ver. 1

Dependencies:   mbed OneWireCRC_LoRa_Node

Files at this revision

API Documentation at this revision

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