From 9ccec50c374e5b843d1d3b7c8f25b88ecd2de6bc Mon Sep 17 00:00:00 2001 From: lukas Date: Sat, 20 Jun 2020 09:13:55 +0200 Subject: [PATCH 1/3] dht22 --- platformio.ini | 5 ++ src/main.cpp | 216 +++++++++++++++---------------------------------- 2 files changed, 71 insertions(+), 150 deletions(-) diff --git a/platformio.ini b/platformio.ini index 02e9444..bf247d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,3 +12,8 @@ platform = espressif8266 board = esp07 framework = arduino + +lib_deps = + SPI + Wire + DHT sensor library \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 08ef094..a71eb29 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,162 +1,78 @@ -#include -#include +#include "Arduino.h" +#include +#include +#include -#include "WifiManager.h" +#define DHTPIN 3 // Digital pin connected to the DHT sensor +// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- +// Pin 15 can work but DHT must be disconnected during program upload. -#define VERSION "v1.0" +// Uncomment the type of sensor in use: +//#define DHTTYPE DHT11 // DHT 11 +#define DHTTYPE DHT22 // DHT 22 (AM2302) +//#define DHTTYPE DHT21 // DHT 21 (AM2301) -bool allow; -bool error = false; +// See guide for details on sensor wiring and usage: +// https://learn.adafruit.com/dht/overview -/** pin config */ -static const uint8_t WasserSensorPin = 14; -static const uint8_t DruckSensorPin = 12; -static const uint8_t SchuetzPin = 13; +DHT_Unified dht(DHTPIN, DHTTYPE); -/** time config */ -static const int abschaltzeit = 7200; //sek -static const int maxpumpdauer = 600; //sek - -// ticker fuer kein-wasser abschaltung -Ticker status; - -//pumpendauer maximum ticker -Ticker pumpendauer; - -int turnontime = -1; - -void pumpeSchalten(bool on) { - // digitalWrite(4,on); - if (on) { - Serial.println("versuche Pumpe EIN zuschalten"); - } else { - Serial.println("versuche Pumpe AUS zuschalten"); - } - - if (allow && !error) { - if (on) { - pumpendauer.once(maxpumpdauer + 1, []() { //erlaube keine einschaltung von mehr als 60 sek - if (millis() - turnontime >= maxpumpdauer * 1000 && turnontime != -1) { - //error zu lange - Serial.println("\n\npumpe lief mehr als 10 Minuten durchgaengig"); - pumpeSchalten(false); - error = true; - } - }); - } - turnontime = millis(); - digitalWrite(SchuetzPin, on); - Serial.println("[Erfolg] pumpe wird geschalten"); - } else { - Serial.println("[FEHLGESCHLAGEN] Schalten des Schütz gesperrt durch Timeout oder Fehler-- sofortiges ausschalten der pumpe\n"); - turnontime = -1; - digitalWrite(SchuetzPin, LOW); - } - - -} - -ICACHE_RAM_ATTR void DruckschalterInt() { - if (digitalRead(DruckSensorPin) == HIGH) { - //pumpe einschalten - Serial.println("\n\nDruck Sensor EIN"); - if (digitalRead(WasserSensorPin)) { - Serial.println("Wasser Sensor EIN"); - pumpeSchalten(true); - } else { - Serial.println("Wasser Sensor aus irgent einem Grund doch nicht ein -- sofort abschalten!"); - pumpeSchalten(false); - } - } else { - //pumpe ausschalten - Serial.println("\n\nDruck Sensor AUS"); - pumpeSchalten(false); - } -} - -int i = abschaltzeit; //todo better -void WasserSensorCheck() { - if (digitalRead(WasserSensorPin) == LOW) { - Serial.println("Wasser Sensor AUS"); - //kein Wasser dh timer auf 10min stellen - - allow = false; - Serial.println("Schalte pumpe aus"); - pumpeSchalten(false); - - Serial.println("warte 30min"); - - status.detach(); - - i = abschaltzeit; - status.attach(5, []() { - i -= 5; - Serial.print("noch "); - Serial.print(i); - Serial.println(" Sekunden verbleibend"); - - if (i <= 0) { - if (digitalRead(WasserSensorPin)) { - allow = true; - Serial.println("Einschalten der Pumpe wieder erlaubt."); - - //pruefen ob drucksensor ein - DruckschalterInt(); - } else { - Serial.print("wassersensor immer noch kein Wasser --> verlaengern um 120min\n\n"); - WasserSensorCheck(); - } - status.detach(); - } - }); - } else { - Serial.println("Wasser Sensor EIN"); - } -} - -ICACHE_RAM_ATTR void WasserSensorInt() { - WasserSensorCheck(); -} +uint32_t delayMS; void setup() { - digitalWrite(SchuetzPin, LOW); //pumpe anfangs sofort abschalten - pinMode(SchuetzPin, OUTPUT); - - pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(LED_BUILTIN, LOW); - - - pinMode(WasserSensorPin, INPUT); - pinMode(DruckSensorPin, INPUT); - - Serial.begin(9600); - Serial.println("\n\n\n\nstartup of ESP"); - Serial.print("Version: "); - Serial.println(VERSION); - - - //initial measurement of water state - delay(1000); - //allow = digitalRead(WasserSensorPin); - allow = true; - WasserSensorCheck(); - DruckschalterInt(); - - - //anhängen der Pin-Interrupts - attachInterrupt(digitalPinToInterrupt(DruckSensorPin), DruckschalterInt, CHANGE); - attachInterrupt(digitalPinToInterrupt(WasserSensorPin), WasserSensorInt, CHANGE); - - - Serial.println("startup sequence complete!\n"); - digitalWrite(LED_BUILTIN, HIGH); - - WifiManager mang = WifiManager(); - mang.init(); + // Initialize device. + Serial.println("DHTxx Unified Sensor Example"); + dht.begin(); + Serial.println(F("DHTxx Unified Sensor Example")); + // Print temperature sensor details. + sensor_t sensor; + dht.temperature().getSensor(&sensor); + Serial.println(F("------------------------------------")); + Serial.println(F("Temperature Sensor")); + Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); + Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); + Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); + Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C")); + Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C")); + Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C")); + Serial.println(F("------------------------------------")); + // Print humidity sensor details. + dht.humidity().getSensor(&sensor); + Serial.println(F("Humidity Sensor")); + Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); + Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); + Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); + Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%")); + Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%")); + Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%")); + Serial.println(F("------------------------------------")); + // Set delay between sensor readings based on sensor details. + delayMS = sensor.min_delay / 1000; } - void loop() { - + // Delay between measurements. + delay(delayMS); + // Get temperature event and print its value. + sensors_event_t event; + dht.temperature().getEvent(&event); + if (isnan(event.temperature)) { + Serial.println(F("Error reading temperature!")); + } + else { + Serial.print(F("Temperature: ")); + Serial.print(event.temperature); + Serial.println(F("°C")); + } + // Get humidity event and print its value. + dht.humidity().getEvent(&event); + if (isnan(event.relative_humidity)) { + Serial.println(F("Error reading humidity!")); + } + else { + Serial.print(F("Humidity: ")); + Serial.print(event.relative_humidity); + Serial.println(F("%")); + } } \ No newline at end of file From 3d7a87f4b806bf88550a4d4ee5aa0766715d81cd Mon Sep 17 00:00:00 2001 From: lukas Date: Sat, 22 Aug 2020 12:33:46 +0200 Subject: [PATCH 2/3] add new temperature class and rollback main --- src/Temperature.cpp | 33 +++++++ src/Temperature.h | 21 +++++ src/main.cpp | 220 ++++++++++++++++++++++++++++++-------------- 3 files changed, 206 insertions(+), 68 deletions(-) create mode 100644 src/Temperature.cpp create mode 100644 src/Temperature.h diff --git a/src/Temperature.cpp b/src/Temperature.cpp new file mode 100644 index 0000000..78c9a49 --- /dev/null +++ b/src/Temperature.cpp @@ -0,0 +1,33 @@ +// +// Created by lukas on 22.08.20. +// + +#include "Temperature.h" + +void Temperature::init() { + dht.begin(); +} + +double Temperature::getTemp() { + sensors_event_t event; + dht.temperature().getEvent(&event); + if (isnan(event.temperature)) { + return -1; + } + else { + return event.temperature; + } +} + +double Temperature::getHum() { + // Get humidity event and print its value. + dht.humidity().getEvent(&event); + if (isnan(event.relative_humidity)) { + return -1; + } + else { + + return event.relative_humidity; + + } +} diff --git a/src/Temperature.h b/src/Temperature.h new file mode 100644 index 0000000..dcc9cb0 --- /dev/null +++ b/src/Temperature.h @@ -0,0 +1,21 @@ +// +// Created by lukas on 22.08.20. +// + +#pragma once + +#include +#include +#include + +class Temperature { +public: + Temperature(): dht(4, DHT22){}; + + void init(); + double getTemp(); + double getHum(); + +private: + DHT_Unified dht; +}; diff --git a/src/main.cpp b/src/main.cpp index a71eb29..de90ef5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,78 +1,162 @@ -#include "Arduino.h" -#include -#include -#include +#include +#include -#define DHTPIN 3 // Digital pin connected to the DHT sensor -// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 -- -// Pin 15 can work but DHT must be disconnected during program upload. +#include "WifiManager.h" -// Uncomment the type of sensor in use: -//#define DHTTYPE DHT11 // DHT 11 -#define DHTTYPE DHT22 // DHT 22 (AM2302) -//#define DHTTYPE DHT21 // DHT 21 (AM2301) +#define VERSION "v1.1" -// See guide for details on sensor wiring and usage: -// https://learn.adafruit.com/dht/overview +bool allow; +bool error = false; -DHT_Unified dht(DHTPIN, DHTTYPE); +/** pin config */ +static const uint8_t WasserSensorPin = 14; +static const uint8_t DruckSensorPin = 12; +static const uint8_t SchuetzPin = 13; + +/** time config */ +static const int abschaltzeit = 7200; //sek +static const int maxpumpdauer = 600; //sek + +// ticker fuer kein-wasser abschaltung +Ticker status; + +//pumpendauer maximum ticker +Ticker pumpendauer; + +int turnontime = -1; + +void pumpeSchalten(bool on) { + // digitalWrite(4,on); + if (on) { + Serial.println("versuche Pumpe EIN zuschalten"); + } else { + Serial.println("versuche Pumpe AUS zuschalten"); + } + + if (allow && !error) { + if (on) { + pumpendauer.once(maxpumpdauer + 1, []() { //erlaube keine einschaltung von mehr als 60 sek + if (millis() - turnontime >= maxpumpdauer * 1000 && turnontime != -1) { + //error zu lange + Serial.println("\n\npumpe lief mehr als 10 Minuten durchgaengig"); + pumpeSchalten(false); + error = true; + } + }); + } + turnontime = millis(); + digitalWrite(SchuetzPin, on); + Serial.println("[Erfolg] pumpe wird geschalten"); + } else { + Serial.println("[FEHLGESCHLAGEN] Schalten des Schütz gesperrt durch Timeout oder Fehler-- sofortiges ausschalten der pumpe\n"); + turnontime = -1; + digitalWrite(SchuetzPin, LOW); + } -uint32_t delayMS; -void setup() { - Serial.begin(9600); - // Initialize device. - Serial.println("DHTxx Unified Sensor Example"); - dht.begin(); - Serial.println(F("DHTxx Unified Sensor Example")); - // Print temperature sensor details. - sensor_t sensor; - dht.temperature().getSensor(&sensor); - Serial.println(F("------------------------------------")); - Serial.println(F("Temperature Sensor")); - Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); - Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); - Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); - Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("°C")); - Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("°C")); - Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("°C")); - Serial.println(F("------------------------------------")); - // Print humidity sensor details. - dht.humidity().getSensor(&sensor); - Serial.println(F("Humidity Sensor")); - Serial.print (F("Sensor Type: ")); Serial.println(sensor.name); - Serial.print (F("Driver Ver: ")); Serial.println(sensor.version); - Serial.print (F("Unique ID: ")); Serial.println(sensor.sensor_id); - Serial.print (F("Max Value: ")); Serial.print(sensor.max_value); Serial.println(F("%")); - Serial.print (F("Min Value: ")); Serial.print(sensor.min_value); Serial.println(F("%")); - Serial.print (F("Resolution: ")); Serial.print(sensor.resolution); Serial.println(F("%")); - Serial.println(F("------------------------------------")); - // Set delay between sensor readings based on sensor details. - delayMS = sensor.min_delay / 1000; } +ICACHE_RAM_ATTR void DruckschalterInt() { + if (digitalRead(DruckSensorPin) == HIGH) { + //pumpe einschalten + Serial.println("\n\nDruck Sensor EIN"); + if (digitalRead(WasserSensorPin)) { + Serial.println("Wasser Sensor EIN"); + pumpeSchalten(true); + } else { + Serial.println("Wasser Sensor aus irgent einem Grund doch nicht ein -- sofort abschalten!"); + pumpeSchalten(false); + } + } else { + //pumpe ausschalten + Serial.println("\n\nDruck Sensor AUS"); + pumpeSchalten(false); + } +} + +int i = abschaltzeit; //todo better +void WasserSensorCheck() { + if (digitalRead(WasserSensorPin) == LOW) { + Serial.println("Wasser Sensor AUS"); + //kein Wasser dh timer auf 10min stellen + + allow = false; + Serial.println("Schalte pumpe aus"); + pumpeSchalten(false); + + Serial.println("warte 30min"); + + status.detach(); + + i = abschaltzeit; + status.attach(5, []() { + i -= 5; + Serial.print("noch "); + Serial.print(i); + Serial.println(" Sekunden verbleibend"); + + if (i <= 0) { + if (digitalRead(WasserSensorPin)) { + allow = true; + Serial.println("Einschalten der Pumpe wieder erlaubt."); + + //pruefen ob drucksensor ein + DruckschalterInt(); + } else { + Serial.print("wassersensor immer noch kein Wasser --> verlaengern um 120min\n\n"); + WasserSensorCheck(); + } + status.detach(); + } + }); + } else { + Serial.println("Wasser Sensor EIN"); + } +} + +ICACHE_RAM_ATTR void WasserSensorInt() { + WasserSensorCheck(); +} + +void setup() { + digitalWrite(SchuetzPin, LOW); //pumpe anfangs sofort abschalten + pinMode(SchuetzPin, OUTPUT); + + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, LOW); + + + pinMode(WasserSensorPin, INPUT); + pinMode(DruckSensorPin, INPUT); + + + Serial.begin(9600); + Serial.println("\n\n\n\nstartup of ESP"); + Serial.print("Version: "); + Serial.println(VERSION); + + + //initial measurement of water state + delay(1000); + //allow = digitalRead(WasserSensorPin); + allow = true; + WasserSensorCheck(); + DruckschalterInt(); + + + //anhängen der Pin-Interrupts + attachInterrupt(digitalPinToInterrupt(DruckSensorPin), DruckschalterInt, CHANGE); + attachInterrupt(digitalPinToInterrupt(WasserSensorPin), WasserSensorInt, CHANGE); + + + Serial.println("startup sequence complete!\n"); + digitalWrite(LED_BUILTIN, HIGH); + + WifiManager mang = WifiManager(); + mang.init(); +} + + void loop() { - // Delay between measurements. - delay(delayMS); - // Get temperature event and print its value. - sensors_event_t event; - dht.temperature().getEvent(&event); - if (isnan(event.temperature)) { - Serial.println(F("Error reading temperature!")); - } - else { - Serial.print(F("Temperature: ")); - Serial.print(event.temperature); - Serial.println(F("°C")); - } - // Get humidity event and print its value. - dht.humidity().getEvent(&event); - if (isnan(event.relative_humidity)) { - Serial.println(F("Error reading humidity!")); - } - else { - Serial.print(F("Humidity: ")); - Serial.print(event.relative_humidity); - Serial.println(F("%")); - } + } \ No newline at end of file From d036201313699125679e6275dee884baf921dd9d Mon Sep 17 00:00:00 2001 From: lukas Date: Sat, 22 Aug 2020 12:35:43 +0200 Subject: [PATCH 3/3] fix event var --- src/Temperature.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Temperature.cpp b/src/Temperature.cpp index 78c9a49..4146be8 100644 --- a/src/Temperature.cpp +++ b/src/Temperature.cpp @@ -20,7 +20,7 @@ double Temperature::getTemp() { } double Temperature::getHum() { - // Get humidity event and print its value. + sensors_event_t event; dht.humidity().getEvent(&event); if (isnan(event.relative_humidity)) { return -1;