Gateway by Jorge Troncoso

Dependencies:   libmDot-mbed5

Committer:
jortronm2
Date:
Wed Jun 13 11:45:52 2018 +0000
Revision:
0:e671110e33a3
Gateway by Jorge Troncoso

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jortronm2 0:e671110e33a3 1 #include "board_config.h"
jortronm2 0:e671110e33a3 2 #include "dot_util.h"
jortronm2 0:e671110e33a3 3 #include "mbed.h"
jortronm2 0:e671110e33a3 4 #include "RadioEvent.h"
jortronm2 0:e671110e33a3 5 #include "serialize.h"
jortronm2 0:e671110e33a3 6 #include "status_led.h"
jortronm2 0:e671110e33a3 7
jortronm2 0:e671110e33a3 8
jortronm2 0:e671110e33a3 9 #define ESP_UART_BAUD 115200
jortronm2 0:e671110e33a3 10 DigitalOut status_led_external(PIN_OUTPUT_LED_EXTERNAL);
jortronm2 0:e671110e33a3 11
jortronm2 0:e671110e33a3 12 void esp_wait_for_reply(float timeout);
jortronm2 0:e671110e33a3 13 int8_t esp_wait_for_response(float timeout, char *response);
jortronm2 0:e671110e33a3 14 int8_t esp_get_ip_status(float timeout, uint8_t *ip_status);
jortronm2 0:e671110e33a3 15
jortronm2 0:e671110e33a3 16
jortronm2 0:e671110e33a3 17 DigitalIn button(PIN_INPUT_BUTTON);
jortronm2 0:e671110e33a3 18 DigitalOut esp_reset(PIN_OUTPUT_ESP_POWER);
jortronm2 0:e671110e33a3 19 Serial debug_serial(PIN_OUTPUT_DEBUG_UART_TX, PIN_OUTPUT_DEBUG_UART_RX, DEBUG_UART_BAUD);
jortronm2 0:e671110e33a3 20 Serial esp_serial(PIN_OUTPUT_ESP_UART_TX, PIN_OUTPUT_ESP_UART_RX, ESP_UART_BAUD);
jortronm2 0:e671110e33a3 21 Timer timer;
jortronm2 0:e671110e33a3 22
jortronm2 0:e671110e33a3 23
jortronm2 0:e671110e33a3 24 // Radio settings.
jortronm2 0:e671110e33a3 25 uint8_t radio_network_address[] = {0x65, 0x34, 0x03, 0x04};
jortronm2 0:e671110e33a3 26 uint8_t radio_network_session_key[] = {0x23, 0x45, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
jortronm2 0:e671110e33a3 27 uint8_t radio_data_session_key[] = {0xF0, 0x34, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04};
jortronm2 0:e671110e33a3 28
jortronm2 0:e671110e33a3 29
jortronm2 0:e671110e33a3 30
jortronm2 0:e671110e33a3 31
jortronm2 0:e671110e33a3 32
jortronm2 0:e671110e33a3 33 // WiFi settings.
jortronm2 0:e671110e33a3 34 char *esp_wifi_network_ssid = "TrelleborgNet";
jortronm2 0:e671110e33a3 35 char *esp_wifi_network_password = "TrelleborgNet";
jortronm2 0:e671110e33a3 36
jortronm2 0:e671110e33a3 37 //char *esp_wifi_network_ssid = "Jorges iPhone";
jortronm2 0:e671110e33a3 38 //char *esp_wifi_network_password = "jorge123";
jortronm2 0:e671110e33a3 39
jortronm2 0:e671110e33a3 40 //char *esp_wifi_network_ssid = "fatpoo";
jortronm2 0:e671110e33a3 41 //char *esp_wifi_network_password = "fatpoo123";
jortronm2 0:e671110e33a3 42
jortronm2 0:e671110e33a3 43
jortronm2 0:e671110e33a3 44 /* Netherlands JTRON1
jortronm2 0:e671110e33a3 45 char *esp_wifi_network_ssid = "Dirk Jan van Waardhuizen";
jortronm2 0:e671110e33a3 46 char *esp_wifi_network_password = "bl9ffvrk8qfi";
jortronm2 0:e671110e33a3 47 char *esp_thingspeak_api_key_1 = "07NREQD3ZCJU4VBD"; //JTRON1A_EUR
jortronm2 0:e671110e33a3 48 char *esp_thingspeak_api_key_2 = "9ZNZJFYPH7TA2GWH"; //JTRON1B_EUR
jortronm2 0:e671110e33a3 49 https://thingspeak.com/channels/305477
jortronm2 0:e671110e33a3 50 https://thingspeak.com/channels/325738
jortronm2 0:e671110e33a3 51 https://freeboard.io/board/VkEXvR
jortronm2 0:e671110e33a3 52 */
jortronm2 0:e671110e33a3 53
jortronm2 0:e671110e33a3 54 /* Singapore JTRON2
jortronm2 0:e671110e33a3 55 char *esp_wifi_network_ssid = "JP 6S";
jortronm2 0:e671110e33a3 56 char *esp_wifi_network_password = "jp123456";
jortronm2 0:e671110e33a3 57 char *esp_thingspeak_api_key_1 = "I6ZBMOGDOULI20QA"; //JTRON2A_Aus
jortronm2 0:e671110e33a3 58 char *esp_thingspeak_api_key_2 = "QNUMBZ6VS5HSIGFD"; //JTRON2B_Aus
jortronm2 0:e671110e33a3 59 https://thingspeak.com/channels/329688
jortronm2 0:e671110e33a3 60 https://thingspeak.com/channels/329689
jortronm2 0:e671110e33a3 61 https://freeboard.io/board/_2lcKY
jortronm2 0:e671110e33a3 62 */
jortronm2 0:e671110e33a3 63
jortronm2 0:e671110e33a3 64
jortronm2 0:e671110e33a3 65 /* China Jerry JTRON3
jortronm2 0:e671110e33a3 66 char *esp_wifi_network_ssid = "iPhone(2)";
jortronm2 0:e671110e33a3 67 char *esp_wifi_network_password = "Zhengzihang2008";
jortronm2 0:e671110e33a3 68 char *esp_thingspeak_api_key_1 = "F5QU9DKAPWQFTJP4"; //JTRON3A_EUR
jortronm2 0:e671110e33a3 69 char *esp_thingspeak_api_key_2 = "DY0I2SI08XAFFWPX"; //JTRON3B_EUR
jortronm2 0:e671110e33a3 70 https://thingspeak.com/channels/347705
jortronm2 0:e671110e33a3 71 https://thingspeak.com/channels/347707
jortronm2 0:e671110e33a3 72 https://freeboard.io/board/7pAdKY
jortronm2 0:e671110e33a3 73 */
jortronm2 0:e671110e33a3 74
jortronm2 0:e671110e33a3 75 /* USA Tom JTRON4
jortronm2 0:e671110e33a3 76 char *esp_wifi_network_ssid = "TrellIOTU";
jortronm2 0:e671110e33a3 77 char *esp_wifi_network_password = "WtLnVDOKh1";
jortronm2 0:e671110e33a3 78 char *esp_thingspeak_api_key_1 = "UW5IRWSEY1305S8T"; //JTRON4A_Aus
jortronm2 0:e671110e33a3 79 char *esp_thingspeak_api_key_2 = "89GAX32G1VUNY492"; //JTRON4B_Aus
jortronm2 0:e671110e33a3 80 https://thingspeak.com/channels/348224
jortronm2 0:e671110e33a3 81 https://freeboard.io/board/8YrieZ
jortronm2 0:e671110e33a3 82 */
jortronm2 0:e671110e33a3 83
jortronm2 0:e671110e33a3 84 /*UK David JTRON5
jortronm2 0:e671110e33a3 85 char *esp_wifi_network_ssid = "Dave’s iPhone";
jortronm2 0:e671110e33a3 86 char *esp_wifi_network_password = "rjfoewv7nwzg7";
jortronm2 0:e671110e33a3 87 char *esp_thingspeak_api_key_1 = "XRUEOQLI8LL7LDDH"; //JTRON5A_Aus
jortronm2 0:e671110e33a3 88 char *esp_thingspeak_api_key_2 = "N2B2469BMKB14CCS"; //JTRON5B_Aus
jortronm2 0:e671110e33a3 89 https://thingspeak.com/channels/351633
jortronm2 0:e671110e33a3 90 https://freeboard.io/board/SAw7iZ
jortronm2 0:e671110e33a3 91 */
jortronm2 0:e671110e33a3 92
jortronm2 0:e671110e33a3 93 /*Australia JTRON6
jortronm2 0:e671110e33a3 94 */
jortronm2 0:e671110e33a3 95 char *esp_thingspeak_api_key_1 = "ROSLO0MJM6OTAMFM"; //JTRON6A_Aus
jortronm2 0:e671110e33a3 96 char *esp_thingspeak_api_key_2 = "Z3S5TWQE4RLKIDH5"; //JTRON6B_Aus
jortronm2 0:e671110e33a3 97 //https://thingspeak.com/channels/351672
jortronm2 0:e671110e33a3 98 //https://thingspeak.com/channels/351673
jortronm2 0:e671110e33a3 99 //https://freeboard.io/board/n9paiZ
jortronm2 0:e671110e33a3 100
jortronm2 0:e671110e33a3 101
jortronm2 0:e671110e33a3 102
jortronm2 0:e671110e33a3 103
jortronm2 0:e671110e33a3 104
jortronm2 0:e671110e33a3 105
jortronm2 0:e671110e33a3 106
jortronm2 0:e671110e33a3 107
jortronm2 0:e671110e33a3 108 mDot *dot = NULL;
jortronm2 0:e671110e33a3 109
jortronm2 0:e671110e33a3 110 bool radio_gateway_rx_ready;
jortronm2 0:e671110e33a3 111 uint8_t *radio_gateway_rx_data;
jortronm2 0:e671110e33a3 112 uint32_t radio_gateway_rx_length;
jortronm2 0:e671110e33a3 113 int16_t radio_gateway_rx_rssi;
jortronm2 0:e671110e33a3 114
jortronm2 0:e671110e33a3 115
jortronm2 0:e671110e33a3 116 int main() {
jortronm2 0:e671110e33a3 117 //wait(5);
jortronm2 0:e671110e33a3 118 uint8_t esp_ip_status;
jortronm2 0:e671110e33a3 119 int8_t return_status;
jortronm2 0:e671110e33a3 120 struct sensor_data_raw data_raw_packed;
jortronm2 0:e671110e33a3 121 struct sensor_data data_packed;
jortronm2 0:e671110e33a3 122 status_led_external = 1;
jortronm2 0:e671110e33a3 123
jortronm2 0:e671110e33a3 124 status_led_blink_start(1);
jortronm2 0:e671110e33a3 125 wait(5);
jortronm2 0:e671110e33a3 126 // Initialize the ESP.
jortronm2 0:e671110e33a3 127 esp_reset = 1;
jortronm2 0:e671110e33a3 128 wait(2);
jortronm2 0:e671110e33a3 129
jortronm2 0:e671110e33a3 130 esp_serial.printf("AT+RST\r\n");
jortronm2 0:e671110e33a3 131 debug_serial.printf("AT+RST\r\n");
jortronm2 0:e671110e33a3 132 esp_wait_for_response(15, "ready");
jortronm2 0:e671110e33a3 133
jortronm2 0:e671110e33a3 134 while(1) {
jortronm2 0:e671110e33a3 135 esp_ip_status = 0xFF;
jortronm2 0:e671110e33a3 136 return_status = esp_get_ip_status(15, &esp_ip_status);
jortronm2 0:e671110e33a3 137 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 138
jortronm2 0:e671110e33a3 139 if(return_status != 0) {
jortronm2 0:e671110e33a3 140 debug_serial.printf("esp_get_ip_status failed:");
jortronm2 0:e671110e33a3 141 if(return_status == 1) debug_serial.printf("timeout");
jortronm2 0:e671110e33a3 142 else if(return_status == 2) debug_serial.printf("invalid response");
jortronm2 0:e671110e33a3 143 debug_serial.printf("\r\n");
jortronm2 0:e671110e33a3 144 } else {
jortronm2 0:e671110e33a3 145 if(esp_ip_status == 2) {
jortronm2 0:e671110e33a3 146 debug_serial.printf("esp is connected to wifi\r\n");
jortronm2 0:e671110e33a3 147 break;
jortronm2 0:e671110e33a3 148 } else if(esp_ip_status == 5) {
jortronm2 0:e671110e33a3 149 debug_serial.printf("esp is not connected to wifi\r\n");
jortronm2 0:e671110e33a3 150
jortronm2 0:e671110e33a3 151 esp_serial.printf("AT+CWMODE=1\r\n");
jortronm2 0:e671110e33a3 152 debug_serial.printf("AT+CWMODE=1\r\n");
jortronm2 0:e671110e33a3 153 esp_wait_for_reply(5);
jortronm2 0:e671110e33a3 154
jortronm2 0:e671110e33a3 155 esp_serial.printf("AT+CIPMUX=1\r\n");
jortronm2 0:e671110e33a3 156 debug_serial.printf("AT+CIPMUX=1\r\n");
jortronm2 0:e671110e33a3 157 esp_wait_for_reply(5);
jortronm2 0:e671110e33a3 158
jortronm2 0:e671110e33a3 159 esp_serial.printf("AT+CWJAP=\"%s\",\"%s\"\r\n", esp_wifi_network_ssid, esp_wifi_network_password);
jortronm2 0:e671110e33a3 160 debug_serial.printf("AT+CWJAP=\"%s\",\"%s\"\r\n", esp_wifi_network_ssid, esp_wifi_network_password);
jortronm2 0:e671110e33a3 161 esp_wait_for_reply(20);
jortronm2 0:e671110e33a3 162 } else {
jortronm2 0:e671110e33a3 163 debug_serial.printf("esp returned an unexpected ip status:%i\r\n", esp_ip_status);
jortronm2 0:e671110e33a3 164 }
jortronm2 0:e671110e33a3 165 }
jortronm2 0:e671110e33a3 166 }
jortronm2 0:e671110e33a3 167
jortronm2 0:e671110e33a3 168 // Initialize the LoRa radio.
jortronm2 0:e671110e33a3 169 uint8_t radio_data_rate, radio_power, radio_frequency_band;
jortronm2 0:e671110e33a3 170 uint32_t radio_frequency;
jortronm2 0:e671110e33a3 171 lora::ChannelPlan* plan;
jortronm2 0:e671110e33a3 172 RadioEvent event;
jortronm2 0:e671110e33a3 173
jortronm2 0:e671110e33a3 174 radio_gateway_rx_ready = false;
jortronm2 0:e671110e33a3 175
jortronm2 0:e671110e33a3 176 // Configure the logging level and instatiate the mDot with the correct channel plan.
jortronm2 0:e671110e33a3 177 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
jortronm2 0:e671110e33a3 178
jortronm2 0:e671110e33a3 179 #if RADIO_CHANNEL_PLAN == CP_US915
jortronm2 0:e671110e33a3 180 plan = new lora::ChannelPlan_US915();
jortronm2 0:e671110e33a3 181 #elif RADIO_CHANNEL_PLAN == CP_AU915
jortronm2 0:e671110e33a3 182 plan = new lora::ChannelPlan_AU915();
jortronm2 0:e671110e33a3 183 #elif RADIO_CHANNEL_PLAN == CP_EU868
jortronm2 0:e671110e33a3 184 plan = new lora::ChannelPlan_EU868();
jortronm2 0:e671110e33a3 185 #elif RADIO_CHANNEL_PLAN == CP_KR920
jortronm2 0:e671110e33a3 186 plan = new lora::ChannelPlan_KR920();
jortronm2 0:e671110e33a3 187 #elif RADIO_CHANNEL_PLAN == CP_AS923
jortronm2 0:e671110e33a3 188 plan = new lora::ChannelPlan_AS923();
jortronm2 0:e671110e33a3 189 #elif RADIO_CHANNEL_PLAN == CP_AS923_JAPAN
jortronm2 0:e671110e33a3 190 plan = new lora::ChannelPlan_AS923_Japan();
jortronm2 0:e671110e33a3 191 #elif RADIO_CHANNEL_PLAN == CP_IN865
jortronm2 0:e671110e33a3 192 plan = new lora::ChannelPlan_IN865();
jortronm2 0:e671110e33a3 193 #endif
jortronm2 0:e671110e33a3 194 assert(plan);
jortronm2 0:e671110e33a3 195
jortronm2 0:e671110e33a3 196 dot = mDot::getInstance(plan);
jortronm2 0:e671110e33a3 197 assert(dot);
jortronm2 0:e671110e33a3 198 dot->setLogLevel(mts::MTSLog::TRACE_LEVEL);
jortronm2 0:e671110e33a3 199
jortronm2 0:e671110e33a3 200
jortronm2 0:e671110e33a3 201 // Return the mdot to a known state.
jortronm2 0:e671110e33a3 202 dot->resetConfig();
jortronm2 0:e671110e33a3 203
jortronm2 0:e671110e33a3 204 // Attach the custom events handler.
jortronm2 0:e671110e33a3 205 dot->setEvents(&event);
jortronm2 0:e671110e33a3 206
jortronm2 0:e671110e33a3 207 // Configure MDOT network settings.
jortronm2 0:e671110e33a3 208 if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
jortronm2 0:e671110e33a3 209 logInfo("changing network join mode to PEER_TO_PEER");
jortronm2 0:e671110e33a3 210 if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
jortronm2 0:e671110e33a3 211 logError("failed to set network join mode to PEER_TO_PEER");
jortronm2 0:e671110e33a3 212 }
jortronm2 0:e671110e33a3 213 }
jortronm2 0:e671110e33a3 214
jortronm2 0:e671110e33a3 215 radio_frequency_band = dot->getFrequencyBand();
jortronm2 0:e671110e33a3 216 switch (radio_frequency_band) {
jortronm2 0:e671110e33a3 217 case lora::ChannelPlan::EU868_OLD:
jortronm2 0:e671110e33a3 218 case lora::ChannelPlan::EU868:
jortronm2 0:e671110e33a3 219 // 250kHz channels achieve higher throughput
jortronm2 0:e671110e33a3 220 // DR_6 : SF7 @ 250kHz
jortronm2 0:e671110e33a3 221 // DR_0 - DR_5 (125kHz channels) available but much slower
jortronm2 0:e671110e33a3 222 radio_frequency = 869850000;
jortronm2 0:e671110e33a3 223 radio_data_rate = lora::DR_6;
jortronm2 0:e671110e33a3 224 // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7
jortronm2 0:e671110e33a3 225 radio_power = 4;
jortronm2 0:e671110e33a3 226 break;
jortronm2 0:e671110e33a3 227
jortronm2 0:e671110e33a3 228 case lora::ChannelPlan::US915_OLD:
jortronm2 0:e671110e33a3 229 case lora::ChannelPlan::US915:
jortronm2 0:e671110e33a3 230 case lora::ChannelPlan::AU915_OLD:
jortronm2 0:e671110e33a3 231 case lora::ChannelPlan::AU915:
jortronm2 0:e671110e33a3 232 // 500kHz channels achieve highest throughput
jortronm2 0:e671110e33a3 233 // DR_8 : SF12 @ 500kHz
jortronm2 0:e671110e33a3 234 // DR_9 : SF11 @ 500kHz
jortronm2 0:e671110e33a3 235 // DR_10 : SF10 @ 500kHz
jortronm2 0:e671110e33a3 236 // DR_11 : SF9 @ 500kHz
jortronm2 0:e671110e33a3 237 // DR_12 : SF8 @ 500kHz
jortronm2 0:e671110e33a3 238 // DR_13 : SF7 @ 500kHz
jortronm2 0:e671110e33a3 239 // DR_0 - DR_3 (125kHz channels) available but much slower
jortronm2 0:e671110e33a3 240 radio_frequency = 915500000;
jortronm2 0:e671110e33a3 241 radio_data_rate = lora::DR_13;
jortronm2 0:e671110e33a3 242 // 915 bands have no duty cycle restrictions, set tx power to max
jortronm2 0:e671110e33a3 243 radio_power = 20;
jortronm2 0:e671110e33a3 244 break;
jortronm2 0:e671110e33a3 245
jortronm2 0:e671110e33a3 246 case lora::ChannelPlan::AS923:
jortronm2 0:e671110e33a3 247 case lora::ChannelPlan::AS923_JAPAN:
jortronm2 0:e671110e33a3 248 // 250kHz channels achieve higher throughput
jortronm2 0:e671110e33a3 249 // DR_6 : SF7 @ 250kHz
jortronm2 0:e671110e33a3 250 // DR_0 - DR_5 (125kHz channels) available but much slower
jortronm2 0:e671110e33a3 251 radio_frequency = 924800000;
jortronm2 0:e671110e33a3 252 radio_data_rate = lora::DR_6;
jortronm2 0:e671110e33a3 253 radio_power = 16;
jortronm2 0:e671110e33a3 254 break;
jortronm2 0:e671110e33a3 255
jortronm2 0:e671110e33a3 256 case lora::ChannelPlan::KR920:
jortronm2 0:e671110e33a3 257 // DR_5 : SF7 @ 125kHz
jortronm2 0:e671110e33a3 258 radio_frequency = 922700000;
jortronm2 0:e671110e33a3 259 radio_data_rate = lora::DR_5;
jortronm2 0:e671110e33a3 260 radio_power = 14;
jortronm2 0:e671110e33a3 261 break;
jortronm2 0:e671110e33a3 262
jortronm2 0:e671110e33a3 263 default:
jortronm2 0:e671110e33a3 264 while (true) {
jortronm2 0:e671110e33a3 265 logFatal("no known channel plan in use - extra configuration is needed!");
jortronm2 0:e671110e33a3 266 wait(5);
jortronm2 0:e671110e33a3 267 }
jortronm2 0:e671110e33a3 268 }
jortronm2 0:e671110e33a3 269
jortronm2 0:e671110e33a3 270 update_peer_to_peer_config(radio_network_address, radio_network_session_key, radio_data_session_key, radio_frequency, radio_data_rate, radio_power);
jortronm2 0:e671110e33a3 271
jortronm2 0:e671110e33a3 272 // Save changes to configuration.
jortronm2 0:e671110e33a3 273 logInfo("saving configuration");
jortronm2 0:e671110e33a3 274 if (!dot->saveConfig()) {
jortronm2 0:e671110e33a3 275 logError("failed to save configuration");
jortronm2 0:e671110e33a3 276 }
jortronm2 0:e671110e33a3 277
jortronm2 0:e671110e33a3 278 // Display configuration.
jortronm2 0:e671110e33a3 279 display_config();
jortronm2 0:e671110e33a3 280
jortronm2 0:e671110e33a3 281 status_led_blink_stop();
jortronm2 0:e671110e33a3 282 status_led_set(1, 0);
jortronm2 0:e671110e33a3 283
jortronm2 0:e671110e33a3 284 while(true) {
jortronm2 0:e671110e33a3 285 // Make sure to stay connected to the network.
jortronm2 0:e671110e33a3 286 if (!dot->getNetworkJoinStatus()) {
jortronm2 0:e671110e33a3 287 join_network();
jortronm2 0:e671110e33a3 288 }
jortronm2 0:e671110e33a3 289
jortronm2 0:e671110e33a3 290 if(button.read() == 1) {
jortronm2 0:e671110e33a3 291 logDebug("Button press.");
jortronm2 0:e671110e33a3 292 status_led_blink(STATUS_LED_CHECK);
jortronm2 0:e671110e33a3 293 }
jortronm2 0:e671110e33a3 294
jortronm2 0:e671110e33a3 295 if(radio_gateway_rx_ready) {
jortronm2 0:e671110e33a3 296 radio_gateway_rx_ready = false;
jortronm2 0:e671110e33a3 297
jortronm2 0:e671110e33a3 298 if(radio_gateway_rx_length != sizeof(struct sensor_data_raw)) {
jortronm2 0:e671110e33a3 299 logError("Incorrect packet size (%i should be %i).", radio_gateway_rx_length, sizeof(struct sensor_data_raw));
jortronm2 0:e671110e33a3 300 } else {
jortronm2 0:e671110e33a3 301 status_led_blink(STATUS_LED_RADIO_ACTIVITY);
jortronm2 0:e671110e33a3 302
jortronm2 0:e671110e33a3 303 serialize_bytes_to_sensor(radio_gateway_rx_data, &data_raw_packed);
jortronm2 0:e671110e33a3 304
jortronm2 0:e671110e33a3 305 data_packed.reading_number = data_raw_packed.reading_number;
jortronm2 0:e671110e33a3 306 data_packed.voltage_battery = (float)(data_raw_packed.voltage_battery) / BATTERY_VOLTAGE_SCALE;
jortronm2 0:e671110e33a3 307 for(int j = 0; j < 9; j++) {
jortronm2 0:e671110e33a3 308 data_packed.voltage_wire[j] = data_raw_packed.voltage_wire[j];
jortronm2 0:e671110e33a3 309 }
jortronm2 0:e671110e33a3 310 data_packed.temperature = (float)(data_raw_packed.temperature) / TEMPERATURE_READING_SCALE;
jortronm2 0:e671110e33a3 311 data_packed.rssi = (float)(radio_gateway_rx_rssi);
jortronm2 0:e671110e33a3 312
jortronm2 0:e671110e33a3 313
jortronm2 0:e671110e33a3 314 char buf1[140], buf2[30];
jortronm2 0:e671110e33a3 315
jortronm2 0:e671110e33a3 316 // Begin HTTP connection through the ESP.
jortronm2 0:e671110e33a3 317 esp_serial.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n");
jortronm2 0:e671110e33a3 318 debug_serial.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n");
jortronm2 0:e671110e33a3 319 esp_wait_for_reply(2);
jortronm2 0:e671110e33a3 320
jortronm2 0:e671110e33a3 321 // Send data set 1 (battery, signal 1-1, 2-2, 3-3, temperature, rssi) to ThingSpeak.
jortronm2 0:e671110e33a3 322 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("POST /update HTTP/1.1\r\n"));
jortronm2 0:e671110e33a3 323 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("POST /update HTTP/1.1\r\n"));
jortronm2 0:e671110e33a3 324 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 325
jortronm2 0:e671110e33a3 326 esp_serial.printf("POST /update HTTP/1.1\r\n");
jortronm2 0:e671110e33a3 327 debug_serial.printf("POST /update HTTP/1.1\r\n");
jortronm2 0:e671110e33a3 328 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 329
jortronm2 0:e671110e33a3 330
jortronm2 0:e671110e33a3 331 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Host: api.thingspeak.com\r\n"));
jortronm2 0:e671110e33a3 332 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Host: api.thingspeak.com\r\n"));
jortronm2 0:e671110e33a3 333 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 334
jortronm2 0:e671110e33a3 335 esp_serial.printf("Host: api.thingspeak.com\r\n");
jortronm2 0:e671110e33a3 336 debug_serial.printf("Host: api.thingspeak.com\r\n");
jortronm2 0:e671110e33a3 337 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 338
jortronm2 0:e671110e33a3 339
jortronm2 0:e671110e33a3 340 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Connection: close\r\n"));
jortronm2 0:e671110e33a3 341 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Connection: close\r\n"));
jortronm2 0:e671110e33a3 342 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 343
jortronm2 0:e671110e33a3 344 esp_serial.printf("Connection: close\r\n");
jortronm2 0:e671110e33a3 345 debug_serial.printf("Connection: close\r\n");
jortronm2 0:e671110e33a3 346 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 347
jortronm2 0:e671110e33a3 348
jortronm2 0:e671110e33a3 349 memset(buf1, 0, sizeof(buf1));
jortronm2 0:e671110e33a3 350 sprintf(buf1, "X-THINGSPEAKAPIKEY: %s\r\n", esp_thingspeak_api_key_1);
jortronm2 0:e671110e33a3 351
jortronm2 0:e671110e33a3 352 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 353 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 354 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 355
jortronm2 0:e671110e33a3 356 esp_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 357 debug_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 358 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 359
jortronm2 0:e671110e33a3 360
jortronm2 0:e671110e33a3 361 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Content-Type: application/x-www-form-urlencoded\r\n"));
jortronm2 0:e671110e33a3 362 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Content-Type: application/x-www-form-urlencoded\r\n"));
jortronm2 0:e671110e33a3 363 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 364
jortronm2 0:e671110e33a3 365 esp_serial.printf("Content-Type: application/x-www-form-urlencoded\r\n");
jortronm2 0:e671110e33a3 366 debug_serial.printf("Content-Type: application/x-www-form-urlencoded\r\n");
jortronm2 0:e671110e33a3 367 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 368
jortronm2 0:e671110e33a3 369
jortronm2 0:e671110e33a3 370 memset(buf1, 0, sizeof(buf1));
jortronm2 0:e671110e33a3 371 memset(buf2, 0, sizeof(buf2));
jortronm2 0:e671110e33a3 372
jortronm2 0:e671110e33a3 373 sprintf(buf1, "%s&field1=%i&field2=%.2f&field3=%i&field4=%i&field5=%i&field6=%.2f&field7=%.2f\r\n\r\n",
jortronm2 0:e671110e33a3 374 esp_thingspeak_api_key_1,
jortronm2 0:e671110e33a3 375 data_packed.reading_number,
jortronm2 0:e671110e33a3 376 data_packed.voltage_battery,
jortronm2 0:e671110e33a3 377 data_packed.voltage_wire[0],
jortronm2 0:e671110e33a3 378 data_packed.voltage_wire[4],
jortronm2 0:e671110e33a3 379 data_packed.voltage_wire[8],
jortronm2 0:e671110e33a3 380 data_packed.temperature,
jortronm2 0:e671110e33a3 381 data_packed.rssi);
jortronm2 0:e671110e33a3 382 sprintf(buf2, "Content-Length: %i\r\n\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 383
jortronm2 0:e671110e33a3 384
jortronm2 0:e671110e33a3 385 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf2));
jortronm2 0:e671110e33a3 386 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf2));
jortronm2 0:e671110e33a3 387 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 388
jortronm2 0:e671110e33a3 389 esp_serial.printf("%s", buf2);
jortronm2 0:e671110e33a3 390 debug_serial.printf("%s", buf2);
jortronm2 0:e671110e33a3 391 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 392
jortronm2 0:e671110e33a3 393
jortronm2 0:e671110e33a3 394 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 395 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 396 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 397
jortronm2 0:e671110e33a3 398 esp_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 399 debug_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 400 esp_wait_for_reply(2);
jortronm2 0:e671110e33a3 401
jortronm2 0:e671110e33a3 402 wait(15);
jortronm2 0:e671110e33a3 403
jortronm2 0:e671110e33a3 404 // Begin HTTP connection through the ESP.
jortronm2 0:e671110e33a3 405 esp_serial.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n");
jortronm2 0:e671110e33a3 406 debug_serial.printf("AT+CIPSTART=4,\"TCP\",\"api.thingspeak.com\",80\r\n");
jortronm2 0:e671110e33a3 407 esp_wait_for_reply(2);
jortronm2 0:e671110e33a3 408
jortronm2 0:e671110e33a3 409 // Send data set 2 (signal 1-2, 1-3, 2-1, 2-3, 3-1, 3-2) to ThingSpeak.
jortronm2 0:e671110e33a3 410 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("POST /update HTTP/1.1\r\n"));
jortronm2 0:e671110e33a3 411 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("POST /update HTTP/1.1\r\n"));
jortronm2 0:e671110e33a3 412 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 413
jortronm2 0:e671110e33a3 414 esp_serial.printf("POST /update HTTP/1.1\r\n");
jortronm2 0:e671110e33a3 415 debug_serial.printf("POST /update HTTP/1.1\r\n");
jortronm2 0:e671110e33a3 416 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 417
jortronm2 0:e671110e33a3 418
jortronm2 0:e671110e33a3 419 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Host: api.thingspeak.com\r\n"));
jortronm2 0:e671110e33a3 420 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Host: api.thingspeak.com\r\n"));
jortronm2 0:e671110e33a3 421 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 422
jortronm2 0:e671110e33a3 423 esp_serial.printf("Host: api.thingspeak.com\r\n");
jortronm2 0:e671110e33a3 424 debug_serial.printf("Host: api.thingspeak.com\r\n");
jortronm2 0:e671110e33a3 425 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 426
jortronm2 0:e671110e33a3 427
jortronm2 0:e671110e33a3 428 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Connection: close\r\n"));
jortronm2 0:e671110e33a3 429 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Connection: close\r\n"));
jortronm2 0:e671110e33a3 430 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 431
jortronm2 0:e671110e33a3 432 esp_serial.printf("Connection: close\r\n");
jortronm2 0:e671110e33a3 433 debug_serial.printf("Connection: close\r\n");
jortronm2 0:e671110e33a3 434 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 435
jortronm2 0:e671110e33a3 436
jortronm2 0:e671110e33a3 437 memset(buf1, 0, sizeof(buf1));
jortronm2 0:e671110e33a3 438 sprintf(buf1, "X-THINGSPEAKAPIKEY: %s\r\n", esp_thingspeak_api_key_2);
jortronm2 0:e671110e33a3 439
jortronm2 0:e671110e33a3 440 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 441 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 442 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 443
jortronm2 0:e671110e33a3 444 esp_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 445 debug_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 446 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 447
jortronm2 0:e671110e33a3 448
jortronm2 0:e671110e33a3 449 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Content-Type: application/x-www-form-urlencoded\r\n"));
jortronm2 0:e671110e33a3 450 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen("Content-Type: application/x-www-form-urlencoded\r\n"));
jortronm2 0:e671110e33a3 451 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 452
jortronm2 0:e671110e33a3 453 esp_serial.printf("Content-Type: application/x-www-form-urlencoded\r\n");
jortronm2 0:e671110e33a3 454 debug_serial.printf("Content-Type: application/x-www-form-urlencoded\r\n");
jortronm2 0:e671110e33a3 455 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 456
jortronm2 0:e671110e33a3 457
jortronm2 0:e671110e33a3 458 memset(buf1, 0, sizeof(buf1));
jortronm2 0:e671110e33a3 459 memset(buf2, 0, sizeof(buf2));
jortronm2 0:e671110e33a3 460
jortronm2 0:e671110e33a3 461 sprintf(buf1, "%s&field1=%i&field2=%i&field3=%i&field4=%i&field5=%i&field6=%i&field7=%i\r\n\r\n",
jortronm2 0:e671110e33a3 462 esp_thingspeak_api_key_2,
jortronm2 0:e671110e33a3 463 data_packed.reading_number,
jortronm2 0:e671110e33a3 464 data_packed.voltage_wire[1],
jortronm2 0:e671110e33a3 465 data_packed.voltage_wire[2],
jortronm2 0:e671110e33a3 466 data_packed.voltage_wire[3],
jortronm2 0:e671110e33a3 467 data_packed.voltage_wire[5],
jortronm2 0:e671110e33a3 468 data_packed.voltage_wire[6],
jortronm2 0:e671110e33a3 469 data_packed.voltage_wire[7]);
jortronm2 0:e671110e33a3 470 sprintf(buf2, "Content-Length: %i\r\n\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 471
jortronm2 0:e671110e33a3 472
jortronm2 0:e671110e33a3 473 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf2));
jortronm2 0:e671110e33a3 474 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf2));
jortronm2 0:e671110e33a3 475 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 476
jortronm2 0:e671110e33a3 477 esp_serial.printf("%s", buf2);
jortronm2 0:e671110e33a3 478 debug_serial.printf("%s", buf2);
jortronm2 0:e671110e33a3 479 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 480
jortronm2 0:e671110e33a3 481
jortronm2 0:e671110e33a3 482 esp_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 483 debug_serial.printf("AT+CIPSEND=4,%i\r\n", strlen(buf1));
jortronm2 0:e671110e33a3 484 esp_wait_for_reply(1);
jortronm2 0:e671110e33a3 485
jortronm2 0:e671110e33a3 486 esp_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 487 debug_serial.printf("%s", buf1);
jortronm2 0:e671110e33a3 488 esp_wait_for_reply(2);
jortronm2 0:e671110e33a3 489 }
jortronm2 0:e671110e33a3 490 }
jortronm2 0:e671110e33a3 491 }
jortronm2 0:e671110e33a3 492 }
jortronm2 0:e671110e33a3 493
jortronm2 0:e671110e33a3 494 void esp_wait_for_reply(float timeout) {
jortronm2 0:e671110e33a3 495 timer.reset();
jortronm2 0:e671110e33a3 496 timer.start();
jortronm2 0:e671110e33a3 497
jortronm2 0:e671110e33a3 498 while(timer.read() < timeout) {
jortronm2 0:e671110e33a3 499 if(esp_serial.readable()) {
jortronm2 0:e671110e33a3 500 debug_serial.putc(esp_serial.getc());
jortronm2 0:e671110e33a3 501 }
jortronm2 0:e671110e33a3 502 }
jortronm2 0:e671110e33a3 503
jortronm2 0:e671110e33a3 504 timer.stop();
jortronm2 0:e671110e33a3 505 }
jortronm2 0:e671110e33a3 506
jortronm2 0:e671110e33a3 507 int8_t esp_wait_for_response(float timeout, char *response) {
jortronm2 0:e671110e33a3 508 int8_t return_value;
jortronm2 0:e671110e33a3 509 char c;
jortronm2 0:e671110e33a3 510 uint32_t response_index, response_length;
jortronm2 0:e671110e33a3 511
jortronm2 0:e671110e33a3 512 return_value = 0;
jortronm2 0:e671110e33a3 513
jortronm2 0:e671110e33a3 514 response_length = strlen(response);
jortronm2 0:e671110e33a3 515
jortronm2 0:e671110e33a3 516 timer.reset();
jortronm2 0:e671110e33a3 517 timer.start();
jortronm2 0:e671110e33a3 518
jortronm2 0:e671110e33a3 519 while(1) {
jortronm2 0:e671110e33a3 520 if(esp_serial.readable()) {
jortronm2 0:e671110e33a3 521 c = esp_serial.getc();
jortronm2 0:e671110e33a3 522 debug_serial.putc(c);
jortronm2 0:e671110e33a3 523
jortronm2 0:e671110e33a3 524 if(response[response_index] == c) {
jortronm2 0:e671110e33a3 525 response_index++;
jortronm2 0:e671110e33a3 526 } else {
jortronm2 0:e671110e33a3 527 response_index = 0;
jortronm2 0:e671110e33a3 528 }
jortronm2 0:e671110e33a3 529
jortronm2 0:e671110e33a3 530 if(response_index == response_length) break;
jortronm2 0:e671110e33a3 531 }
jortronm2 0:e671110e33a3 532
jortronm2 0:e671110e33a3 533 if(timer.read() > timeout) {
jortronm2 0:e671110e33a3 534 return_value = 1;
jortronm2 0:e671110e33a3 535 break;
jortronm2 0:e671110e33a3 536 }
jortronm2 0:e671110e33a3 537 }
jortronm2 0:e671110e33a3 538
jortronm2 0:e671110e33a3 539 timer.stop();
jortronm2 0:e671110e33a3 540 return return_value;
jortronm2 0:e671110e33a3 541 }
jortronm2 0:e671110e33a3 542
jortronm2 0:e671110e33a3 543 int8_t esp_get_ip_status(float timeout, uint8_t *ip_status) {
jortronm2 0:e671110e33a3 544 uint8_t ip_status_index, ip_status_string_length;
jortronm2 0:e671110e33a3 545 char c;
jortronm2 0:e671110e33a3 546 char *ip_status_string = "STATUS:";
jortronm2 0:e671110e33a3 547
jortronm2 0:e671110e33a3 548 esp_serial.printf("AT+CIPSTATUS\r\n");
jortronm2 0:e671110e33a3 549 debug_serial.printf("AT+CIPSTATUS\r\n");
jortronm2 0:e671110e33a3 550
jortronm2 0:e671110e33a3 551 ip_status_string_length = 7;
jortronm2 0:e671110e33a3 552
jortronm2 0:e671110e33a3 553 timer.reset();
jortronm2 0:e671110e33a3 554 timer.start();
jortronm2 0:e671110e33a3 555
jortronm2 0:e671110e33a3 556 ip_status_index = 0;
jortronm2 0:e671110e33a3 557
jortronm2 0:e671110e33a3 558 while(1) {
jortronm2 0:e671110e33a3 559 if(esp_serial.readable()) {
jortronm2 0:e671110e33a3 560 c = esp_serial.getc();
jortronm2 0:e671110e33a3 561 debug_serial.putc(c);
jortronm2 0:e671110e33a3 562
jortronm2 0:e671110e33a3 563 if(ip_status_index == ip_status_string_length) {
jortronm2 0:e671110e33a3 564 timer.stop();
jortronm2 0:e671110e33a3 565
jortronm2 0:e671110e33a3 566 if(c < '0' || c > '9') return 2;
jortronm2 0:e671110e33a3 567 (*ip_status) = c - '0';
jortronm2 0:e671110e33a3 568 return 0;
jortronm2 0:e671110e33a3 569 }
jortronm2 0:e671110e33a3 570
jortronm2 0:e671110e33a3 571 if(ip_status_string[ip_status_index] == c) {
jortronm2 0:e671110e33a3 572 ip_status_index++;
jortronm2 0:e671110e33a3 573 } else {
jortronm2 0:e671110e33a3 574 ip_status_index = 0;
jortronm2 0:e671110e33a3 575 }
jortronm2 0:e671110e33a3 576 }
jortronm2 0:e671110e33a3 577
jortronm2 0:e671110e33a3 578 if(timer.read() > timeout) {
jortronm2 0:e671110e33a3 579 timer.stop();
jortronm2 0:e671110e33a3 580 return 1;
jortronm2 0:e671110e33a3 581 }
jortronm2 0:e671110e33a3 582 }
jortronm2 0:e671110e33a3 583 }