Le serveur web est programmé pour afficher le mot "Alarme" lorsqu'une température de 50°C ou une concentration de gaz de 100 est dépassée. Mais il faut chercher activement sur la page correspondante pour que tout soit affiché. Cela ne me suffisait pas, je voulais aussi être informé par un signal acoustique et optique. J'ai donc dû évaluer la page web avec un micro contrôleur ou un micro ordinateur, filtrer les valeurs mesurées et déclencher l'alarme avec un buzzer et une LED si nécessaire. Dans la deuxième partie, j'ai présenté une solution avec un Raspberry Pi compatible WLAN et un Display OLED I2C 128 x 64 pixels de 1,3 pouce.
Maintenant je voudrais montrer la configuration avec une carte D1 et un clavier LCD :
Matériel requis pour la première partie :
1 |
||
optionnel |
||
optionnel |
Pile au lithium 3,7V |
|
1 |
||
1 |
Capteur de gaz MQ-2 Module Capteur de fumée et qualité de l'air |
|
Mini Breadboard, câble de liaison |
Matériel requis pour la troisième partie :
1 |
||
1 |
||
alternativement |
||
Mini Breadboard, câble de liaison |
||
Buzzer |
||
LED rouge avec résistance en série de 200 à 330 Ohm |
Le point de départ de nombreux projets est la collection de Sketchs d'exemples, qui s'enrichit à chaque installation de nouveaux microcontrôleurs ou d'une bibliothèque de programmes. J'ai rapidement trouvé les sketches WiFiClient et WiFiClientBasic sous Examples/ESP8266WiFi, qui conviennent en principe pour se connecter à des sites web depuis Internet.
Deux défis (j'ai appris à l'OTAN : " No Problems, only Challenges ") :
Tout d'abord, je ne veux pas aller sur Internet, mais demander une adresse IP dans le WLAN de la maison. Et deuxièmement, je veux sauvegarder le texte HTML transmis dans une variable de type chaîne pour un traitement ultérieur.
Il faut donc étendre et modifier le Sketch WiFiClientBasic. Nous avons besoin des bibliothèques de programmes suivantes pour enregistrer la carte D1 avec le routeur à la maison, puis lire la page HTML du serveur Web dans l'abri de jardin en tant que client Web.
Esp8266wifImulti Wifimulti;
Ensuite, on déclare le SSID et le mot de passe pour l'accès WLAN et on saisit l'adresse IP du serveur web (dans mon cas http://192.168.178.100) et le port pour HTML (80). Vous devez faire vos propres entrées ici.
Ensuite, les variables globales pour les valeurs mesurées sont définies de sorte qu'elles soient disponibles dans toutes les fonctions.
Dans le void setup(), les connexions au moniteur série de l'IDE Arduino et au WLAN local sont établies.
La requête régulière du serveur web est ensuite effectuée avec http.GET() et http.GetString() dans la boucle void(), la page web entière est stockée dans la variable payload.
Après de nombreuses lignes de formatage et le code pour la mise à jour automatique de la page web dans le navigateur, nous trouvons les valeurs mesurées souhaitées pour la température, l'humidité relative du DHT22 et pour la concentration de gaz du MQ-2 à la toute fin. Au début, la seule chose qui aide est "Tabula rasa" = effacer les 721 premiers caractères avec la méthode string StringName.substring(from,to). Dans mon cas, from=722, to est facultatif et peut être omis.
Avec une boucle for, je recherche ensuite les indices des lettres T (pour température), H (pour humidité) et G (pour concentration de gaz) comme valeurs de référence pour la réutilisation de la méthode StringName.substring(from,to). J'ai dû jouer un peu avec les valeurs respectives des paramètres from et to, car la température peut avoir un ou deux chiffres et éventuellement un signe moins, et la valeur de la concentration de gaz peut avoir deux ou trois chiffres. Heureusement, la méthode String.toFloat() est très tolérante et ignore les espaces dans la température et le caractère < à la fin d'une valeur à deux chiffres pour la concentration de gaz.
Voilà, cela affiche les valeurs de température, d'humidité et de concentration de gaz dans le moniteur série. Voici le sketch (partiel) Télécharger
Mais ce n'est que la moitié de la bataille. Nous voulons utiliser la carte D1 sans la connecter au PC et, si nécessaire, déclencher une alarme lorsque les valeurs limites sont dépassées. Nous avons donc besoin d'un petit écran et bien sûr de notre buzzer et éventuellement d'une LED rouge pour l'alarme lorsque les valeurs limites sont dépassées.
En raison de son aspect agréable et pratique, j'utilise le LCD Keypad Shield. Pour plus de détails sur la façon d'utiliser le clavier (c'est-à-dire les boutons), consultez le Blog post "Le nouveau D1 avec ESP8266mod-12F au format Uno". Mais nous n'avons pas besoin des clés ici. Nous n'utilisons que le LCD, qui est connecté aux broches GPIO dans ce cas. Installez et incluez la bibliothèque appropriée (pas I2C) et définissez les broches selon le diagramme de brochage de la carte D1 :
// L'écran LCD n'a pas l'adaptateur i2c, les données sont transmises via les broches D4 à D7
// LCD Pin à Arduino
constant int pin_bl = 15;
constant int pin_en = 2;
constant int pin_rs = 0;
constant int pin_d4 = 4;
constant int pin_d5 = 14;
constant int pin_d6 = 12;
constant int pin_d7 = 13;
Nous utilisons la broche libre D2 = GPIO16 pour le Buzzer et la LED.
Voici le Sketch étendue : (Télécharger)
/*
Cette esquisse Reads le texte HTML A partir de TCP Server dans votre réseau local.
Par Gerald Lechner et Bernd Albrecht AZ-livraison * /
// *** client HTTP
constant Char * SSID = Stasid;
constant Char * le mot de passe = Stapk;
constant Char * url = "Http://192.168.178.100";
constant uint16_t Port = 80;
// L'écran LCD n'a pas l'adaptateur i2c, les données sont transmises via les broches D4 à D7
// LCD Pin à Arduino
constant int pin_bl = 15;
constant int pin_en = 2;
constant int pin_rs = 0;
constant int pin_d4 = 4;
constant int pin_d5 = 14;
constant int pin_d6 = 12;
constant int pin_d7 = 13;
Liquide Crystal LCD( pin_rs, pin_en, pin_d4, pin_d5, pin_d6, pin_d7);
flotter t = 0.0;
flotter H = 0.0;
flotter g = 0.0;
int indice;
int indexh;
int indice;
int avertisseur sonore=16;
Esp8266wifImulti Wifimulti;
annuler d'installation() {
En série.Commencer(115200);
// Initialiser numérique Pin D2 = GPIO16 AS sur SORTIE.
pinMode(avertisseur sonore, SORTIR);
LCD.Commencer(16, 2); // LCD1602 avec 16 caractères et 2 lignes
// On commence par connexion à un réseau Wifi
Wifi.Mode(Wifi_sta);
Wifimulti.ADDAP(SSID, le mot de passe);
En série.println();
En série.println();
En série.imprimer(« Attendez wifi ... »);
Whiler (Wifimulti.Cours() != Wl_connected) {
En série.imprimer(".");
retard(500);
}
En série.imprimeur("");
En série.imprimeur("Wifi connecté");
En série.imprimeur("Adresse IP: ");
En série.imprimeur(Wifi.localip());
retard(500);
}
annuler boucle() {
En série.imprimer("connexion à ");
// série.print (hôte);
En série.imprimer(URL); // neueu
En série.imprimer(':');
En série.imprimeur(Port);
// **** Neue Hauptschleife
si ((Wifimulti.Cours() == Wl_connected)) {
Charmant client;
Httpclient http;
En série.imprimer("[Http] commence ... \ n");
si (http.commencer(client, URL)) { // http "URL" "" ENDERNT
En série.imprimer("[Http] obtenir ... \ n");
// Démarrer la connexion et envoyez une en-tête HTTP
int httpcode = http.AVOIR();
// httpcode sera négatif sur l'erreur
si (httpcode > 0) {
// L'en-tête HTTP a été envoyé et une en-tête de réponse du serveur a été traitée.
En série.printf("[Http] get ... code:% d \ n", httpcode);
// Fichier trouvé sur le serveur
si (httpcode == Http_code_ok || httpcode == Http_code_moved_permanemment) {
Chaîne de caractères charge utile = http.getString();
Chaîne de caractères Charge utile1 = charge utile.sous-chaîne(722);
// série.println (charge utile);
// série.println ();
En série.imprimeur(Charge utile1);
pour (int je=0;je<=Charge utile1.longueur();je++)
{
si (Charge utile1.charret(je) == 'T') index = je;
// série.println (indiquement);
si (Charge utile1.charret(je) == "H") index = je;
// série.println (Indexh);
si (Charge utile1.charret(je) == 'G') index = je;
// série.println (indexg);
}
Chaîne de caractères Ttring = Charge utile1.sous-chaîne(index+12,index-10);
Chaîne de caractères Hstring = Charge utile1.sous-chaîne(index+10,index+12);
Chaîne de caractères Gage = Charge utile1.sous-chaîne(index+18,index+22);
// série.println (charge utile1);
En série.imprimeur(Ttring);
En série.imprimeur(Hstring);
En série.imprimeur(Gage);
t = Ttring.flotter();
h = int(Hstring.flotter());
g = int(Gage.flotter());
En série.imprimeur(t,1);
En série.imprimeur(int(h));
En série.imprimeur(int(g));
LCD.dégager();
LCD.setcursor(0,0); // zählung débutant bei null, Ètal Zeichen, Dann Zeile
LCD.imprimer("t =");
LCD.imprimer(Chaîne de caractères(t));
LCD.imprimer("h =");
LCD.imprimer(Chaîne de caractères(int(h)));
LCD.setcursor(0,1); // 0 = erstes Zeichen, 1 = Zeile Zweite
LCD.imprimer("g =");
LCD.imprimer(Chaîne de caractères(int(g)));
si (t>50.0 || g>100) {
LCD.imprimer("Alarme!");
denadewrite(avertisseur sonore, HAUTE); // Tournez la sonnerie et conduit sur
retard(200); // attendre
denadewrite(avertisseur sonore, MEUGLER); // Tournez la sonnerie et mentionné
retard(100); // attendre
denadewrite(avertisseur sonore, HAUTE); // Tournez la sonnerie et conduit sur
retard(200); // attendre
denadewrite(avertisseur sonore, MEUGLER); // Tournez la sonnerie et mentionné
retard(100); // attendre
}
}
}
autre {
En série.printf("[Http] get ... a échoué, erreur:% s \ n", http.errorostring(httpcode).c_str());
}
http.finir();
} autre {
En série.printf("[Http} Impossible de connecter \ n");
}
}
retard(5000);
}
Dans le blog en trois parties, j'ai montré comment envoyer les données des capteurs via le WLAN de la maison et afficher les valeurs sur le PC, le smartphone, avec Raspberry ou ESP8266 (même tous en même temps) et déclencher une alarme lorsque les valeurs limites sont dépassées. Comme nous l'avons mentionné au début, vous pouvez également ajouter des détecteurs de mouvement et d'autres capteurs comme dispositif antivol. Amusez-vous bien à le construire.
2 commentaires
Andreas Wolter
@jürgen: die multi-Variante lässt die Verwaltung mehrere WiFi-Netzwerke zu. Z.B. wenn Sie den Standort verlassen und sich in ein anderes Netzwerk einloggen möchten. Warum die andere Variante mit inkludiert ist, kann ich nicht genau sagen. Entweder werden beide Bibliotheken zusammen verwendet, da eine auf der anderen aufsetzt, oder es ist ein Überbleibsel aus der Entwicklung des Sketches. Probieren Sie es einmal aus, indem Sie die andere Variante auskommentieren.
Grüße,
Andreas Wolter
AZ-Delivery Blog
jürgen
Warum wird hier #include und nicht nur #include benutzt? Warum werden beide Versionen eingeschlossen? Welchen Vorteil bringt in diesem Beispiel die Multi-Varinate??