segunda-feira, 31 de julho de 2023

LSM110A - COMANDOS AT (LORAWAN - OTA) - RAK LIB

       

O objetivo deste BLOG é demonstrar como é possível enviar pacotes para  a rede LoRaWAN através de comandos AT enviados ao  módulo WISOL LSM110A.


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


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


Principais comandos AT

AT+DEVEUI=00xxE115xx1Fxx0A
AT+APPKEY=A614D59963A0861EDF2702AE6F0E1AD6
AT+BAND=6
AT+MASK=0002
AT+CLASS=A
AT+JOIN=1:0:10:8
AT+CFM=1

loop
        se já fez Join AT+NJS=? retorna 1, então 
            você pode enviar pacote AT+SEND=2:112233
       caso contrário
            faça Join AT+JOIN=1:0:10:8
        fim se
        modo de baixo consumo AT+SLEEP=15000
fim loop

Fontes:

Atenção


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

segunda-feira, 24 de julho de 2023

LSM110A - CONSUMO SLEEP (LORAWAN - OTA) - RAK LIB

       

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

Será testado o modo SLEEP para avaliar consumo de bateria, muito importante quando sua aplicação requer baixo consumo, com LoRaWAN OTA.


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

/*** * 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; #define OTAA_PERIOD (15000) /************************************* 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, 0x1F, 0xXX, 0x0A} #define OTAA_APPEUI {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99} #define OTAA_APPKEY {0xA6, 0x14, 0xD5, 0x99, 0xXX, 0xA0, 0x86, 0x1E, 0xDF, 0x27, 0x02, 0xAE, 0x6F, 0x0E, 0x1A, 0xD6} /** Packet buffer for sending */ uint8_t collected_data[64] = { 0 }; void recvCallback(SERVICE_LORA_RECEIVE_T * data) { if (data->BufferSize > 0) { Serial.println("Something received!"); 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) { Serial.println("Successfully sent"); } else { Serial.println("Sending failed"); } } void setup() { Serial.begin(115200, RAK_AT_MODE); delay(2000); Serial.println("RAKwireless LoRaWan OTAA Example"); 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 { Serial.printf("LoRaWan OTAA - set network join mode is incorrect! \r\n"); return; } if (!api.lorawan.join()) // Join to Gateway { Serial.printf("LoRaWan OTAA - join fail! \r\n"); return; } /** Wait for Join success */ while (api.lorawan.njs.get() == 0) { Serial.print("Wait for LoRaWAN join..."); api.lorawan.join(); delay(10000); } if (!api.lorawan.adr.set(true)) { Serial.printf("LoRaWan OTAA - set adaptive data rate is incorrect! \r\n"); return; } if (!api.lorawan.rety.set(1)) { Serial.printf("LoRaWan OTAA - set retry times is incorrect! \r\n"); return; } if (!api.lorawan.cfm.set(1)) { 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", OTAA_PERIOD); Serial.println(""); api.lorawan.registerRecvCallback(recvCallback); api.lorawan.registerJoinCallback(joinCallback); api.lorawan.registerSendCallback(sendCallback); } void uplink_routine() { /** Payload of Uplink */ uint8_t data_len = 0; collected_data[data_len++] = (uint8_t) 't'; collected_data[data_len++] = (uint8_t) 'e'; collected_data[data_len++] = (uint8_t) 's'; collected_data[data_len++] = (uint8_t) 't'; Serial.println("Data Packet:"); for (int i = 0; i < data_len; i++) { Serial.printf("0x%02X ", collected_data[i]); } Serial.println(""); 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)) { Serial.println("Sending is requested"); } else { Serial.println("Sending failed"); } } void loop() { static uint64_t last = 0; static uint64_t elapsed; if ((elapsed = millis() - last) > OTAA_PERIOD) { uplink_routine(); last = millis(); } Serial.printf("Try sleep %ums..", OTAA_PERIOD); api.system.sleep.all(OTAA_PERIOD); Serial.println("Wakeup.."); }

Execução


Ao medir com o multímetro,  durante a execução do comando api.system.sleep.all(OTAA_PERIOD)acusou 4uA





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

sexta-feira, 21 de julho de 2023

LSM110A - Programando com VISUINO E ENVIANDO DADOS SEM TTN OU CHIRPSTACK

   

O objetivo deste BLOG é demonstrar como é possível utilizar o VISUINO para programação do WISOL LSM110A. Foi utilizado o Starter Kit LSM110A para o teste. O exemplo permitirá com linhas de comando o envio de texto via LoRA (ABP, AU915) a um servidor MQTT  da U_BLOX (ThingStream), via Gateway Dragino, ou seja, não necessário ter um servidor LoRaWAN TTN ou CHIRPSTACK, ou nem mesmo acesso à Internet.

Os parâmetros de acesso ao ABP são passados pela UART e gravados na FLASH

@0000000000000099 $0080E115051FD80A #FF9F138B40180AA45D6846E0A0146954 %OTA %ABP <=== &00000000 *00000000000000000000000000000000 +00000000000000000000000000000000


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



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!

Ok, o ambiente de desenvolvimento está pronto. Abra Projeto Visuino abaixo

No CustomCode, Declarations

/** * This is a an example of the asynchronous API. This sketch is not * completely asynchronous (see ScheduledAsync.ino for that) and its * flow still follows the LoRa flow, but this sketch shows how some * background work can be done while waiting for the LoRa library to * complete its work. * * Revised BSD License - https://spdx.org/licenses/BSD-3-Clause.html */ //transmit interval unsigned long last_tx = 0; //LoRa LOG char buffer[256]; HardwareSerial Serial1(PB6, PB7); STM32LoRaWAN modem; //Payload Mount uint8_t payload_size; char payload[1024]; String setAppEuiString; String setAppKeyString; String setDevEuiString; String OTA_ABP; String setDevAddrString; String setNwkSKeyString; String setAppSKeyString; /********************************************************************* * This part of the sketch defines a very simple scheduler and defines * two tasks that handle the actual work. *********************************************************************/ struct Task { unsigned long time; /* When to run, 0 == never */ void (*callback)(); }; enum Tasks { LORA_WORK_TASK, LORA_MAINTAIN_TASK, NUM_TASKS, }; void do_lora_maintain(); void do_lora_work(); void maintain_needed_callback(); Task tasks[NUM_TASKS] = { [LORA_WORK_TASK] = {0, do_lora_work}, [LORA_MAINTAIN_TASK] = {0, do_lora_maintain}, }; void run_scheduler() { // Super-simple scheduler that just checks all tasks and runs // any that are due. for (size_t i = 0; i < NUM_TASKS; ++i) { if (tasks[i].time != 0 && (int)(millis() - tasks[i].time) >= 0) { tasks[i].time = 0; tasks[i].callback(); } } } /********************************************************************* * This part of the sketch defines the lora work task, which iniates new * work and the lora_done() function that processes the results. *********************************************************************/ static const unsigned long TX_INTERVAL = 30000; /* ms */ static const unsigned long RETRY_JOIN_INTERVAL = 5000; /* ms */ enum LoraState { IDLE, JOINING, TRANSMITTING, }; LoraState lora_state; void start_join() { setAppEuiString = readStringEEPROM(0); setAppKeyString = readStringEEPROM(17); setDevEuiString = readStringEEPROM(50); OTA_ABP = readStringEEPROM(67); setDevAddrString = readStringEEPROM(71); setNwkSKeyString = readStringEEPROM(80); setAppSKeyString = readStringEEPROM(113); //Serial.println(setAppEuiString); //Serial.println(setAppKeyString); //Serial.println(setDevEuiString); //Serial.println(OTA_ABP); //Serial.println(setDevAddrString); //Serial.println(setNwkSKeyString); //Serial.println(setAppSKeyString); //found bug on STM32LoRaWAN.h (reported) //bool setAppEui(String value) { return setDevEui(value.c_str()); } //bool setAppEui(String value) { return setAppEui(value.c_str()); } //MIGUEL //@0000000000000099 //$0080E115051FD80A //#FF9F138B40180AA45D6846E0A0146954 //%OTA //%ABP //&00000000 //*00000000000000000000000000000000 //+00000000000000000000000000000000 if(OTA_ABP=="OTA") { modem.setAppEui(setAppEuiString); //@ modem.setAppKey(setAppKeyString); //# modem.setDevEui(setDevEuiString); //$ modem.joinOTAAAsync(); lora_state = JOINING; } if(OTA_ABP=="ABP") { //bool connected = modem.joinABP(/* DevAddr */ setDevAddrString, /* NwkSKey */ setNwkSKeyString, /* AppSKey */ setAppSKeyString); bool connected = modem.joinABP(/* DevAddr */ setDevAddrString, /* NwkSKey */ setNwkSKeyString, /* AppSKey */ setAppSKeyString); if (connected) { StatusLoRa("Joined"); //Serial.println("Joined"); } else StatusLoRa("Join failed"); //Serial.println("Join failed"); //while (true) /* infinite loop */; } //modem.setDevAddr("00000000"); //& //modem.setNwkSKey("00000000000000000000000000000000"); //* //modem.setAppSKey("00000000000000000000000000000000"); //+ //modem.joinABPAsync(); } void send_packet() { String s = String(payload); payload_size = s.length(); modem.setPort(10); modem.beginPacket(); modem.write(payload, payload_size); if(OTA_ABP=="OTA") { if (modem.endPacketAsync() == payload_size) { StatusLoRa("Queued packet"); //Serial.println("Queued packet"); } else { StatusLoRa("Failed to queue packet"); //Serial.println("Failed to queue packet"); } lora_state = TRANSMITTING; } if(OTA_ABP=="ABP") { if (modem.endPacket() == payload_size) { StatusLoRa("Queued packet"); //Serial.println("Queued packet"); } else { //Serial.println("Failed to queue packet"); StatusLoRa("Failed to queue packet"); } lora_state = TRANSMITTING; } } void process_rx() { if (modem.available()) { sprintf(buffer,"Received packet on port %d:",modem.getDownlinkPort()); StatusLoRa(buffer); //Serial.print("Received packet on port "); //Serial.print(modem.getDownlinkPort()); //Serial.print(":"); while (modem.available()) { uint8_t b = modem.read(); sprintf(buffer," %x%x",b >> 4,b & 0xF); StatusLoRa(buffer); //Serial.print(" "); //Serial.print(b >> 4, HEX); //Serial.print(b & 0xF, HEX); } sprintf(buffer,"%c%c",13,10); StatusLoRa(buffer); //Serial.println(); } } void do_lora_work() { // Time to start new work if (!modem.connected()) { start_join(); } else { send_packet(); } } void lora_done() { // If, after calling maintain() the library is no longer // busy, then the asynchronous operation has completed, // so check its results. if (lora_state == TRANSMITTING) { StatusLoRa("Sent packet"); //Serial.println("Sent packet"); // Done transmitting process_rx(); lora_state = IDLE; // Schedule transmission of next packet tasks[LORA_WORK_TASK].time = millis() + TX_INTERVAL; } else if (lora_state == JOINING) { if (modem.connected()) { StatusLoRa("Joined"); //Serial.println("Joined"); send_packet(); } else { StatusLoRa("Join failed"); //Serial.println("Join failed"); lora_state = IDLE; tasks[LORA_WORK_TASK].time = millis() + RETRY_JOIN_INTERVAL; } } } /********************************************************************* * This part of the sketch defines the lora maintain task, which calls * maintain() to let the lora library do any background work that it * needs to do. It is called whenever request by the callback. *********************************************************************/ void do_lora_maintain() { modem.maintain(); // If, after calling maintain() the library is no longer // busy, then the asynchronous operation has completed, // so check its results. if (!modem.busy()) { lora_done(); } } void maintain_needed_callback() { // This is called from interrupt context, so this must *not* // call maintain() directly and return as fast as possible. // So just schedule the maintain task to run ASAP. tasks[LORA_MAINTAIN_TASK].time = millis(); } /********************************************************************* * And this is the entry points of the sketch. *********************************************************************/
No CustomCode, OnInit

StatusLoRa("Starting"); //Serial.println("Starting"); modem.begin(AU915); modem.powerdB(22); modem.dataRate(10); //spread OTA_ABP = readStringEEPROM(67); if(OTA_ABP=="OTA") modem.setMaintainNeededCallback(maintain_needed_callback); do_lora_work();

No CustomCode, OnExecute

if(OTA_ABP=="OTA") { run_scheduler(); } if(OTA_ABP=="ABP") { if (!last_tx || millis() - last_tx > TX_INTERVAL) { do_lora_work(); //send_packet(); last_tx = millis(); } }

No CustomCode, Global Implementations

//https://roboticsbackend.com/arduino-write-string-in-eeprom/ //FIRST BYTE IS THE LENGHT String readStringEEPROM(int addrOffset) { int newStrLen = EEPROM.read(addrOffset); char data[newStrLen + 1]; for (int i = 0; i < newStrLen; i++) { data[i] = EEPROM.read(addrOffset + 1 + i); } data[newStrLen] = 0; //NULL return String(data); } void StatusLoRa(String Txt) { Declarations::Instances::LoRaWAN.LoRaWANStatus.Send(Txt); }














No CustomCode, Includes

#include <STM32LoRaWAN.h>

Compilando



Utilize STM32 PROGRAMMER para gravar


No Gateway da Dragino, cadastre os parâmetros ABP



Rede Privada - Direcione para um servidor MQTT

Neste caso, foi utilizado da U-BLOX





No terminal, você mandar as credenciais


%ABP &00000000 *00000000000000000000000000000000 +00000000000000000000000000000000

Pacote a ser enviado

Qualquer texto não comece com @#$%, é identificado como no novo pacote a ser enviado

Executando


Log - System Log (Dragino)


Wed Nov 30 11:11:59 2022 daemon.info lora_pkt_fwd[307]: PKT_FWD~ DATA_CONF_UP-> {"DevAddr": "00000000", "FCtrl": ["ADR": 0, "ADRACKReq": 0, "ACK": 0, "RFU" : "RFU", "FOptsLen": 0], "FCnt": 0, "FPort": 2, "MIC": "B1F93D67"}
Wed Nov 30 11:11:59 2022 daemon.info lora_pkt_fwd[307]: RXTX~ {"rxpk":[{"tmst":248124740,"time":"2022-11-30T14:11:59.008966Z","chan":1,"rfch":0,"freq":917.000000,"stat":1,"modu":"LORA","datr":"SF12BW125","codr":"4/5","lsnr":10.5,"rssi":-90,"size":18,"data":"gAAAAAAAAAACvR2eYW9nPfmx"}]}

Dados no THINGSTREAM



ffffffd70000007348656c6c6f00 




Para ver os dados, acompanhe o vídeo a partir do tempo 07:19


MONTAGEM



DÚVIDAS

suporte@smartcore.com.br

REFERÊNCIAS


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(); } }








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