Dans notre abri de jardin, on stocke les tondeuses à gazon à essence et les bidons, le barbecue à gaz et quelques bidons de peinture et de diluant nitro. Si des gaz ou des liquides inflammables s'échappent ou même si un incendie se déclare, je veux être alerté. Comme le hangar est toujours à portée de notre WLAN, j'ai donc décidé d'utiliser un D1 Mini (ESP8266) avec un capteur de température DHT22 et un capteur de gaz MQ-2. La transmission des données se fait avec l'ESP comme serveur web.
Matériel requis
numéro | Composant |
---|---|
1 | D1 Mini Nodemcu avec ESP8266-12F WLAN Module |
optionnel | bouclier pour piles au lithium pour mini-D1 |
optionnel | 3.7V batterie au lithium |
1 | DHT22 AM2302 capteur de température et un capteur d'humidité |
1 | MQ-2 Capteur de fumée du détecteur de gaz module de qualité de l'air |
Mini Breadboard, Câble Jumper |
Pour le sketch, j'ai pu faire appel à des éléments de décor d'autres programmes. Le moyen le plus simple est d'interroger le capteur de gaz MQ-2, qui est alimenté par une tension de 5V pour le chauffage interne. En tant que ligne de données, on a le choix entre une sortie numérique et une sortie analogique. Pour les deux options, vous avez besoin d'un diviseur de tension (par exemple 1 kOhm et 2,2 kOhm), car les entrées de l'ESP8266 ne peuvent supporter que 3,3 V. Bien que le petit microcontrôleur ne dispose que d'une seule entrée analogique, j'utilise celle-ci. Car ici, vous pouvez définir la limite avec une certaine valeur dans l'esquisse. Vous pouvez également définir la limite de la sortie numérique à l'aide d'un potentiomètre intégré. Bien que l'état HAUT soit également indiqué par une LED verte, l'étalonnage est difficile en raison du manque de comparaisons. Pour interroger la broche analogique, nous avons seulement besoin :
sensorValue = analogRead(0);
Le DHT22 (AM2302) est un compteur combiné de température et d'humidité de la famille des capteurs à un fil (1 fil). L'alimentation est flexible entre 3 et 6 V, les données sont envoyées sur une broche numérique. Pour interroger les valeurs mesurées, il est conseillé d'utiliser une bibliothèque de programmes, comme le fait si souvent l'équipe d'Adafruit autour de Limor Fried. Nous avons donc besoin de dht pour instancier l'objet :
//D6-GPIO12
// DHT22(AM2302)
DHT dht(DHTPIN, DHTTYPE);
Comme on utilise les valeurs mesurées dans différentes fonctions, on les définit comme une variable globale avant même void setup() :
float t = 0.0;
float h = 0.0;
int sensorValue = 0;
La programmation du serveur web sur l'ESP8266 n'est pas une science secrète. Il existe des exemples dans l'IDE Arduino si vous installez les bibliothèques de programmes suivantes.
Cependant, le sketch peut devenir très étendu si la sortie dans le navigateur du PC ou du smartphone doit également être belle et être mise à jour automatiquement. Un collègue a développé un bloc de code pour le nouvel E-Book sur le Smart Home Starter Set que j'ai seulement dû adapter un peu. Vous pouvez trouver le code HTML dans le sketch complet : (télécharger)
/*
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;
}
Notre abri de jardin est de construction assez robuste et la porte est sécurisée par un verrou de sécurité. C'est pourquoi je n'ai pas utilisé de détecteurs de mouvement ou d'autres capteurs pour prévenir le vol. Il serait facile d'adapter le code pour cela.
Dans la deuxième partie, je voudrais montrer comment je peux afficher les données envoyées non seulement dans le navigateur du PC ou du smartphone, mais aussi à l'aide d'un Raspberry Pi ou d'un micro contrôleur. L'avantage est que vous pouvez même connecter un buzzer et/ou une LED pour déclencher une alarme.
4 commentaires
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.