diff options
author | Torben Egmose <torben.egmose@gmail.com> | 2021-02-07 22:06:46 +0100 |
---|---|---|
committer | Torben Egmose <torben.egmose@gmail.com> | 2021-02-07 22:06:46 +0100 |
commit | cb38cc24238c70b841e762a9870e46d231761600 (patch) | |
tree | 50b8cea71e230f3674277534112332a32430b3e1 /src |
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 261 |
1 files changed, 261 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..ccd53fc --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,261 @@ +#include <Arduino.h> +#include <Arduino_I2C_Port_Expander.h> + +#include <ESP8266WiFi.h> +#include <ESP8266mDNS.h> +#include <WiFiUdp.h> +#include <ArduinoOTA.h> +#include <EEPROM.h> + +#include <PubSubClient.h> +const char* debug = "debug"; +const char* server = "172.19.1.10"; + +const char* s_will = "died"; +const char* s_on = "on"; +const char* s_off = "off"; + +const char* on[6] = {"led0:on","led1:on","led2:on","led3:on","led4:on","led5:on"}; +const char* off[6] = {"led0:off","led1:off","led2:off","led3:off","led4:off","led5:off"}; +int timer[6] = {0,0,0,0,0,0}; +int button_lvl[6] = {0,0,0,0,0,0}; +char button[6][23]; +char led[6][23]; + +const char* s_error = "error"; +const char* s_ready = "ready"; + +WiFiClient espClient; +PubSubClient client(espClient); + +const char* ssid = "iot"; +const char* password = "longtimeago"; + +EXPAND io1(0x01); +EXPAND io2(0x02); + +int wait = 1; +unsigned int i; +int val; +char str[10]; +unsigned long tick = 0; +unsigned long tock = 0; + +uint8_t MAC_array[6]; +char MAC_char[23]; +char buffer[60]; +char sta[23]; +char lim[23]; + + +int level(byte* payload, unsigned int length) { + if ((char)payload[0] == 'o' && (char)payload[1] == 'n') { + return 255; + } + if ((char)payload[0] == 'o' && (char)payload[1] == 'f') { + return 0; + } + + str[0] = '0'; + str[1] = '0'; + str[2] = '0'; + str[3] = '0'; + str[4] = '\0'; + + for (i = 0; i < length; i++) { + str[i] = (char)payload[i]; + } + + for (i = length; i < 10; i++) { + str[i] = '\0'; + } + + return atoi(str); +} + +void callback(char* topic, byte* payload, unsigned int length) { + + // debug reboot of device + if(topic[0] == 'd') + { + if((char)payload[0] == 'r' && (char)payload[1] == 'e' && (char)payload[2] == 's' && (char)payload[3] == 'e' && (char)payload[4] == 't') + { + WiFi.forceSleepBegin(); + ESP.wdtFeed(); + ESP.restart(); + while(true) + { + yield(); + } + } + return ; + } + + // set limt + if(topic[14] == 'l' && topic[15] == 'i') + { + int tmp = level(payload, length); + if(tmp > 0) + { + wait = tmp; + EEPROM.write(0,wait); + EEPROM.commit(); + sprintf(buffer,"%d",wait); + client.publish(sta,buffer); + } + else + { + client.publish(sta,s_error); + } + return ; + } + + + i = ((int)topic[17]) - 48; + + if(payload[0] == 't') + { + timer[i] = wait; + val = 255; + } + else + { + // string to int + val = level(payload,length); + } + + if(topic[17] == '0' ) { io1.analogWriteSlow(3,val); } + if(topic[17] == '1' ) { io1.analogWriteSlow(5,val); } + if(topic[17] == '2' ) { io1.digitalWrite(6,val > 0 ? HIGH : LOW ); } + //if(topic[17] == '3' ) { io2.analogWriteSlow(3,val); } + //if(topic[17] == '4' ) { io2.analogWriteSlow(5,val); } + //if(topic[17] == '5' ) { io2.analogWriteSlow(6,val); } + + if(val > 0) client.publish(sta, on[0]); + if(val == 0) client.publish(sta, off[0]); + return; + +} + +void trigger_input(int ¤t, int value, const char* topic) +{ + if(current != value) + { + current = value; + if(value == HIGH) + { + client.publish(topic, s_on); + } + else + { + client.publish(topic, s_off); + } + client.loop(); + } +} + +void setup() { + // put your setup code here, to run once: + Wire.setClock(10000L); + Wire.begin(); + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(10); + yield(); + } + + WiFi.macAddress(MAC_array); + for (i = 0; i < sizeof(MAC_array); ++i) { + sprintf(MAC_char, "%s%02x", MAC_char, MAC_array[i]); + } + sprintf(sta, "/%s/status", MAC_char); + sprintf(lim, "/%s/limit", MAC_char); + + client.setServer(server, 1883); + client.setCallback(callback); + client.connect(MAC_char, sta, 0, false, s_will); + client.publish(debug, MAC_char); + + EEPROM.begin(512); + wait = int(EEPROM.read(0)); + + for (i = 0; i < 6; i++) + { + sprintf(led[i], "/%s/led%i", MAC_char, i); + sprintf(button[i], "/%s/button%i", MAC_char, i); + client.subscribe(led[i],1); + } + + client.publish(sta,__FILE__); + client.publish(sta,s_ready); + sprintf(buffer,"%d",wait); + client.publish(sta,buffer); + client.subscribe(lim,1); + + IPAddress ip = WiFi.localIP(); + sprintf(buffer,"%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); + client.publish(sta,buffer); + + ArduinoOTA.setHostname(MAC_char); + ArduinoOTA.begin(); + ESP.wdtEnable(WDTO_8S); + tick = millis(); + tock = millis(); +} + +void loop() { + // put your main code here, to run repeatedly: + ESP.wdtFeed(); + ArduinoOTA.handle(); + ESP.wdtFeed(); + + if (WiFi.status() != WL_CONNECTED) { + yield(); + } + + if (client.connected()) { + client.loop(); + } else { + client.connect(MAC_char, sta, 0, false, s_will); + client.subscribe(debug,1); + client.subscribe(lim,1); + for (i = 0; i < 6; i++) + { + client.subscribe(led[i],1); + } + } + + ESP.wdtFeed(); + yield(); + + if(millis() - tick >= 20) { + tick = millis(); + + for (i = 0; i < 3; i++) + { + trigger_input(button_lvl[i],io1.digitalRead(14 + i), button[i]); yield(); + //trigger_input(button_lvl[i+3],io2.digitalRead(14 + i), button[i+3]); yield(); + } + } + + // every secound + if(millis() - tock >= 1000) { + tock = millis(); + for (i = 0; i < 6; i++) + { + if(timer[i] > 0) + { + timer[i]--; + if(timer[i] == 0) + { + client.publish(led[i],s_off,1); + } + } + } + } + + delay(10); +}
\ No newline at end of file |