segunda-feira, 31 de julho de 2023

LSM110A - GPIOS COM ARDUINO

         

O objetivo deste BLOG é demonstrar como é possível programar o módulo WISOL LSM110A via ARDUINO e assim utilizá-lo como OPENCPU.

Aqui é mostrado o mapa de GPIOS para uso do LSM110A com ARDUINO


LSM110A Starter KIT
Módulo

O LSM110A é um módulo de última geração que integra o STMicroelectronics STM32WL. É muito menos consumo atual para o dispositivo IoT para estender a vida útil da bateria. E, também suporta ambas as tecnologias – Sigfox e LoRa – com o próprio módulo LSM110A.

Você pode trocar Sigfox ou LoRa com ele para que você também possa reduzir o custo. É altamente otimizado para solução de IoT (Alto Consumo de Energia, Baixo Custo)

BREAKOUT para testes

Esquema Elétrico - últimas correções





PLACA MONTADA




VISUINO

Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino.
Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá facilmente criar e projetar seus programas arrastando e soltando. Nenhum equipamento ou hardware é necessário para executar o software no modo de design. Depois de concluir o projeto, você pode conectar o upload da placa Arduino e executá-lo.
Para aquelas pessoas que não são fortes em escrever código, projetar, compilar e criar programas Arduino nunca foi tão fácil! Por que perder tempo codificando quando todo o trabalho duro é feito para você? Você tem sua placa Arduino e um ótimo design de hardware, coloque-a em funcionamento em minutos, não em horas!



//---------------------------------------------------------------------------

GPIOS

PB6 = DIGITAL INPUT/OUTPUT
PB7 = DIGITAL INPUT/OUTPUT
PA2 = TXD1
PA3 = RXD1
PA9 = TXD2 
PA10 = RXD2
PB2 = ADC_IN4/DIGITAL INPUT/OUTPUT
PB3 = ADC_IN2/DIGITAL INPUT/OUTPUT
PB4 = ADC_IN3/DIGITAL INPUT/OUTPUT
PA15 = ADC_IN10/DIGITAL INPUT/OUTPUT
PB8 = DIGITAL INPUT/OUTPUT
PA0 = DIGITAL INPUT/OUTPUT
PA11 = I2C/SDA/ADC_IN7/SDA/DIGITAL INPUT/OUTPUT
PA12 = I2C/SCL/ADC_IN8/SCL/DIGITAL INPUT/OUTPUT
PA1 = DIGITAL INPUT/OUTPUT
PA7 = DIGITAL INPUT/OUTPUT
PA8 = DIGITAL INPUT/OUTPUT
PA4 = NSS/DIGITAL INPUT/OUTPUT
PA5 = SCK/DIGITAL INPUT/OUTPUT
PA6 = MISO/DIGITAL INPUT/OUTPUT
PB5 = MOSI/DIGITAL INPUT/OUTPUT

Para Serial1, incluir no código

HardwareSerial Serial1(USART1);

Variants

/* ******************************************************************************* * Copyright (c) 2020, STMicroelectronics * All rights reserved. * * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ******************************************************************************* */ #pragma once /*---------------------------------------------------------------------------- * STM32 pins number *----------------------------------------------------------------------------*/ #define PA0 0 #define PA1 1 #define PA2 2 #define PA3 3 #define PA4 4 #define PA5 5 #define PA6 6 #define PA7 7 #define PA8 8 #define PA9 9 #define PA10 PIN_A0 #define PA11 PIN_A1 #define PA12 PIN_A2 #define PA13 PIN_A3 #define PA14 PIN_A4 #define PA15 PIN_A5 #define PB0 16 #define PB2 PIN_A6 #define PB3 PIN_A7 #define PB4 PIN_A8 #define PB5 20 #define PB6 21 #define PB7 22 #define PB8 23 #define PB12 24 #define PC13 25 #define PC14 26 #define PC15 27 #define PH3 28 // Alternate pins number #define PA1_ALT1 (PA1 | ALT1) #define PA2_ALT1 (PA2 | ALT1) #define PA3_ALT1 (PA3 | ALT1) #define PA4_ALT1 (PA4 | ALT1) #define PA5_ALT1 (PA5 | ALT1) #define PA6_ALT1 (PA6 | ALT1) #define PA7_ALT1 (PA7 | ALT1) #define PB8_ALT1 (PB8 | ALT1) #define NUM_DIGITAL_PINS 29 #define NUM_ANALOG_INPUTS 9 // On-board LED pin number #ifndef LED_BUILTIN #define LED_BUILTIN PNUM_NOT_DEFINED #endif // On-board user button #ifndef USER_BTN #define USER_BTN PNUM_NOT_DEFINED #endif // SPI definitions #ifndef PIN_SPI_SS #define PIN_SPI_SS PA4 #endif #ifndef PIN_SPI_SS1 #define PIN_SPI_SS1 PA15 #endif #ifndef PIN_SPI_SS2 #define PIN_SPI_SS2 PB2 #endif #ifndef PIN_SPI_SS3 #define PIN_SPI_SS3 PNUM_NOT_DEFINED #endif #ifndef PIN_SPI_MOSI #define PIN_SPI_MOSI PB5 #endif #ifndef PIN_SPI_MISO #define PIN_SPI_MISO PA6 #endif #ifndef PIN_SPI_SCK #define PIN_SPI_SCK PA5 #endif // I2C definitions #ifndef PIN_WIRE_SDA #define PIN_WIRE_SDA PA11 #endif #ifndef PIN_WIRE_SCL #define PIN_WIRE_SCL PA12 #endif // Timer Definitions // Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin #ifndef TIMER_TONE #define TIMER_TONE TIM16 #endif #ifndef TIMER_SERVO #define TIMER_SERVO TIM17 #endif // UART Definitions #ifndef SERIAL_UART_INSTANCE #define SERIAL_UART_INSTANCE 101 #endif // Default pin used for generic 'Serial' instance // Mandatory for Firmata #ifndef PIN_SERIAL_RX #define PIN_SERIAL_RX PA3 #endif #ifndef PIN_SERIAL_TX #define PIN_SERIAL_TX PA2 #endif // Alias #ifndef DEBUG_SUBGHZSPI_MOSI #define DEBUG_SUBGHZSPI_MOSI PA7_ALT1 #endif #ifndef DEBUG_SUBGHZSPI_MISO #define DEBUG_SUBGHZSPI_MISO PA6_ALT1 #endif #ifndef DEBUG_SUBGHZSPI_SCLK #define DEBUG_SUBGHZSPI_SCLK PA5_ALT1 #endif #ifndef DEBUG_SUBGHZSPI_SS #define DEBUG_SUBGHZSPI_SS PA4_ALT1 #endif // Extra HAL modules #if !defined(HAL_DAC_MODULE_DISABLED) #define HAL_DAC_MODULE_ENABLED #endif /*---------------------------------------------------------------------------- * Arduino objects - C++ only *----------------------------------------------------------------------------*/ #ifdef __cplusplus // These serial port names are intended to allow libraries and architecture-neutral // sketches to automatically default to the correct port name for a particular type // of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, // the first hardware serial port whose RX/TX pins are not dedicated to another use. // // SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor // // SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial // // SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library // // SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. // // SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX // pins are NOT connected to anything by default. #ifndef SERIAL_PORT_MONITOR #define SERIAL_PORT_MONITOR Serial #endif #ifndef SERIAL_PORT_HARDWARE #define SERIAL_PORT_HARDWARE Serial #endif #endif



Exemplos:

    pinMode(PB2,OUTPUT);
    analogRead(PB3);

Atenção

ATENÇÃO: RTC BACKUP (generic_clock.c)
C:\Users\Usuario\AppData\Local\arduino15\packages\STMicroelectronics\hardware\stm32\2.6.0\variants\STM32WLxx\WL54JCI_WL55JCI_WLE4J(8-B-C)I_WLE5J(8-B-C)I

void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; HAL_PWR_EnableBkUpAccess(); __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK3|RCC_CLOCKTYPE_HCLK |RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.AHBCLK3Divider = RCC_SYSCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } }


Dúvidas

FORUM

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br

LSM110A - GPIOS COM VISUINO

         

O objetivo deste BLOG é demonstrar como é possível programar o módulo WISOL LSM110A via ARDUINO e assim utilizá-lo como OPENCPU.

Aqui é mostrado o mapa de GPIOS para uso do LSM110A com VISUINO


LSM110A Starter KIT
Módulo

O LSM110A é um módulo de última geração que integra o STMicroelectronics STM32WL. É muito menos consumo atual para o dispositivo IoT para estender a vida útil da bateria. E, também suporta ambas as tecnologias – Sigfox e LoRa – com o próprio módulo LSM110A.

Você pode trocar Sigfox ou LoRa com ele para que você também possa reduzir o custo. É altamente otimizado para solução de IoT (Alto Consumo de Energia, Baixo Custo)

BREAKOUT para testes

Esquema Elétrico - últimas correções





PLACA MONTADA




VISUINO

Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino.
Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá facilmente criar e projetar seus programas arrastando e soltando. Nenhum equipamento ou hardware é necessário para executar o software no modo de design. Depois de concluir o projeto, você pode conectar o upload da placa Arduino e executá-lo.
Para aquelas pessoas que não são fortes em escrever código, projetar, compilar e criar programas Arduino nunca foi tão fácil! Por que perder tempo codificando quando todo o trabalho duro é feito para você? Você tem sua placa Arduino e um ótimo design de hardware, coloque-a em funcionamento em minutos, não em horas!



No Visuino, altere Mitov.Boards.STM32Duino.vcomp para 

//--------------------------------------------------------------------------- [Name( 'Blue Pill (STM32F103)' )] [ArduinoBoardCompileParams( 'STM32:stm32:GenF1' )] [Category( TSTM32_F103_Category )] +TArduino_STM32_Blue_Pill_Board : TArduino_STM32_Basic_Modules_Board [AddItem( TArduinoSTM32HardwareSerial1 )] [AddItem( TArduinoSTM32HardwareSerial0 )] Serial [AddItem( TArduinoI2C, 1 )] I2CChannels [AddItem( TArduinoSPI, 1 )] SPIChannels [ArduinoBoard_Add_DigitalAnalogChannel( 0, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA0 (BUT1) 3.3V', 'PA0' )] [ArduinoBoard_Add_DigitalAnalogChannel( 1, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA1 (BUT2) (WKUP) 3.3V', 'PA1' )] [ArduinoBoard_Add_DigitalAnalogChannel( 2, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial0Channel, 'PA2 (TX0) 3.3V', 'PA2' )] [ArduinoBoard_Add_DigitalAnalogChannel( 3, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial0Channel, 'PA3 (RX0) 3.3V', 'PA3' )] [ArduinoBoard_Add_DigitalAnalogChannel( 4, TArduinoCombinedAnalogDigitalPullDownOpenDrainChannel, 'PA4 (SPI1-NSS) 3.3V', 'PA4' )] [ArduinoBoard_Add_DigitalAnalogChannel( 5, TArduinoCombinedAnalogDigitalPullDownOpenDrainChannel, 'PA5 (SPI1-SCK) 3.3V', 'PA5' )] [ArduinoBoard_Add_DigitalAnalogChannel( 6, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSPI0Channel, 'PA6(SPI1-MISO) 3.3V', 'PA6' )] [ArduinoBoard_Add_DigitalAnalogChannel( 7, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSPI0Channel, 'PB5(SPI1-MOSI) 3.3V', 'PB5' )] [ArduinoBoard_Add_DigitalAnalogChannel( 8, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA7 3.3V', 'PA7' )] [ArduinoBoard_Add_DigitalAnalogChannel( 9, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA8 3.3V', 'PA8' )] [ArduinoBoard_Add_DigitalAnalogChannel( 10, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial1Channel, 'PA9 (TX1) 3.3V', 'PA9' )] [ArduinoBoard_Add_DigitalAnalogChannel( 11, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMSerial1Channel, 'PA10 (RX1) 3.3V', 'PA10' )] [ArduinoBoard_Add_DigitalAnalogChannel( 12, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA11 3.3V', 'PA11' )] [ArduinoBoard_Add_DigitalAnalogChannel( 13, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA12 3.3V', 'PA12' )] [ArduinoBoard_Add_DigitalAnalogChannel( 14, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA13 (SWDIO) 3.3V', 'PA13' )] [ArduinoBoard_Add_DigitalAnalogChannel( 15, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA14 (SWCLK) 3.3V', 'PA14' )] [ArduinoBoard_Add_DigitalAnalogChannel( 16, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PA15 (LED3) 3.3V', 'PA15' )] [ArduinoBoard_Add_DigitalAnalogChannel( 17, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB2 3.3V (ADC-IN4)', 'PB2' )] [ArduinoBoard_Add_DigitalAnalogChannel( 18, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB3 3.3V', 'PB3' )] [ArduinoBoard_Add_DigitalAnalogChannel( 19, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB4 3.3V', 'PB4' )] [ArduinoBoard_Add_DigitalAnalogChannel( 20, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, '3.3V', 'PB6' )] [ArduinoBoard_Add_DigitalAnalogChannel( 21, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, '3.3V', 'PB7' )] [ArduinoBoard_Add_DigitalAnalogChannel( 22, TArduinoCombinedAnalogDigitalPullDownOpenDrainPWMChannel, 'PB8 3.3V', 'PB8' )] Digital : TArduinoDigitalChannels ; //---------------------------------------------------------------------------

GPIOS

PB6 = DIGITAL INPUT/OUTPUT
PB7 = DIGITAL INPUT/OUTPUT
PA2 = TXD1
PA3 = RXD1
PA9 = TXD2 
PA10 = RXD2
PB2 = ADC_IN4/DIGITAL INPUT/OUTPUT
PB3 = ADC_IN2/DIGITAL INPUT/OUTPUT
PB4 = ADC_IN3/DIGITAL INPUT/OUTPUT
PA15 = ADC_IN10/DIGITAL INPUT/OUTPUT
PB8 = DIGITAL INPUT/OUTPUT
PA0 = DIGITAL INPUT/OUTPUT
PA11 = I2C/SDA/ADC_IN7/SDA/DIGITAL INPUT/OUTPUT
PA12 = I2C/SCL/ADC_IN8/SCL/DIGITAL INPUT/OUTPUT
PA1 = DIGITAL INPUT/OUTPUT
PA7 = DIGITAL INPUT/OUTPUT
PA8 = DIGITAL INPUT/OUTPUT
PA4 = NSS/DIGITAL INPUT/OUTPUT
PA5 = SCK/DIGITAL INPUT/OUTPUT
PA6 = MISO/DIGITAL INPUT/OUTPUT
PB5 = MOSI/DIGITAL INPUT/OUTPUT

Dúvidas

FORUM

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br

LSM110A - PAYLOAD sendo enviado via UART

        

O objetivo deste BLOG é demonstrar como é possível programar o módulo WISOL LSM110A via ARDUINO e assim utilizá-lo como OPENCPU.

Este exemplo aguarda que o Payload a ser enviado via LoRaWAN seja enviado pela UART, seguindo a sequência

*@PAYLOAD
*#SLEEP

Após o RESET, você verá a configuração atual e pode mandar o comando AT para alterar em no máximo 2 segundos.




Comandos

AT+DEVEUI=00xxE115xx1Fxx0A
AT+APPKEY=A614D59963A0861EDF2702AE6F0E1AD6
AT+BAND=6
AT+MASK=0002
AT+CLASS=A
AT+CFM=1


LSM110A Starter KIT
Módulo

O LSM110A é um módulo de última geração que integra o STMicroelectronics STM32WL. É muito menos consumo atual para o dispositivo IoT para estender a vida útil da bateria. E, também suporta ambas as tecnologias – Sigfox e LoRa – com o próprio módulo LSM110A.

Você pode trocar Sigfox ou LoRa com ele para que você também possa reduzir o custo. É altamente otimizado para solução de IoT (Alto Consumo de Energia, Baixo Custo)

BREAKOUT para testes

Esquema Elétrico - últimas correções





PLACA MONTADA



CONEXÃO COM ST-LINK V2 E UART




Altere radio_board_if.c para

int32_t RBI_ConfigRFSwitch(RBI_Switch_TypeDef Config) { switch (Config) { case RBI_SWITCH_OFF: { /* Turn off switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); break; } case RBI_SWITCH_RX: { /*Turns On in Rx Mode the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_RESET); break; } case RBI_SWITCH_RFO_LP: { /*Turns On in Tx Low Power the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); break; } case RBI_SWITCH_RFO_HP: { /*Turns On in Tx High Power the RF Switch */ HAL_GPIO_WritePin(RF_SW_CTRL1_GPIO_PORT, RF_SW_CTRL1_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(RF_SW_CTRL2_GPIO_PORT, RF_SW_CTRL2_PIN, GPIO_PIN_SET); break; } default: break; } return 0; }
































Altere radio_board_if.h para

#define RF_SW_CTRL1_PIN GPIO_PIN_12 #define RF_SW_CTRL1_GPIO_PORT GPIOB #define RF_SW_CTRL1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() #define RF_SW_CTRL1_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() /* official version */ #define RF_SW_CTRL2_PIN GPIO_PIN_13 #define RF_SW_CTRL2_GPIO_PORT GPIOC #define RF_SW_CTRL2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() 
#define RF_SW_CTRL2_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()

Altere Placa para RAK3272-SIP, compile


Grave com o STM32 Programmer o BOOTLOADER no LSM110A 

Assim, pode-se transferir o programa via Serial, através dos pinos PA2 e PA3 do LSM110A.


RAK3272-SiP_latest_final.hex


Transferindo


Executando

Uma vez gravado o Software, o LSM110A entrará em Sleep por 60 segundos.



Segue código final

//#define LOG true

/***
 *  This example shows LoRaWan protocol joining the network in OTAA mode, class A, region EU868.
 *  Device will send uplink every 20 seconds.
***/
//uint16_t maskBuff = 0x0002;
uint8_t data_len = 0;

  uint8_t flash_read[4] = {0};
  uint32_t time_sleep = 0;

//#define OTAA_PERIOD   (10000)
/*************************************

   LoRaWAN band setting:
     RAK_REGION_EU433
     RAK_REGION_CN470
     RAK_REGION_RU864
     RAK_REGION_IN865
     RAK_REGION_EU868
     RAK_REGION_US915
     RAK_REGION_AU915
     RAK_REGION_KR920
     RAK_REGION_AS923

 *************************************/
#define OTAA_BAND     (RAK_REGION_AU915)
#define OTAA_DEVEUI   {0x00, 0xXX, 0xXX, 0x15, 0xXX, 0xXX, 0xXX, 0xXX}
#define OTAA_APPEUI   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99} //ignorado pelo CHIRPSTACK
#define OTAA_APPKEY   {0xA6, 0x14, 0xD5, 0x99, 0x63, 0xA0, 0x86, 0x1E, 0xDF, 0x27, 0x02, 0xAE, 0x6F, 0x0E, 0x1A, 0xD6}

/** Packet buffer for sending */
char collected_data[64] = { 0 };

void recvCallback(SERVICE_LORA_RECEIVE_T * data)
{
    if (data->BufferSize > 0) {
        #ifdef LOG
        Serial.println("Something received!");
        #endif
        for (int i = 0; i < data->BufferSize; i++) {
            Serial.printf("%x", data->Buffer[i]);
        }
        Serial.print("\r\n");
    }
}

void joinCallback(int32_t status)
{
    Serial.printf("Join status: %d\r\n", status);
}

/*************************************
 * enum type for LoRa Event
    RAK_LORAMAC_STATUS_OK = 0,
    RAK_LORAMAC_STATUS_ERROR,
    RAK_LORAMAC_STATUS_TX_TIMEOUT,
    RAK_LORAMAC_STATUS_RX1_TIMEOUT,
    RAK_LORAMAC_STATUS_RX2_TIMEOUT,
    RAK_LORAMAC_STATUS_RX1_ERROR,
    RAK_LORAMAC_STATUS_RX2_ERROR,
    RAK_LORAMAC_STATUS_JOIN_FAIL,
    RAK_LORAMAC_STATUS_DOWNLINK_REPEATED,
    RAK_LORAMAC_STATUS_TX_DR_PAYLOAD_SIZE_ERROR,
    RAK_LORAMAC_STATUS_DOWNLINK_TOO_MANY_FRAMES_LOSS,
    RAK_LORAMAC_STATUS_ADDRESS_FAIL,
    RAK_LORAMAC_STATUS_MIC_FAIL,
    RAK_LORAMAC_STATUS_MULTICAST_FAIL,
    RAK_LORAMAC_STATUS_BEACON_LOCKED,
    RAK_LORAMAC_STATUS_BEACON_LOST,
    RAK_LORAMAC_STATUS_BEACON_NOT_FOUND,
 *************************************/

void sendCallback(int32_t status)
{
    if (status == RAK_LORAMAC_STATUS_OK) {
        #ifdef LOG
        Serial.println("Successfully sent");
        #endif

    } else {
        #ifdef LOG
        Serial.println("Sending failed");
        #endif
    }
}

void setup()
{

    uint8_t buff[16];
    uint16_t maskBuff = 0x0002;

    Serial.begin(115200, RAK_AT_MODE);
    Serial.setTimeout(2000);
    delay(2000); //APROVEITE AQUI PARA MANDAR COMANDO AT
 
    //Sleep time...
    if (api.system.flash.get(0, flash_read, 4))
      {
        time_sleep |= flash_read[0] << 0;
        time_sleep |= flash_read[1] << 8;
        time_sleep |= flash_read[2] << 16;
        time_sleep |= flash_read[3] << 24;
      }
      else
      {
        Serial.println("Failed to read data from Flash");
      }

    Serial.println("------------------------------------------------------");
   
    if(api.lorawan.appkey.get(buff, 16) == true) {
        Serial.print("LoRaWan AppKey = 0x");
        for(int i = 0; i < 16; i++) {
            Serial.printf("%02X", buff[i]);
        }
        Serial.println("");
    } else {
        Serial.println("LoRaWan AppKey get fail");
    }

    if(api.lorawan.deui.get(buff, 8) == true) {
        Serial.print("LoRaWan device EUI = 0x");
        for(int i = 0; i < 8; i++) {
            Serial.printf("%02X", buff[i]);
        }
        Serial.println("");
    } else {
        Serial.println("LoRaWan device EUI get fail");
    }

    Serial.printf("LoRa region = %d\r\n", api.lorawan.band.get());
   
    switch(api.lorawan.deviceClass.get()) {
        case 0:
            Serial.println("Device is in Class A");
            break;
        case 1:
            Serial.println("Device is in Class B");
            break;
        case 2:
            Serial.println("Device is in Class C");
            break;
    }

    Serial.printf("Get channel mask %s\r\n", api.lorawan.mask.get(&maskBuff) ? "Success" : "Fail");
    Serial.printf("Channel mask = %04X\r\n", maskBuff);
    Serial.printf("Packet is %s\n\r", api.lorawan.cfm.get() ? "CONFIRMED" : "UNCONFIRMED");
    Serial.printf("Sleep interval %u", time_sleep);
    Serial.println();
    Serial.println("------------------------------------------------------");

    if(api.lorawan.nwm.get() != 1)
    {
        Serial.printf("Set Node device work mode %s\r\n",
            api.lorawan.nwm.set(1) ? "Success" : "Fail");
        api.system.reboot();
    }

    // OTAA Device EUI MSB first
    uint8_t node_device_eui[8] = OTAA_DEVEUI;
    // OTAA Application EUI MSB first
    uint8_t node_app_eui[8] = OTAA_APPEUI;
    // OTAA Application Key MSB first
    uint8_t node_app_key[16] = OTAA_APPKEY;
 
    //if (!api.lorawan.appeui.set(node_app_eui, 8)) {
    //    Serial.printf("LoRaWan OTAA - set application EUI is incorrect! \r\n");
    //    return;
    //}
   
    //if (!api.lorawan.appkey.set(node_app_key, 16)) {
    //    Serial.printf("LoRaWan OTAA - set application key is incorrect! \r\n");
    //    return;
    //}
    //if (!api.lorawan.deui.set(node_device_eui, 8)) {
    //    Serial.printf("LoRaWan OTAA - set device EUI is incorrect! \r\n");
    //    return;
    //}
 
    //if (!api.lorawan.band.set(OTAA_BAND)) {
    //    Serial.printf("LoRaWan OTAA - set band is incorrect! \r\n");
    //    return;
    //}

    //if (!api.lorawan.deviceClass.set(RAK_LORA_CLASS_A)) {
    //    Serial.printf("LoRaWan OTAA - set device class is incorrect! \r\n");
    //    return;
    //}
   
    //Serial.printf("Set channel mask %s\r\n", api.lorawan.mask.set(&maskBuff) ? "Success" : "Fail");

    if (!api.lorawan.njm.set(RAK_LORA_OTAA))  // Set the network join mode to OTAA
    {
        #ifdef LOG
        Serial.printf("LoRaWan OTAA - set network join mode is incorrect! \r\n");
        #endif
        return;
    }

    if (!api.lorawan.join())  // Join to Gateway
    {
        #ifdef LOG
        Serial.printf("LoRaWan OTAA - join fail! \r\n");
        #endif
        return;
    }
 
    /** Wait for Join success */
    while (api.lorawan.njs.get() == 0) {
        #ifdef LOG
        Serial.print("Wait for LoRaWAN join...");
        #endif
        api.lorawan.join();
        delay(10000);
    }
 
    if (!api.lorawan.adr.set(true)) {
        #ifdef LOG
        Serial.printf("LoRaWan OTAA - set adaptive data rate is incorrect! \r\n");
        #endif
        return;
    }

    //if (!api.lorawan.rety.set(1)) {
    //    Serial.printf("LoRaWan OTAA - set retry times is incorrect! \r\n");
    //    return;
    //}

    //NAO PEDIR CONFIRMACAO
    //if (!api.lorawan.cfm.set(0)) {
    //    Serial.printf("LoRaWan OTAA - set confirm mode is incorrect! \r\n");
    //    return;
    //}
 
    /** Check LoRaWan Status*/
    Serial.printf("Duty cycle is %s\r\n", api.lorawan.dcs.get()? "ON" : "OFF"); // Check Duty Cycle status
    Serial.printf("Packet is %s\r\n", api.lorawan.cfm.get()? "CONFIRMED" : "UNCONFIRMED");  // Check Confirm status
    uint8_t assigned_dev_addr[4] = { 0 };
    api.lorawan.daddr.get(assigned_dev_addr, 4);
    Serial.printf("Device Address is %02X%02X%02X%02X\r\n", assigned_dev_addr[0], assigned_dev_addr[1], assigned_dev_addr[2], assigned_dev_addr[3]);  // Check Device Address
    Serial.printf("Uplink period is %ums\r\n", time_sleep);
    Serial.println("");
    api.lorawan.registerRecvCallback(recvCallback);
    api.lorawan.registerJoinCallback(joinCallback);
    api.lorawan.registerSendCallback(sendCallback);
}

void uplink_routine()
{
  //Serial.println("++++++++++++++++++++++++++++");
  //Serial.println(data_len);
  //Serial.println("++++++++++++++++++++++++++++");
  if(!(data_len==0))
  {
    /** Payload of Uplink */
    #ifdef LOG
    Serial.println("Data Packet:");
    for (int i = 0; i < data_len; i++) {
        Serial.printf("0x%02X ", collected_data[i]);
    }
    Serial.println("");
    #endif
 
    //Serial.printf("Set channel mask %s\r\n", api.lorawan.mask.set(&maskBuff) ? "Success" : "Fail");
   
    /** Send the data package */
    if (api.lorawan.send(data_len, (uint8_t *) & collected_data, 2, true, 1)) {
        #ifdef LOG
        Serial.println("Sending is requested");
        #endif
    } else {
        #ifdef LOG
        Serial.println("Sending failed");
        #endif
    }
  }
  data_len = 0;
}

  uint8_t flash_value[4] = {0};
  bool wr_result = false;
  uint32_t data_to_save;
 
void loop()
{
    static uint64_t last = 0;
    static uint64_t elapsed;

     String returnString = "";
 
    if ((elapsed = millis() - last) > time_sleep) {
        uplink_routine();
 
        last = millis();
    }
    #ifdef LOG
    Serial.printf("Try sleep %ums..", time_sleep);
    #endif
    api.system.sleep.all(time_sleep);
    #ifdef LOG
    Serial.println("Wakeup..");
    #endif

    returnString = Serial.readStringUntil('\r');

    //Some payload received
    if (!(returnString == ""))
      {
          //remove the first character, sometimes  read it
          if(returnString.indexOf("*") >= 0)
              returnString.remove(0,1);

          if(returnString.substring(0,1)=="@") {
            //Remove @
            returnString.remove(0,1)
            //Convert to collected_data
            data_len = returnString.length();
            returnString.toCharArray(collected_data, data_len+1);
          }

          if(returnString.substring(0,1)=="#") {
            //Remove #
            returnString.remove(0,1);
            data_to_save = returnString.toInt();
            //save time sleep
            flash_value[0] = (uint8_t)(data_to_save >> 0);
            flash_value[1] = (uint8_t)(data_to_save >> 8);
            flash_value[2] = (uint8_t)(data_to_save >> 16);
            flash_value[3] = (uint8_t)(data_to_save >> 24);
            wr_result = api.system.flash.set(0, flash_value, 4);
            Serial.printf("Storing Sleep Interval ");
            if(wr_result)
                Serial.printf("OK");
            else
                Serial.printf("ERROR");
            Serial.println();
          }

          //Serial.println(returnString);
          //Serial.println(data_len);
          //Serial.println("----------------------");
          //for(int i=0; i<data_len; i++)
              //Serial.println(collected_data[i]);
          //Serial.println("----------------------");
      }

    /** Wait for Join success */
    while (api.lorawan.njs.get() == 0) {
        #ifdef LOG
        Serial.print("Wait for LoRaWAN join...");
        #endif
        api.lorawan.join();
        delay(10000);
    }
}
Execução

Entre um caractere e outro, dar uma pausa de 1ms

Fontes:

Dúvidas

FORUM

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.

Mais detalhes em www.smartcore.com.br