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;