#include #include #include #include #include #include #include #include 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); }