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

En nuestra caseta de jardín, solemos guardar las cortadoras de césped de gasolina y las latas, parrillas de gas y también algunas latas de pintura y disolvente nitro. En el caso de que se produzcan fugas de gases o líquidos inflamables, o incluso un incendio, es preciso recibir una alerta. Dado que la caseta sigue estando dentro del alcance de la red WLAN, decidí utilizar un D1 mini (ESP8266) con sensor de temperatura DHT22 y sensor de gas MQ-2. La transmisión de datos se realiza con el ESP como servidor web. 

Hardware necesario

Número Componentes
1 Microcontrolador D1 Mini NodeMCU con módulo WLAN ESP8266 - 12F
Opcional Batería Shield para Baterías de Litio para D1 Mini
Opcional Batería de Litio 3,7 V
1 DHT22 AM2302 Sensor de Temperatura y Humedad
1 MQ-2 Módulo Calidad de Aire Sensor de gas Sensor de humo
Mini Breadboard, Jumper cable

Para el sketch, pude usar piezas de otros programas. La forma más sencilla es utilizar el sensor de gas MQ-2, que se alimenta con un voltaje de 5V para el calentamiento interno. Como línea de datos, se puede elegir entre una salida digital y analógica. Para ambas opciones se necesita un divisor de voltaje (por ejemplo, 1 kOhm y 2,2 kOhm), dado que las entradas del ESP8266 sólo pueden manejar 3,3V. Aunque el microcontrolador pequeño sólo tiene una entrada analógica, yo utilizo ésta. Porque aquí puede establecer el límite con un valor determinado en el sketch. Como alternativa, puede ajustar el límite de la salida digital con un potenciómetro incorporado. Aunque el estado HIGH también se indica con un LED verde, la calibración es difícil debido a la falta de comparaciones. Para consultar el pin analógico, sólo necesitamos:

   sensorValue = analogRead(0);

El DHT22 (AM2302) es un medidor combinado de temperatura y humedad de la familia de sensores de un solo hilo (1-wire). El voltaje de alimentación es flexible entre 3 y 6 V, los datos se envían a un pin digital. Para consultar los valores medidos, es aconsejable utilizar una librería de programas, como hace a menudo el equipo de Adafruit en torno a Limor Fried. Por lo tanto, sólo necesitamos instanciar el objeto dht:

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

Como utilizamos los valores medidos en diferentes funciones, los definimos como una variable global, incluso antes de void setup() :

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

La programación del servidor web en el ESP8266 no es una ciencia secreta. Hay ejemplos en el Arduino IDE si instala las siguientes librerías de programas.

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

Sin embargo, el sketch puede llegar a ser muy extenso si la salida en el navegador de un ordenador o smartphone también se ve bien y se actualiza automáticamente. Un colega ha desarrollado el bloque de código para el nuevo E-Book sobre Smart-Home Starter Set, que he tenido que adaptar sólo ligeramente. Puede encontrar el código HTML en el sketch completo: Descargar.

 /*
     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;
 }

Nuestra caseta de jardín es de construcción bastante robusta y la puerta está asegurada con una cerradura de seguridad. Por eso no utilicé detectores de movimiento ni otros sensores para prevenir el robo. Sería fácil adaptar el código para esto.

En la segunda parte, me gustaría presentar cómo puedo mostrar los datos enviados no sólo en el navegador del PC o del smartphone, sino también con la ayuda de una Raspberry Pi o un microcontrolador. Esto tiene la ventaja de que incluso puede conectar un zumbador y/o un LED para activar una alarma.

Esp-8266Proyectos para principiantesCasa inteligente

4 comentarios

Andreas Wolter

Andreas Wolter

Norbert Dunker: das zweite Bild ist ein Fritzing Schaltplan und sollte theoretisch direkt nachgebaut werden können.

Norbert Dunker

Norbert Dunker

Mit den Fotos komme ich nicht ganz zurecht gibt es auch eine Schaltung
Danke

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.

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas