Gartenhäuschen mit Micro Controller und Sensoren überwachen - Teil 1

In unserem Gartenhäuschen lagern Benzinrasenmäher und -kanister, der Gasgrill und einige Dosen mit Farben und Nitro-Verdünner. Wenn brennbare Gase oder Flüssigkeiten auslaufen oder gar ein Feuer ausbricht, möchte ich alarmiert werden. Da der Schuppen noch im Bereich unseres WLAN liegt, habe ich mich deshalb für einen D1 Mini (ESP8266) mit Temperatursensor DHT22 und Gassensor MQ-2 entschieden. Die Datenübermittlung erfolgt mit dem ESP als Web Server.

Benötigte Hardware

Anzahl Bauteil
1 D1 Mini NodeMcu mit ESP8266-12F WLAN Modul
optional Batterie Shield für Lithium Batterien für D1 Mini
optional Lithium Batterie 3,7V
1 DHT22 AM2302 Temperatursensor und Luftfeuchtigkeitssensor
1 MQ-2 Gas Sensor Rauch Sensor Luftqualität Modul
Mini Breadboard, Jumperkabel

Für den Sketch konnte ich auf Versatzstücke aus anderen Programmen zurückgreifen. Am einfachsten ist die Abfrage des Gassensors MQ-2, der für die interne Heizung mit einer Spannung von 5V versorgt wird. Als Datenleitung hat man die Wahl zwischen einem digitalen und einem analogen Ausgang. Für beide Möglichkeiten benötigt man einen Spannungsteiler (z.B. 1 kOhm und 2,2 kOhm), da die Eingänge des ESP8266 nur 3,3V vertragen. Obwohl der kleine Micro Controller nur einen analogen Eingang hat, benutze ich diesen. Denn hier kann man den Grenzwert mit einem bestimmten Wert im Sketch festlegen. Alternativ kann man den Grenzwert für den digitalen Ausgang mit einem eingebauten Potentiometer einstellen. Obwohl der Zustand HIGH auch an einer grünen LED angezeigt wird, gestaltet sich die Kalibrierung aufgrund fehlender Vergleiche schwierig. Für die Abfrage des analogen Pins benötigen wir nur:

  sensorValue = analogRead(0);

Der DHT22 (AM2302) ist ein kombinierter Temperatur- und Luftfeuchtigkeitsmesser aus der Familie der Eindraht-Sensoren (1-wire). Die Spannungsversorgung liegt flexibel zwischen 3 und 6 V, die Daten werden an einen digitalen Pin gesendet. Für die Abfrage der Messwerte bedient man sich zweckmäßigerweise einer Programmbibliothek, wie so oft vom Adafruit Team um Limor Fried. Wir benötigen also zur Instanziierung des Objekts dht:

  #include "DHT.h"
 
 #define DHTPIN 12              //D6-GPIO12
 #define DHTTYPE DHT22   // DHT22(AM2302)
 DHT dht(DHTPIN, DHTTYPE);

Da wir die Messwerte in verschiedenen Funktionen benutzen, definieren wir sie als globale Variable noch vor void setup() :

 float t = 0.0;
 float h = 0.0;
 int sensorValue = 0;

Die Programmierung des Web Servers auf dem ESP8266 ist keine Geheimwissenschaft. Es gibt dazu Beispiele in der Arduino IDE, wenn man die folgenden Programmbibliotheken installiert.

 #include <ESP8266WiFi.h>
 #include <ESP8266WebServer.h>
 #include <WifiUDP.h>

Allerdings kann der Sketch schon sehr umfangreich werden, wenn die Ausgabe im Browser des PCs oder Smartphones auch gut aussehen und automatisch aktualisiert werden soll. Ein Kollege hat für das neue eBook zum Smart-Home Starter Set einen Code-Block entwickelt, den ich nur wenig anpassen musste. Den HTML-Code können Sie dem vollständigen Sketch entnehmen: (Download)

 /*
     This sketch reads sensor data and provides these
     as HTML-Text on a TCP server in your local network.
     By Mihajlo Manojlovic and Bernd Albrecht for AZ-Delivery*/
 
 #include <ESP8266WiFi.h>
 #include <ESP8266WebServer.h>
 #include <WifiUDP.h>
 #include "DHT.h"
 
 #define DHTPIN 12 //D6-GPIO12
 #define DHTTYPE DHT22   // DHT22(AM2302)
 DHT dht(DHTPIN, DHTTYPE);
 
 const char* ssid = "---your SSID---";
 const char* password = "---your-PASSWORD---";
 
 float t = 0.0;
 float h = 0.0;
 int sensorValue = 0;
   
 ESP8266WebServer server(80);
 
 void setup () {
   Serial.begin(9600);
   dht.begin();
   // Connect to wifi
   Serial.println("");
   Serial.print("Connecting ...");
   Serial.print(ssid);
 
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED)
  {
     delay(500);
     Serial.print(".");
  }
   Serial.println("");
   Serial.print("Connecting to WiFi... ");
   Serial.print(WiFi.localIP());
   Serial.println("");
   delay(5000);
 
   //start server
   server.on("/", handle_OnConnect);
   server.onNotFound(handle_NotFound);
   server.begin();
   Serial.println("HTTP server started");
   //end
 }
 
 void readData() {
   delay(2000);
   h = dht.readHumidity();
   t = dht.readTemperature();
   Serial.print(F("Temperature: "));
   Serial.print(t);
   Serial.print(F(" °C Humidity: "));
   Serial.print(h);
   Serial.println(F(" %"));
   sensorValue = analogRead(0);
   Serial.print("Sensor Value: ");
   Serial.println(sensorValue);
   if(sensorValue > 100) {
     Serial.println("Gas detected!");   }
   Serial.println();
  }
 
 void loop() {
   server.handleClient();
   //
   readData();
   //
   
   if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status
  {
   handle_OnConnect();  
  }
   else // attempt to connect to wifi again if disconnected
  {
     Serial.print("Reconnecting");
     WiFi.begin(ssid, password);
     Serial.print("Connected!");
     delay(1000);
  }
 }
 
 void handle_OnConnect() {
   server.send(200, "text/html", SendHTML());
 }
 
 void handle_NotFound() {
   server.send(404, "text/plain", "Not found");
 }
 
 String SendHTML() {
   String ptr = "<!DOCTYPE html> <html>\n";
   ptr += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
   ptr += "<title>ESP8266 Web Server</title>\n";
   ptr += "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
   ptr += "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
   ptr += "p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
   ptr += "</style>\n";
 
   //ajax refresh start
   ptr += "<script>\n";
   ptr += "setInterval(loadDoc,200);\n";
   ptr += "function loadDoc() {\n";
   ptr += "var xhttp = new XMLHttpRequest();\n";
   ptr += "xhttp.onreadystatechange = function() {\n";
   ptr += "if (this.readyState == 4 && this.status == 200) {\n";
   ptr += "document.getElementById(\"webpage\").innerHTML =this.responseText}\n";
   ptr += "};\n";
   ptr += "xhttp.open(\"GET\", \"/\", true);\n";
   ptr += "xhttp.send();\n";
   ptr += "}\n";
   ptr += "</script>\n";
   //ajax refresh end
 
   ptr += "</head>\n";
   ptr += "<body>\n";
   ptr += "<div id=\"webpage\">\n";
   ptr += "<h1>AZ-Delivery</h1>\n";
   ptr += "<h2>Environmental Control</h2>\n";
 
 //CURRENT RECEIVED DATA
   ptr += "<p>Temperature: ";
   ptr += (t);
   ptr += " *C ";
   ptr += "</p>";
   ptr += "<p>Humidity: ";
   ptr += (h);
   ptr += " %";
   ptr += "</p>";
   ptr += "<p>Gas concentration: ";
   ptr += (sensorValue);
   if(sensorValue > 100) {
     ptr += "<p>gas detected!";   }
   
 //
   ptr += "</div>\n";
   ptr += "</body>\n";
   ptr += "</html>\n";
   return ptr;
 }

Unser Gartenhäuschen ist ziemlich robust gebaut und die Tür ist mit einem Sicherheitsschloss gesichert. Deshalb habe ich auf Bewegungsmelder oder andere Sensoren zur Diebstahlsicherung verzichtet. Es wäre ein leichtes, den Code dafür anzupassen.

Im zweiten Teil möchte ich zeigen, wie ich die gesendeten Daten nicht nur im Browser am PC oder Smartphone, sondern auch mit Hilfe eines Raspberry Pi oder eines Micro Controllers anzeigen kann. Das hat den Vorteil, dass man sogar einen Buzzer und/oder eine LED anschließen kann, um Alarm auszulösen.


Download als pdf

Esp-8266Projekte für anfängerSmart home

2 Kommentare

Juergen Eggers

Juergen Eggers

Herr Kühnel hat im Gegensatz zu AZ-Delivery und dem Entwickler des Board´s ganz nah aus meiner Heimat das Problem mit der Temperaturkompensation thematisiert und auch Lösungsansätze gezeigt. Warum haben die Schweizer im Gegensatz zu den Wolfsburgern bessere Lösungsansätze. Ich empfehle die Kühnel-sche Lösund auf Seiten AZ zu verfolgen, mit der bisherigen Beispiel Datei ist das AZ-Envy kein Freude-spender, übrigens auch nicht die Tasmota Variante, die zwar MQTT beherrscht aber bei der Temperatur eindeutig “schummelt” Vielen Dank Herr Kühnel, auch für die Ausarbeitung bei den Gassensoren.

Claus  Kühnel

Claus Kühnel

Ich habe etwas sehr ähnliches mit einem AZ-Envy aufgebaut. Das kompakte Board ist für diesen Zweck sehr gut geeignet. Detail unter https://wp.me/pbNO7T-lc.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. OTA - Over the Air - ESP Programmieren über WLAN