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:
//D6-GPIO12
// 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.
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*/
//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;
}
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.
4 comentarios
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.