summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp261
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 &current, 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