IoT sensor/controller using STM32, W5500 ethernet, MQTT
Dependencies: mbed WIZnet_Library Watchdog DHT MQTT DS1820
Diff: main.cpp
- 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...... } }