import projektu
parent
4bb19c978d
commit
956ee23a7c
|
|
@ -0,0 +1,76 @@
|
||||||
|
#define RELAY1 16 // D0
|
||||||
|
#define RELAY2 14 // D5
|
||||||
|
#define RELAY3 13 // D2
|
||||||
|
#define RELAY4 12 // D1
|
||||||
|
|
||||||
|
const char* version = "v2.2";
|
||||||
|
|
||||||
|
const char* ssid = "Vlcice";
|
||||||
|
const char* password = "1010201010";
|
||||||
|
const char* host = "terarium";
|
||||||
|
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#include <Preferences.h> // preference
|
||||||
|
Preferences pref;
|
||||||
|
|
||||||
|
#include "ntp.h"
|
||||||
|
|
||||||
|
#include "relay.h"
|
||||||
|
|
||||||
|
#include "bme280.h"
|
||||||
|
|
||||||
|
#include "webserver.h"
|
||||||
|
|
||||||
|
#include "ota.h"
|
||||||
|
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Serial.begin(9600);
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("");
|
||||||
|
Serial.println("Booting .... ");
|
||||||
|
Serial.println("Version: " + String(version));
|
||||||
|
|
||||||
|
pref.begin("my-app", false);
|
||||||
|
|
||||||
|
wifi_setup();
|
||||||
|
|
||||||
|
time_client_setup();
|
||||||
|
|
||||||
|
// nastaveni vystupu
|
||||||
|
relay_setup();
|
||||||
|
|
||||||
|
sensor_setup();
|
||||||
|
|
||||||
|
webserver_setup();
|
||||||
|
|
||||||
|
ota_setup();
|
||||||
|
|
||||||
|
Serial.println("Booting end");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
update_sensor_data();
|
||||||
|
ota_handler();
|
||||||
|
time_client_update();
|
||||||
|
relay_scheduler();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wifi_setup() {
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
WiFi.hostname(host);
|
||||||
|
WiFi.begin(ssid, password);
|
||||||
|
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||||||
|
Serial.printf("WiFi Failed!\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.print("IP Address: ");
|
||||||
|
Serial.println(WiFi.localIP());
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <Adafruit_BME280.h>
|
||||||
|
|
||||||
|
Adafruit_BME280 bme; // use I2C interface
|
||||||
|
Adafruit_Sensor *bme_temp = bme.getTemperatureSensor();
|
||||||
|
//Adafruit_Sensor *bme_pressure = bme.getPressureSensor();
|
||||||
|
Adafruit_Sensor *bme_humidity = bme.getHumiditySensor();
|
||||||
|
|
||||||
|
float temperature;
|
||||||
|
float humidity;
|
||||||
|
|
||||||
|
void sensor_setup() {
|
||||||
|
if (!bme.begin()) {
|
||||||
|
Serial.println(F("Could not find a valid BME280 sensor, check wiring!"));
|
||||||
|
//while (1) delay(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void update_sensor_data(){
|
||||||
|
sensors_event_t temp_event, humidity_event;
|
||||||
|
bme_temp->getEvent(&temp_event);
|
||||||
|
bme_humidity->getEvent(&humidity_event);
|
||||||
|
|
||||||
|
temperature = temp_event.temperature;
|
||||||
|
humidity = humidity_event.relative_humidity;
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,84 @@
|
||||||
|
String pageIndex() {
|
||||||
|
|
||||||
|
String ptr = "<!DOCTYPE html> <html>\n";
|
||||||
|
ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
|
||||||
|
ptr += "<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
|
||||||
|
ptr += "<meta charset=\"utf-8\" />";
|
||||||
|
|
||||||
|
ptr += "<title>Terarium</title>\n";
|
||||||
|
ptr += "<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js\"></script>\n";
|
||||||
|
ptr += "<script type=\"text/javascript\" src=\"script.js\"></script>\n";
|
||||||
|
ptr += "<link media=\"all\" rel=\"stylesheet\" href=\"/style.css\" />\n";
|
||||||
|
|
||||||
|
ptr += "</head>\n";
|
||||||
|
ptr += "<body>\n";
|
||||||
|
|
||||||
|
ptr += "<div id=\"webpage\">\n";
|
||||||
|
|
||||||
|
ptr += "<h1>Terarium</h1>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side temperature-icon\">\n";
|
||||||
|
ptr += "<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
|
||||||
|
ptr += "width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
|
||||||
|
ptr += "<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
|
||||||
|
ptr += "c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
|
||||||
|
ptr += "c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
|
||||||
|
ptr += "c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
|
||||||
|
ptr += "c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
|
||||||
|
ptr += "</svg>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
ptr += "<div class=\"side-by-side temperature-text\">Teplota</div>\n";
|
||||||
|
ptr += "<div class=\"side-by-side temperature\">";
|
||||||
|
ptr += "<div class=\"temp-value\">--</div>";
|
||||||
|
ptr += "<span class=\"superscript\">°C</span></div>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side humidity-icon\">\n";
|
||||||
|
ptr += "<svg version=\"1.1\" id=\"Layer_2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\"; width=\"12px\" height=\"17.955px\" viewBox=\"0 0 13 17.955\" enable-background=\"new 0 0 13 17.955\" xml:space=\"preserve\">\n";
|
||||||
|
ptr += "<path fill=\"#FFFFFF\" d=\"M1.819,6.217C3.139,4.064,6.5,0,6.5,0s3.363,4.064,4.681,6.217c1.793,2.926,2.133,5.05,1.571,7.057\n";
|
||||||
|
ptr += "c-0.438,1.574-2.264,4.681-6.252,4.681c-3.988,0-5.813-3.107-6.252-4.681C-0.313,11.267,0.026,9.143,1.819,6.217\"></path>\n";
|
||||||
|
ptr += "</svg>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
ptr += "<div class=\"side-by-side humidity-text\">Vlhkost</div>\n";
|
||||||
|
ptr += "<div class=\"side-by-side humidity\">";
|
||||||
|
ptr += "<div class=\"humidity-value\">--</div>";
|
||||||
|
ptr += "<span class=\"superscript\">%</span></div>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
if (pref.getBool("r1_enable", true)) {
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side switch-text\">" + pref.getString("r1_name", "Relay 1") + "</div>\n";
|
||||||
|
ptr += "<label class=\"switch\"><input type=\"checkbox\" id=\"switch1\"><span class=\"slider\"></span></label>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pref.getBool("r2_enable", true)) {
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side switch-text\">" + pref.getString("r2_name", "Relay 2") + "</div>\n";
|
||||||
|
ptr += "<label class=\"switch\"><input type=\"checkbox\" id=\"switch2\"><span class=\"slider\"></span></label>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pref.getBool("r3_enable", true)) {
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side switch-text\">" + pref.getString("r3_name", "Relay 3") + "</div>\n";
|
||||||
|
ptr += "<label class=\"switch\"><input type=\"checkbox\" id=\"switch3\"><span class=\"slider\"></span></label>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pref.getBool("r4_enable", true)) {
|
||||||
|
ptr += "<div class=\"data\">\n";
|
||||||
|
ptr += "<div class=\"side-by-side switch-text\">" + pref.getString("r4_name", "Relay 4") + "</div>\n";
|
||||||
|
ptr += "<label class=\"switch\"><input type=\"checkbox\" id=\"switch4\"><span class=\"slider\"></span></label>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr += "<div class=\"foot\"><a href=\"/settings\">Nastavení</a></div>";
|
||||||
|
|
||||||
|
ptr += "</div>\n";
|
||||||
|
ptr += "</body>\n";
|
||||||
|
ptr += "</html>\n";
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
//#include <ESP8266WiFi.h>
|
||||||
|
#include <WiFiUdp.h>
|
||||||
|
#include <NTPClient.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WiFiUDP ntpUDP;
|
||||||
|
|
||||||
|
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600 * 1, 60000);
|
||||||
|
|
||||||
|
void time_client_setup() {
|
||||||
|
timeClient.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void time_client_update() {
|
||||||
|
timeClient.update();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,46 @@
|
||||||
|
//#include <ESP8266WiFi.h>
|
||||||
|
#include <ESP8266mDNS.h>
|
||||||
|
//#include <WiFiUdp.h>
|
||||||
|
#include <ArduinoOTA.h>
|
||||||
|
|
||||||
|
void ota_setup() {
|
||||||
|
ArduinoOTA.setHostname(host);
|
||||||
|
ArduinoOTA.setPassword("123");
|
||||||
|
|
||||||
|
ArduinoOTA.onStart([]() {
|
||||||
|
String type;
|
||||||
|
if (ArduinoOTA.getCommand() == U_FLASH) {
|
||||||
|
type = "sketch";
|
||||||
|
} else { // U_FS
|
||||||
|
type = "filesystem";
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: if updating FS this would be the place to unmount FS using FS.end()
|
||||||
|
Serial.println("Start updating " + type);
|
||||||
|
});
|
||||||
|
ArduinoOTA.onEnd([]() {
|
||||||
|
Serial.println("\nEnd");
|
||||||
|
});
|
||||||
|
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
|
||||||
|
Serial.printf("Progress: %u%%\r\n", (progress / (total / 100)));
|
||||||
|
});
|
||||||
|
ArduinoOTA.onError([](ota_error_t error) {
|
||||||
|
Serial.printf("Error[%u]: ", error);
|
||||||
|
if (error == OTA_AUTH_ERROR) {
|
||||||
|
Serial.println("Auth Failed");
|
||||||
|
} else if (error == OTA_BEGIN_ERROR) {
|
||||||
|
Serial.println("Begin Failed");
|
||||||
|
} else if (error == OTA_CONNECT_ERROR) {
|
||||||
|
Serial.println("Connect Failed");
|
||||||
|
} else if (error == OTA_RECEIVE_ERROR) {
|
||||||
|
Serial.println("Receive Failed");
|
||||||
|
} else if (error == OTA_END_ERROR) {
|
||||||
|
Serial.println("End Failed");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ArduinoOTA.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ota_handler(){
|
||||||
|
ArduinoOTA.handle();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,77 @@
|
||||||
|
void switch_relay(uint8_t id, uint8_t state, bool negation) {
|
||||||
|
if (negation) {
|
||||||
|
state = !state;
|
||||||
|
}
|
||||||
|
digitalWrite(id, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool relay_state(uint8_t id, bool negation) {
|
||||||
|
if (negation) {
|
||||||
|
return !digitalRead(id);
|
||||||
|
} else {
|
||||||
|
return digitalRead(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void relay_setup() {
|
||||||
|
pinMode(RELAY1, OUTPUT);
|
||||||
|
pinMode(RELAY2, OUTPUT);
|
||||||
|
pinMode(RELAY3, OUTPUT);
|
||||||
|
pinMode(RELAY4, OUTPUT);
|
||||||
|
|
||||||
|
switch_relay(RELAY1, LOW, pref.getBool("r1_neg", false));
|
||||||
|
switch_relay(RELAY2, LOW, pref.getBool("r2_neg", false));
|
||||||
|
switch_relay(RELAY3, LOW, pref.getBool("r3_neg", false));
|
||||||
|
switch_relay(RELAY4, LOW, pref.getBool("r4_neg", false));
|
||||||
|
}
|
||||||
|
|
||||||
|
void relay_scheduler() {
|
||||||
|
int hours = timeClient.getHours();
|
||||||
|
int minutes = timeClient.getMinutes();
|
||||||
|
// rele 1
|
||||||
|
if (pref.getBool("r1_enable", true)) {
|
||||||
|
if (hours == pref.getString("r1_on_h", "00").toInt() && minutes == pref.getString("r1_on_m", "00").toInt() && relay_state(RELAY1, pref.getBool("r1_neg", false)) == 0) {
|
||||||
|
switch_relay(RELAY1, HIGH, pref.getBool("r1_neg", false));
|
||||||
|
Serial.println("Relay 1 on (" + timeClient.getFormattedTime() + ")");
|
||||||
|
Serial.println(timeClient.getFormattedTime());
|
||||||
|
}
|
||||||
|
if (hours == pref.getString("r1_off_h", "01").toInt() && minutes == pref.getString("r1_off_m", "00").toInt() && relay_state(RELAY1, pref.getBool("r1_neg", false)) == 1) {
|
||||||
|
switch_relay(RELAY1, LOW, pref.getBool("r1_neg", false));
|
||||||
|
Serial.println("Relay 1 off (" + timeClient.getFormattedTime() + ")");
|
||||||
|
Serial.println(timeClient.getFormattedTime());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// rele 2
|
||||||
|
if (pref.getBool("r2_enable", true)) {
|
||||||
|
if (hours == pref.getString("r2_on_h", "01").toInt() && minutes == pref.getString("r2_on_m", "00").toInt() && relay_state(RELAY2, pref.getBool("r2_neg", false)) == 0) {
|
||||||
|
switch_relay(RELAY2, HIGH, pref.getBool("r2_neg", false));
|
||||||
|
Serial.println("Relay 1 on (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
if (hours == pref.getString("r2_off_h", "02").toInt() && minutes == pref.getString("r2_off_m", "00").toInt() && relay_state(RELAY2, pref.getBool("r2_neg", false)) == 1) {
|
||||||
|
switch_relay(RELAY2, LOW, pref.getBool("r2_neg", false));
|
||||||
|
Serial.println("Relay 2 off (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// rele 3
|
||||||
|
if (pref.getBool("r3_enable", true)) {
|
||||||
|
if (hours == pref.getString("r3_on_h", "02").toInt() && minutes == pref.getString("r3_on_m", "00").toInt() && relay_state(RELAY3, pref.getBool("r3_neg", false)) == 0) {
|
||||||
|
switch_relay(RELAY3, HIGH, pref.getBool("r3_neg", false));
|
||||||
|
Serial.println("Relay 3 on (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
if (hours == pref.getString("r3_off_h", "03").toInt() && minutes == pref.getString("r3_off_m", "00").toInt() && relay_state(RELAY3, pref.getBool("r3_neg", false)) == 1) {
|
||||||
|
switch_relay(RELAY3, LOW, pref.getBool("r3_neg", false));
|
||||||
|
Serial.println("Relay 3 off (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// rele 4
|
||||||
|
if (pref.getBool("r4_enable", true)) {
|
||||||
|
if (hours == pref.getString("r4_on_h", "03").toInt() && minutes == pref.getString("r4_on_m", "00").toInt() && relay_state(RELAY4, pref.getBool("r4_neg", false)) == 0) {
|
||||||
|
switch_relay(RELAY4, HIGH, pref.getBool("r4_neg", false));
|
||||||
|
Serial.println("Relay 4 on (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
if (hours == pref.getString("r4_off_h", "04").toInt() && minutes == pref.getString("r4_off_m", "00").toInt() && relay_state(RELAY4, pref.getBool("r4_neg", false)) == 1) {
|
||||||
|
switch_relay(RELAY4, LOW, pref.getBool("r4_neg", false));
|
||||||
|
Serial.println("Relay 4 off (" + timeClient.getFormattedTime() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
String script() {
|
||||||
|
|
||||||
|
String s = "$(document).ready(function () {\n";
|
||||||
|
s +="getTemp();\n";
|
||||||
|
s +="getHumidity();\n";
|
||||||
|
s +="getSwitch1();\n";
|
||||||
|
s +="getSwitch2();\n";
|
||||||
|
s +="getSwitch3();\n";
|
||||||
|
s +="getSwitch4();\n";
|
||||||
|
|
||||||
|
s +="function getTemp(){ $.get(\"/gettemp\", function(data) { $(\".temp-value\").html(data); window.setTimeout(getTemp, 5*1000); }); }\n";
|
||||||
|
s +="function getHumidity(){ $.get(\"/gethumidity\", function(data) { $(\".humidity-value\").html(data); window.setTimeout(getHumidity, 5*1000); }); }\n";
|
||||||
|
|
||||||
|
s +="function getSwitch1(){ $.get(\"/switch_state?relay=1\", function(data) { if(data == 1) {$(\"#switch1\").attr('checked', true)} else {$(\"#switch1\").attr('checked', false)}; window.setTimeout(getSwitch1, 1000); }); }\n";
|
||||||
|
s +="function getSwitch2(){ $.get(\"/switch_state?relay=2\", function(data) { if(data == 1) {$(\"#switch2\").attr('checked', true)} else {$(\"#switch2\").attr('checked', false)}; window.setTimeout(getSwitch2, 1000); }); }\n";
|
||||||
|
s +="function getSwitch3(){ $.get(\"/switch_state?relay=3\", function(data) { if(data == 1) {$(\"#switch3\").attr('checked', true)} else {$(\"#switch3\").attr('checked', false)}; window.setTimeout(getSwitch3, 1000); }); }\n";
|
||||||
|
s +="function getSwitch4(){ $.get(\"/switch_state?relay=4\", function(data) { if(data == 1) {$(\"#switch4\").attr('checked', true)} else {$(\"#switch4\").attr('checked', false)}; window.setTimeout(getSwitch4, 1000); }); }\n";
|
||||||
|
|
||||||
|
s +="$(\"#switch1\").change(function() { if(this.checked) { $.get(\"/switch?relay=1&state=1\", function(data) {}); } else { $.get(\"/switch?relay=1&state=0\", function(data) {}); } });\n";
|
||||||
|
s +="$(\"#switch2\").change(function() { if(this.checked) { $.get(\"/switch?relay=2&state=1\", function(data) {}); } else { $.get(\"/switch?relay=2&state=0\", function(data) {}); } });\n";
|
||||||
|
s +="$(\"#switch3\").change(function() { if(this.checked) { $.get(\"/switch?relay=3&state=1\", function(data) {}); } else { $.get(\"/switch?relay=3&state=0\", function(data) {}); } });\n";
|
||||||
|
s +="$(\"#switch4\").change(function() { if(this.checked) { $.get(\"/switch?relay=4&state=1\", function(data) {}); } else { $.get(\"/switch?relay=4&state=0\", function(data) {}); } });\n";
|
||||||
|
|
||||||
|
|
||||||
|
s +="})";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return s;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
String pageSettings() {
|
||||||
|
|
||||||
|
String ptr = "<!DOCTYPE html> <html>\n";
|
||||||
|
ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
|
||||||
|
ptr += "<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
|
||||||
|
ptr += "<meta charset=\"utf-8\" />";
|
||||||
|
|
||||||
|
ptr += "<title>Terarium - nastavení</title>\n";
|
||||||
|
ptr += "<link media=\"all\" rel=\"stylesheet\" href=\"/style.css\" />\n";
|
||||||
|
|
||||||
|
ptr += "</head>\n";
|
||||||
|
ptr += "<body>\n";
|
||||||
|
|
||||||
|
ptr += "<div id=\"webpage\">\n";
|
||||||
|
|
||||||
|
ptr += "<h1>Terarium - nastavení</h1>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"center\">Verze: " + String(version) + "</div>";
|
||||||
|
ptr += "<div class=\"center\">Aktuální čas: " + timeClient.getFormattedTime() + "</div>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"center\"><a href=\"/\">Zpět na přehled</a></div>";
|
||||||
|
|
||||||
|
ptr += "<form action=\"/settings_save\" method=\"post\">\n";
|
||||||
|
|
||||||
|
// rele 1
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<fieldset>";
|
||||||
|
ptr += "<legend>Relé 1:</legend>";
|
||||||
|
ptr += "<table class=\"center\">\n";
|
||||||
|
ptr += "<tr><td>povoleno</td><td><input type=\"checkbox\" name=\"relay1_enable\" value=\"1\"";
|
||||||
|
if(pref.getBool("r1_enable", true)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>název</td><td><input type=\"text\" id=\"r1_on\" name=\"relay1_name\" value=\"" + pref.getString("r1_name", "Relay 1") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>negovat</td><td><input type=\"checkbox\" name=\"relay1_negation\"";
|
||||||
|
if(pref.getBool("r1_neg", false)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>zapnout</td><td><input type=\"time\" id=\"r1_on\" name=\"relay1_on\" value=\"" + pref.getString("r1_on_h", "00") + ":" + pref.getString("r1_on_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>vypnout</td><td><input type=\"time\" id=\"r1_off\" name=\"relay1_off\" value=\"" + pref.getString("r1_off_h", "01") + ":" + pref.getString("r1_off_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "</table>\n";
|
||||||
|
ptr += "</fieldset>";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
// rele 2
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<fieldset>";
|
||||||
|
ptr += "<legend>Relé 2:</legend>";
|
||||||
|
ptr += "<table class=\"center\">\n";
|
||||||
|
ptr += "<tr><td>povoleno</td><td><input type=\"checkbox\" name=\"relay2_enable\" value=\"1\"";
|
||||||
|
if(pref.getBool("r2_enable", true)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>název</td><td><input type=\"text\" id=\"r1_on\" name=\"relay2_name\" value=\"" + pref.getString("r2_name", "Relay 2") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>negovat</td><td><input type=\"checkbox\" name=\"relay2_negation\"";
|
||||||
|
if(pref.getBool("r2_neg", false)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>zapnout</td><td><input type=\"time\" id=\"r2_on\" name=\"relay2_on\" value=\"" + pref.getString("r2_on_h", "01") + ":" + pref.getString("r2_on_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>vypnout</td><td><input type=\"time\" id=\"r2_off\" name=\"relay2_off\" value=\"" + pref.getString("r2_off_h", "02") + ":" + pref.getString("r2_off_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "</table>\n";
|
||||||
|
ptr += "</fieldset>";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
// rele 3
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<fieldset>";
|
||||||
|
ptr += "<legend>Relé 3:</legend>";
|
||||||
|
ptr += "<table class=\"center\">\n";
|
||||||
|
ptr += "<tr><td>povoleno</td><td><input type=\"checkbox\" name=\"relay3_enable\"";
|
||||||
|
if(pref.getBool("r3_enable", true)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>název</td><td><input type=\"text\" id=\"r1_on\" name=\"relay3_name\" value=\"" + pref.getString("r3_name", "Relay 3") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>negovat</td><td><input type=\"checkbox\" name=\"relay3_negation\"";
|
||||||
|
if(pref.getBool("r3_neg", false)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>zapnout</td><td><input type=\"time\" id=\"r3_on\" name=\"relay3_on\" value=\"" + pref.getString("r3_on_h", "02") + ":" + pref.getString("r3_on_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>vypnout</td><td><input type=\"time\" id=\"r3_off\" name=\"relay3_off\" value=\"" + pref.getString("r3_off_h", "03") + ":" + pref.getString("r3_off_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "</table>\n";
|
||||||
|
ptr += "</fieldset>";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
// rele 4
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<fieldset>";
|
||||||
|
ptr += "<legend>Relé 4:</legend>";
|
||||||
|
ptr += "<table class=\"center\">\n";
|
||||||
|
ptr += "<tr><td>zapnuto</td><td><input type=\"checkbox\" name=\"relay4_enable\"";
|
||||||
|
if(pref.getBool("r4_enable", true)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>název</td><td><input type=\"text\" id=\"r1_on\" name=\"relay4_name\" value=\"" + pref.getString("r4_name", "Relay 4") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>negovat</td><td><input type=\"checkbox\" name=\"relay4_negation\"";
|
||||||
|
if(pref.getBool("r4_neg", false)) {
|
||||||
|
ptr += " checked=\"checked\" ";
|
||||||
|
}
|
||||||
|
ptr += "/></td></tr>\n";
|
||||||
|
ptr += "<tr><td>zapnout</td><td><input type=\"time\" id=\"r4_on\" name=\"relay4_on\" value=\"" + pref.getString("r4_on_h", "03") + ":" + pref.getString("r4_on_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "<tr><td>vypnout</td><td><input type=\"time\" id=\"r4_off\" name=\"relay4_off\" value=\"" + pref.getString("r4_off_h", "04") + ":" + pref.getString("r4_off_m", "00") + "\"></td></tr>\n";
|
||||||
|
ptr += "</table>\n";
|
||||||
|
ptr += "</fieldset>";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
// ntp a cas
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<label class=\"setting\" for=\"ntp\">NTP server:</label><br>\n";
|
||||||
|
ptr += "<input type=\"text\" id=\"ntp\" name=\"ntp\" value=\"" + pref.getString("ntp", "europe.pool.ntp.org") + "\"/>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<input type=\"submit\" value=\"Uložit\"/>\n";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
ptr += "</form>\n";
|
||||||
|
|
||||||
|
ptr += "<div class=\"setting_row\">\n";
|
||||||
|
ptr += "<form method='POST' action='/update' enctype='multipart/form-data'>";
|
||||||
|
ptr += "<label class=\"setting\" for=\"update\">Update:</label><br>";
|
||||||
|
ptr += "<input type= \"file\" name=\"update\" id=\"update\" accept=\".bin\"><input type=\"submit\" value=\"Update\">";
|
||||||
|
ptr += "</form>";
|
||||||
|
ptr += "</div>\n";
|
||||||
|
|
||||||
|
|
||||||
|
ptr += "</div>\n";
|
||||||
|
ptr += "</body>\n";
|
||||||
|
ptr += "</html>\n";
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
String style() {
|
||||||
|
String ptr = "html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
|
||||||
|
ptr += "body{margin-top: 50px;}\n";
|
||||||
|
ptr += "h1 {margin: 50px auto 30px;}\n";
|
||||||
|
ptr += ".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n";
|
||||||
|
ptr += ".data{padding: 10px;}\n";
|
||||||
|
ptr += ".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";
|
||||||
|
ptr += ".humidity-text, .temperature-text, .switch-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
|
||||||
|
ptr += "a {text-decoration: none; margin-top:50px; margin-bottom:50px;}\n";
|
||||||
|
ptr += ".setting_row{padding: 20px;}\n";
|
||||||
|
ptr += "label.setting{padding-bottom: 10px; font-weight: bold;}\n";
|
||||||
|
ptr += ".center { margin-left: auto; margin-right: auto;}\n";
|
||||||
|
ptr += "td {padding: 5px;}\n";
|
||||||
|
ptr += "div.foot{margin-top: 80px;}";
|
||||||
|
ptr += "fieldset {width: 200px; margin: auto; border-radius: 10px;}";
|
||||||
|
//ptr += "legend {padding-left: 10px; padding-right: 10px; font-weight: bold;";
|
||||||
|
|
||||||
|
// vlhkost
|
||||||
|
ptr += ".humidity-icon{background-color: #3498db;width: 30px;height: 30px;border-radius: 50%;line-height: 36px;}\n";
|
||||||
|
ptr += ".humidity{font-weight: 300;font-size: 60px;color: #3498db;}\n";
|
||||||
|
|
||||||
|
// teplota
|
||||||
|
ptr += ".temperature-icon{background-color: #f39c12;width: 30px;height: 30px;border-radius: 50%;line-height: 40px;}\n";
|
||||||
|
ptr += ".temperature{font-weight: 300;font-size: 60px;color: #f39c12;}\n";
|
||||||
|
|
||||||
|
|
||||||
|
// switch
|
||||||
|
ptr += ".switch input{display:none;}\n";
|
||||||
|
ptr += ".switch{display:inline-block; width: 60px; /*=w*/ height: 30px; /*=h*/ margin:8px; transform:translateY(50%); position:relative;}\n";
|
||||||
|
ptr += ".slider{position:absolute; top:0; bottom:0; left:0; right:0; border-radius:30px; box-shadow:0 0 0 2px #777,0 0 4px #777; cursor:pointer; border:4px solid transparent; overflow:hidden; transition:0.4s; text-align: left;}\n";
|
||||||
|
ptr += ".slider:before{position:absolute; content:\"\"; width:100%; height:100%; background-color:#777; border-radius:30px; transform:translateX(-30px); /*translateX(-(w-h))*/ transition:0.4s;}\n";
|
||||||
|
ptr += "input:checked + .slider:before{transform:translateX(30px); /*translateX(w-h)*/ background-color:limeGreen;}\n";
|
||||||
|
ptr += "input:checked + .slider{box-shadow:0 0 0 2px limeGreen,0 0 8px limeGreen;} .switch200 .slider:before{width:200%; transform:translateX(-82px); /*translateX(-(w-h))*/ }\n";
|
||||||
|
ptr += ".switch200 input:checked + .slider:before{background-color:red;}\n";
|
||||||
|
ptr += ".switch200 input:checked + .slider{box-shadow:0 0 0 2px red,0 0 8px red;}\n";
|
||||||
|
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,239 @@
|
||||||
|
#include "HardwareSerial.h"
|
||||||
|
#include <ESP8266WiFi.h>
|
||||||
|
#include <ESPAsyncTCP.h>
|
||||||
|
#include <ESPAsyncWebSrv.h>
|
||||||
|
|
||||||
|
#include "index.h"
|
||||||
|
#include "style.h"
|
||||||
|
#include "script.h"
|
||||||
|
#include "setting.h"
|
||||||
|
|
||||||
|
AsyncWebServer server(80);
|
||||||
|
|
||||||
|
String getHour(String s) {
|
||||||
|
return s.substring(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
String getMinutes(String s) {
|
||||||
|
return s.substring(3, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_switch(AsyncWebServerRequest *request) {
|
||||||
|
if (request->hasParam("relay") && request->hasParam("state")) {
|
||||||
|
int s = request->getParam("state")->value().toInt();
|
||||||
|
switch (request->getParam("relay")->value().toInt()) {
|
||||||
|
case 1:
|
||||||
|
switch_relay(RELAY1, s, pref.getBool("r1_neg", false));
|
||||||
|
Serial.println("Relay 1 -> " + (String)relay_state(RELAY1, pref.getBool("r1_neg", false)));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch_relay(RELAY2, s, pref.getBool("r2_neg", false));
|
||||||
|
Serial.println("Relay 2 -> " + (String)relay_state(RELAY2, pref.getBool("r2_neg", false)));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
switch_relay(RELAY3, s, pref.getBool("r3_neg", false));
|
||||||
|
Serial.println("Relay 3 -> " + (String)relay_state(RELAY3, pref.getBool("r3_neg", false)));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
switch_relay(RELAY4, s, pref.getBool("r4_neg", false));
|
||||||
|
Serial.println("Relay 4 -> " + (String)relay_state(RELAY4, pref.getBool("r4_neg", false)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
request->send(200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_switch_state(AsyncWebServerRequest *request) {
|
||||||
|
if (request->hasParam("relay")) {
|
||||||
|
switch (request->getParam("relay")->value().toInt()) {
|
||||||
|
case 1:
|
||||||
|
request->send(200, "text/plain", (String)relay_state(RELAY1, pref.getBool("r1_neg", false)));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
request->send(200, "text/plain", (String)relay_state(RELAY2, pref.getBool("r2_neg", false)));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
request->send(200, "text/plain", (String)relay_state(RELAY3, pref.getBool("r3_neg", false)));
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
request->send(200, "text/plain", (String)relay_state(RELAY4, pref.getBool("r4_neg", false)));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void handle_setting_save(AsyncWebServerRequest *request) {
|
||||||
|
//relay 1
|
||||||
|
if (request->hasParam("relay1_on", true) && request->hasParam("relay1_off", true) && request->hasParam("relay1_name", true)) {
|
||||||
|
if (request->hasParam("relay1_enable", true)) {
|
||||||
|
pref.putBool("r1_enable", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r1_enable", false);
|
||||||
|
}
|
||||||
|
if (request->hasParam("relay1_negation", true)) {
|
||||||
|
pref.putBool("r1_neg", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r1_neg", false);
|
||||||
|
}
|
||||||
|
pref.putString("r1_name", request->getParam("relay1_name", true)->value());
|
||||||
|
pref.putString("r1_on_h", getHour(request->getParam("relay1_on", true)->value()));
|
||||||
|
pref.putString("r1_on_m", getMinutes(request->getParam("relay1_on", true)->value()));
|
||||||
|
pref.putString("r1_off_h", getHour(request->getParam("relay1_off", true)->value()));
|
||||||
|
pref.putString("r1_off_m", getMinutes(request->getParam("relay1_off", true)->value()));
|
||||||
|
Serial.println("Save settings relay 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
// relay 2
|
||||||
|
if (request->hasParam("relay2_on", true) && request->hasParam("relay2_off", true) && request->hasParam("relay2_name", true)) {
|
||||||
|
if (request->hasParam("relay2_enable", true)) {
|
||||||
|
pref.putBool("r2_enable", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r2_enable", false);
|
||||||
|
}
|
||||||
|
if (request->hasParam("relay2_negation", true)) {
|
||||||
|
pref.putBool("r2_neg", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r2_neg", false);
|
||||||
|
}
|
||||||
|
pref.putString("r2_name", request->getParam("relay2_name", true)->value());
|
||||||
|
pref.putString("r2_on_h", getHour(request->getParam("relay2_on", true)->value()));
|
||||||
|
pref.putString("r2_on_m", getMinutes(request->getParam("relay2_on", true)->value()));
|
||||||
|
pref.putString("r2_off_h", getHour(request->getParam("relay2_off", true)->value()));
|
||||||
|
pref.putString("r2_off_m", getMinutes(request->getParam("relay2_off", true)->value()));
|
||||||
|
Serial.println("Save settings relay 2");
|
||||||
|
}
|
||||||
|
// relay 3
|
||||||
|
|
||||||
|
if (request->hasParam("relay3_on", true) && request->hasParam("relay3_off", true) && request->hasParam("relay3_name", true)) {
|
||||||
|
if (request->hasParam("relay3_enable", true)) {
|
||||||
|
pref.putBool("r3_enable", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r3_enable", false);
|
||||||
|
}
|
||||||
|
if (request->hasParam("relay3_negation", true)) {
|
||||||
|
pref.putBool("r3_neg", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r3_neg", false);
|
||||||
|
}
|
||||||
|
pref.putString("r3_name", request->getParam("relay3_name", true)->value());
|
||||||
|
pref.putString("r3_on_h", getHour(request->getParam("relay3_on", true)->value()));
|
||||||
|
pref.putString("r3_on_m", getMinutes(request->getParam("relay3_on", true)->value()));
|
||||||
|
pref.putString("r3_off_h", getHour(request->getParam("relay3_off", true)->value()));
|
||||||
|
pref.putString("r3_off_m", getMinutes(request->getParam("relay3_off", true)->value()));
|
||||||
|
Serial.println("Save settings relay 3");
|
||||||
|
}
|
||||||
|
|
||||||
|
// relay 4
|
||||||
|
if (request->hasParam("relay4_on", true) && request->hasParam("relay4_off", true) && request->hasParam("relay4_name", true)) {
|
||||||
|
if (request->hasParam("relay4_enable", true)) {
|
||||||
|
pref.putBool("r4_enable", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r4_enable", false);
|
||||||
|
}
|
||||||
|
if (request->hasParam("relay4_negation", true)) {
|
||||||
|
pref.putBool("r4_neg", true);
|
||||||
|
} else {
|
||||||
|
pref.putBool("r4_neg", false);
|
||||||
|
}
|
||||||
|
pref.putString("r4_name", request->getParam("relay4_name", true)->value());
|
||||||
|
pref.putString("r4_on_h", getHour(request->getParam("relay4_on", true)->value()));
|
||||||
|
pref.putString("r4_on_m", getMinutes(request->getParam("relay4_on", true)->value()));
|
||||||
|
pref.putString("r4_off_h", getHour(request->getParam("relay4_off", true)->value()));
|
||||||
|
pref.putString("r4_off_m", getMinutes(request->getParam("relay4_off", true)->value()));
|
||||||
|
Serial.println("Save settings relay 4");
|
||||||
|
}
|
||||||
|
|
||||||
|
// ntp
|
||||||
|
if (request->hasParam("ntp", true)) {
|
||||||
|
pref.putString("ntp", request->getParam("ntp", true)->value());
|
||||||
|
Serial.println("Save settings NTP");
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "");
|
||||||
|
response->addHeader("Location", "/");
|
||||||
|
request->send(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
void webserver_setup() {
|
||||||
|
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/html", pageIndex());
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/style.css", [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/css", style());
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/script.js", [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/javascript", script());
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings", [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/html", pageSettings());
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/settings_save", HTTP_POST, handle_setting_save);
|
||||||
|
|
||||||
|
server.on("/switch_state", HTTP_GET, handle_switch_state);
|
||||||
|
|
||||||
|
server.on("/switch", HTTP_GET, handle_switch);
|
||||||
|
|
||||||
|
server.on("/gettemp", [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/plain", (String)(int)temperature);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/gethumidity", [](AsyncWebServerRequest *request) {
|
||||||
|
request->send(200, "text/plain", (String)(int)humidity);
|
||||||
|
});
|
||||||
|
|
||||||
|
server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||||
|
// the request handler is triggered after the upload has finished...
|
||||||
|
// create the response, add header, and send response
|
||||||
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "");
|
||||||
|
response->addHeader("Location", "/");
|
||||||
|
request->send(response);
|
||||||
|
//AsyncWebServerResponse *response = request->beginResponse(200, "text/plain", (Update.hasError())?"FAIL":"OK");
|
||||||
|
//response->addHeader("Connection", "close");
|
||||||
|
//response->addHeader("Access-Control-Allow-Origin", "*");
|
||||||
|
//request->send(response);
|
||||||
|
|
||||||
|
ESP.restart();
|
||||||
|
},[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){
|
||||||
|
//Upload handler chunks in data
|
||||||
|
//Serial.setDebugOutput(true);
|
||||||
|
WiFiUDP::stopAll();
|
||||||
|
if(!index){ // if index == 0 then this is the first frame of data
|
||||||
|
Serial.printf("Upload start: %s\n", filename.c_str());
|
||||||
|
|
||||||
|
// calculate sketch space required for the update
|
||||||
|
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
|
||||||
|
if(!Update.begin(maxSketchSpace)){//start with max available size
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
|
||||||
|
Update.runAsync(true); // tell the updaterClass to run in async mode
|
||||||
|
}
|
||||||
|
|
||||||
|
//Write chunked data to the free sketch space
|
||||||
|
if(Update.write(data, len) != len){
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(final){ // if the final flag is set then this is the last frame of data
|
||||||
|
if(Update.end(true)){ //true to set the size to the current progress
|
||||||
|
Serial.printf("Update Success: %u B\nRebooting...\n", index+len);
|
||||||
|
AsyncWebServerResponse *response = request->beginResponse(302, "text/plain", "");
|
||||||
|
response->addHeader("Location", "/");
|
||||||
|
request->send(response);
|
||||||
|
} else {
|
||||||
|
Update.printError(Serial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
server.onNotFound([](AsyncWebServerRequest *request) {
|
||||||
|
request->send(404, "text/plain", "Not found");
|
||||||
|
});
|
||||||
|
|
||||||
|
server.begin();
|
||||||
|
Serial.println("HTTP server started");
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue