IoT sensor/controller using STM32, W5500 ethernet, MQTT

Dependencies:   mbed WIZnet_Library Watchdog DHT MQTT DS1820

Revision:
10:3ad12f8d8b46
Parent:
9:a8098e772b48
Child:
11:2a397ea7acc8
--- a/main.cpp	Thu Feb 27 23:05:42 2020 +0000
+++ b/main.cpp	Sun Mar 01 11:11:22 2020 +0000
@@ -121,7 +121,8 @@
             // turn something on/off!
             pc.printf("Output: %d updated to %s\r\n", output_num, ONOFF[new_state]);
             outputs[output_num] = new_state;
-//            publish_value(client, topic, ONOFF[new_state]);  // needs to access client :-/
+            flag_publish = 1;  // workaround for below
+//            publish_value(client, topic, ONOFF[new_state], false);  // needs to access client :-/
         }
     }
     else {
@@ -178,9 +179,9 @@
 }
 
 
-int publish_value(MClient &client, const char *topic, const char *buf)
+int publish_value(MClient &client, const char *topic, const char *buf, bool retain = false)
 {
-    return publish(client, "stat", topic, buf, strlen(buf), true);
+    return publish(client, "stat", topic, buf, strlen(buf), retain);
 }
 
 
@@ -190,7 +191,15 @@
         char topic[] = "outputx";
         topic[6] = i+48;
         pc.printf("Output: %s is %s\r\n", topic, ONOFF[output_state]);
-        connected = publish_value(client, topic, ONOFF[output_state]);
+        connected = publish_value(client, topic, ONOFF[output_state], false);
+    }
+}
+
+void publish_inputs(MClient &client) {
+    for(int i=0; i<NUM_INPUTS; i++) {
+        char topic_str[8]; // long enough string for inputx
+        sprintf(topic_str, "input%d", i);
+        connected = publish_value(client,topic_str,OPENCLOSED[input_state[i]], false);
     }
 }
 
@@ -200,7 +209,9 @@
     pc.printf("Uptime %d\r\n", uptime_sec);
     char uptime_sec_str[12]; // long enough string for a long int
     sprintf(uptime_sec_str, "%d", uptime_sec);
-    connected = publish_value(client,"uptime",uptime_sec_str);
+    connected = publish_value(client,"uptime",uptime_sec_str, false);
+    // alive
+    publish_value(client, "alive","ON", false);
 }
 
 
@@ -214,7 +225,7 @@
             pc.printf("Input %d changed to %s\r\n", i, OPENCLOSED[input_state[i]]);
             char topic_str[8]; // long enough string for inputx
             sprintf(topic_str, "input%d", i);
-            connected = publish_value(client,topic_str,OPENCLOSED[input_state[i]]);
+            connected = publish_value(client,topic_str,OPENCLOSED[input_state[i]], false);
         }
     }
 }
@@ -228,14 +239,15 @@
         pc.printf("Temperature: %3.1f, Humidity: %3.1f\n", temp, humidity);
     } else {
         pc.printf("DHT read error: %d\n", error);
+        return;
     }
     // convert to string and publish
     char temp_str[6];
     sprintf(temp_str, "%3.1f", temp[0]);
-    connected = publish_value(client,"temp0",temp_str);
+    connected = publish_value(client,"temp0",temp_str, false);
     char humidity_str[6];
     sprintf(humidity_str, "%3.1f", humidity[0]);
-    connected = publish_value(client,"humidity0",humidity_str);
+    connected = publish_value(client,"humidity0",humidity_str, false);
 /*
     probe.convertTemperature(true, DS1820::all_devices);  //Start temp conversion, wait until ready
     temp = probe.temperature();
@@ -273,8 +285,8 @@
     // TODO add client ID when subscribing
 
     // Node online message
-    publish_value(client, "alive","ON");
-    publish_value(client, "IPAddress", wiz.getIPAddress());
+    publish_value(client, "alive","ON", false);
+    publish_value(client, "IPAddress", wiz.getIPAddress(), true);
     pc.printf("Initialization done.\r\n");
     
     return 0;
@@ -282,12 +294,12 @@
 
 void every_60sec() {
     // no waits or blocking routines here please!
+    flag_read_temps = 1;
 }
 
 void every_5sec() {
     // no waits or blocking routines here please!
     flag_publish = 1;
-    flag_read_temps = 1;
 }
 
 void every_second() {
@@ -308,6 +320,7 @@
 
 int main()
 {
+    wd.Configure(20.0);
 //    WIZnetInterface wiz(PA_7, PA_6, PA_5, PA_4, NC); // SPI1 with no reset
     WIZnetInterface wiz(PB_15, PB_14, PB_13, PB_12, NC); // SPI2 with no reset
     MQTTSocket sock;
@@ -317,16 +330,16 @@
     tick_1sec.attach(&every_second, 1.0);
     tick_5sec.attach(&every_5sec, 5.0);
     tick_60sec.attach(&every_60sec, 60);
-    wd.Configure(30.0);
     
     //pulse all outputs
     for(int i=0; i<NUM_OUTPUTS; i++) {
         outputs[i] = IO_OFF;
         wait(0.2);
     }
-    
+
     pc.printf("\n\nNode: %s\r\n", NODE_NAME);
     
+    wd.Service();       // kick the dog before the timeout
     connected = networking_init(sock, client, wiz);
     
     while(1) {
@@ -340,6 +353,7 @@
             // we're connected, do stuff!
             if(flag_publish) {
                 publish_outputs(client);
+                publish_inputs(client);
                 publish_info(client);
                 flag_publish = 0;
             }
@@ -349,6 +363,6 @@
             }
         }
         
-        client.yield(500);  // pause a while, yawn......
+        client.yield(50);  // pause a while, yawn......
     }
 }