B-L072 ST Board BMP280 LoRaWAN end node

Dependencies:   BME280

Temperature/Pressure LoRaWAN End Node

Committer:
saranjay
Date:
Sat Jul 25 06:40:08 2020 +0000
Revision:
61:d220d51ae9d8
Parent:
60:ff7a31e79593
Child:
62:078d66d985f8
end node.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:7037ed05f54f 1 #include <stdio.h>
saranjay 61:d220d51ae9d8 2 #include "BME280.h"
mbed_official 3:8c7198d1a2a1 3
mbed_official 0:7037ed05f54f 4 #include "lorawan/LoRaWANInterface.h"
mbed_official 0:7037ed05f54f 5 #include "lorawan/system/lorawan_data_structures.h"
mbed_official 0:7037ed05f54f 6 #include "events/EventQueue.h"
mbed_official 0:7037ed05f54f 7
saranjay 61:d220d51ae9d8 8 //#include "trace_helper.h"
mbed_official 0:7037ed05f54f 9 #include "lora_radio_helper.h"
mbed_official 0:7037ed05f54f 10
mbed_official 0:7037ed05f54f 11 using namespace events;
mbed_official 0:7037ed05f54f 12
mbed_official 12:5015dfead3f2 13 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
mbed_official 12:5015dfead3f2 14 // This example only communicates with much shorter messages (<30 bytes).
mbed_official 12:5015dfead3f2 15 // If longer messages are used, these buffers must be changed accordingly.
saranjay 61:d220d51ae9d8 16 //uint8_t tx_buffer[30];
saranjay 61:d220d51ae9d8 17 uint8_t tx_buffer[12];
mbed_official 12:5015dfead3f2 18 uint8_t rx_buffer[30];
mbed_official 0:7037ed05f54f 19
mbed_official 0:7037ed05f54f 20 /*
mbed_official 0:7037ed05f54f 21 * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
mbed_official 0:7037ed05f54f 22 */
mbed_official 0:7037ed05f54f 23 #define TX_TIMER 10000
mbed_official 0:7037ed05f54f 24
mbed_official 0:7037ed05f54f 25 /**
mbed_official 0:7037ed05f54f 26 * Maximum number of events for the event queue.
mbed_official 12:5015dfead3f2 27 * 10 is the safe number for the stack events, however, if application
mbed_official 0:7037ed05f54f 28 * also uses the queue for whatever purposes, this number should be increased.
mbed_official 0:7037ed05f54f 29 */
mbed_official 12:5015dfead3f2 30 #define MAX_NUMBER_OF_EVENTS 10
mbed_official 0:7037ed05f54f 31
mbed_official 0:7037ed05f54f 32 /**
mbed_official 0:7037ed05f54f 33 * Maximum number of retries for CONFIRMED messages before giving up
mbed_official 0:7037ed05f54f 34 */
mbed_official 0:7037ed05f54f 35 #define CONFIRMED_MSG_RETRY_COUNTER 3
mbed_official 0:7037ed05f54f 36
saranjay 61:d220d51ae9d8 37 #define DEBUG 1
saranjay 61:d220d51ae9d8 38 #define BUFFER_SIZE 12
mbed_official 0:7037ed05f54f 39
saranjay 61:d220d51ae9d8 40 BME280 sensor(PB_9, PB_8, 0x77);
mbed_official 0:7037ed05f54f 41
mbed_official 0:7037ed05f54f 42 /**
mbed_official 0:7037ed05f54f 43 * This event queue is the global event queue for both the
mbed_official 0:7037ed05f54f 44 * application and stack. To conserve memory, the stack is designed to run
mbed_official 0:7037ed05f54f 45 * in the same thread as the application and the application is responsible for
mbed_official 0:7037ed05f54f 46 * providing an event queue to the stack that will be used for ISR deferment as
mbed_official 0:7037ed05f54f 47 * well as application information event queuing.
mbed_official 0:7037ed05f54f 48 */
mbed_official 46:a124538e2891 49 static EventQueue ev_queue(MAX_NUMBER_OF_EVENTS *EVENTS_EVENT_SIZE);
mbed_official 0:7037ed05f54f 50
mbed_official 0:7037ed05f54f 51 /**
mbed_official 0:7037ed05f54f 52 * Event handler.
mbed_official 0:7037ed05f54f 53 *
mbed_official 0:7037ed05f54f 54 * This will be passed to the LoRaWAN stack to queue events for the
mbed_official 0:7037ed05f54f 55 * application which in turn drive the application.
mbed_official 0:7037ed05f54f 56 */
mbed_official 0:7037ed05f54f 57 static void lora_event_handler(lorawan_event_t event);
mbed_official 0:7037ed05f54f 58
mbed_official 0:7037ed05f54f 59 /**
mbed_official 46:a124538e2891 60 * Constructing Mbed LoRaWANInterface and passing it the radio object from lora_radio_helper.
mbed_official 0:7037ed05f54f 61 */
mbed_official 2:dc95ac6d6d4e 62 static LoRaWANInterface lorawan(radio);
mbed_official 0:7037ed05f54f 63
mbed_official 0:7037ed05f54f 64 /**
mbed_official 0:7037ed05f54f 65 * Application specific callbacks
mbed_official 0:7037ed05f54f 66 */
mbed_official 0:7037ed05f54f 67 static lorawan_app_callbacks_t callbacks;
saranjay 60:ff7a31e79593 68 static void send_message();
mbed_official 0:7037ed05f54f 69
mbed_official 0:7037ed05f54f 70 /**
mbed_official 0:7037ed05f54f 71 * Entry point for application
mbed_official 0:7037ed05f54f 72 */
mbed_official 46:a124538e2891 73 int main(void)
mbed_official 0:7037ed05f54f 74 {
mbed_official 0:7037ed05f54f 75 // setup tracing
saranjay 61:d220d51ae9d8 76 //setup_trace();
mbed_official 0:7037ed05f54f 77
mbed_official 0:7037ed05f54f 78 // stores the status of a call to LoRaWAN protocol
mbed_official 0:7037ed05f54f 79 lorawan_status_t retcode;
mbed_official 0:7037ed05f54f 80
mbed_official 0:7037ed05f54f 81 // Initialize LoRaWAN stack
mbed_official 2:dc95ac6d6d4e 82 if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
saranjay 61:d220d51ae9d8 83 if(DEBUG)
saranjay 61:d220d51ae9d8 84 printf("\r\n LoRa initialization failed! \r\n");
mbed_official 0:7037ed05f54f 85 return -1;
mbed_official 0:7037ed05f54f 86 }
mbed_official 0:7037ed05f54f 87
saranjay 61:d220d51ae9d8 88 if(DEBUG)
saranjay 61:d220d51ae9d8 89 printf("\r\n Mbed LoRaWANStack initialized \r\n");
mbed_official 0:7037ed05f54f 90
mbed_official 0:7037ed05f54f 91 // prepare application callbacks
mbed_official 0:7037ed05f54f 92 callbacks.events = mbed::callback(lora_event_handler);
mbed_official 2:dc95ac6d6d4e 93 lorawan.add_app_callbacks(&callbacks);
mbed_official 0:7037ed05f54f 94
mbed_official 0:7037ed05f54f 95 // Set number of retries in case of CONFIRMED messages
mbed_official 2:dc95ac6d6d4e 96 if (lorawan.set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER)
mbed_official 46:a124538e2891 97 != LORAWAN_STATUS_OK) {
saranjay 61:d220d51ae9d8 98 if(DEBUG)
saranjay 61:d220d51ae9d8 99 printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
mbed_official 0:7037ed05f54f 100 return -1;
mbed_official 0:7037ed05f54f 101 }
mbed_official 0:7037ed05f54f 102
saranjay 61:d220d51ae9d8 103 if(DEBUG)
saranjay 61:d220d51ae9d8 104 printf("\r\n CONFIRMED message retries : %d \r\n", CONFIRMED_MSG_RETRY_COUNTER);
mbed_official 0:7037ed05f54f 105
mbed_official 0:7037ed05f54f 106 // Enable adaptive data rate
mbed_official 2:dc95ac6d6d4e 107 if (lorawan.enable_adaptive_datarate() != LORAWAN_STATUS_OK) {
saranjay 61:d220d51ae9d8 108 if(DEBUG)
saranjay 61:d220d51ae9d8 109 printf("\r\n enable_adaptive_datarate failed! \r\n");
mbed_official 0:7037ed05f54f 110 return -1;
mbed_official 0:7037ed05f54f 111 }
mbed_official 0:7037ed05f54f 112
saranjay 61:d220d51ae9d8 113 if(DEBUG)
saranjay 61:d220d51ae9d8 114 printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
mbed_official 0:7037ed05f54f 115
mbed_official 2:dc95ac6d6d4e 116 retcode = lorawan.connect();
mbed_official 0:7037ed05f54f 117
saranjay 61:d220d51ae9d8 118 if (retcode == LORAWAN_STATUS_OK || retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) {
mbed_official 0:7037ed05f54f 119 } else {
saranjay 61:d220d51ae9d8 120 if(DEBUG)
saranjay 61:d220d51ae9d8 121 printf("\r\n Connection error, code = %d \r\n", retcode);
mbed_official 0:7037ed05f54f 122 return -1;
mbed_official 0:7037ed05f54f 123 }
mbed_official 0:7037ed05f54f 124
saranjay 61:d220d51ae9d8 125 if(DEBUG)
saranjay 61:d220d51ae9d8 126 printf("\r\n Connection - In Progress ...\r\n");
mbed_official 0:7037ed05f54f 127
mbed_official 0:7037ed05f54f 128 // make your event queue dispatching events forever
mbed_official 0:7037ed05f54f 129 ev_queue.dispatch_forever();
saranjay 60:ff7a31e79593 130
mbed_official 3:8c7198d1a2a1 131 return 0;
mbed_official 0:7037ed05f54f 132 }
mbed_official 0:7037ed05f54f 133
mbed_official 0:7037ed05f54f 134 /**
mbed_official 0:7037ed05f54f 135 * Sends a message to the Network Server
mbed_official 0:7037ed05f54f 136 */
mbed_official 0:7037ed05f54f 137 static void send_message()
mbed_official 0:7037ed05f54f 138 {
saranjay 61:d220d51ae9d8 139 uint16_t packet_len = BUFFER_SIZE;
mbed_official 0:7037ed05f54f 140 int16_t retcode;
saranjay 61:d220d51ae9d8 141 float sensor_values[3];
saranjay 61:d220d51ae9d8 142
saranjay 61:d220d51ae9d8 143 sensor.trigger();
saranjay 61:d220d51ae9d8 144 sensor_values[0] = sensor.getTemperature();
saranjay 61:d220d51ae9d8 145 sensor_values[1] = sensor.getPressure();
saranjay 61:d220d51ae9d8 146 sensor_values[2] = sensor.getHumidity();
mbed_official 0:7037ed05f54f 147
saranjay 61:d220d51ae9d8 148 memcpy(tx_buffer, sensor_values, packet_len);
saranjay 61:d220d51ae9d8 149
saranjay 61:d220d51ae9d8 150 //packet_len = sprintf((char *) tx_buffer, "Dummy Sensor Value is");
mbed_official 0:7037ed05f54f 151
saranjay 61:d220d51ae9d8 152 //retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG);
saranjay 61:d220d51ae9d8 153
saranjay 61:d220d51ae9d8 154 retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_UNCONFIRMED_FLAG);
mbed_official 0:7037ed05f54f 155
mbed_official 0:7037ed05f54f 156 if (retcode < 0) {
saranjay 61:d220d51ae9d8 157
saranjay 61:d220d51ae9d8 158 if(DEBUG)
saranjay 61:d220d51ae9d8 159 retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n")
saranjay 61:d220d51ae9d8 160 : printf("\r\n send() - Error code %d \r\n", retcode);
mbed_official 26:f07f5febf97f 161
mbed_official 26:f07f5febf97f 162 if (retcode == LORAWAN_STATUS_WOULD_BLOCK) {
mbed_official 26:f07f5febf97f 163 //retry in 3 seconds
mbed_official 26:f07f5febf97f 164 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 165 ev_queue.call_in(3000, send_message);
mbed_official 26:f07f5febf97f 166 }
mbed_official 26:f07f5febf97f 167 }
mbed_official 0:7037ed05f54f 168 return;
mbed_official 0:7037ed05f54f 169 }
mbed_official 0:7037ed05f54f 170
saranjay 61:d220d51ae9d8 171 if(DEBUG)
saranjay 61:d220d51ae9d8 172 printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
saranjay 61:d220d51ae9d8 173 //memset(tx_buffer, 0, sizeof(tx_buffer));
mbed_official 0:7037ed05f54f 174 }
mbed_official 0:7037ed05f54f 175
mbed_official 0:7037ed05f54f 176 /**
mbed_official 0:7037ed05f54f 177 * Receive a message from the Network Server
mbed_official 0:7037ed05f54f 178 */
mbed_official 0:7037ed05f54f 179 static void receive_message()
mbed_official 0:7037ed05f54f 180 {
mbed_official 47:b6d132f1079f 181 uint8_t port;
mbed_official 47:b6d132f1079f 182 int flags;
mbed_official 47:b6d132f1079f 183 int16_t retcode = lorawan.receive(rx_buffer, sizeof(rx_buffer), port, flags);
mbed_official 0:7037ed05f54f 184
mbed_official 0:7037ed05f54f 185 if (retcode < 0) {
mbed_official 0:7037ed05f54f 186 printf("\r\n receive() - Error code %d \r\n", retcode);
mbed_official 0:7037ed05f54f 187 return;
mbed_official 0:7037ed05f54f 188 }
mbed_official 0:7037ed05f54f 189
mbed_official 47:b6d132f1079f 190 printf(" RX Data on port %u (%d bytes): ", port, retcode);
mbed_official 0:7037ed05f54f 191 for (uint8_t i = 0; i < retcode; i++) {
mbed_official 47:b6d132f1079f 192 printf("%02x ", rx_buffer[i]);
mbed_official 0:7037ed05f54f 193 }
mbed_official 47:b6d132f1079f 194 printf("\r\n");
mbed_official 47:b6d132f1079f 195
mbed_official 12:5015dfead3f2 196 memset(rx_buffer, 0, sizeof(rx_buffer));
mbed_official 0:7037ed05f54f 197 }
mbed_official 0:7037ed05f54f 198
mbed_official 0:7037ed05f54f 199 /**
mbed_official 0:7037ed05f54f 200 * Event handler
mbed_official 0:7037ed05f54f 201 */
mbed_official 0:7037ed05f54f 202 static void lora_event_handler(lorawan_event_t event)
mbed_official 0:7037ed05f54f 203 {
mbed_official 0:7037ed05f54f 204 switch (event) {
mbed_official 0:7037ed05f54f 205 case CONNECTED:
saranjay 61:d220d51ae9d8 206 if(DEBUG)
saranjay 61:d220d51ae9d8 207 printf("\r\n Connection - Successful \r\n");
mbed_official 0:7037ed05f54f 208 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 209 send_message();
mbed_official 0:7037ed05f54f 210 } else {
mbed_official 0:7037ed05f54f 211 ev_queue.call_every(TX_TIMER, send_message);
mbed_official 0:7037ed05f54f 212 }
mbed_official 0:7037ed05f54f 213
mbed_official 0:7037ed05f54f 214 break;
mbed_official 0:7037ed05f54f 215 case DISCONNECTED:
mbed_official 0:7037ed05f54f 216 ev_queue.break_dispatch();
saranjay 61:d220d51ae9d8 217 if(DEBUG)
saranjay 61:d220d51ae9d8 218 printf("\r\n Disconnected Successfully \r\n");
mbed_official 0:7037ed05f54f 219 break;
mbed_official 0:7037ed05f54f 220 case TX_DONE:
saranjay 61:d220d51ae9d8 221 if(DEBUG)
saranjay 61:d220d51ae9d8 222 printf("\r\n Message Sent to Network Server \r\n");
mbed_official 0:7037ed05f54f 223 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 224 send_message();
mbed_official 0:7037ed05f54f 225 }
mbed_official 0:7037ed05f54f 226 break;
mbed_official 0:7037ed05f54f 227 case TX_TIMEOUT:
mbed_official 0:7037ed05f54f 228 case TX_ERROR:
mbed_official 0:7037ed05f54f 229 case TX_CRYPTO_ERROR:
mbed_official 0:7037ed05f54f 230 case TX_SCHEDULING_ERROR:
saranjay 61:d220d51ae9d8 231 if(DEBUG)
saranjay 61:d220d51ae9d8 232 printf("\r\n Transmission Error - EventCode = %d \r\n", event);
mbed_official 0:7037ed05f54f 233 // try again
mbed_official 0:7037ed05f54f 234 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 0:7037ed05f54f 235 send_message();
mbed_official 0:7037ed05f54f 236 }
mbed_official 0:7037ed05f54f 237 break;
mbed_official 0:7037ed05f54f 238 case RX_DONE:
saranjay 61:d220d51ae9d8 239 if(DEBUG)
saranjay 61:d220d51ae9d8 240 printf("\r\n Received message from Network Server \r\n");
mbed_official 0:7037ed05f54f 241 receive_message();
mbed_official 0:7037ed05f54f 242 break;
mbed_official 0:7037ed05f54f 243 case RX_TIMEOUT:
mbed_official 0:7037ed05f54f 244 case RX_ERROR:
saranjay 61:d220d51ae9d8 245 if(DEBUG)
saranjay 61:d220d51ae9d8 246 printf("\r\n Error in reception - Code = %d \r\n", event);
mbed_official 0:7037ed05f54f 247 break;
mbed_official 0:7037ed05f54f 248 case JOIN_FAILURE:
saranjay 61:d220d51ae9d8 249 if(DEBUG)
saranjay 61:d220d51ae9d8 250 printf("\r\n OTAA Failed - Check Keys \r\n");
mbed_official 0:7037ed05f54f 251 break;
mbed_official 26:f07f5febf97f 252 case UPLINK_REQUIRED:
saranjay 61:d220d51ae9d8 253 if(DEBUG)
saranjay 61:d220d51ae9d8 254 printf("\r\n Uplink required by NS \r\n");
mbed_official 26:f07f5febf97f 255 if (MBED_CONF_LORA_DUTY_CYCLE_ON) {
mbed_official 26:f07f5febf97f 256 send_message();
mbed_official 26:f07f5febf97f 257 }
mbed_official 26:f07f5febf97f 258 break;
mbed_official 0:7037ed05f54f 259 default:
mbed_official 0:7037ed05f54f 260 MBED_ASSERT("Unknown Event");
mbed_official 0:7037ed05f54f 261 }
mbed_official 0:7037ed05f54f 262 }
mbed_official 0:7037ed05f54f 263
mbed_official 0:7037ed05f54f 264 // EOF