diff --git a/.vscode/arduino.json b/.vscode/arduino.json index 126c748..152a177 100644 --- a/.vscode/arduino.json +++ b/.vscode/arduino.json @@ -1,7 +1,7 @@ { "board": "esp8266:esp8266:generic", - "configuration": "CpuFrequency=80,FlashFreq=40,FlashMode=dio,UploadSpeed=115200,FlashSize=1M512,ResetMethod=ck,Debug=Disabled,DebugLevel=None____", + "configuration": "CpuFrequency=160,FlashFreq=80,FlashMode=dio,UploadSpeed=115200,FlashSize=1M512,ResetMethod=ck,Debug=Disabled,DebugLevel=None____", "port": "/dev/ttyUSB0", "sketch": "frontend.ino", - "output": "../ArduinoOutput" + "output": "Output" } \ No newline at end of file diff --git a/front.svg b/front.svg index 65cf781..ee9ec45 100644 --- a/front.svg +++ b/front.svg @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="1.7148375" - inkscape:cx="653.21436" - inkscape:cy="527.23476" + inkscape:zoom="0.85741875" + inkscape:cx="557.99796" + inkscape:cy="403.15866" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="true" @@ -201,7 +201,7 @@ height="45.456871" x="610.63721" y="163.87068" />13:37:33 14:00:00 ONCE PER HOUR + + NOT CONNECTED! + we will die in 10s! :0 + die diff --git a/frontend.ino b/frontend.ino index 0128410..7d49a1e 100644 --- a/frontend.ino +++ b/frontend.ino @@ -1,27 +1,26 @@ #include #include +#include #include #include #include #include "SSD1306Brzo.h" -// #include -// #include -#include "../wifi.h" //not working :/ +#include +#include +#include "wifi.h" //not working :/ #include "Adafruit_MQTT.h" #include "Adafruit_MQTT_Client.h" double inTemp,outTemp,pressure,humid; -short int onTime = 5, offTime = 23, beepDelay = 1, lastNtp, lastBeep; +unsigned short int onTime = 5, offTime = 23, beepDelay = 60, lastNtp, lastBeep; bool mqttAvail; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP); SSD1306Brzo display(0x3C, 4, 5); //oled display w/ address 0x3C with SDA on GPIO4 and SCL on GPIO5 //address == offset -// Ticker dispUpd; //i tried ticker for 91 line but it crashes every time it launch - WiFiClient client; - +ESP8266WebServer server(80); Adafruit_MQTT_Client mqtt(&client, "192.168.100.102", 1883); Adafruit_MQTT_Subscribe pressureFeed = Adafruit_MQTT_Subscribe(&mqtt, "pressure"); @@ -43,9 +42,9 @@ void wifiConnect() { ESP.reset(); } MDNS.begin("esp8266-frontend"); - Serial.println("Connected to " + String(ssid) + "; IP address: "); + Serial.print("Connected to " + String(ssid) + "; IP address: "); + Serial.println(WiFi.localIP()); displayStatus(0); - Serial.print(WiFi.localIP()); } void setup(){ @@ -58,10 +57,12 @@ void setup(){ WiFi.mode(WIFI_STA); wifiConnect(); //==READ CONFIG== - // if (!readConfig()) { - // Serial.println("can't load config!"); - // defConf(); - // } + if (!SPIFFS.begin()) + SPIFFS.format(); + + if (!readConfig()) + defConfig(); + //==NTP INIT== timeClient.begin(); timeClient.setTimeOffset(10800); @@ -74,28 +75,28 @@ void setup(){ mqtt.subscribe(&outFeed); mqtt.subscribe(&inFeed); mqtt.subscribe(&humidFeed); - - Serial.println(ESP.getFlashChipRealSize()); + server.on("/edit", editConfig); } void loop(){ - if (WiFi.status() != WL_CONNECTED) { - // displayStatus(1); + if (WiFi.status() != WL_CONNECTED) { //check wifi status wifiConnect(); } - MQTT_connect(); + server.handleClient(); + MQTT_connect();//check connection and get packets for 0.5s mqtt.processPackets(500); - if(! mqtt.ping()) { - mqtt.disconnect(); - } + mainScreen();//it could be cool and smooth if we could update screen independently, in some kind of separate thread or smthn similar - if (timeClient.getMinutes() == 0 && timeClient.getSeconds() < 5 && !nightMode() && lastBeep != timeClient.getHours()) { //beep + + // if (timeClient.getMinutes() == 0 && timeClient.getSeconds() < 5 && !nightMode() && lastBeep != timeClient.getHours()) { + if ((timeClient.getHours()*60 + timeClient.getMinutes() - lastBeep > beepDelay)&&(!nightMode())){ //beep every $lastBeep tone(15,1000); delay(100); noTone(15); - lastBeep = timeClient.getHours(); + lastBeep = timeClient.getHours()*60 + timeClient.getMinutes(); } - updateNtp(); + + updateNtp();//update time } //TODO @@ -108,12 +109,15 @@ void loop(){ //check connectivity during work and do actions - DONE //beep hourly - DONE //github - oh yeahhh -//second screen -//reconfig wifi if not found (start webserver and AP) + //load config -//webconfig (?) +//webconfig (?) - in progress //mqtt update interval +//second screen + +//reconfig wifi if not found (start webserver and AP) + //GRAPH /* get json from server @@ -134,6 +138,155 @@ mqtt update interval //====================IN PROGRESS=================== +void editConfig(){ + if (server.args() > 0 ) { + for ( uint8_t i = 0; i < server.args(); i++ ){ + String Argument_Name = server.argName(i); + String client_response = server.arg(i); + + if (Argument_Name == "beepDelay"){ + beepDelay = client_response.toInt(); + } + + if (Argument_Name == "onTime"){ + onTime = client_response.toInt(); + } + if (Argument_Name == "offTime"){ + offTime = client_response.toInt(); + } + updateConfig(); + } + } +} + +bool updateConfig() { + StaticJsonBuffer<200> jsonBuffer; + JsonObject& json = jsonBuffer.createObject(); + json["onTime"] = onTime; + json["offTime"] = offTime; + json["beepDelay"] = beepDelay; + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + Serial.println("Failed to open config file for writing"); + return false; + } + + json.printTo(configFile); + return true; + +} + +bool readConfig() { + File configFile = SPIFFS.open("/config.json", "r"); + if (!configFile) { + Serial.println("Failed to open config file"); + + return false; + } + + size_t size = configFile.size(); + if (size > 1024) { + Serial.println("Config file size is too large"); + return false; + } + + // Allocate a buffer to store contents of the file. + std::unique_ptr buf(new char[size]); + + // We don't use String here because ArduinoJson library requires the input buffer to be mutable. If you don't use ArduinoJson, you may as well use configFile.readString instead. + configFile.readBytes(buf.get(), size); + + StaticJsonBuffer<200> jsonBuffer; + JsonObject& json = jsonBuffer.parseObject(buf.get()); + + if (!json.success()) { + Serial.println("Failed to parse config file"); + return false; + } + + offTime = int(json["offTime"]); + onTime = int(json["onTime"]); + beepDelay = int(json["beepDelay"]); + return true; + +} +bool defConfig() { + StaticJsonBuffer<200> jsonBuffer; + JsonObject& json = jsonBuffer.createObject(); + json["onTime"] = "6"; + json["offTime"] = "23"; + json["beepDelay"] = "60"; + File configFile = SPIFFS.open("/config.json", "w"); + if (!configFile) { + Serial.println("Failed to open config file for writing"); + return false; + } + + json.printTo(configFile); + return true; +} + +//====================paused=================== + + +// void secondDisplay() { +// display.clear(); +// display.setFont(ArialMT_Plain_16); +// display.setTextAlignment(TEXT_ALIGN_CENTER); +// display.drawString(0, 30, timeClient.getFormattedTime()); + +// display.drawRect(0,18,128,53); //frame +// /* +// 128/12=10px +// 128x32 resolution +// 32-19=13px for graph +// */ +// int x = 0; +// for (int i=0;i<12;++i){ +// display.drawLine(x+i*10, y[x], x+i*10+10, y[x]); +// } + +// } + +//===================WELL DONE======================= +void mainScreen() { + display.clear(); + + if (!nightMode()) { //turn off screen at night + int x = (timeClient.getHours()*60+timeClient.getMinutes())/11; + //Time + display.setFont(ArialMT_Plain_24); + display.setTextAlignment(TEXT_ALIGN_CENTER); + display.drawString(64, 22, timeClient.getFormattedTime()); + //progress bar + display.drawLine(0,22,x,22); + if (mqttAvail){ //do not show info if mqtt not available + //external temp //top left + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0, 0, "o:"+String(outTemp)); + //pressure //top right + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_RIGHT); + display.drawString(128, 0, "p:"+String(pressure)); + //inside temp //bottom left + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0, 53, "i:"+String(inTemp)); + //humid //bottom right + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_RIGHT); + display.drawString(128, 53, "h:"+String(humid)+"%"); + } + else { + display.setFont(ArialMT_Plain_10); + display.setTextAlignment(TEXT_ALIGN_LEFT); + display.drawString(0, 53, "mqtt unavailable"); + } + } + display.display(); +} + void displayStatus(int state){ display.clear(); if (state == 0) { @@ -158,132 +311,23 @@ void displayStatus(int state){ display.display(); } -void mainScreen() { - display.clear(); - - if (!nightMode()) { //turn off screen at night - int x = (timeClient.getHours()*60+timeClient.getMinutes())/11; - //Time - display.setFont(ArialMT_Plain_24); - display.setTextAlignment(TEXT_ALIGN_CENTER); - display.drawString(64, 22, timeClient.getFormattedTime()); - //progress bar - display.drawLine(0,22,x,22); - //external temp //top left - display.setFont(ArialMT_Plain_10); - display.setTextAlignment(TEXT_ALIGN_LEFT); - display.drawString(0, 0, "o:"+String(outTemp)); - //pressure //top right - display.setFont(ArialMT_Plain_10); - display.setTextAlignment(TEXT_ALIGN_RIGHT); - display.drawString(128, 0, "p:"+String(pressure)); - //inside temp //bottom left - display.setFont(ArialMT_Plain_10); - display.setTextAlignment(TEXT_ALIGN_LEFT); - display.drawString(0, 53, "i:"+String(inTemp)); - //humid //bottom right - display.setFont(ArialMT_Plain_10); - display.setTextAlignment(TEXT_ALIGN_RIGHT); - display.drawString(128, 53, "h:"+String(humid)+"%"); - - } - display.display(); -} - -// void secondDisplay() { -// display.clear(); -// display.setFont(ArialMT_Plain_16); -// display.setTextAlignment(TEXT_ALIGN_CENTER); -// display.drawString(0, 30, timeClient.getFormattedTime()); - -// display.drawRect(0,18,128,53); //frame -// /* -// 128/12=10px -// 128x32 resolution -// 32-19=13px for graph -// */ -// int x = 0; -// for (int i=0;i<12;++i){ -// display.drawLine(x+i*10, y[x], x+i*10+10, y[x]); -// } - -// } - -//====================paused=================== - -// bool readConfig() { -// File configFile = SPIFFS.open("/config.json", "r"); -// if (!configFile) { -// Serial.println("Failed to open config file"); -// return false; -// } - -// // size_t size = configFile.size(); -// // if (size > 1024) { -// // Serial.println("Config file size is too large"); -// // return false; -// // } - -// // Allocate a buffer to store contents of the file. -// std::unique_ptr buf(new char[size]); - -// // We don't use String here because ArduinoJson library requires the input buffer to be mutable. If you don't use ArduinoJson, you may as well use configFile.readString instead. -// configFile.readBytes(buf.get(), size); - -// StaticJsonBuffer<200> jsonBuffer; -// JsonObject& json = jsonBuffer.parseObject(buf.get()); - -// if (!json.success()) { -// Serial.println("Failed to parse config file"); -// return false; -// } - -// offTime = int(json["offTime"]); -// onTime = int(json["onTime"]); -// beepDelay = int(json["beepDelay"]); -// return true; - -// } -// bool defConf() { -// StaticJsonBuffer<200> jsonBuffer; -// JsonObject& json = jsonBuffer.createObject(); -// json["onTime"] = "6"; -// json["offTime"] = "23"; -// json["beepDelay"] = "60"; -// File configFile = SPIFFS.open("/config.json", "w"); -// if (!configFile) { -// Serial.println("Failed to open config file for writing"); -// return false; -// } - -// json.printTo(configFile); -// return true; -// } - -//===================WELL DONE======================= void MQTT_connect() { - int8_t ret; - - // Stop if already connected. if (mqtt.connected()) { return; } - - Serial.print("Connecting to MQTT... "); - + int8_t ret; uint8_t retries = 3; - while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected - Serial.println(mqtt.connectErrorString(ret)); - Serial.println("Retrying MQTT connection in 10 seconds..."); - mqtt.disconnect(); - delay(10000); // wait 10 seconds - retries--; - if (retries == 0) { - // basically die and wait for WDT to reset me - while (1); - } + while ((ret = mqtt.connect()) != 0) { + displayStatus(3); + mqtt.disconnect(); + delay(5000); + retries--; + if (retries == 0) { + mqttAvail = false; + } } - Serial.println("MQTT Connected!"); + if (mqtt.connected()) + mqttAvail = true; } void pressureCall(double x) { pressure = x; @@ -297,14 +341,12 @@ void outCall(double x) { void humidCall(double x){ humid = x; } - void updateNtp() { if (lastNtp != timeClient.getHours()) { - timeClient.update(); - lastNtp = timeClient.getHours(); + if (timeClient.update()) + lastNtp = timeClient.getHours(); } } - bool nightMode() { if ((timeClient.getHours() > offTime)||(timeClient.getHours() < onTime)) { //turn off screen between loaded time return true;