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