const char SSID[] = ""; const char PASSWORD[] = ""; const char version[] = " 0.8.1"; #include "globalvars.h" #include #include #include #include #include #include #include #include ESP8266WebServer server; IPAddress staticIP(192, 168, 2, 4); // static IP address IPAddress gateway(192, 168, 2, 1); // Router's IP address IPAddress subnet(255, 255, 255, 0); IPAddress dns(192, 168, 2, 1); Timezone myTime; const u_int r = 0; const u_int oneWireBus = 0; OneWire oneWire(oneWireBus); DallasTemperature sensors(&oneWire); int temperature; int temperatureSet; static unsigned long lastTempCycle = -5000; char time_all[8][8][3] = { {}, {}, {}, {}, {}, {}, {}, {}}; // 3D array for load_EEPROM() and handleTime() const unsigned int pins[1] = {4}; char stat[1][4] = {"AUS"}; // text on button char t_stat[1][4] = {""}; // for "status of timer changed" bool override[1] = {false}; // for manual override char home_html[1346]; char settings_html[987]; const char settings_html_pre[] PROGMEM = {"\ \ \ \ \ \ Einstellungen\ \ \ \
\
\ \
\ \ - \
\ \ - \
"}; void reload_home(); void reload_settings(); void handleToggle(); void load_EEPROM() { unsigned int EEPROM_Addr = 0; for (unsigned int i0 = 0; i0 < 8; i0++) { for (unsigned int i = 0; i < 8; i++) { if (EEPROM.read(EEPROM_Addr) < 10) { sprintf(time_all[i0][i], "0%d", EEPROM.read(EEPROM_Addr)); } else { sprintf(time_all[i0][i], "%d", EEPROM.read(EEPROM_Addr)); } EEPROM_Addr += 4; yield(); } } temperatureSet = EEPROM.read(256); } void handleHome() { reload_home(); server.send(200, "text/html", home_html); debugln(ESP.getFreeHeap(), DEC); } void handleSettings() { reload_settings(); server.setContentLength(strlen(settings_html_pre) + strlen(settings_html)); server.send(200, "text/html", settings_html_pre); server.sendContent(settings_html); debugln(ESP.getFreeHeap(), DEC); } void handleTime() { if (server.arg("rule") != "") { debugln("write main"); const char args[4][9] = {"time_o", "time_f", "time_o_1", "time_f_1"}; for (unsigned int arg = 0; arg < 4; arg++) { if (server.arg(args[arg]) != "") { char buff_h[2][2] = {server.arg(args[arg])[0], server.arg(args[arg])[1]}; char buff_m[2][2] = {server.arg(args[arg])[3], server.arg(args[arg])[4]}; sprintf(time_all[arg * 2][server.arg("rule").toInt()], "%s", buff_h); sprintf(time_all[arg * 2 + 1][server.arg("rule").toInt()], "%s", buff_m); EEPROM.put(server.arg("rule").toInt() * 4 + arg * 64, atoi(time_all[arg * 2][server.arg("rule").toInt()])); EEPROM.commit(); EEPROM.put(server.arg("rule").toInt() * 4 + arg * 64 + 32, atoi(time_all[arg * 2 + 1][server.arg("rule").toInt()])); EEPROM.commit(); } } } if (server.arg("temperature").toInt() != temperatureSet) { debugln("write temperature"); temperatureSet = server.arg("temperature").toInt(); EEPROM.put(256, temperatureSet); EEPROM.commit(); } reload_settings(); server.setContentLength(strlen(settings_html_pre) + strlen(settings_html)); server.send(301, "text/html", settings_html_pre); server.sendContent(settings_html); } void timer() { int ri = 0; bool isOn = false; while (ri <= 7) { if ((((myTime.hour() * 60 + myTime.minute() >= atoi(time_all[0][ri]) * 60 + atoi(time_all[1][ri])) and (myTime.hour() * 60 + myTime.minute() < atoi(time_all[2][ri]) * 60 + atoi(time_all[3][ri]))) // first range or ((myTime.hour() * 60 + myTime.minute() >= atoi(time_all[4][ri]) * 60 + atoi(time_all[5][ri])) and (myTime.hour() * 60 + myTime.minute() < atoi(time_all[6][ri]) * 60 + atoi(time_all[7][ri]))) or ((atoi(time_all[0][ri]) == atoi(time_all[2][ri])) and ((atoi(time_all[1][ri]) == atoi(time_all[3][ri])) and (atoi(time_all[0][ri]) + atoi(time_all[1][ri]) != 0)))) // second range and temperature <= temperatureSet) { isOn = true; } ri++; } if (isOn) { if ((override[r]) and (strcmp(t_stat[r], "off") == 0)) { override[r] = false; debugln(F("debug#1")); } sprintf(t_stat[r], "on"); if (!override[r]) { digitalWrite(pins[r], HIGH); digitalWrite(2, HIGH); // LED if (strcmp(stat[r], "AUS") == 0) { debug(r); debugln(F(" is on")); sprintf(stat[r], "AN"); } } } else { if ((override[r]) and (strcmp(t_stat[r], "on") == 0)) { override[r] = false; } sprintf(t_stat[r], "off"); if (!override[r]) { digitalWrite(pins[r], LOW); digitalWrite(2, LOW); // LED if (strcmp(stat[r], "AN") == 0) { debug(r); debugln(F(" is off")); sprintf(stat[r], "AUS"); } } } } void getCurrentTemperatur() { if (millis() - lastTempCycle > 5000) { sensors.requestTemperatures(); temperature = int(sensors.getTempCByIndex(0)) != -127 ? int(sensors.getTempCByIndex(0)) : 255; // TODO: mark as invalid lastTempCycle = millis(); debugln(temperature); } } void setup() { int p = 0; while (p <= 7) { pinMode(pins[p], OUTPUT); pinMode(2, OUTPUT); digitalWrite(pins[p], LOW); digitalWrite(2, LOW); // LED p++; } Serial.begin(74880); EEPROM.begin(260); // 4 bits for EEPROM, address 0-255, value 0-255 sensors.begin(); debug(F("\nver.")); debugln(version); debugln(F("check for updates at " "https://somepi.ddns.net/gitea/gilex-dev/ESP8266-IOT-timer/\n")); load_EEPROM(); // WLAN-config // --------------------------------------------------------------------------------------------------------------------- WiFi.mode(WIFI_STA); WiFi.config(staticIP, gateway, subnet, dns); WiFi.hostname("ESP8266 IOT development"); WiFi.begin(SSID, PASSWORD); debugln(F("Connecting ...")); while (WiFi.status() != WL_CONNECTED) { delay(250); debug('.'); } debug(F("\nConnected to ")); debugln(WiFi.SSID()); debug(F("IP address: ")); debugln(WiFi.localIP()); //---------------------------------------------------------------------------------------------------------------------------------- myTime.setLocation("de"); waitForSync(); debug(F("Local time: ")); debugln(myTime.dateTime("H:i:s")); setInterval(); server.on("/", HTTP_GET, handleHome); server.on("/settings", HTTP_GET, handleSettings); server.on("/settings", HTTP_POST, handleTime); server.on("/toggle", HTTP_GET, handleToggle); server.on("/version", HTTP_GET, [] { server.send(200, "text/html", version); }); getCurrentTemperatur(); server.begin(); debugln(F("Webserver started")); } void loop() { server.handleClient(); getCurrentTemperatur(); timer(); yield(); delay(50); }