ver. 1
Dependencies: mbed OneWireCRC_LoRa_Node
Revision 2:e731b7dba32b, committed 2021-05-08
- Comitter:
- lukas_formanek
- Date:
- Sat May 08 18:34:38 2021 +0000
- Parent:
- 1:8a60d7a33fa5
- Commit message:
- LoRaWAN_Node
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Sun Apr 05 16:00:23 2020 +0000 +++ b/main.cpp Sat May 08 18:34:38 2021 +0000 @@ -4,86 +4,106 @@ #include "mbed.h" //#include "stdio.h" //#include <sstream> -//#include <iostream> -#include <string> +//#include <iostream> +//#include <string> #include "DS18B20.h" #include "OneWireDefs.h" -//#define MBED_CONF_TARGET_TICKLESS_FROM_US_TICKER 0 -/* Select the clock sources (other than HSI) to start with (0=OFF, 1=ON) */ -//#define USE_PLL_HSE_EXTC (1) /* Use external clock */ -//#define USE_PLL_HSE_XTAL (1) /* Use external xtal */ -//#define DEBUG_MCO (0) // Output the MCO1/MCO2 on PA8/PC9 for debugging (0=OFF, 1=ON) - - #ifndef DEBUG_CONSOLE #define DEBUG_CONSOLE 0 #endif - -#define V_BATT_REFF 8.20 // max napatie baterii -const double voltage_divider_ref = V_BATT_REFF * (1.00/(1.00+1.60)); // max uroven napatia na delici -const char *delimiter=":"; // delimiter na prijatie spravy -// #define MEASURE_PERIOD 30.00 -volatile int measurePeriod = 60; // in seconds -volatile uint32_t timeCounter = 0; - - #define USB_TX PA_9 #define USB_RX PA_10 - #define LORA_TX PA_11 #define LORA_RX PA_12 - #define THERM_PIN PB_8 #define LED_PIN PB_0 - -#define BUF_SIZE 256 - #define FOTO_PIN PA_1 #define BATTERY_PIN PA_3 +#define BUF_SIZE 256 +#define V_BATT_REFF 8.20 // max napatie baterii + +volatile int measurePeriod = 60; // in seconds + +const double voltage_divider_ref = V_BATT_REFF * (1.00/(1.00+1.60)); // max uroven napatia na delici +const char *delimiter=":"; // delimiter na prijatie spravy +volatile uint32_t timeCounter = 0; + +DS18B20 thermometer(true, true, false,THERM_PIN); AnalogIn foto(FOTO_PIN); AnalogIn battery(BATTERY_PIN); DigitalOut led(LED_PIN); -Ticker measureTicker; +Ticker secondTicker; Serial lora(LORA_TX, LORA_RX,115200); + #if DEBUG_CONSOLE Serial usb(USB_TX, USB_RX,115200); #endif -DS18B20 thermometer(true, true, false,THERM_PIN); -char buffer[64]; -char hexBuffer[128]; + +char buffer[BUF_SIZE]; +char hexBuffer[BUF_SIZE]; char rxBuffer[BUF_SIZE]; char rxMessage[BUF_SIZE]; char message[BUF_SIZE]; + volatile int8_t rxPtr = 0; +volatile uint8_t numOfERR = 0; +volatile float batteryValue = 0.00; +volatile float temperature = 0.00; +volatile uint16_t fotoValue = 0; + + volatile bool measure = true; volatile bool rxDone = false; - volatile bool receiveOK=false; volatile bool receiveACK=false; volatile bool receiveJOIN=false; volatile bool receiveERR=false; -volatile uint8_t numOfERR = 0; -volatile float batteryValue = 0.00; -volatile uint16_t fotoValue = 0; -/* -int main() { + +// ----------------------------------------------------------------------------- +void onSecondTick(); +void rxLoraInterrupt(); +void clearRxBuffer(); +void resetModule(); +void init(); +void onMeasure(); +void onReceive(); +// ----------------------------------------------------------------------------- + - while(1) { - while(usb.readable()) { - lora.putc(usb.getc()); +int main() +{ + #if DEBUG_CONSOLE + usb.printf("\r\n ------------ START APPLICATION ------------ \r\n"); + usb.printf("HCLK frequency : %d \r\n",HAL_RCC_GetHCLKFreq()); + usb.printf("System clock : %d \r\n", SystemCoreClock); + #endif + init(); + while(true) { + if(measure) { + onMeasure(); } - while(lora.readable()) { - usb.putc(lora.getc()); + + if(receiveACK) { + onReceive(); } + + if(receiveERR) { + receiveERR = false; + } + + if(receiveOK) { + receiveOK = false; + } + hal_sleep(); } } -*/ + void clearRxBuffer() { @@ -98,33 +118,33 @@ wait(0.2); receiveJOIN = false; lora.printf("at+set_config=device:restart\r\n"); -#if DEBUG_CONSOLE - usb.printf("Joining to network... \r\n"); -#endif - + #if DEBUG_CONSOLE + usb.printf("Joining to network... \r\n"); + #endif + Timer timer; timer.reset(); timer.start(); - while(1) - { - if(receiveJOIN) + while(1) + { + if(receiveJOIN) { -#if DEBUG_CONSOLE - usb.printf("Join OK \r\n"); -#endif + #if DEBUG_CONSOLE + usb.printf("Join OK \r\n"); + #endif timer.stop(); receiveJOIN=false; break; } - if(timer.read_ms() > 30000) + if(timer.read_ms() > 30000) { timer.stop(); timer.reset(); timer.start(); lora.printf("at+join\r\n"); -#if DEBUG_CONSOLE - usb.printf("Joining...\r\n"); -#endif + #if DEBUG_CONSOLE + usb.printf("Joining...\r\n"); + #endif } } timer.stop(); @@ -140,27 +160,27 @@ if(rxPtr >= sizeof(rxBuffer) - 1) clearRxBuffer(); rxBuffer[rxPtr++] = c; - + if(c =='\n') { rxDone = true; - - if( strncmp( ( const char* )rxBuffer, "at+recv", 7) == 0) + + if( strncmp( ( const char* )rxBuffer, "at+recv", 7) == 0) { receiveACK = true; snprintf((char *)rxMessage, BUF_SIZE, "%s", rxBuffer); clearRxBuffer(); return; } - - if(strncmp( ( const char* )rxBuffer, "OK", 2) == 0) + + if(strncmp( ( const char* )rxBuffer, "OK", 2) == 0) { receiveOK = true; clearRxBuffer(); return; } - - if(strncmp( ( const char* )rxBuffer, "ERROR", 5) == 0) + + if(strncmp( ( const char* )rxBuffer, "ERROR", 5) == 0) { receiveERR = true; numOfERR++; @@ -168,22 +188,21 @@ return; } - if( strncmp( ( const char* )rxBuffer, "[LoRa]:Join Success", 19) == 0) + if( strncmp( ( const char* )rxBuffer, "[LoRa]:Join Success", 19) == 0) { receiveJOIN = true; clearRxBuffer(); return; } - clearRxBuffer(); } } } -void onMeasure() +void onSecondTick() { timeCounter++; - if(timeCounter >= measurePeriod) + if(timeCounter >= measurePeriod) { timeCounter = 0; measure = true; @@ -193,9 +212,9 @@ void init() { + led = 1; // led OFF timeCounter = 0; - measureTicker.detach(); - led = 1; + secondTicker.detach(); clearRxBuffer(); lora.attach(&rxLoraInterrupt, Serial::RxIrq); resetModule(); @@ -204,128 +223,89 @@ memset(buffer, '\0', sizeof(buffer)); memset(hexBuffer, '\0', sizeof(hexBuffer)); memset(rxBuffer, '\0', sizeof(rxBuffer)); - sprintf(hexBuffer,"at+send=lora:11:"); - measureTicker.attach(&onMeasure, 1.0); + memset(rxMessage, '\0', sizeof(rxMessage)); + memset(message, '\0', sizeof(message)); + sprintf(hexBuffer,"at+send=lora:1:"); + secondTicker.attach(&onSecondTick, 1.0); +} + +void onMeasure() +{ + fotoValue = foto.read_u16(); + batteryValue = (((battery.read_u16()/65535.0)*3.30)/voltage_divider_ref)*V_BATT_REFF; + lora.printf("at+set_config=device:sleep:0\r\n"); + temperature = thermometer.readTemperature(); + sprintf(buffer, "%.2f;%.2f;%d", batteryValue, temperature, fotoValue); + for(int i=0; i < sizeof(buffer); i++) + { + if(buffer[i] == '\0') + break; + sprintf(hexBuffer + strlen(hexBuffer), "%02x",buffer[i]); + } + #if DEBUG_CONSOLE + usb.printf("Buffer : %s\r\n", buffer); + #endif + lora.printf("%s\r\n", hexBuffer); + memset(buffer, '\0', sizeof(buffer)); + memset(hexBuffer, '\0', sizeof(hexBuffer)); + sprintf(hexBuffer,"at+send=lora:1:"); + measure=false; } - - -int main() +void onReceive() { -#if DEBUG_CONSOLE - usb.printf("\r\n ------------ START APPLICATION ------------ \r\n"); - usb.printf("HCLK frequency : %d \r\n",HAL_RCC_GetHCLKFreq()); - usb.printf("System clock : %d \r\n", SystemCoreClock); -#endif - init(); - float val = 0.0; - while(true) + #if DEBUG_CONSOLE + usb.printf("%s",rxMessage); + #endif + if(rxMessage[8] != '0') { - if(measure) + char *e; + int idx; + e = strchr(rxMessage, ':'); + idx = (int)(e - rxMessage); + char str[3]; + str[2]='\0'; + int8_t j = 0; + memset(message, '\0', sizeof(message)); + + for(int i=idx+1; i<sizeof(rxMessage); i+=2) { - fotoValue = foto.read_u16(); - batteryValue = (((battery.read_u16()/65535.0)*3.30)/voltage_divider_ref)*V_BATT_REFF; - lora.printf("at+set_config=device:sleep:0\r\n"); - val = thermometer.readTemperature(); - sprintf(buffer, "%.2f;%.2f;%d", batteryValue, val, fotoValue); - for(int i=0; i < sizeof(buffer); i++) - { - if(buffer[i] == '\0') - break; - sprintf(hexBuffer + strlen(hexBuffer), "%02x",buffer[i]); - } -#if DEBUG_CONSOLE - usb.printf("Buffer : %s\r\n", buffer); -// usb.printf("HEX Buffer : %s\r\n", hexBuffer); -#endif - lora.printf("%s\r\n", hexBuffer); - memset(buffer, '\0', sizeof(buffer)); - memset(hexBuffer, '\0', sizeof(hexBuffer)); - sprintf(hexBuffer,"at+send=lora:11:"); - measure=false; + if((rxMessage[i] == '\r') || (rxMessage[i] == '\n')) + break; + str[0]=rxMessage[i]; + str[1]=rxMessage[i+1]; + char chr = (char)(int)strtol((const char *)str, NULL, 16); + message[j++] = chr; } - - if(receiveACK) - { -#if DEBUG_CONSOLE - usb.printf("%s",rxMessage); -#endif - if(rxMessage[8] != '0') - { - char *e; - int idx; - - e = strchr(rxMessage, ':'); - idx = (int)(e - rxMessage); - - char str[3]; - str[2]='\0'; - int8_t j = 0; - memset(message, '\0', sizeof(message)); - for(int i=idx+1; i<sizeof(rxMessage); i+=2) - { - if((rxMessage[i] == '\r') || (rxMessage[i] == '\n')) - break; - str[0]=rxMessage[i]; - str[1]=rxMessage[i+1]; - char chr = (char)(int)strtol((const char *)str, NULL, 16); - - message[j++] = chr; - } - - if(rxMessage[8] == '1') // nastavenie intervalu merania v sekundach - { - timeCounter = 0; - measurePeriod = atoi((const char*)(message)); -#if DEBUG_CONSOLE - usb.printf("Converted number : %d \r\n", measurePeriod); -#endif -// measure = true; - } - else if(rxMessage[8] == '2') - { - lora.printf("%s\r\n", message); - wait(0.2); - } -#if DEBUG_CONSOLE - usb.printf("Received message : %s \r\n", message); -#endif - -// if( strncmp( ( const char* )message, "at+set_config=lora:class:", 25) == 0) -// resetModule(); - - - } - - memset(rxMessage, '\0', sizeof(rxMessage)); -// usb.printf("HAL SLEEP \r\n"); - lora.printf("at+set_config=device:sleep:1\r\n"); - receiveACK = false; - // hal_sleep(); + if(rxMessage[8] == '1') + { // nastavenie intervalu merania v sekundach + timeCounter = 0; + measurePeriod = atoi((const char*)(message)); + #if DEBUG_CONSOLE + usb.printf("Converted number : %d \r\n", measurePeriod); + #endif + } + else if(rxMessage[8] == '2') + { + if( strncmp( ( const char* )message, "reset", 5) == 0) + { + #if DEBUG_CONSOLE + usb.printf("Received message : %s \r\n", message); + usb.printf("\r\n ------------ SOFTWARE RESET ------------ \r\n"); + #endif + NVIC_SystemReset(); + } + lora.printf("at+set_config=device:sleep:0\r\n"); + wait(0.1); + lora.printf("%s\r\n", message); + wait(0.2); } - - if(receiveERR) - { - receiveERR = false; -// memset(rxMessage, '\0', sizeof(rxMessage)); -/* - if(numOfERR > 4) - { - measureTicker.detach(); - resetModule(); - measureTicker.attach(&onMeasure, 1.00); - } -*/ - } - - if(receiveOK) - { - receiveOK = false; - } - - hal_sleep(); -// hal_deepsleep(); - + #if DEBUG_CONSOLE + usb.printf("Received message : %s \r\n", message); + #endif } + memset(rxMessage, '\0', sizeof(rxMessage)); + lora.printf("at+set_config=device:sleep:1\r\n"); + receiveACK = false; } \ No newline at end of file