watersensor and DS1280 temp sensor

Dependencies:   watersenor_and_temp_code MQTT NetworkSocketAPI X_NUCLEO_IDW01M1v2 mbed

Fork of DS1820_IDW01M1 by CHANG rozen

Committer:
e58136782000
Date:
Sun Nov 05 06:50:14 2017 +0000
Revision:
5:06af79bf75a5
Parent:
4:3642f63079ec
watersensor and temp sensor finish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rozendhyan@gmail.com 0:80c7778c82b8 1 #include "mbed.h"
rozendhyan@gmail.com 0:80c7778c82b8 2 #include "BME280.hpp"
rozendhyan@gmail.com 0:80c7778c82b8 3 #include "SpwfInterface.h"
rozendhyan@gmail.com 0:80c7778c82b8 4 #include "TCPSocket.h"
rozendhyan@gmail.com 0:80c7778c82b8 5 #include "MQTTClient.h"
rozendhyan@gmail.com 0:80c7778c82b8 6 #include "MQTTWiFi.h"
e58136782000 3:30d9b8d9adc9 7 #include "DS1820.h"
rozendhyan@gmail.com 0:80c7778c82b8 8
rozendhyan@gmail.com 0:80c7778c82b8 9 // MQTT use
rozendhyan@gmail.com 0:80c7778c82b8 10 #define MQTT_MAX_PACKET_SIZE 250
rozendhyan@gmail.com 0:80c7778c82b8 11 #define MQTT_MAX_PAYLOAD_SIZE 300
rozendhyan@gmail.com 0:80c7778c82b8 12 //Configuration value needed to connect Red-node
e58136782000 5:06af79bf75a5 13 #define BROKER_URL "192.168.1.111";
rozendhyan@gmail.com 0:80c7778c82b8 14 #define MQTT_PORT 1883
rozendhyan@gmail.com 0:80c7778c82b8 15 //MQTT use Topic
e58136782000 5:06af79bf75a5 16 #define TOPIC2 "1"
e58136782000 5:06af79bf75a5 17 #define TOPIC1 "3"
rozendhyan@gmail.com 1:2ee9e5685a1e 18 #define SUB_TOPIC "LED"
rozendhyan@gmail.com 0:80c7778c82b8 19
rozendhyan@gmail.com 0:80c7778c82b8 20
rozendhyan@gmail.com 0:80c7778c82b8 21 //Wifi network
e58136782000 5:06af79bf75a5 22 #define SSID "18-2F"
e58136782000 5:06af79bf75a5 23 #define PASSW "062432779"
rozendhyan@gmail.com 0:80c7778c82b8 24
rozendhyan@gmail.com 0:80c7778c82b8 25 DigitalOut myled(LED1);
rozendhyan@gmail.com 4:3642f63079ec 26 //BME280 bmpSensor;
rozendhyan@gmail.com 0:80c7778c82b8 27 int connack_rc = 0; // MQTT connack return code
rozendhyan@gmail.com 0:80c7778c82b8 28 const char * ip_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 29 char *host_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 30 bool netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 31 int connectTimeout = 1000;
rozendhyan@gmail.com 0:80c7778c82b8 32 bool mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 33 bool netConnected = false;
rozendhyan@gmail.com 0:80c7778c82b8 34 bool connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 35 int retryAttempt = 0;
rozendhyan@gmail.com 0:80c7778c82b8 36 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 37
e58136782000 3:30d9b8d9adc9 38
rozendhyan@gmail.com 4:3642f63079ec 39
e58136782000 3:30d9b8d9adc9 40 Serial serial(USBTX, USBRX);
rozendhyan@gmail.com 4:3642f63079ec 41 DS1820 ds1820(PA_8); // substitute PA_9 with actual mbed pin name connected to the DS1820 data pin
e58136782000 5:06af79bf75a5 42 DigitalIn sensor_in(D4);
e58136782000 3:30d9b8d9adc9 43
e58136782000 3:30d9b8d9adc9 44
rozendhyan@gmail.com 0:80c7778c82b8 45 MQTT::Message message;
e58136782000 3:30d9b8d9adc9 46 MQTTString TopicName1={TOPIC1};
e58136782000 3:30d9b8d9adc9 47 MQTTString TopicName2={TOPIC2};
e58136782000 3:30d9b8d9adc9 48 MQTT::MessageData MsgData1(TopicName1, message);
e58136782000 3:30d9b8d9adc9 49 MQTT::MessageData MsgData2(TopicName2, message);
rozendhyan@gmail.com 0:80c7778c82b8 50
rozendhyan@gmail.com 1:2ee9e5685a1e 51 void subscribe_LED(char* msg){
rozendhyan@gmail.com 1:2ee9e5685a1e 52 int value = atoi(msg);
rozendhyan@gmail.com 1:2ee9e5685a1e 53 //printf("value = %d\n", value);
rozendhyan@gmail.com 1:2ee9e5685a1e 54 if(value ==1){
rozendhyan@gmail.com 1:2ee9e5685a1e 55 myled = !myled;
rozendhyan@gmail.com 1:2ee9e5685a1e 56 }
rozendhyan@gmail.com 1:2ee9e5685a1e 57
rozendhyan@gmail.com 1:2ee9e5685a1e 58 }
rozendhyan@gmail.com 1:2ee9e5685a1e 59
rozendhyan@gmail.com 0:80c7778c82b8 60
rozendhyan@gmail.com 0:80c7778c82b8 61 void subscribe_cb(MQTT::MessageData & msgMQTT) {
rozendhyan@gmail.com 0:80c7778c82b8 62 char msg[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 63 msg[0]='\0';
rozendhyan@gmail.com 0:80c7778c82b8 64 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
rozendhyan@gmail.com 0:80c7778c82b8 65 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
rozendhyan@gmail.com 1:2ee9e5685a1e 66 subscribe_LED(msg);
rozendhyan@gmail.com 0:80c7778c82b8 67 }
rozendhyan@gmail.com 0:80c7778c82b8 68 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 69 {
rozendhyan@gmail.com 1:2ee9e5685a1e 70 char* pubTopic = SUB_TOPIC;
rozendhyan@gmail.com 0:80c7778c82b8 71 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
rozendhyan@gmail.com 0:80c7778c82b8 72 }
rozendhyan@gmail.com 0:80c7778c82b8 73
rozendhyan@gmail.com 0:80c7778c82b8 74
rozendhyan@gmail.com 0:80c7778c82b8 75 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack){
rozendhyan@gmail.com 0:80c7778c82b8 76 const char* host = BROKER_URL;
rozendhyan@gmail.com 0:80c7778c82b8 77
rozendhyan@gmail.com 0:80c7778c82b8 78 char hostname[strlen(host) + 1];
rozendhyan@gmail.com 0:80c7778c82b8 79 sprintf(hostname,"%s", host);
rozendhyan@gmail.com 0:80c7778c82b8 80
rozendhyan@gmail.com 0:80c7778c82b8 81 SpwfSAInterface& WiFi = ipstack->getWiFi();
rozendhyan@gmail.com 0:80c7778c82b8 82
rozendhyan@gmail.com 0:80c7778c82b8 83 //Network Debug statements
rozendhyan@gmail.com 0:80c7778c82b8 84 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 85 LOG("Connecting WiFi.\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 86 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
rozendhyan@gmail.com 0:80c7778c82b8 87 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
rozendhyan@gmail.com 0:80c7778c82b8 88 LOG("Server Hostname: %s port: %d\n\r", hostname, MQTT_PORT);
e58136782000 3:30d9b8d9adc9 89 LOG("Topic1: %s\n\r", TOPIC1);
e58136782000 3:30d9b8d9adc9 90 LOG("Topic2: %s\n\r", TOPIC2);
rozendhyan@gmail.com 0:80c7778c82b8 91 //need subscrie
rozendhyan@gmail.com 0:80c7778c82b8 92 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 93 netConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 94 ipstack->open(&ipstack->getWiFi());
rozendhyan@gmail.com 0:80c7778c82b8 95 int rc = ipstack->connect(hostname,MQTT_PORT,connectTimeout);
rozendhyan@gmail.com 0:80c7778c82b8 96 if (rc != 0)
rozendhyan@gmail.com 0:80c7778c82b8 97 {
rozendhyan@gmail.com 0:80c7778c82b8 98 WARN("IP Stack connect returned: %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 99 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 100 }
rozendhyan@gmail.com 0:80c7778c82b8 101 printf ("--->TCP Connected\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 102 netConnected = true;
rozendhyan@gmail.com 0:80c7778c82b8 103 netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 104
rozendhyan@gmail.com 0:80c7778c82b8 105 //MQTT Connect
rozendhyan@gmail.com 0:80c7778c82b8 106 mqttConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 107 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
rozendhyan@gmail.com 0:80c7778c82b8 108 data.MQTTVersion = 4;
rozendhyan@gmail.com 0:80c7778c82b8 109 data.struct_version =0;
rozendhyan@gmail.com 0:80c7778c82b8 110
rozendhyan@gmail.com 0:80c7778c82b8 111 if((rc = client->connect(data)) == 0){
rozendhyan@gmail.com 0:80c7778c82b8 112 connected = true;
rozendhyan@gmail.com 0:80c7778c82b8 113 printf("--->MQTT Connected\n\r");
rozendhyan@gmail.com 1:2ee9e5685a1e 114 //#ifdef SUBSCRIBE
rozendhyan@gmail.com 1:2ee9e5685a1e 115 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",SUB_TOPIC);
rozendhyan@gmail.com 1:2ee9e5685a1e 116 //#endif
rozendhyan@gmail.com 0:80c7778c82b8 117 }else {
rozendhyan@gmail.com 0:80c7778c82b8 118 WARN("MQTT connect returned %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 119 }
rozendhyan@gmail.com 0:80c7778c82b8 120 if (rc >= 0)
rozendhyan@gmail.com 0:80c7778c82b8 121 connack_rc = rc;
rozendhyan@gmail.com 0:80c7778c82b8 122 mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 123 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 124
rozendhyan@gmail.com 0:80c7778c82b8 125 }
rozendhyan@gmail.com 0:80c7778c82b8 126 int getConnTimeout(int attemptNumber)
rozendhyan@gmail.com 0:80c7778c82b8 127 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
rozendhyan@gmail.com 0:80c7778c82b8 128 // after 20 attempts, retry every 10 minutes
rozendhyan@gmail.com 0:80c7778c82b8 129 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
rozendhyan@gmail.com 0:80c7778c82b8 130 }
rozendhyan@gmail.com 0:80c7778c82b8 131 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 132 {
rozendhyan@gmail.com 0:80c7778c82b8 133 connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 134
rozendhyan@gmail.com 0:80c7778c82b8 135 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
rozendhyan@gmail.com 0:80c7778c82b8 136 {
rozendhyan@gmail.com 0:80c7778c82b8 137 /*if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
rozendhyan@gmail.com 0:80c7778c82b8 138 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
rozendhyan@gmail.com 0:80c7778c82b8 139 return; // don't reattempt to connect if credentials are wrong
rozendhyan@gmail.com 0:80c7778c82b8 140 } */
rozendhyan@gmail.com 0:80c7778c82b8 141 int timeout = getConnTimeout(++retryAttempt);
rozendhyan@gmail.com 0:80c7778c82b8 142 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
rozendhyan@gmail.com 0:80c7778c82b8 143
rozendhyan@gmail.com 0:80c7778c82b8 144 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
rozendhyan@gmail.com 0:80c7778c82b8 145 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
rozendhyan@gmail.com 0:80c7778c82b8 146 // this works - reset the system when the retry count gets to a threshold
rozendhyan@gmail.com 0:80c7778c82b8 147 if (retryAttempt == 5)
rozendhyan@gmail.com 0:80c7778c82b8 148 NVIC_SystemReset();
rozendhyan@gmail.com 0:80c7778c82b8 149 else
rozendhyan@gmail.com 0:80c7778c82b8 150 wait(timeout);
rozendhyan@gmail.com 0:80c7778c82b8 151 }
rozendhyan@gmail.com 0:80c7778c82b8 152 }
e58136782000 5:06af79bf75a5 153 int publish1(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack,int data){
rozendhyan@gmail.com 0:80c7778c82b8 154
rozendhyan@gmail.com 0:80c7778c82b8 155
rozendhyan@gmail.com 0:80c7778c82b8 156 MQTT::Message message;
e58136782000 3:30d9b8d9adc9 157 char *pubTopic = TOPIC1;
rozendhyan@gmail.com 0:80c7778c82b8 158 char buf[MQTT_MAX_PAYLOAD_SIZE];
e58136782000 5:06af79bf75a5 159 // printf("Temp = %d\n", data);
rozendhyan@gmail.com 0:80c7778c82b8 160 sprintf(buf,"%d",data);
rozendhyan@gmail.com 0:80c7778c82b8 161 message.qos = MQTT::QOS0;
rozendhyan@gmail.com 0:80c7778c82b8 162 message.retained = false;
rozendhyan@gmail.com 0:80c7778c82b8 163 message.dup = false;
rozendhyan@gmail.com 0:80c7778c82b8 164 message.payload = (void*)buf;
rozendhyan@gmail.com 0:80c7778c82b8 165 message.payloadlen = strlen(buf);
rozendhyan@gmail.com 0:80c7778c82b8 166
e58136782000 5:06af79bf75a5 167 printf("Temp = %s\n\r", buf);
rozendhyan@gmail.com 0:80c7778c82b8 168 return client->publish(pubTopic, message);
rozendhyan@gmail.com 0:80c7778c82b8 169 }
e58136782000 5:06af79bf75a5 170 int publish2(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack,int data){
e58136782000 5:06af79bf75a5 171
e58136782000 5:06af79bf75a5 172
e58136782000 5:06af79bf75a5 173 MQTT::Message message;
e58136782000 5:06af79bf75a5 174 char *pubTopic = TOPIC1;
e58136782000 5:06af79bf75a5 175 char buf[MQTT_MAX_PAYLOAD_SIZE];
e58136782000 5:06af79bf75a5 176 if(data)
e58136782000 5:06af79bf75a5 177 {
e58136782000 5:06af79bf75a5 178 printf("LED:OFF \n");
e58136782000 5:06af79bf75a5 179 }
e58136782000 5:06af79bf75a5 180 else
e58136782000 5:06af79bf75a5 181 {
e58136782000 5:06af79bf75a5 182 printf("LED:ON \n");
e58136782000 5:06af79bf75a5 183 }
e58136782000 5:06af79bf75a5 184 sprintf(buf,"%d",data);
e58136782000 5:06af79bf75a5 185 message.qos = MQTT::QOS0;
e58136782000 5:06af79bf75a5 186 message.retained = false;
e58136782000 5:06af79bf75a5 187 message.dup = false;
e58136782000 5:06af79bf75a5 188 message.payload = (void*)buf;
e58136782000 5:06af79bf75a5 189 message.payloadlen = strlen(buf);
e58136782000 5:06af79bf75a5 190 return client->publish(pubTopic, message);
e58136782000 5:06af79bf75a5 191 }
rozendhyan@gmail.com 4:3642f63079ec 192 int main()
rozendhyan@gmail.com 0:80c7778c82b8 193 {
rozendhyan@gmail.com 0:80c7778c82b8 194 myled =0;
rozendhyan@gmail.com 4:3642f63079ec 195
e58136782000 3:30d9b8d9adc9 196
rozendhyan@gmail.com 0:80c7778c82b8 197 const char *ssid = SSID;
rozendhyan@gmail.com 0:80c7778c82b8 198 const char *seckey = PASSW;
rozendhyan@gmail.com 0:80c7778c82b8 199 //use SpwfSAInterface connect AP
rozendhyan@gmail.com 0:80c7778c82b8 200 SpwfSAInterface spwf(D8,D2, false);
rozendhyan@gmail.com 0:80c7778c82b8 201 printf("\r\nX-NUCLEO-IDW01M1 mbed \n");
rozendhyan@gmail.com 0:80c7778c82b8 202 printf("\r\nconnecting to AP\n");
rozendhyan@gmail.com 0:80c7778c82b8 203 //connect to Wifi
rozendhyan@gmail.com 0:80c7778c82b8 204 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
rozendhyan@gmail.com 0:80c7778c82b8 205 //check wifi has got ip_address
rozendhyan@gmail.com 0:80c7778c82b8 206 if(ipstack.getWiFi().get_ip_address() == 0){
rozendhyan@gmail.com 0:80c7778c82b8 207 printf("Connect WiFi is failed!\nPlease check your ssid and passwd is correct");
rozendhyan@gmail.com 0:80c7778c82b8 208 return 0;
rozendhyan@gmail.com 0:80c7778c82b8 209 }
rozendhyan@gmail.com 0:80c7778c82b8 210 printf("ip: %s\n",ipstack.getWiFi().get_ip_address() );
rozendhyan@gmail.com 0:80c7778c82b8 211
rozendhyan@gmail.com 0:80c7778c82b8 212 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
rozendhyan@gmail.com 0:80c7778c82b8 213 attemptConnect(&client, &ipstack);
rozendhyan@gmail.com 4:3642f63079ec 214
rozendhyan@gmail.com 4:3642f63079ec 215 int count = 0;
e58136782000 5:06af79bf75a5 216 int databuffer1;
e58136782000 5:06af79bf75a5 217 int databuffer2;
rozendhyan@gmail.com 0:80c7778c82b8 218 // tyeld.start();
rozendhyan@gmail.com 4:3642f63079ec 219 while (true){
rozendhyan@gmail.com 4:3642f63079ec 220 if(!ds1820.begin())
e58136782000 5:06af79bf75a5 221 {
rozendhyan@gmail.com 4:3642f63079ec 222 return -1;
e58136782000 5:06af79bf75a5 223 }
rozendhyan@gmail.com 4:3642f63079ec 224 else
e58136782000 5:06af79bf75a5 225 {
rozendhyan@gmail.com 4:3642f63079ec 226 ds1820.startConversion();
e58136782000 5:06af79bf75a5 227 }
e58136782000 5:06af79bf75a5 228
e58136782000 5:06af79bf75a5 229 if(sensor_in)
e58136782000 5:06af79bf75a5 230 {
e58136782000 5:06af79bf75a5 231 databuffer2 = 0;
e58136782000 5:06af79bf75a5 232 }
e58136782000 5:06af79bf75a5 233 else
e58136782000 5:06af79bf75a5 234 {
e58136782000 5:06af79bf75a5 235 databuffer2 = 1;
e58136782000 5:06af79bf75a5 236 }
e58136782000 5:06af79bf75a5 237 if (++count == 20)
e58136782000 3:30d9b8d9adc9 238 { // Publish a message every second
e58136782000 5:06af79bf75a5 239 // serial.printf("temp = %3.1f\r\n", ds1820.read()); // read temperature
e58136782000 5:06af79bf75a5 240 databuffer1 = ds1820.read();
rozendhyan@gmail.com 4:3642f63079ec 241 ds1820.startConversion(); // start temperature conversion
rozendhyan@gmail.com 4:3642f63079ec 242 wait(1.0); // let DS1820 complete the temperature conversion
e58136782000 5:06af79bf75a5 243 if (publish1(&client, &ipstack,databuffer1) != 0)
e58136782000 5:06af79bf75a5 244 {
e58136782000 5:06af79bf75a5 245 attemptConnect(&client, &ipstack); // if we have lost the connection
e58136782000 5:06af79bf75a5 246 }
e58136782000 5:06af79bf75a5 247 if (publish2(&client, &ipstack,databuffer2) != 0)
e58136782000 3:30d9b8d9adc9 248 {
e58136782000 3:30d9b8d9adc9 249 attemptConnect(&client, &ipstack); // if we have lost the connection
e58136782000 3:30d9b8d9adc9 250 }
e58136782000 3:30d9b8d9adc9 251 count = 0;
e58136782000 3:30d9b8d9adc9 252 }
e58136782000 3:30d9b8d9adc9 253 else
e58136782000 3:30d9b8d9adc9 254 {
e58136782000 5:06af79bf75a5 255 // serial.printf("count: %d \n",count);
rozendhyan@gmail.com 4:3642f63079ec 256 }
e58136782000 3:30d9b8d9adc9 257 // int start = tyeld.read_ms();
rozendhyan@gmail.com 4:3642f63079ec 258 //client.yield(10); // allow the MQTT client to receive messages
e58136782000 3:30d9b8d9adc9 259 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
e58136782000 3:30d9b8d9adc9 260 }
rozendhyan@gmail.com 0:80c7778c82b8 261 }