#include #include #include #include #include #include #include "DHT.h" String ssid = ""; String pasw = ""; String hwId = ""; String url = ""; //Pins #define LIGHTPIN 13 #define DHTPIN 4 #define DHTTYPE DHT11 #define LED_BUILTIN 16 //Settings bool deepSleepOn = true; long sleepTime = 4; //in minutes bool lightSensor = true; bool humiditySensor = true; bool temperatureSensor = true; ESP8266WebServer server(80); DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.setDebugOutput(true); EEPROM.begin(512); Serial.println(""); } void loop() { restorSetting(); if (!checkConnection()) { settingMode(); while (true){ Serial.println("CONECTION SETTING LOOP"); server.handleClient(); } } else { httpRequest(); sleep(); } } //webpages void handleRoot() { String s = ""; s += ""; s += ""; s += "Main"; s += ""; s += ""; s += ""; s += "

Restartovat

"; s += "

Refrest WIFI Networks

"; s += ""; s += ""; server.send(200, "text/html", s); } void handleSetting() { String wifiList = ""; int n = WiFi.scanNetworks(); Serial.println("scan done"); if (n == 0) { Serial.println("no networks found"); } else { for (int i = 0; i < n; ++i) { //Serial.println("SSID: " + WiFi.SSID(i)); wifiList = wifiList + String(""); } } String s = ""; s += ""; s += ""; s += "Main"; s += ""; s += ""; s += ""; s += "
"; s += "
SSID: "; s += "
Password: "; s += "
Token: "; s += "
Api Url: "; s += ""; s += "
"; s += ""; s += ""; server.send(200, "text/html", s); } //functions bool restorSetting() { Serial.println("Reading EEPROM"); ssid = ""; pasw = ""; hwId = ""; url = ""; if (EEPROM.read(0) != 0) { Serial.println("Reading EEPROM"); for (int i = 0; i < 64; ++i) { ssid += char(EEPROM.read(i)); } Serial.println("SSID: " + String(ssid)); for (int i = 64; i < 128; ++i) { pasw += char(EEPROM.read(i)); } Serial.println("PASS: " + String(pasw)); for (int i = 128; i < 192; ++i) { hwId += char(EEPROM.read(i)); } Serial.println("TOKEN: " + String(hwId)); for (int i = 192; i < 256; ++i) { url += char(EEPROM.read(i)); } Serial.println("URL: " + String(url)); return true; } else { return false; } } String urlDecode(String input) { String s = input; s.replace("%20", " "); s.replace("+", " "); s.replace("%21", "!"); s.replace("%22", "\""); s.replace("%23", "#"); s.replace("%24", "$"); s.replace("%25", "%"); s.replace("%26", "&"); s.replace("%27", "\'"); s.replace("%28", "("); s.replace("%29", ")"); s.replace("%30", "*"); s.replace("%31", "+"); s.replace("%2C", ","); s.replace("%2E", "."); s.replace("%2F", "/"); s.replace("%2C", ","); s.replace("%3A", ":"); s.replace("%3A", ";"); s.replace("%3C", "<"); s.replace("%3D", "="); s.replace("%3E", ">"); s.replace("%3F", "?"); s.replace("%40", "@"); s.replace("%5B", "["); s.replace("%5C", "\\"); s.replace("%5D", "]"); s.replace("%5E", "^"); s.replace("%5F", "-"); s.replace("%60", "`"); return s; } bool checkConnection() { int count = 0; WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.forceSleepWake(); WiFi.begin(ssid, pasw); Serial.print("Waiting for Wi-Fi connection"); while ( count < 30 ) { if (WiFi.status() == WL_CONNECTED) { Serial.println(); Serial.println("Connected!"); return (true); } delay(500); Serial.print("."); count++; } Serial.println("Timed out."); return false; } void settingMode(){ WiFi.mode(WIFI_AP); WiFi.softAP("NodeMeter"); IPAddress myIP = WiFi.softAPIP(); Serial.print("HotSpt IP:"); Serial.println(myIP); server.on("/", handleRoot); server.on("/restart", []() { ESP.restart(); }); server.on("/setting", handleSetting); server.on("/set", []() { for (int i = 0; i < 96; ++i) { EEPROM.write(i, 'e'); } EEPROM.commit(); ssid = server.arg("ssid"); pasw = server.arg("pasw"); hwId = server.arg("token"); url = server.arg("url"); for (int i = 0; i < 256; ++i) { EEPROM.write(i, 0); } Serial.println("Writing EEPROM..."); Serial.println("SSID:" + ssid); for (int i = 0; i < ssid.length(); ++i) { EEPROM.write(i,ssid[i]); } Serial.println("PASW:" + pasw); for (int i = 0; i < pasw.length(); ++i) { EEPROM.write(64 + i, pasw[i]); } Serial.println("TOKEN:" + hwId); for (int i = 0; i < hwId.length(); ++i) { EEPROM.write(128 + i, hwId[i]); } Serial.println("URL:" + url); for (int i = 0; i < url.length(); ++i) { EEPROM.write(192 + i, url[i]); } EEPROM.commit(); Serial.println("Write EEPROM done!"); String s = "

Setup complete.

device will be connected to \""; s += ssid; s += "\" after the restart."; server.send(200, "text/html", s); ESP.restart(); }); server.begin(); Serial.println("HTTP server started"); } bool httpRequest(){ StaticJsonDocument<1024> sendContent; sendContent["token"] = hwId; if (temperatureSensor){ sendContent["values"]["temp"]["value"] = String(getTemperature()); sendContent["values"]["temp"]["unit"] = "C"; } if (humiditySensor){ sendContent["values"]["humi"]["value"] = String(getHumidity()); sendContent["values"]["humi"]["unit"] = "%"; } if (lightSensor){ sendContent["values"]["light"]["value"] = String(getLight()); sendContent["values"]["light"]["unit"] = ""; } String requestJson = ""; serializeJson(sendContent, requestJson); Serial.println("JSON: " + requestJson); HTTPClient http; http.begin(String(url)); http.addHeader("Content-Type", "application/json"); //Specify content-type header int httpCode = http.POST(requestJson); String payload = http.getString(); //Get the response payload http.end(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); String hostname = doc["device"]["hostname"]; sleepTime = doc["device"]["sleepTime"]; WiFi.hostname(hostname); Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload http.end(); //Close connection } void sleep(){ Serial.println("DISCONECTED FROM WIFI"); WiFi.disconnect(); if (deepSleepOn) { Serial.println("GOING TO SLEEP FOR " + String(sleepTime)); ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT); // 20e6 is 20 microseconds delay(1000); } else { delay(1000); delay(sleepTime); } } //ReadTemperatures float getTemperature() { float t = dht.readTemperature(); //Serial.print(dht.readTemperature()); //Serial.println(t); if (isnan(t)) { Serial.println( "Failed to read temperature from sensor!") ; return 999; } return t; } float getHumidity() { float h = dht.readHumidity(); //Serial.println(h); if (isnan(h)) { Serial.println("Failed to read humidity from sensor!"); return 999; } return h; } int getLight() { int l = analogRead(LIGHTPIN); if (l > 1000) { return 1; } else { return 0; } Serial.println("Failed to read light from sensor!"); return 999; }