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:
//D6-GPIO12
// 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.
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*/
//D6-GPIO12
// 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.
4 Kommentare
Andreas Wolter
Norbert Dunker: das zweite Bild ist ein Fritzing Schaltplan und sollte theoretisch direkt nachgebaut werden können.
Norbert Dunker
Mit den Fotos komme ich nicht ganz zurecht gibt es auch eine Schaltung
Danke
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
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.