
Fire Detector IoT
Dependencies: BSP_B-L475E-IOT01
main.cpp@0:e84b46bbec77, 2020-10-13 (annotated)
- Committer:
- GuilhermeLubk
- Date:
- Tue Oct 13 12:24:59 2020 +0000
- Revision:
- 0:e84b46bbec77
- Child:
- 1:2c451ce6086b
Fire Detector Program IoT - CentraleSupelec
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
GuilhermeLubk | 0:e84b46bbec77 | 1 | /* WiFi Example |
GuilhermeLubk | 0:e84b46bbec77 | 2 | * Copyright (c) 2018 ARM Limited |
GuilhermeLubk | 0:e84b46bbec77 | 3 | * |
GuilhermeLubk | 0:e84b46bbec77 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
GuilhermeLubk | 0:e84b46bbec77 | 5 | * you may not use this file except in compliance with the License. |
GuilhermeLubk | 0:e84b46bbec77 | 6 | * You may obtain a copy of the License at |
GuilhermeLubk | 0:e84b46bbec77 | 7 | * |
GuilhermeLubk | 0:e84b46bbec77 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
GuilhermeLubk | 0:e84b46bbec77 | 9 | * |
GuilhermeLubk | 0:e84b46bbec77 | 10 | * Unless required by applicable law or agreed to in writing, software |
GuilhermeLubk | 0:e84b46bbec77 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
GuilhermeLubk | 0:e84b46bbec77 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
GuilhermeLubk | 0:e84b46bbec77 | 13 | * See the License for the specific language governing permissions and |
GuilhermeLubk | 0:e84b46bbec77 | 14 | * limitations under the License. |
GuilhermeLubk | 0:e84b46bbec77 | 15 | */ |
GuilhermeLubk | 0:e84b46bbec77 | 16 | |
GuilhermeLubk | 0:e84b46bbec77 | 17 | #include "mbed.h" |
GuilhermeLubk | 0:e84b46bbec77 | 18 | #include "TCPSocket.h" |
GuilhermeLubk | 0:e84b46bbec77 | 19 | #include "stm32l475e_iot01_tsensor.h" |
GuilhermeLubk | 0:e84b46bbec77 | 20 | |
GuilhermeLubk | 0:e84b46bbec77 | 21 | #define FIRE_DETECTED (1UL << 0) |
GuilhermeLubk | 0:e84b46bbec77 | 22 | |
GuilhermeLubk | 0:e84b46bbec77 | 23 | #define WIFI_IDW0XX1 2 |
GuilhermeLubk | 0:e84b46bbec77 | 24 | #define TS_DEVICE "stmWifi" |
GuilhermeLubk | 0:e84b46bbec77 | 25 | #define thingspeak_APIkey_write "SCS2JFDTW4EZC0NP" |
GuilhermeLubk | 0:e84b46bbec77 | 26 | #define thingspeak_APIkey_read "O3ZVNRCX5J95EB4G" |
GuilhermeLubk | 0:e84b46bbec77 | 27 | |
GuilhermeLubk | 0:e84b46bbec77 | 28 | #if (defined(TARGET_DISCO_L475VG_IOT01A) || defined(TARGET_DISCO_F413ZH)) |
GuilhermeLubk | 0:e84b46bbec77 | 29 | #include "ISM43362Interface.h" |
GuilhermeLubk | 0:e84b46bbec77 | 30 | ISM43362Interface wifi(MBED_CONF_APP_WIFI_SPI_MOSI, MBED_CONF_APP_WIFI_SPI_MISO, MBED_CONF_APP_WIFI_SPI_SCLK, MBED_CONF_APP_WIFI_SPI_NSS, MBED_CONF_APP_WIFI_RESET, MBED_CONF_APP_WIFI_DATAREADY, MBED_CONF_APP_WIFI_WAKEUP, false); |
GuilhermeLubk | 0:e84b46bbec77 | 31 | |
GuilhermeLubk | 0:e84b46bbec77 | 32 | #else // External WiFi modules |
GuilhermeLubk | 0:e84b46bbec77 | 33 | #if MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1 |
GuilhermeLubk | 0:e84b46bbec77 | 34 | #include "SpwfSAInterface.h" |
GuilhermeLubk | 0:e84b46bbec77 | 35 | SpwfSAInterface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX); |
GuilhermeLubk | 0:e84b46bbec77 | 36 | #endif // MBED_CONF_APP_WIFI_SHIELD == WIFI_IDW0XX1 |
GuilhermeLubk | 0:e84b46bbec77 | 37 | #endif |
GuilhermeLubk | 0:e84b46bbec77 | 38 | |
GuilhermeLubk | 0:e84b46bbec77 | 39 | //LEDS used for debugging |
GuilhermeLubk | 0:e84b46bbec77 | 40 | DigitalOut led1(LED1, 1); |
GuilhermeLubk | 0:e84b46bbec77 | 41 | DigitalOut led2(LED2, 1); |
GuilhermeLubk | 0:e84b46bbec77 | 42 | |
GuilhermeLubk | 0:e84b46bbec77 | 43 | //Interruptions |
GuilhermeLubk | 0:e84b46bbec77 | 44 | InterruptIn button(D3); |
GuilhermeLubk | 0:e84b46bbec77 | 45 | InterruptIn IR(D7); |
GuilhermeLubk | 0:e84b46bbec77 | 46 | |
GuilhermeLubk | 0:e84b46bbec77 | 47 | //Thread |
GuilhermeLubk | 0:e84b46bbec77 | 48 | Thread thread; |
GuilhermeLubk | 0:e84b46bbec77 | 49 | |
GuilhermeLubk | 0:e84b46bbec77 | 50 | //Event flag to control thread start |
GuilhermeLubk | 0:e84b46bbec77 | 51 | EventFlags event_flags; |
GuilhermeLubk | 0:e84b46bbec77 | 52 | |
GuilhermeLubk | 0:e84b46bbec77 | 53 | |
GuilhermeLubk | 0:e84b46bbec77 | 54 | |
GuilhermeLubk | 0:e84b46bbec77 | 55 | void button_ISP() |
GuilhermeLubk | 0:e84b46bbec77 | 56 | { |
GuilhermeLubk | 0:e84b46bbec77 | 57 | led1 = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 58 | NVIC_SystemReset(); |
GuilhermeLubk | 0:e84b46bbec77 | 59 | } |
GuilhermeLubk | 0:e84b46bbec77 | 60 | |
GuilhermeLubk | 0:e84b46bbec77 | 61 | void IR_ISP() |
GuilhermeLubk | 0:e84b46bbec77 | 62 | { |
GuilhermeLubk | 0:e84b46bbec77 | 63 | led1 = 1; |
GuilhermeLubk | 0:e84b46bbec77 | 64 | event_flags.set(FIRE_DETECTED); |
GuilhermeLubk | 0:e84b46bbec77 | 65 | IR.rise(NULL); |
GuilhermeLubk | 0:e84b46bbec77 | 66 | } |
GuilhermeLubk | 0:e84b46bbec77 | 67 | |
GuilhermeLubk | 0:e84b46bbec77 | 68 | const char *sec2str(nsapi_security_t sec) |
GuilhermeLubk | 0:e84b46bbec77 | 69 | { |
GuilhermeLubk | 0:e84b46bbec77 | 70 | switch (sec) { |
GuilhermeLubk | 0:e84b46bbec77 | 71 | case NSAPI_SECURITY_NONE: |
GuilhermeLubk | 0:e84b46bbec77 | 72 | return "None"; |
GuilhermeLubk | 0:e84b46bbec77 | 73 | case NSAPI_SECURITY_WEP: |
GuilhermeLubk | 0:e84b46bbec77 | 74 | return "WEP"; |
GuilhermeLubk | 0:e84b46bbec77 | 75 | case NSAPI_SECURITY_WPA: |
GuilhermeLubk | 0:e84b46bbec77 | 76 | return "WPA"; |
GuilhermeLubk | 0:e84b46bbec77 | 77 | case NSAPI_SECURITY_WPA2: |
GuilhermeLubk | 0:e84b46bbec77 | 78 | return "WPA2"; |
GuilhermeLubk | 0:e84b46bbec77 | 79 | case NSAPI_SECURITY_WPA_WPA2: |
GuilhermeLubk | 0:e84b46bbec77 | 80 | return "WPA/WPA2"; |
GuilhermeLubk | 0:e84b46bbec77 | 81 | case NSAPI_SECURITY_UNKNOWN: |
GuilhermeLubk | 0:e84b46bbec77 | 82 | default: |
GuilhermeLubk | 0:e84b46bbec77 | 83 | return "Unknown"; |
GuilhermeLubk | 0:e84b46bbec77 | 84 | } |
GuilhermeLubk | 0:e84b46bbec77 | 85 | } |
GuilhermeLubk | 0:e84b46bbec77 | 86 | |
GuilhermeLubk | 0:e84b46bbec77 | 87 | void main_routine() |
GuilhermeLubk | 0:e84b46bbec77 | 88 | { |
GuilhermeLubk | 0:e84b46bbec77 | 89 | //Temperature reading |
GuilhermeLubk | 0:e84b46bbec77 | 90 | BSP_TSENSOR_Init(); |
GuilhermeLubk | 0:e84b46bbec77 | 91 | float temperature_value = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 92 | |
GuilhermeLubk | 0:e84b46bbec77 | 93 | //Check fire variable |
GuilhermeLubk | 0:e84b46bbec77 | 94 | int numReadings = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 95 | |
GuilhermeLubk | 0:e84b46bbec77 | 96 | while(true) { |
GuilhermeLubk | 0:e84b46bbec77 | 97 | //wait for a fire reading |
GuilhermeLubk | 0:e84b46bbec77 | 98 | event_flags.wait_any(FIRE_DETECTED); |
GuilhermeLubk | 0:e84b46bbec77 | 99 | |
GuilhermeLubk | 0:e84b46bbec77 | 100 | //check against false readings |
GuilhermeLubk | 0:e84b46bbec77 | 101 | for(int n = 0; n < 5; n++) { |
GuilhermeLubk | 0:e84b46bbec77 | 102 | numReadings += IR.read(); |
GuilhermeLubk | 0:e84b46bbec77 | 103 | led1 = !led1; |
GuilhermeLubk | 0:e84b46bbec77 | 104 | wait(0.2); |
GuilhermeLubk | 0:e84b46bbec77 | 105 | } |
GuilhermeLubk | 0:e84b46bbec77 | 106 | |
GuilhermeLubk | 0:e84b46bbec77 | 107 | printf("\nNum of positive readings: %d\n\r", numReadings); |
GuilhermeLubk | 0:e84b46bbec77 | 108 | |
GuilhermeLubk | 0:e84b46bbec77 | 109 | if(numReadings >= 5) { |
GuilhermeLubk | 0:e84b46bbec77 | 110 | printf("\nFIRE DETECTED - SENDING DATA\n\r"); |
GuilhermeLubk | 0:e84b46bbec77 | 111 | IR.rise(NULL); |
GuilhermeLubk | 0:e84b46bbec77 | 112 | led1 = 1; |
GuilhermeLubk | 0:e84b46bbec77 | 113 | led2 = 1; |
GuilhermeLubk | 0:e84b46bbec77 | 114 | |
GuilhermeLubk | 0:e84b46bbec77 | 115 | //Connect to ThingSpeak and starting sending data |
GuilhermeLubk | 0:e84b46bbec77 | 116 | int ret = 1; |
GuilhermeLubk | 0:e84b46bbec77 | 117 | do { |
GuilhermeLubk | 0:e84b46bbec77 | 118 | printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID); |
GuilhermeLubk | 0:e84b46bbec77 | 119 | ret = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2); |
GuilhermeLubk | 0:e84b46bbec77 | 120 | } while(ret != 0); |
GuilhermeLubk | 0:e84b46bbec77 | 121 | |
GuilhermeLubk | 0:e84b46bbec77 | 122 | printf("Success\n\n"); |
GuilhermeLubk | 0:e84b46bbec77 | 123 | printf("MAC: %s\n", wifi.get_mac_address()); |
GuilhermeLubk | 0:e84b46bbec77 | 124 | printf("IP: %s\n", wifi.get_ip_address()); |
GuilhermeLubk | 0:e84b46bbec77 | 125 | printf("Netmask: %s\n", wifi.get_netmask()); |
GuilhermeLubk | 0:e84b46bbec77 | 126 | printf("Gateway: %s\n", wifi.get_gateway()); |
GuilhermeLubk | 0:e84b46bbec77 | 127 | printf("RSSI: %d\n\n", wifi.get_rssi()); |
GuilhermeLubk | 0:e84b46bbec77 | 128 | |
GuilhermeLubk | 0:e84b46bbec77 | 129 | NetworkInterface *net = &wifi; |
GuilhermeLubk | 0:e84b46bbec77 | 130 | |
GuilhermeLubk | 0:e84b46bbec77 | 131 | TCPSocket socket; |
GuilhermeLubk | 0:e84b46bbec77 | 132 | nsapi_error_t response; |
GuilhermeLubk | 0:e84b46bbec77 | 133 | char sbuffer[256]; |
GuilhermeLubk | 0:e84b46bbec77 | 134 | char message[64]; |
GuilhermeLubk | 0:e84b46bbec77 | 135 | |
GuilhermeLubk | 0:e84b46bbec77 | 136 | while(true) { |
GuilhermeLubk | 0:e84b46bbec77 | 137 | |
GuilhermeLubk | 0:e84b46bbec77 | 138 | // Open a socket on the network interface, and create a TCP connection to thingspeaks.com |
GuilhermeLubk | 0:e84b46bbec77 | 139 | socket.open(net); |
GuilhermeLubk | 0:e84b46bbec77 | 140 | response = socket.connect("api.thingspeak.com", 80); |
GuilhermeLubk | 0:e84b46bbec77 | 141 | if(0 != response) { |
GuilhermeLubk | 0:e84b46bbec77 | 142 | printf("Error connecting: %d\n", response); |
GuilhermeLubk | 0:e84b46bbec77 | 143 | socket.close(); |
GuilhermeLubk | 0:e84b46bbec77 | 144 | return; |
GuilhermeLubk | 0:e84b46bbec77 | 145 | } |
GuilhermeLubk | 0:e84b46bbec77 | 146 | |
GuilhermeLubk | 0:e84b46bbec77 | 147 | printf("Connected to the Server\n"); |
GuilhermeLubk | 0:e84b46bbec77 | 148 | |
GuilhermeLubk | 0:e84b46bbec77 | 149 | //lecture des données des capteurs et actualisation des variables à transmettre |
GuilhermeLubk | 0:e84b46bbec77 | 150 | temperature_value = BSP_TSENSOR_ReadTemp() - 8; |
GuilhermeLubk | 0:e84b46bbec77 | 151 | led1 = !led1; |
GuilhermeLubk | 0:e84b46bbec77 | 152 | |
GuilhermeLubk | 0:e84b46bbec77 | 153 | |
GuilhermeLubk | 0:e84b46bbec77 | 154 | /* Construct content of HTTP command */ |
GuilhermeLubk | 0:e84b46bbec77 | 155 | //message à transmettre (données des capteurs) |
GuilhermeLubk | 0:e84b46bbec77 | 156 | sprintf(message, "{\"field1\": %0.2f}", temperature_value); |
GuilhermeLubk | 0:e84b46bbec77 | 157 | printf("Content Length = %d\r\n", (int)strlen(message)); |
GuilhermeLubk | 0:e84b46bbec77 | 158 | |
GuilhermeLubk | 0:e84b46bbec77 | 159 | /* Construct HTTP command to send */ |
GuilhermeLubk | 0:e84b46bbec77 | 160 | // Phase de transmission des données à ThingSpeaks.com |
GuilhermeLubk | 0:e84b46bbec77 | 161 | sprintf(sbuffer, "GET /update?api_key=%s HTTP/1.1\r\nHost: api.thingspeak.com\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s", thingspeak_APIkey_write, |
GuilhermeLubk | 0:e84b46bbec77 | 162 | (int)strlen(message),message); |
GuilhermeLubk | 0:e84b46bbec77 | 163 | printf("HTTP command %s\r\n", sbuffer); |
GuilhermeLubk | 0:e84b46bbec77 | 164 | wait(1.0); // temporisation avant la nouvelle transmission |
GuilhermeLubk | 0:e84b46bbec77 | 165 | |
GuilhermeLubk | 0:e84b46bbec77 | 166 | // Send a simple http request |
GuilhermeLubk | 0:e84b46bbec77 | 167 | printf("Sending HTTP request to thingspeak.com...\n");// |
GuilhermeLubk | 0:e84b46bbec77 | 168 | nsapi_size_t size = strlen(sbuffer); |
GuilhermeLubk | 0:e84b46bbec77 | 169 | response = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 170 | while(size) { |
GuilhermeLubk | 0:e84b46bbec77 | 171 | response = socket.send(sbuffer+response, size); |
GuilhermeLubk | 0:e84b46bbec77 | 172 | if (response < 0) { |
GuilhermeLubk | 0:e84b46bbec77 | 173 | printf("Error sending data: %d\n", response); |
GuilhermeLubk | 0:e84b46bbec77 | 174 | socket.close(); |
GuilhermeLubk | 0:e84b46bbec77 | 175 | return; |
GuilhermeLubk | 0:e84b46bbec77 | 176 | } else { |
GuilhermeLubk | 0:e84b46bbec77 | 177 | size -= response; |
GuilhermeLubk | 0:e84b46bbec77 | 178 | // Check if entire message was sent or not |
GuilhermeLubk | 0:e84b46bbec77 | 179 | printf("sent %d [%.*s]\n", response, strstr(sbuffer, "\r\n")-sbuffer, sbuffer); |
GuilhermeLubk | 0:e84b46bbec77 | 180 | } |
GuilhermeLubk | 0:e84b46bbec77 | 181 | } |
GuilhermeLubk | 0:e84b46bbec77 | 182 | |
GuilhermeLubk | 0:e84b46bbec77 | 183 | // Receive a simple http response and print out the response line |
GuilhermeLubk | 0:e84b46bbec77 | 184 | char rbuffer[64]; |
GuilhermeLubk | 0:e84b46bbec77 | 185 | response = socket.recv(rbuffer, sizeof rbuffer); |
GuilhermeLubk | 0:e84b46bbec77 | 186 | if (response < 0) { |
GuilhermeLubk | 0:e84b46bbec77 | 187 | printf("Error receiving data: %d\n", response); |
GuilhermeLubk | 0:e84b46bbec77 | 188 | } else { |
GuilhermeLubk | 0:e84b46bbec77 | 189 | printf("recv %d [%.*s]\n", response, strstr(rbuffer, "\r\n")-rbuffer, rbuffer); |
GuilhermeLubk | 0:e84b46bbec77 | 190 | } |
GuilhermeLubk | 0:e84b46bbec77 | 191 | // Close the socket to return its memory and bring down the network interface |
GuilhermeLubk | 0:e84b46bbec77 | 192 | socket.close(); |
GuilhermeLubk | 0:e84b46bbec77 | 193 | } |
GuilhermeLubk | 0:e84b46bbec77 | 194 | |
GuilhermeLubk | 0:e84b46bbec77 | 195 | |
GuilhermeLubk | 0:e84b46bbec77 | 196 | } else { |
GuilhermeLubk | 0:e84b46bbec77 | 197 | numReadings = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 198 | if(IR.read() == 0) { |
GuilhermeLubk | 0:e84b46bbec77 | 199 | event_flags.set(0); |
GuilhermeLubk | 0:e84b46bbec77 | 200 | IR.rise(&IR_ISP); |
GuilhermeLubk | 0:e84b46bbec77 | 201 | printf("\nNo fire detected, returning IDLE\n\r"); |
GuilhermeLubk | 0:e84b46bbec77 | 202 | } else { |
GuilhermeLubk | 0:e84b46bbec77 | 203 | event_flags.set(FIRE_DETECTED); |
GuilhermeLubk | 0:e84b46bbec77 | 204 | printf("\nSensor still high, re-checking\n\r"); |
GuilhermeLubk | 0:e84b46bbec77 | 205 | } |
GuilhermeLubk | 0:e84b46bbec77 | 206 | } |
GuilhermeLubk | 0:e84b46bbec77 | 207 | |
GuilhermeLubk | 0:e84b46bbec77 | 208 | |
GuilhermeLubk | 0:e84b46bbec77 | 209 | } |
GuilhermeLubk | 0:e84b46bbec77 | 210 | } |
GuilhermeLubk | 0:e84b46bbec77 | 211 | |
GuilhermeLubk | 0:e84b46bbec77 | 212 | |
GuilhermeLubk | 0:e84b46bbec77 | 213 | |
GuilhermeLubk | 0:e84b46bbec77 | 214 | int main() |
GuilhermeLubk | 0:e84b46bbec77 | 215 | { |
GuilhermeLubk | 0:e84b46bbec77 | 216 | |
GuilhermeLubk | 0:e84b46bbec77 | 217 | led1 = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 218 | led2 = 0; |
GuilhermeLubk | 0:e84b46bbec77 | 219 | thread.start(mbed::callback(main_routine)); |
GuilhermeLubk | 0:e84b46bbec77 | 220 | button.fall(&button_ISP); |
GuilhermeLubk | 0:e84b46bbec77 | 221 | IR.rise(&IR_ISP); |
GuilhermeLubk | 0:e84b46bbec77 | 222 | //main function will sleep |
GuilhermeLubk | 0:e84b46bbec77 | 223 | while(true) { |
GuilhermeLubk | 0:e84b46bbec77 | 224 | wait(1); |
GuilhermeLubk | 0:e84b46bbec77 | 225 | } |
GuilhermeLubk | 0:e84b46bbec77 | 226 | |
GuilhermeLubk | 0:e84b46bbec77 | 227 | } |