ver. 1

Dependencies:   mbed OneWireCRC_LoRa_Node

Committer:
lukas_formanek
Date:
Sat May 08 18:34:38 2021 +0000
Revision:
2:e731b7dba32b
Parent:
1:8a60d7a33fa5
LoRaWAN_Node

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lukas_formanek 1:8a60d7a33fa5 1 #include "stm32f4xx_hal.h"
lukas_formanek 1:8a60d7a33fa5 2 #include "stm32f4xx.h"
lukas_formanek 1:8a60d7a33fa5 3 #include "hal_tick.h"
lukas_formanek 0:7f12b35d7969 4 #include "mbed.h"
lukas_formanek 0:7f12b35d7969 5 //#include "stdio.h"
lukas_formanek 0:7f12b35d7969 6 //#include <sstream>
lukas_formanek 2:e731b7dba32b 7 //#include <iostream>
lukas_formanek 2:e731b7dba32b 8 //#include <string>
lukas_formanek 0:7f12b35d7969 9 #include "DS18B20.h"
lukas_formanek 0:7f12b35d7969 10 #include "OneWireDefs.h"
lukas_formanek 0:7f12b35d7969 11
lukas_formanek 0:7f12b35d7969 12
lukas_formanek 0:7f12b35d7969 13 #ifndef DEBUG_CONSOLE
lukas_formanek 1:8a60d7a33fa5 14 #define DEBUG_CONSOLE 0
lukas_formanek 0:7f12b35d7969 15 #endif
lukas_formanek 0:7f12b35d7969 16
lukas_formanek 1:8a60d7a33fa5 17 #define USB_TX PA_9
lukas_formanek 1:8a60d7a33fa5 18 #define USB_RX PA_10
lukas_formanek 1:8a60d7a33fa5 19 #define LORA_TX PA_11
lukas_formanek 1:8a60d7a33fa5 20 #define LORA_RX PA_12
lukas_formanek 1:8a60d7a33fa5 21 #define THERM_PIN PB_8
lukas_formanek 1:8a60d7a33fa5 22 #define LED_PIN PB_0
lukas_formanek 0:7f12b35d7969 23 #define FOTO_PIN PA_1
lukas_formanek 0:7f12b35d7969 24 #define BATTERY_PIN PA_3
lukas_formanek 0:7f12b35d7969 25
lukas_formanek 2:e731b7dba32b 26 #define BUF_SIZE 256
lukas_formanek 2:e731b7dba32b 27 #define V_BATT_REFF 8.20 // max napatie baterii
lukas_formanek 2:e731b7dba32b 28
lukas_formanek 2:e731b7dba32b 29 volatile int measurePeriod = 60; // in seconds
lukas_formanek 2:e731b7dba32b 30
lukas_formanek 2:e731b7dba32b 31 const double voltage_divider_ref = V_BATT_REFF * (1.00/(1.00+1.60)); // max uroven napatia na delici
lukas_formanek 2:e731b7dba32b 32 const char *delimiter=":"; // delimiter na prijatie spravy
lukas_formanek 2:e731b7dba32b 33 volatile uint32_t timeCounter = 0;
lukas_formanek 2:e731b7dba32b 34
lukas_formanek 2:e731b7dba32b 35 DS18B20 thermometer(true, true, false,THERM_PIN);
lukas_formanek 0:7f12b35d7969 36 AnalogIn foto(FOTO_PIN);
lukas_formanek 0:7f12b35d7969 37 AnalogIn battery(BATTERY_PIN);
lukas_formanek 0:7f12b35d7969 38 DigitalOut led(LED_PIN);
lukas_formanek 2:e731b7dba32b 39 Ticker secondTicker;
lukas_formanek 0:7f12b35d7969 40
lukas_formanek 0:7f12b35d7969 41 Serial lora(LORA_TX, LORA_RX,115200);
lukas_formanek 2:e731b7dba32b 42
lukas_formanek 0:7f12b35d7969 43 #if DEBUG_CONSOLE
lukas_formanek 0:7f12b35d7969 44 Serial usb(USB_TX, USB_RX,115200);
lukas_formanek 0:7f12b35d7969 45 #endif
lukas_formanek 0:7f12b35d7969 46
lukas_formanek 2:e731b7dba32b 47
lukas_formanek 2:e731b7dba32b 48 char buffer[BUF_SIZE];
lukas_formanek 2:e731b7dba32b 49 char hexBuffer[BUF_SIZE];
lukas_formanek 0:7f12b35d7969 50 char rxBuffer[BUF_SIZE];
lukas_formanek 0:7f12b35d7969 51 char rxMessage[BUF_SIZE];
lukas_formanek 0:7f12b35d7969 52 char message[BUF_SIZE];
lukas_formanek 2:e731b7dba32b 53
lukas_formanek 0:7f12b35d7969 54 volatile int8_t rxPtr = 0;
lukas_formanek 2:e731b7dba32b 55 volatile uint8_t numOfERR = 0;
lukas_formanek 2:e731b7dba32b 56 volatile float batteryValue = 0.00;
lukas_formanek 2:e731b7dba32b 57 volatile float temperature = 0.00;
lukas_formanek 2:e731b7dba32b 58 volatile uint16_t fotoValue = 0;
lukas_formanek 2:e731b7dba32b 59
lukas_formanek 2:e731b7dba32b 60
lukas_formanek 0:7f12b35d7969 61 volatile bool measure = true;
lukas_formanek 0:7f12b35d7969 62 volatile bool rxDone = false;
lukas_formanek 0:7f12b35d7969 63 volatile bool receiveOK=false;
lukas_formanek 0:7f12b35d7969 64 volatile bool receiveACK=false;
lukas_formanek 0:7f12b35d7969 65 volatile bool receiveJOIN=false;
lukas_formanek 0:7f12b35d7969 66 volatile bool receiveERR=false;
lukas_formanek 2:e731b7dba32b 67
lukas_formanek 2:e731b7dba32b 68 // -----------------------------------------------------------------------------
lukas_formanek 2:e731b7dba32b 69 void onSecondTick();
lukas_formanek 2:e731b7dba32b 70 void rxLoraInterrupt();
lukas_formanek 2:e731b7dba32b 71 void clearRxBuffer();
lukas_formanek 2:e731b7dba32b 72 void resetModule();
lukas_formanek 2:e731b7dba32b 73 void init();
lukas_formanek 2:e731b7dba32b 74 void onMeasure();
lukas_formanek 2:e731b7dba32b 75 void onReceive();
lukas_formanek 2:e731b7dba32b 76 // -----------------------------------------------------------------------------
lukas_formanek 2:e731b7dba32b 77
lukas_formanek 0:7f12b35d7969 78
lukas_formanek 2:e731b7dba32b 79 int main()
lukas_formanek 2:e731b7dba32b 80 {
lukas_formanek 2:e731b7dba32b 81 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 82 usb.printf("\r\n ------------ START APPLICATION ------------ \r\n");
lukas_formanek 2:e731b7dba32b 83 usb.printf("HCLK frequency : %d \r\n",HAL_RCC_GetHCLKFreq());
lukas_formanek 2:e731b7dba32b 84 usb.printf("System clock : %d \r\n", SystemCoreClock);
lukas_formanek 2:e731b7dba32b 85 #endif
lukas_formanek 2:e731b7dba32b 86 init();
lukas_formanek 2:e731b7dba32b 87 while(true) {
lukas_formanek 2:e731b7dba32b 88 if(measure) {
lukas_formanek 2:e731b7dba32b 89 onMeasure();
lukas_formanek 0:7f12b35d7969 90 }
lukas_formanek 2:e731b7dba32b 91
lukas_formanek 2:e731b7dba32b 92 if(receiveACK) {
lukas_formanek 2:e731b7dba32b 93 onReceive();
lukas_formanek 0:7f12b35d7969 94 }
lukas_formanek 2:e731b7dba32b 95
lukas_formanek 2:e731b7dba32b 96 if(receiveERR) {
lukas_formanek 2:e731b7dba32b 97 receiveERR = false;
lukas_formanek 2:e731b7dba32b 98 }
lukas_formanek 2:e731b7dba32b 99
lukas_formanek 2:e731b7dba32b 100 if(receiveOK) {
lukas_formanek 2:e731b7dba32b 101 receiveOK = false;
lukas_formanek 2:e731b7dba32b 102 }
lukas_formanek 2:e731b7dba32b 103 hal_sleep();
lukas_formanek 0:7f12b35d7969 104 }
lukas_formanek 0:7f12b35d7969 105 }
lukas_formanek 2:e731b7dba32b 106
lukas_formanek 0:7f12b35d7969 107
lukas_formanek 0:7f12b35d7969 108 void clearRxBuffer()
lukas_formanek 0:7f12b35d7969 109 {
lukas_formanek 0:7f12b35d7969 110 memset(rxBuffer, '\0', sizeof(rxBuffer));
lukas_formanek 0:7f12b35d7969 111 rxPtr = 0;
lukas_formanek 0:7f12b35d7969 112 };
lukas_formanek 0:7f12b35d7969 113
lukas_formanek 0:7f12b35d7969 114 void resetModule()
lukas_formanek 0:7f12b35d7969 115 {
lukas_formanek 0:7f12b35d7969 116 numOfERR = 0;
lukas_formanek 0:7f12b35d7969 117 lora.printf("at+set_config=device:sleep:0\r\n");
lukas_formanek 0:7f12b35d7969 118 wait(0.2);
lukas_formanek 0:7f12b35d7969 119 receiveJOIN = false;
lukas_formanek 0:7f12b35d7969 120 lora.printf("at+set_config=device:restart\r\n");
lukas_formanek 2:e731b7dba32b 121 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 122 usb.printf("Joining to network... \r\n");
lukas_formanek 2:e731b7dba32b 123 #endif
lukas_formanek 2:e731b7dba32b 124
lukas_formanek 0:7f12b35d7969 125 Timer timer;
lukas_formanek 0:7f12b35d7969 126 timer.reset();
lukas_formanek 0:7f12b35d7969 127 timer.start();
lukas_formanek 2:e731b7dba32b 128 while(1)
lukas_formanek 2:e731b7dba32b 129 {
lukas_formanek 2:e731b7dba32b 130 if(receiveJOIN)
lukas_formanek 0:7f12b35d7969 131 {
lukas_formanek 2:e731b7dba32b 132 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 133 usb.printf("Join OK \r\n");
lukas_formanek 2:e731b7dba32b 134 #endif
lukas_formanek 0:7f12b35d7969 135 timer.stop();
lukas_formanek 0:7f12b35d7969 136 receiveJOIN=false;
lukas_formanek 0:7f12b35d7969 137 break;
lukas_formanek 0:7f12b35d7969 138 }
lukas_formanek 2:e731b7dba32b 139 if(timer.read_ms() > 30000)
lukas_formanek 0:7f12b35d7969 140 {
lukas_formanek 0:7f12b35d7969 141 timer.stop();
lukas_formanek 0:7f12b35d7969 142 timer.reset();
lukas_formanek 0:7f12b35d7969 143 timer.start();
lukas_formanek 0:7f12b35d7969 144 lora.printf("at+join\r\n");
lukas_formanek 2:e731b7dba32b 145 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 146 usb.printf("Joining...\r\n");
lukas_formanek 2:e731b7dba32b 147 #endif
lukas_formanek 0:7f12b35d7969 148 }
lukas_formanek 0:7f12b35d7969 149 }
lukas_formanek 0:7f12b35d7969 150 timer.stop();
lukas_formanek 0:7f12b35d7969 151 }
lukas_formanek 0:7f12b35d7969 152
lukas_formanek 0:7f12b35d7969 153
lukas_formanek 0:7f12b35d7969 154 void rxLoraInterrupt()
lukas_formanek 0:7f12b35d7969 155 {
lukas_formanek 0:7f12b35d7969 156 while (lora.readable())
lukas_formanek 0:7f12b35d7969 157 {
lukas_formanek 0:7f12b35d7969 158 char c = lora.getc();
lukas_formanek 0:7f12b35d7969 159 // usb.putc(c);
lukas_formanek 0:7f12b35d7969 160 if(rxPtr >= sizeof(rxBuffer) - 1)
lukas_formanek 0:7f12b35d7969 161 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 162 rxBuffer[rxPtr++] = c;
lukas_formanek 2:e731b7dba32b 163
lukas_formanek 0:7f12b35d7969 164 if(c =='\n')
lukas_formanek 0:7f12b35d7969 165 {
lukas_formanek 0:7f12b35d7969 166 rxDone = true;
lukas_formanek 2:e731b7dba32b 167
lukas_formanek 2:e731b7dba32b 168 if( strncmp( ( const char* )rxBuffer, "at+recv", 7) == 0)
lukas_formanek 0:7f12b35d7969 169 {
lukas_formanek 0:7f12b35d7969 170 receiveACK = true;
lukas_formanek 0:7f12b35d7969 171 snprintf((char *)rxMessage, BUF_SIZE, "%s", rxBuffer);
lukas_formanek 0:7f12b35d7969 172 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 173 return;
lukas_formanek 0:7f12b35d7969 174 }
lukas_formanek 2:e731b7dba32b 175
lukas_formanek 2:e731b7dba32b 176 if(strncmp( ( const char* )rxBuffer, "OK", 2) == 0)
lukas_formanek 0:7f12b35d7969 177 {
lukas_formanek 0:7f12b35d7969 178 receiveOK = true;
lukas_formanek 0:7f12b35d7969 179 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 180 return;
lukas_formanek 0:7f12b35d7969 181 }
lukas_formanek 2:e731b7dba32b 182
lukas_formanek 2:e731b7dba32b 183 if(strncmp( ( const char* )rxBuffer, "ERROR", 5) == 0)
lukas_formanek 0:7f12b35d7969 184 {
lukas_formanek 0:7f12b35d7969 185 receiveERR = true;
lukas_formanek 0:7f12b35d7969 186 numOfERR++;
lukas_formanek 0:7f12b35d7969 187 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 188 return;
lukas_formanek 0:7f12b35d7969 189 }
lukas_formanek 0:7f12b35d7969 190
lukas_formanek 2:e731b7dba32b 191 if( strncmp( ( const char* )rxBuffer, "[LoRa]:Join Success", 19) == 0)
lukas_formanek 0:7f12b35d7969 192 {
lukas_formanek 0:7f12b35d7969 193 receiveJOIN = true;
lukas_formanek 0:7f12b35d7969 194 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 195 return;
lukas_formanek 0:7f12b35d7969 196 }
lukas_formanek 0:7f12b35d7969 197 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 198 }
lukas_formanek 0:7f12b35d7969 199 }
lukas_formanek 0:7f12b35d7969 200 }
lukas_formanek 0:7f12b35d7969 201
lukas_formanek 2:e731b7dba32b 202 void onSecondTick()
lukas_formanek 0:7f12b35d7969 203 {
lukas_formanek 0:7f12b35d7969 204 timeCounter++;
lukas_formanek 2:e731b7dba32b 205 if(timeCounter >= measurePeriod)
lukas_formanek 0:7f12b35d7969 206 {
lukas_formanek 0:7f12b35d7969 207 timeCounter = 0;
lukas_formanek 0:7f12b35d7969 208 measure = true;
lukas_formanek 0:7f12b35d7969 209 return;
lukas_formanek 0:7f12b35d7969 210 }
lukas_formanek 0:7f12b35d7969 211 }
lukas_formanek 0:7f12b35d7969 212
lukas_formanek 0:7f12b35d7969 213 void init()
lukas_formanek 0:7f12b35d7969 214 {
lukas_formanek 2:e731b7dba32b 215 led = 1; // led OFF
lukas_formanek 0:7f12b35d7969 216 timeCounter = 0;
lukas_formanek 2:e731b7dba32b 217 secondTicker.detach();
lukas_formanek 0:7f12b35d7969 218 clearRxBuffer();
lukas_formanek 0:7f12b35d7969 219 lora.attach(&rxLoraInterrupt, Serial::RxIrq);
lukas_formanek 0:7f12b35d7969 220 resetModule();
lukas_formanek 0:7f12b35d7969 221 thermometer.initialize();
lukas_formanek 0:7f12b35d7969 222 thermometer.setResolution(twelveBit);
lukas_formanek 0:7f12b35d7969 223 memset(buffer, '\0', sizeof(buffer));
lukas_formanek 0:7f12b35d7969 224 memset(hexBuffer, '\0', sizeof(hexBuffer));
lukas_formanek 0:7f12b35d7969 225 memset(rxBuffer, '\0', sizeof(rxBuffer));
lukas_formanek 2:e731b7dba32b 226 memset(rxMessage, '\0', sizeof(rxMessage));
lukas_formanek 2:e731b7dba32b 227 memset(message, '\0', sizeof(message));
lukas_formanek 2:e731b7dba32b 228 sprintf(hexBuffer,"at+send=lora:1:");
lukas_formanek 2:e731b7dba32b 229 secondTicker.attach(&onSecondTick, 1.0);
lukas_formanek 2:e731b7dba32b 230 }
lukas_formanek 2:e731b7dba32b 231
lukas_formanek 2:e731b7dba32b 232 void onMeasure()
lukas_formanek 2:e731b7dba32b 233 {
lukas_formanek 2:e731b7dba32b 234 fotoValue = foto.read_u16();
lukas_formanek 2:e731b7dba32b 235 batteryValue = (((battery.read_u16()/65535.0)*3.30)/voltage_divider_ref)*V_BATT_REFF;
lukas_formanek 2:e731b7dba32b 236 lora.printf("at+set_config=device:sleep:0\r\n");
lukas_formanek 2:e731b7dba32b 237 temperature = thermometer.readTemperature();
lukas_formanek 2:e731b7dba32b 238 sprintf(buffer, "%.2f;%.2f;%d", batteryValue, temperature, fotoValue);
lukas_formanek 2:e731b7dba32b 239 for(int i=0; i < sizeof(buffer); i++)
lukas_formanek 2:e731b7dba32b 240 {
lukas_formanek 2:e731b7dba32b 241 if(buffer[i] == '\0')
lukas_formanek 2:e731b7dba32b 242 break;
lukas_formanek 2:e731b7dba32b 243 sprintf(hexBuffer + strlen(hexBuffer), "%02x",buffer[i]);
lukas_formanek 2:e731b7dba32b 244 }
lukas_formanek 2:e731b7dba32b 245 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 246 usb.printf("Buffer : %s\r\n", buffer);
lukas_formanek 2:e731b7dba32b 247 #endif
lukas_formanek 2:e731b7dba32b 248 lora.printf("%s\r\n", hexBuffer);
lukas_formanek 2:e731b7dba32b 249 memset(buffer, '\0', sizeof(buffer));
lukas_formanek 2:e731b7dba32b 250 memset(hexBuffer, '\0', sizeof(hexBuffer));
lukas_formanek 2:e731b7dba32b 251 sprintf(hexBuffer,"at+send=lora:1:");
lukas_formanek 2:e731b7dba32b 252 measure=false;
lukas_formanek 0:7f12b35d7969 253 }
lukas_formanek 0:7f12b35d7969 254
lukas_formanek 2:e731b7dba32b 255 void onReceive()
lukas_formanek 0:7f12b35d7969 256 {
lukas_formanek 2:e731b7dba32b 257 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 258 usb.printf("%s",rxMessage);
lukas_formanek 2:e731b7dba32b 259 #endif
lukas_formanek 2:e731b7dba32b 260 if(rxMessage[8] != '0')
lukas_formanek 0:7f12b35d7969 261 {
lukas_formanek 2:e731b7dba32b 262 char *e;
lukas_formanek 2:e731b7dba32b 263 int idx;
lukas_formanek 2:e731b7dba32b 264 e = strchr(rxMessage, ':');
lukas_formanek 2:e731b7dba32b 265 idx = (int)(e - rxMessage);
lukas_formanek 2:e731b7dba32b 266 char str[3];
lukas_formanek 2:e731b7dba32b 267 str[2]='\0';
lukas_formanek 2:e731b7dba32b 268 int8_t j = 0;
lukas_formanek 2:e731b7dba32b 269 memset(message, '\0', sizeof(message));
lukas_formanek 2:e731b7dba32b 270
lukas_formanek 2:e731b7dba32b 271 for(int i=idx+1; i<sizeof(rxMessage); i+=2)
lukas_formanek 0:7f12b35d7969 272 {
lukas_formanek 2:e731b7dba32b 273 if((rxMessage[i] == '\r') || (rxMessage[i] == '\n'))
lukas_formanek 2:e731b7dba32b 274 break;
lukas_formanek 2:e731b7dba32b 275 str[0]=rxMessage[i];
lukas_formanek 2:e731b7dba32b 276 str[1]=rxMessage[i+1];
lukas_formanek 2:e731b7dba32b 277 char chr = (char)(int)strtol((const char *)str, NULL, 16);
lukas_formanek 2:e731b7dba32b 278 message[j++] = chr;
lukas_formanek 0:7f12b35d7969 279 }
lukas_formanek 0:7f12b35d7969 280
lukas_formanek 2:e731b7dba32b 281 if(rxMessage[8] == '1')
lukas_formanek 2:e731b7dba32b 282 { // nastavenie intervalu merania v sekundach
lukas_formanek 2:e731b7dba32b 283 timeCounter = 0;
lukas_formanek 2:e731b7dba32b 284 measurePeriod = atoi((const char*)(message));
lukas_formanek 2:e731b7dba32b 285 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 286 usb.printf("Converted number : %d \r\n", measurePeriod);
lukas_formanek 2:e731b7dba32b 287 #endif
lukas_formanek 2:e731b7dba32b 288 }
lukas_formanek 2:e731b7dba32b 289 else if(rxMessage[8] == '2')
lukas_formanek 2:e731b7dba32b 290 {
lukas_formanek 2:e731b7dba32b 291 if( strncmp( ( const char* )message, "reset", 5) == 0)
lukas_formanek 2:e731b7dba32b 292 {
lukas_formanek 2:e731b7dba32b 293 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 294 usb.printf("Received message : %s \r\n", message);
lukas_formanek 2:e731b7dba32b 295 usb.printf("\r\n ------------ SOFTWARE RESET ------------ \r\n");
lukas_formanek 2:e731b7dba32b 296 #endif
lukas_formanek 2:e731b7dba32b 297 NVIC_SystemReset();
lukas_formanek 2:e731b7dba32b 298 }
lukas_formanek 2:e731b7dba32b 299 lora.printf("at+set_config=device:sleep:0\r\n");
lukas_formanek 2:e731b7dba32b 300 wait(0.1);
lukas_formanek 2:e731b7dba32b 301 lora.printf("%s\r\n", message);
lukas_formanek 2:e731b7dba32b 302 wait(0.2);
lukas_formanek 0:7f12b35d7969 303 }
lukas_formanek 2:e731b7dba32b 304 #if DEBUG_CONSOLE
lukas_formanek 2:e731b7dba32b 305 usb.printf("Received message : %s \r\n", message);
lukas_formanek 2:e731b7dba32b 306 #endif
lukas_formanek 0:7f12b35d7969 307 }
lukas_formanek 2:e731b7dba32b 308 memset(rxMessage, '\0', sizeof(rxMessage));
lukas_formanek 2:e731b7dba32b 309 lora.printf("at+set_config=device:sleep:1\r\n");
lukas_formanek 2:e731b7dba32b 310 receiveACK = false;
lukas_formanek 1:8a60d7a33fa5 311 }