diff --git a/.gitignore b/.gitignore index eb54202..40de615 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .autogit *.txt -*.pdf \ No newline at end of file +*.pdf +output/ +Settings.h +.vscode \ No newline at end of file diff --git a/DHT.zip b/DHT.zip deleted file mode 100644 index 064fbff..0000000 Binary files a/DHT.zip and /dev/null differ diff --git a/LiquidCrystal_I2C-master.zip b/LiquidCrystal_I2C-master.zip new file mode 100644 index 0000000..81ae275 Binary files /dev/null and b/LiquidCrystal_I2C-master.zip differ diff --git a/Settings.h.original b/Settings.h.original new file mode 100644 index 0000000..7a0b497 --- /dev/null +++ b/Settings.h.original @@ -0,0 +1,26 @@ +//* **EINSTELLUNGEN** *// +#define SETUPTIMEOUT 500 + +// So, the minimum sampling period is the minimum time +// interval that we need to wait between two consecutive +// measurements from the sensor. In the case of the DHT22, +// this value is of 2 seconds [1]. + +static const unsigned long MESS_REFRESH_INTERVAL = 10000; // ms getMinimumSamplingPeriod == 2 sec +static const unsigned long SCHALT_REFRESH_INTERVAL = 60000; // ms +static const unsigned long LCD_REFRESH_INTERVAL = 500; // ms + +const int uT = 1; //Abschalt-Temperatur in °C +const int oT = 4; //Einschalt-Temperatur in °C + +/* +Truhe truhen[] = { + Truhe("Truhe 1", 2, 8), + Truhe("Truhe 2", 3, 9), +};*/ +//Name, Relaypin, DTH Pin +Truhe truhen[] = { + Truhe("Truhe 1", D0, D2), +}; + +//LiquidCrystal_I2C lcd(0x3F, 0, 0, 0, 0, 0, 0, 0, 0, POSITIVE); //0x3F = Adresse des Displays diff --git a/Steuerung_Truhen.ino b/Steuerung_Truhen.ino index 6a5836b..7da2ed0 100644 --- a/Steuerung_Truhen.ino +++ b/Steuerung_Truhen.ino @@ -1,144 +1,18 @@ -#include //Setup Sensoren -#include - -#include //Setup SD SDK=D13, MOSI=D11, MISO=D12 - #include //Setup LCD #include -LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); //0x3F = Adresse des Displays +LiquidCrystal_I2C lcd(0x3F,16,2); //0x3F = Adresse des Displays + +#include "Truhe.h" +#include "Settings.h" +#include "Webserver.h" static unsigned long last_lcd_time = 0; static unsigned long last_mess_time = 0; static unsigned long last_schalt_time = 0; -class Truhe { - private: - int _relay; - DHT _dht; - int _stat = -1; - int _cur_temp = 0; - int _updlcd = 0; - String _name = ""; - public: - Truhe(String name, int relay, int dhtpin, int dhttype) { - _name = name; - _relay = relay; - _dht.setup(dhtpin); - pinMode(_relay, OUTPUT); - }; - - void mess() { - //Serial.println(String(_name) + " mess()"); - //Serial.print("Minimum Sampling Period: "); - //Serial.println(_dht.getMinimumSamplingPeriod()); - //delay(_dht.getMinimumSamplingPeriod()); - _cur_temp = _dht.getTemperature(); - //Serial.println(String(_name) + "\t\t" + String(_cur_temp) + " grad gelesen"); - }; - - void log(File logfile) { - //Serial.println(String(_name) + " log()"); - String logdata = String(_name) + "\t" + String(_cur_temp) + "\t" + String(_stat); - logfile.println(logdata); - } - - void updateLCD(int row) { - //Serial.println(String(_name) + " updateLCD("+String(row)+")"); - //LCD-Anzeige - lcd.setCursor(0, row); //...(Zeichen,Zeile); - lcd.print(_name + " " + String(_updlcd)); - - lcd.setCursor(8, row); - lcd.print(" "); - //Serial.println(sizeof(String(_cur_temp))/2); - lcd.setCursor(11 - sizeof(String(_cur_temp))/2, row); - lcd.setCursor(8, row); - lcd.print(String(_cur_temp)); - lcd.setCursor(11, row); - lcd.print("\337"); - lcd.setCursor(13, row); - if (_stat == -1) { - lcd.print("-"); - } - else if (_stat == 1) { - lcd.print("I"); - } - else if (_stat == 0) { - lcd.print("O"); - } - if(_updlcd == 0){ - lcd.setCursor(15, row); - lcd.print(String("|")); - //Serial.println(String(_name) + " updateLCD("+String(row)+") ."); - _updlcd = 1; - }else{ - lcd.setCursor(15, row); - lcd.print(String("-")); - //Serial.println(String(_name) + " updateLCD("+String(row)+") "); - _updlcd = 0; - } - } - - void schalt(int oT, int uT) { - Serial.print(String(_name) + " schalt() stat: " + String(_stat)); - if (_cur_temp >= oT && _stat != 1) { - digitalWrite(_relay, LOW); - _stat = 1; - Serial.println("schalt " + _name + " zu " + String(_stat)); - } - else if (_cur_temp <= uT && _stat != 0) { - digitalWrite(_relay, HIGH); - _stat = 0; - Serial.println("schalt " + _name + " zu " + String(_stat)); - } - } - - void printName(){ - //Serial.println(_name); - } -}; - -//* **EINSTELLUNGEN** *// -#define DHTTYPE DHT22 -#define SETUPTIMEOUT 500 -// So, the minimum sampling period is the minimum time -// interval that we need to wait between two consecutive -// measurements from the sensor. In the case of the DHT22, -// this value is of 2 seconds [1]. -static const unsigned long MESS_REFRESH_INTERVAL = 10000; // ms getMinimumSamplingPeriod == 2 sec -static const unsigned long SCHALT_REFRESH_INTERVAL = 10000; // ms -static const unsigned long LCD_REFRESH_INTERVAL = 500; // ms -const int uT = 1; //Abschalt-Temperatur in °C -const int oT = 4; //Einschalt-Temperatur in °C - -Truhe truhen[] = { - Truhe("Truhe 1", 2, 8, 0), - Truhe("Truhe 2", 3, 9, 0), -}; - - -void setup_sd() { - //Initialsierugn SD - lcd.clear(); - lcd.setCursor(0, 0); //...(Zeichen,Zeile); - lcd.print("Init SD"); - if (!SD.begin(4)) { //Init SD_Karte mit CS auf Pin D4 - lcd.setCursor(0, 1); - lcd.print("fehlgeschlagen!"); - Serial.println("Init SD fehlgeschlagen!"); - delay(SETUPTIMEOUT); - return; - } else { - lcd.setCursor(0, 1); - lcd.print("abgeschlossen!"); - Serial.println("Init SD abgeschlossen!"); - delay(SETUPTIMEOUT); - } -} - void setup_lcd() { //LCD - lcd.begin(16, 2); //Starten des LCD, 16 Zeichen, 2 Zeilen + lcd.init(); lcd.backlight(); //Beleuchtung des Displays einschalten lcd.blink(); lcd.clear(); @@ -155,13 +29,12 @@ void setup() { Serial.println(); Serial.println(); setup_lcd(); - setup_sd(); - File logfile = SD.open("logTruhe.txt", FILE_WRITE); //Erstelle bzw. öffne log-Datei - logfile.println("t(min)\tTruhe\tT(°C)\tStatus"); - logfile.close(); lcd.clear(); - - wdt_enable(WDTO_1S); // Watchdog auf 1 s stellen + for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { + truhen[i].setup(); + } + wdt_enable(WDTO_4S); // Watchdog auf 4 s stellen + WifiSetup(); Serial.println("Setup fi"); } @@ -171,14 +44,8 @@ void loop() { //MESSINTERVALL last_mess_time = millis(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { - truhen[i].printName(); truhen[i].mess(); - - File logfile = SD.open("logTruhe.txt", FILE_WRITE); - truhen[i].log(logfile); - logfile.close(); } - logfile.println(); } //Serial.println("Schaltintervall: "+ String(millis() - last_schalt_time) + " " + String(SCHALT_REFRESH_INTERVAL)); if(millis() - last_schalt_time >= SCHALT_REFRESH_INTERVAL || last_schalt_time == 0) @@ -195,8 +62,45 @@ void loop() { //LCD Update INTERVALL last_lcd_time = millis(); for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { - truhen[i].updateLCD(i); + //LCD-Anzeige + lcd.setCursor(0, i); //...(Zeichen,Zeile); + lcd.print(truhen[i].getName()); + + lcd.setCursor(8, i); + lcd.print(" "); + //Serial.println(sizeof(String(truhen[i].getCurTemp()))/2); + lcd.setCursor(11 - sizeof(String(truhen[i].getCurTemp()))/2, i); + lcd.setCursor(8, i); + lcd.print(String(truhen[i].getCurTemp())); + lcd.setCursor(11, i); + lcd.print("\337"); + lcd.setCursor(13, i); + if (truhen[i].getStat() == -1) { + lcd.print("-"); + } + else if (truhen[i].getStat() == 1) { + lcd.print("I"); + } + else if (truhen[i].getStat() == 0) { + lcd.print("O"); + } + else if (truhen[i].getStat() == 2) { + lcd.setCursor(8, i); + lcd.print("Error"); + } + if(truhen[i].getUpdLcd() == 0){ + lcd.setCursor(15, i); + lcd.print(String("|")); + //Serial.println(String(truhen[i]._name) + " updateLCD("+String(i)+") ."); + truhen[i].setUpdLcd(1); + }else{ + lcd.setCursor(15, i); + lcd.print(String("-")); + //Serial.println(String(truhen[i]._name) + " updateLCD("+String(i)+") "); + truhen[i].setUpdLcd(0); + } } } + server.handleClient(); wdt_reset(); -} \ No newline at end of file +} diff --git a/Steuerung_Truhen.ino.d1_mini.bin b/Steuerung_Truhen.ino.d1_mini.bin new file mode 100644 index 0000000..8ba3fca Binary files /dev/null and b/Steuerung_Truhen.ino.d1_mini.bin differ diff --git a/Truhe.cpp b/Truhe.cpp new file mode 100644 index 0000000..35df94f --- /dev/null +++ b/Truhe.cpp @@ -0,0 +1,56 @@ +#include "Truhe.h" +Truhe::Truhe(String name, int relay, uint8_t sensorpin){ + _name = name; + _relay = relay; + _sensorpin = sensorpin; + _oneWire = OneWire(sensorpin); + _sensors = DallasTemperature(&_oneWire); + +}; + +void Truhe::setup() { + Serial.println("Setup " + _name); + Serial.println(_sensorpin); + pinMode(_relay, OUTPUT); + digitalWrite(_relay, HIGH); + pinMode(_sensorpin, INPUT); + _sensors.begin(); +} + +void Truhe::mess() { + Serial.println(String(_name) + " mess()"); + _sensors.requestTemperatures(); + _cur_temp = _sensors.getTempCByIndex(0); + // Check if reading was successful + if(_cur_temp != DEVICE_DISCONNECTED_C) + { + Serial.println(String(_name) + "\t\t" + String((int)_cur_temp) + " grad gelesen"); + } + else + { + Serial.println("Error: Could not read temperature data: "+ String(_name)); + _cur_temp = 99; // Liewer warmes bier als garkenn bier + _stat = 2; + } +}; + +void Truhe::schalt(int oT, int uT) { + Serial.println(String(_name) + " schalt() stat: " + String(_stat)); + if (_cur_temp >= oT && _stat != 1 && _stat != 2) { + digitalWrite(_relay, LOW); + _stat = 1; + Serial.println("schalt " + _name + " zu " + String(_stat)); + } + else if (_cur_temp <= uT && _stat != 0 && _stat != 2) { + digitalWrite(_relay, HIGH); + _stat = 0; + Serial.println("schalt " + _name + " zu " + String(_stat)); + } +} +int Truhe::getUpdLcd(){ return _updlcd;}; +void Truhe::setUpdLcd(int updlcd){ _updlcd = updlcd;}; +int Truhe::getRelay(){ return _relay;}; +int Truhe::getSensorPin(){return _sensorpin;}; +int Truhe::getStat(){return _stat;}; +int Truhe::getCurTemp(){return int(_cur_temp);}; +String Truhe::getName(){return _name;}; diff --git a/Truhe.h b/Truhe.h new file mode 100644 index 0000000..dde0b20 --- /dev/null +++ b/Truhe.h @@ -0,0 +1,25 @@ +#include +#include +class Truhe { + private: + OneWire _oneWire; + DallasTemperature _sensors; + int _relay; + uint8_t _sensorpin; + int _stat = -1; + float _cur_temp = 0; + int _updlcd = 0; + String _name = ""; + public: + Truhe(String, int, uint8_t); + void setup(); + void mess(); + void schalt(int, int); + int getUpdLcd(); + void setUpdLcd(int); + int getRelay(); + int getSensorPin(); + int getStat(); + int getCurTemp(); + String getName(); +}; diff --git a/Webserver.h b/Webserver.h new file mode 100644 index 0000000..18ae631 --- /dev/null +++ b/Webserver.h @@ -0,0 +1,185 @@ +// Load Wi-Fi library +#include +#include +#include +#include +Preferences preferences; +ESP8266WebServer server(80); +ESP8266HTTPUpdateServer httpUpdater; +String header = " \n" + "\n" + "Truhensteuerung\n" + "\n" + "\n" + "\n" + "

Truhensteuerung Web Server

\n"; +String ssid = "REPLACE_WITH_YOUR_SSID"; +String password = "REPLACE_WITH_YOUR_PASSWORD"; +unsigned long currentTime = millis(); +unsigned long previousTime= 0; +//const long timeoutTime= 2000; + +void WifiConnect(String _ssid, String _password){ + // Connect to Wi-Fi network with SSID and password + Serial.print("Connecting to "); + Serial.println(_ssid); + WiFi.begin(_ssid, _password); + if(WiFi.waitForConnectResult() == WL_CONNECTED) + { + Serial.println(""); + Serial.println("WiFi connected."); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + } + else + { + Serial.println("WiFi Connection failed! Restarting in SoftAP mode instead"); + WiFi.mode(WIFI_AP); + WiFi.softAP("Truhensteuerung", "12345678"); + Serial.print("AP IP address: "); + Serial.println(WiFi.softAPIP()); + } + // Print local IP address and start web server +} + +void handleWifiSetup(){ + String ptr = header; +// ptr += "URI: "; +// ptr += server.uri(); +// ptr += "
\nMethod: "; +// ptr += (server.method() == HTTP_GET) ? "GET" : "POST"; +// ptr += "
\nArguments: "; +// ptr += server.args(); +// ptr += "
\n"; + for (uint8_t i = 0; i < server.args(); i++) { ptr += " " + server.argName(i) + ": " + server.arg(i) + "
\n"; } + if(server.method() == HTTP_GET){ + int n = WiFi.scanNetworks(false, true); + String ssid; + uint8_t encryptionType; + int32_t RSSI; + uint8_t* BSSID; + int32_t channel; + bool isHidden; + ptr += "Home"; + ptr += "
"; + ptr +="\n\n"; + for (int i = 0; i < n; i++) + { + WiFi.getNetworkInfo(i, ssid, encryptionType, RSSI, BSSID, channel, isHidden); + ptr +="\n"; + } + + ptr += "
IDSSIDChannelRSSI
"+String(i + 1)+""+String(ssid.c_str())+""+String(channel)+""+String(RSSI)+"dBm"+String(encryptionType == ENC_TYPE_NONE ? "open" : "")+""+String(isHidden ? "hidden" : "")+"
\n"; + ptr += ""; + ptr += ""; + ptr += "
"; + }else{ + ptr += "

\n"; + if(server.args() != 4){ + ptr += "Missing Arguments
\n"; + ptr += "zurück\n"; + }else{ + String ssid; + String password; + for (uint8_t i = 0; i < server.args(); i++) { + if(server.argName(i) == "ssid"){ + ssid = server.arg(i); + } + if(server.argName(i) == "password"){ + password = server.arg(i); + } + } + ptr += "Connecting to "+ssid+"
\n"; + Serial.println("Connecting to "+ssid+", "+password+""); + WiFi.begin(ssid, password); + if(WiFi.waitForConnectResult() == WL_CONNECTED) + { + Serial.println(""); + Serial.println("WiFi connected."); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + preferences.begin("my-app", false); + preferences.putString("ssid", ssid); + preferences.putString("password", password); + preferences.end(); + ptr += "WiFi connected.
"; +// ptr += "IP address: "; +// ptr += WiFi.localIP(); + ptr += "
\n"; + } + else + { + Serial.println("WiFi Connection failed! Restarting in SoftAP mode instead"); + ptr += "WiFi Connection failed! Restarting in SoftAP mode instead
\n"; + WiFi.mode(WIFI_AP); + WiFi.softAP("Truhensteuerung", "12345678"); + Serial.print("AP IP address: "); + Serial.println(WiFi.softAPIP()); + //ptr += "AP IP address: "; + //ptr += WiFi.softAPIP(); + ptr += "
\n"; + } + // Print local IP address and start web server + ptr += "

\n"; + } + } + server.send(200, "text/html", ptr); + +} +void handleRoot(){ + String ptr = header; + ptr += "Setup Wifi"; + ptr +="\n\n"; + for (int i = 0; i < (sizeof(truhen) / sizeof(truhen[0])); i++) { + ptr +="\n\n\n\n\n"; + } + ptr += "
NameTempStatus
"; + ptr +=truhen[i].getName(); + ptr +=""; + ptr +=String(truhen[i].getCurTemp())+"℃"; + ptr +=""; + if (truhen[i].getStat() == -1) { + ptr +="Nicht bekannt"; + } + else if (truhen[i].getStat() == 1) { + ptr +="An"; + } + else if (truhen[i].getStat() == 0) { + ptr +="Aus"; + } + else if (truhen[i].getStat() == 2) { + ptr +="Error"; + } + ptr += "
\n"; + ptr +="\n"; + ptr +="\n"; + server.send(200, "text/html", ptr); +} +void handleNotFound() { + String message = "File Not Found\n\n"; + message += "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } + server.send(404, "text/plain", message); +} + +void WifiSetup() { + preferences.begin("my-app", false); + ssid = preferences.getString("ssid", ssid); + password = preferences.getString("password", password); + preferences.end(); + + WifiConnect(ssid, password); + httpUpdater.setup(&server); + server.on("/setup",handleWifiSetup); + server.on("/",handleRoot); + + server.begin(); +};