Jardin arômatique d'intérieur
Jardin arômatique d'intérieur
Dans le cadre du projet Family Connection 2021, accompagné par le centre ressource Zoomacom, un groupe de jeunes de saint Jean Bonnefond a souhaité confectionner un jardin d'intérieur pour plantes aromatiques. Ils souhaitent qu'une carte Arduino gère le déclenchement automatique de l'arrosage et de la lumière de croissance des plantes.Voici le projet Herb Box qu'ils ont voulu confectionner avec l'appui d'OpenFactory.
La première étape sera de réaliser un sytème d'arrosage automatique sans le site internet et l'API. Nous proposerons une alternative qui permet de réduire le cout de l'électronique et de simplifier la connexion via wifi en utilisant un nodeMCU plutot qu'une carte arduino et un ESP01 (pour lequel il faut un convertisseur de tension à 3,3V en plus).
Dans un second temps, si nous disposons de suffisament de temps, on essayera d'utiliser Thingspeak qui est une alternative à AWS Lambda d'Amazon pour pouvoir visualiser les données en ligne.
En effectuant un peu de veille sur les projets de jardin d'intérieur permettant de réaliser un arrosage automatique des plantes, j'ai découvert le projet ArduFarmBot2 (version francaise).
Pour réaliser le projet dans le cadre de Family Connection, nous allons faire au niveau de l'électronique un mixte entre ces deux projets. En gardant les meilleurs aspects de chaque projet (projet et outils open source, qualité des composants utilisés...).
Le matériel nécessaire
- Un nodeMCU
- Un shield Arduino à 4 relais référence A000110
- Deux pompes doseuses péristaltique 12V référence D4
- .... ( à finaliser une fois le prototype électronique monté et testé)
La programmation Arduino
Librairie à installer pour l'ecran OLED :
ACROBOTIC_SSD1306et/ou
AI_ArduLib_SSD1306 via son fichier zip sur github
Penser à redémarrer l'IDE après l'ajout d'une librairie et de modifier l'include avec <ACROBOTIC_SSD1306.h> et non comme ecrit dans l'exemple "src/ACROBOTIC_SSD1306.h"
Librairie pour le DHT 11
le fichier github d'Adafruit pour les capteurs DHT/Lors de l'installation de la librairier via l'IDE, DHT Adafruit, il faut répondre installer toutes les librairies.
Il faut egalement installer la librairie Adafruit Unified Sensor
Librairie pour DS18B20
Pour utiliser ce capteur vous devez installer ses deux librairies :Vous trouverez le fichier zip de la librairie Onewire
Il faut ensuite installer la librairie Dallas Température
Librairie SimpleTimer
Avant de passer au test en mode Controle Local, penser à installer la librairie Simple TimerLibrairie Blynk
Si on veut utiliser l'application Blynk pour controler l'arrosage et visualiser les données à distances, il faut :- télécharger l'application Blynk sur son smartphone
- installer les librairies Blynk dans son IDE Arduino
- Redémarrer l'IDE Arduino
Quelques Debugs
- Resource trouvée sur Reddit pour ce débug
/home/mike/.arduino15/packages/esp8266/hardware/esp8266/2.7.4/libraries/ESP8266WiFi/src/CertStoreBearSSL.cpp:25:31: error: 'DEBUG_ESP_PORT' was not declared in this scope
- #define DEBUG_BSSL(fmt, ...)
- Pour la résoudre :
- Outils> Débogage est défini sur "Désactivé". Pour résoudre ce problème, vous devez soit définir Outils> Port de débogage sur autre chose que "Désactivé", ou définir Outils> Niveau de débogage sur "Aucun". J'ai sélectionné aucun débug pour que cela fonctionne ! J'ai également testé l'autre et cela téléversait également mon code.
- J'ai également eu des conflits avec des doublons dans mes librairies du coup le code ne pouvait pas utiliser certaines variables déclarées (j'ai retiré les librairies suivantes : "Adafruit Sensor Master", "DHT-sensor-library-master" et "ACROBOTIC_SSD1306")
- Penser à modifier la valeur du capteur DHT dans stationDefines.h car j'utilises un DHT11 et dans l'exemple ils utilisent un DHT22
Les ressources utilisées
- le projet Water Plants System sur hackster.io
- une version francaise du projet avec plus de schéma sur genio.cc
- se connecter au wifi avec un nodeMCU
- le projet sur instructables.com
Ce contenu de Zoomacom est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.
Enceintes WiFilles
Enceintes WiFilles
Wi-Filles est un programme de sensibilisation des jeunes filles aux métiers et aux compétences du numérique. Les jeunes volontaires suivent des ateliers pendant plusieurs mois, les mercredis après-midi, et pendant les vacances scolaires, en partenariat avec de nombreux·euses professionnel·le·s du numérique. Plus d'infos: Avec la promo 2021 des Wi-Filles de la Loire (article sur le blog de Zoomacom)Un des deux groupes, accompagné au FabLab par Zoomacom en 2021, a choisi de créer une enceinte mp3 (fichiers sur carte SD, pilotable en wifi depuis un smartphone).
Schéma du montage
Valeurs des composants :
- Résistance : 220Ω
- Condensateur : 1000µF
- Haut parleur : 4Ω 3W
Matériel
Nom | Description | Quantité | Prix unitaire | Prix |
Lolin NodeMCU v3 | Microcontrolleur | 1 | 7€ | 7€ |
DFPlayer Mini | Lecteur MP3 | 1 | 1€ | 1€ |
Enceinte 4Ω 3W | Sortie sonore | 1 | 2€ | 2€ |
Ampli Audio | Amplification du signal sonore | 1 | 0.5€ | 0.5€ |
Connecteur micro USB | Pour l'alimentation | 1 | 0.2€ | 0.2€ |
Chargeur de batterie Li-Ion | Charge de la batterie du système | 1 | 0.2€ | 0.2€ |
Batterie Li-Ion 3.7V 18650 | Alimentation nomade | 1 | 2.5€ | 2.5€ |
LED RGB | Voyant lumineux | 1 | 0.03€ | 0.03€ |
Interrupeur | Marche/Arret du système | 1 | 0.75€ | 0.75€ |
Convertisseur de tension 3.3V | Alimentation des cartes électroniques | 1 | 1€ | 1€ |
Support batterie 18650 | Support batterie | 1 | 0.5€ | 0.5€ |
Condensateur 1000µF | Filtrage de l'alimentation | 1 | 0.07€ | 0.07€ |
Résistance 220Ω | Protection de la LED | 1 | 0.02€ | 0.02€ |
Total | 15.77€ |
Programme Arduino
Paramètrage de la carte :
- Ajouter la bibliothèque des cartes ESP8266 board dans Arduino IDE (http://arduino.esp8266.com/stable/package_esp8266com_index.json)- Installer le paquet "esp8266 by ESP8266 Community" via le gestionnaire de cartes
- Utiliser la carte nommée "NodeMCU 1.0 (ESP-12E Module)" pendant l'envoi du code
Bibliothèque(s) à installer :
- DFPlayerMini_Fast : Disponible dans le gestionnaire de bibliothèques Arduino ou ICI
Code :
Cliquer pour afficher
#include <DFPlayerMini_Fast.h> #include <ESP8266WiFi.h> #include <SoftwareSerial.h> #define SSID "EnceinteWiFille1" #define PASSWD "wifilles" DFPlayerMini_Fast mp3Player; SoftwareSerial softSerial(D2,D3); WiFiServer server(80); #define Pin_R D7 #define Pin_G D6 #define Pin_B D5 int vol, song, R, G, B; void setup() { // Init serial lines Serial.begin(115200); softSerial.begin(9600); delay(10); WiFi.mode(WIFI_AP); WiFi.softAP(SSID, PASSWD); // Print IP address Serial.print("IP address : "); Serial.println(WiFi.softAPIP()); // Start web server server.begin(); // Start mp3 player mp3Player.begin(softSerial); vol = mp3Player.currentVolume(); song = mp3Player.currentSdTrack(); R = 1023; G = 0; B = 1023; analogWrite(Pin_R, R); analogWrite(Pin_G, G); analogWrite(Pin_B, B); } void loop() { // Init connection with client WiFiClient client = server.available(); if(!client) { return; } while(!client.available()) { delay(1); } // Read client request String req = client.readStringUntil('\r'); // Flush output client.flush(); String text = ""; // Return text if(req.indexOf("/volume") != -1) { uint8_t idx = req.indexOf("?vol="); vol = req.substring(idx+5).toInt(); vol = map(vol, 0, 100, 0, 30); mp3Player.volume(vol); } else if(req.indexOf("/play") != -1) { mp3Player.resume(); } else if(req.indexOf("/pause") != -1) { mp3Player.pause(); } else if(req.indexOf("/next") != -1) { mp3Player.playNext(); } else if(req.indexOf("/previous") != -1) { mp3Player.playPrevious(); } else if(req.indexOf("/change") != -1) { uint8_t idx = req.indexOf("?song="); song = req.substring(idx+6).toInt(); mp3Player.play(song); } else if(req.indexOf("/led") != -1) { uint8_t idx = req.indexOf("?R="); uint8_t idxFin = req.indexOf("&G="); R = req.substring(idx+3, idxFin).toInt(); idx = idxFin; idxFin = req.indexOf("&B="); G = req.substring(idx+3, idxFin).toInt(); idx = idxFin; B = req.substring(idx+3).toInt(); R = map(R, 100, 0, 0, 1023); G = map(G, 100, 0, 0, 1023); B = map(B, 100, 0, 0, 1023); analogWrite(Pin_R, R); analogWrite(Pin_G, G); analogWrite(Pin_B, B); } // Flush output client.flush(); // Generate HTML output String htmlPage = "HTTP/1.1 200 OK\r\n"; htmlPage += "Content-Type: text/html\r\n"; htmlPage += "\r\n"; htmlPage += "<!DOCTYPE html>\r\n"; htmlPage += "<html>\r\n"; htmlPage += " <head>\r\n"; htmlPage += " <meta charset=\"utf-8\" />\r\n"; htmlPage += " <title>Enceinte Wi-Fille</title>\r\n"; htmlPage += " <style type=\"text/css\">\r\n"; htmlPage += " body {\r\n"; htmlPage += " background-color: #c862b7;\r\n"; htmlPage += " }\r\n"; htmlPage += " svg {\r\n"; htmlPage += " border-radius: 20px;\r\n"; htmlPage += " }\r\n"; htmlPage += " </style>\r\n"; htmlPage += " </head>\r\n"; htmlPage += " <body>\r\n"; htmlPage += "<svg width=\"320\" height=\"118\" version=\"1.1\" viewBox=\"0 0 320 118\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"> <metadata> <rdf:RDF> <cc:Work rdf:about=\"\"> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/> <dc:title/> </cc:Work> </rdf:RDF> </metadata> <path d=\"m0 59v-59h320v118h-320zm169.72 53.423c9.4306-1.948 19.247-6.7898 25.909-12.78l5.0577-4.5473 45.406-0.2979c43.887-0.28793 45.557-0.36897 49.906-2.4221 6.0327-2.8476 10.799-7.7582 13.748-14.164 2.2926-4.9806 2.4145-6.1452 2.0934-20-0.32307-13.94-0.48502-14.957-3.09-19.388-1.512-2.572-4.4118-6.047-6.444-7.7221-7.2739-5.9957-8.2444-6.0995-57.235-6.1216l-44.572-0.020094-4.4084-4.4393c-2.4246-2.4416-7.421-6.0224-11.103-7.9572-20.944-11.006-46.616-7.8537-64.671 7.9405l-5.1398 4.4962h-44.411c-49.825 0-50.117 0.035437-58.072 7.0374-2.6181 2.3045-5.3152 5.9773-6.6245 9.0207-2.0157 4.6857-2.1805 6.4625-1.8894 20.371 0.31324 14.963 0.3737 15.327 3.3481 20.154 3.6638 5.9466 10.635 10.857 17.504 12.33 3.2034 0.68701 20.969 1.0864 48.329 1.0864h43.264l2.9371 3.1294c6.3215 6.7354 18.703 13.092 28.778 14.775 8.0268 1.3408 13.11 1.2263 21.38-0.48178zm-90.721-23.349c0-0.53382 1.0838-2.14 2.4085-3.5694 5.0877-5.4898 6.0233-9.0351 6.5985-25.004 0.46364-12.873 0.85177-15.589 2.7376-19.153 2.6923-5.0887 8.0945-9.6823 13.178-11.205 5.1669-1.548 181.84-1.6134 187.4-0.06931 4.8812 1.3554 11.471 7.2841 13.814 12.428 2.4581 5.3972 2.667 27.646 0.31261 33.282-1.97 4.7161-5.8422 8.8049-10.947 11.559l-4 2.1584-105.75 0.2721c-67.883 0.17467-105.75-0.075439-105.75-0.69848zm31-18.574v-5.5h19l2e-3 -7.5h-18.503l-0.615-8.5h21.115v-8.0521l-30.499 0.55209-0.27361 17.25-0.27362 17.25h10.047zm36-7v-12.5h-9v25h9zm133.92 11.524c6.9012-1.9793 10.487-8.2212 8.0717-14.052-1.2208-2.9472-6.5578-6.1743-12.488-7.5513-4.3308-1.0056-5.7963-2.3588-4.3899-4.0535 1.6689-2.0109 4.6604-1.6647 5.9178 0.68489 0.90994 1.7002 1.9022 2.0004 5.7852 1.75 4.0505-0.26118 4.6429-0.57377 4.3627-2.3022-0.58424-3.6046-4.627-6.6838-9.4957-7.2326-10.142-1.1432-16.68 2.4755-16.68 9.2326 0 4.7672 3.1591 7.8229 10.205 9.8712 6.5521 1.9048 8.6826 3.8543 6.753 6.1793-1.8258 2.2-6.2483 1.4274-7.4452-1.3006-0.81769-1.8638-1.776-2.25-5.5833-2.25-2.5279 0-4.8595 0.26326-5.1812 0.58501-0.92461 0.92461 1.1901 6.0493 3.2747 7.9358 3.342 3.0245 11.079 4.1708 16.894 2.503zm-95.106-3.7739-0.31037-3.75-15.5-0.58413v-24.916h-10v33h26.121zm33.19-0.25v-4h-14.938l-0.56156-24.5h-10l-0.54954 32.5h26.05zm35 0.5v-3.5h-17v-7h15v-6h-7.5c-7.3333 0-7.5-0.05556-7.5-2.5 0-2.4583 0.13333-2.5 8-2.5h8v-8.058l-26.5 0.55805-0.54954 32.5h28.05zm-108.58-25.107c2.2726-0.87207 1.9709-5.1144-0.45598-6.4132-4.0395-2.1619-8.9458 1.3138-6.9964 4.9563 1.096 2.0479 4.2868 2.6717 7.4524 1.4569zm-120.34 25.857c-1.7808-6.6649-7.0751-29.349-7.0751-30.314 0-0.51496 2.1884-0.93629 4.8631-0.93629h4.8631l2.8704 20.5 3.7258-20.596 9.1775 0.59641 3.9499 20 2.8238-20.5h4.8631c2.6747 0 4.8631 0.42454 4.8631 0.94342 0 0.51888-1.5676 7.3814-3.4837 15.25-1.916 7.8686-3.7246 15.319-4.0191 16.557-0.45511 1.9126-1.1972 2.25-4.949 2.25-4.9099 0-4.7104 0.29064-6.5188-9.5-2.0481-11.088-2.2655-11.542-3.0813-6.4359-0.40106 2.5103-1.2604 7.1228-1.9096 10.25l-1.1804 5.6859h-4.3906c-4.2287 0-4.4275-0.13821-5.3925-3.75zm39.925-8.75v-12.5h9v25h-9zm0.65499-17.329c-2.0662-2.2831-2.0858-3.5976-0.08356-5.5998 2.155-2.155 5.7566-1.9714 7.9054 0.40295 1.6732 1.8489 1.6816 2.1349 0.13194 4.5-1.964 2.9975-5.5847 3.3147-7.9538 0.69688z\" fill=\"#fcfcfc\"/> <path d=\"m100.23 58.75 0.27361-17.25 30.5-0.55209v8.0521h-21.115l0.615 8.5h18.503l-1e-3 3.75-0.0019 3.75h-19v11h-10.047zm36.774 4.75v-12.5h9v25h-9zm131.21 11.516c-4.0567-0.96115-6.7743-3.3296-8.0634-7.0276-1.2556-3.6018-0.79233-3.9879 4.7839-3.9879 3.8073 0 4.7656 0.3862 5.5833 2.25 1.1968 2.728 5.6194 3.5005 7.4452 1.3006 1.9296-2.3251-0.20086-4.2746-6.753-6.1793-7.046-2.0483-10.205-5.104-10.205-9.8712 0-6.7571 6.5377-10.376 16.68-9.2326 4.8687 0.54877 8.9114 3.628 9.4957 7.2326 0.28016 1.7284-0.3122 2.041-4.3627 2.3022-3.883 0.25038-4.8752-0.04978-5.7852-1.75-1.2575-2.3496-4.2489-2.6958-5.9178-0.68489-1.4064 1.6947 0.0591 3.0479 4.3899 4.0535 9.5575 2.2191 14.403 7.1927 13.042 13.388-1.553 7.0707-10.273 10.591-20.333 8.2072zm-109.21-16.516v-16.5h10v24.916l15.5 0.58413 0.31037 3.75 0.31036 3.75h-26.121zm33.225 0.25 0.27477-16.25h10l0.56156 24.5h14.938v8h-26.05zm33 0 0.27477-16.25 26.5-0.55805v8.058h-8c-7.8667 0-8 0.04167-8 2.5 0 2.4444 0.16667 2.5 7.5 2.5h7.5v6h-15v7h17v7h-28.05zm-88.259-13.814c-1.9494-3.6425 2.957-7.1182 6.9964-4.9563 2.4269 1.2989 2.7286 5.5412 0.45598 6.4132-3.1656 1.2148-6.3564 0.59098-7.4524-1.4569z\" fill=\"#9fb747\"/> <path d=\"m151 113.34c-10.6-1.6424-22.168-6.9883-29.62-13.689l-5.0487-4.5392-91.831-0.61211-5.7079-2.803c-5.9919-2.9424-10.763-7.9897-13.306-14.077-1.081-2.5872-1.4832-7.4472-1.4761-17.838 0.0088155-12.888 0.23954-14.776 2.3639-19.338 1.2948-2.7806 4.2679-6.6937 6.6068-8.6957 7.8301-6.7023 8.2288-6.7487 58.024-6.7487h44.649l4.8914-4.4908c20.621-18.932 54.349-19.239 74.595-0.67957l5.6402 5.1703h44.432c48.845 0 49.819 0.10413 57.095 6.1015 2.0322 1.6751 4.932 5.1501 6.444 7.7221 2.5938 4.4124 2.7685 5.4868 3.095 19.031 0.40389 16.757-0.63904 20.783-7.2518 27.992-8.0707 8.7986-6.8498 8.6117-58.51 8.9604l-45.416 0.30658-4.9392 4.4408c-11.267 10.13-30.356 16.013-44.729 13.786zm139.5-24.444c5.5089-1.3872 12.21-7.0453 14.615-12.34 2.6571-5.8498 2.6705-28.237 0.0205-34.056-2.3427-5.1438-8.9323-11.072-13.814-12.428-5.3055-1.4733-182.34-1.4733-187.64 0-4.688 1.3018-10.843 6.7061-13.326 11.701-1.4586 2.9338-1.9675 6.9175-2.392 18.727-0.45727 12.721-0.86394 15.618-2.6769 19.067-1.1758 2.2368-2.8702 4.6748-3.7654 5.4178-0.89523 0.74297-2.0689 2.1754-2.6083 3.1831-0.94777 1.7709 2.5061 1.8322 103.11 1.8322 72.617 0 105.42-0.33382 108.48-1.104zm-255.53-18.146c0.62214-2.8875 1.3991-7.1879 1.7265-9.5564 0.78681-5.6912 1.7256-4.3186 3.2875 4.8064 1.7438 10.188 1.6207 10 6.5601 10 3.2493 0 4.4587-0.43544 4.8602-1.75 0.94742-3.1012 7.6002-31.418 7.6002-32.35 0-0.49526-2.25-0.90046-5-0.90046-4.0791 0-5.0078 0.32232-5.0424 1.75-0.02331 0.9625-0.60572 5.5566-1.2942 10.209l-1.2519 8.459-3.7463-20.418h-9.3304l-3.7463 20.418-1.2519-8.459c-0.68853-4.6525-1.2709-9.2465-1.2942-10.209-0.03457-1.4277-0.96328-1.75-5.0424-1.75-2.9032 0-5 0.45139-5 1.0764 0 1.0194 6.6907 30.02 7.5381 32.674 0.24042 0.75285 2.1684 1.25 4.8477 1.25h4.4485zm38.035-7.25v-12.5h-9v25h9zm-0.56486-17.428c3.3884-3.7442-0.44315-8.0394-5.9407-6.6596-5.0433 1.2658-3.3334 8.588 2.0055 8.588 1.2045 0 2.9753-0.86775 3.9351-1.9283z\" fill=\"#88307a\"/> </svg>"; htmlPage += " <h1>Choix de musique</h1>\r\n"; htmlPage += " <form method=\"get\" action=\"change\">\r\n"; htmlPage += " <input type=\"number\" min=\"1\" max=\"256\" value=\"" + String(song) + "\" name=\"song\"/>\r\n"; htmlPage += " <input type=\"submit\" value=\"Jouer\" />\r\n"; htmlPage += " </form>\r\n"; htmlPage += " <h1>Reglage du volume</h1>\r\n"; htmlPage += " <form method=\"get\" action=\"volume\">\r\n"; htmlPage += " <input type=\"number\" min=\"0\" max=\"100\" value=\"" + String(map(vol, 0, 30, 0, 100)) + "\" name=\"vol\"/>\r\n"; htmlPage += " <input type=\"submit\" value=\"Changer le volume\"/>\r\n"; htmlPage += " </form>\r\n"; htmlPage += " <h1>Gestion de la lecture</h1>\r\n"; htmlPage += " <div style=\"display: flex;\">\r\n"; htmlPage += " <form action=\"previous\"><input type=\"submit\" value=\"Précédent\"/></form>\r\n"; htmlPage += " <form action=\"play\"><input type=\"submit\" value=\"Jouer\"/></form>\r\n"; htmlPage += " <form action=\"pause\"><input type=\"submit\" value=\"Stopper\"/></form>\r\n"; htmlPage += " <form action=\"next\"><input type=\"submit\" value=\"Suivant\"/></form>\r\n"; htmlPage += " </div>\r\n"; htmlPage += " <h1>Couleur LED (Rouge, Vert, Bleu)</h1>\r\n"; htmlPage += " <form method=\"get\" action=\"led\">\r\n"; htmlPage += " <input type=\"number\" min=\"0\" max=\"100\" value=\"" + String(map(R, 1023, 0, 0, 100)) + "\" name=\"R\"/>\r\n"; htmlPage += " <input type=\"number\" min=\"0\" max=\"100\" value=\"" + String(map(G, 1023, 0, 0, 100)) + "\" name=\"G\"/>\r\n"; htmlPage += " <input type=\"number\" min=\"0\" max=\"100\" value=\"" + String(map(B, 1023, 0, 0, 100)) + "\" name=\"B\"/>\r\n"; htmlPage += " <input type=\"submit\" value=\"Changer\" />\r\n"; htmlPage += " </form>\r\n"; htmlPage += " </body>\r\n"; htmlPage += "</html>\r\n"; // Send html output to client client.println(htmlPage); delay(1); }
Connexion à l'enceinte
Cliquer pour afficher
1. Se connecter au WiFi de l'enceinte
Le nom du WiFi est EnceinteWiFilleX (où X est le numéro de l'enceinte)
Le mot de passe du WiFi est wifilles
(Si il y a un message indiquant qu'il n'y a pas d'accès internet, c'est normal, il faut lui dire de rester connecté)
2. Ouvrir un navigateur web (Firefox, Chrome ou autre)
3. Entrer l'URL 192.168.4.1 et charger la page
Le nom du WiFi est EnceinteWiFilleX (où X est le numéro de l'enceinte)
Le mot de passe du WiFi est wifilles
(Si il y a un message indiquant qu'il n'y a pas d'accès internet, c'est normal, il faut lui dire de rester connecté)
2. Ouvrir un navigateur web (Firefox, Chrome ou autre)
3. Entrer l'URL 192.168.4.1 et charger la page
Ce contenu de Zoomacom est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.
HerbBox 2.0
HerbBox 2.0
HerbBox est un système automatique permettant de contrôler la temperature et l'humidité de 3 plantes.Ce système utilise deux microcontrolleurs discutant ensemble, un Arduino Nano et un NodeMCU v3. (Cela est dû au fait que nous les avions en stock, cette solution était donc plus pratique pour nous que d'acheter un microcontrolleur plus gros).
Cette documentation est une traduction de celle disponible avec le code source du projet, elle fait par ailleurs référence au code du projet à plusieurs endroits. Code disponible ICI
Contexte
Dans le cadre du projet Family Connection 2021, accompagné par le centre ressource Zoomacom, un groupe de jeunes de saint Jean Bonnefond a souhaité confectionner un jardin d'intérieur pour plantes aromatiques. Ils souhaitent qu'une carte Arduino gère le déclenchement automatique de l'arrosage et de la lumière de croissance des plantes. La première version du projet est documentée ici: HerbBoxSchematiques
Diagramme de principe
Schéma électronique
Liste du matériel
Nom | Description | Quantité | Prix Unitaire | Prix |
Lolin NodeMCU v3 | Microcontrolleur principal | 1 | 7€ | 7€ |
Arduino Nano | Microcontrolleur secondaire | 1 | 5€ | 5€ |
Arduino relay shield | Carte 4 relais | 1 | 20€ | 20€ |
DHT11 | Capteur de temperature et d'humidité | 1 | 3€ | 3€ |
DS18B20 | Capteur de temperature | 3 | 4€ | 12€ |
Capacitive moisture sensor v1.2 | Capteur d'humidité du sol | 3 | 3€ | 9€ |
SSD1306 | Ecran OLED 128x64 i2c | 1 | 2€ | 2€ |
Bouton poussoir | Pour le contrôle manuel | 3 | 1€ | 3€ |
Résistance 220 Ω | Pour le diviseur de tension | 1 | 0.1€ | 0.1€ |
Résistance 430 Ω | Pour le diviseur de tension | 1 | 0.1€ | 0.1€ |
Résistance 4.7 kΩ | Pour le bus OneWire | 1 | 0.1€ | 0.1€ |
Pompe 12V | Pompe utilisée pour arroser les plantes | 3 | 10€ | 30€ |
Lampe 220V pour la pousse des plantes | Lampe utilisée pour illuminer les plantes (Emet uniquement dans les spectres bleu et rouge) | 1 | 5€ | 5€ |
Total | ~96€ |
Note : Les prix sont des approximations de ce que vous pouvez trouver facilement en ligne, vous pouvez trouver ces composants pour un prix plus faible ou plus élevé en fonction des fournisseurs. Ils sont seulement ici pour vous donner une idée du prix du projet.
Note 2 : L'Arduino relay shield peut être remplacé par une autre carte de relais ou 4 relais séparés ce qui coutera sans doute moins cher.
NodeMCU
Paramètrage de la carte
- Ajouter la bibliothèque des cartes ESP8266 board dans Arduino IDE (http://arduino.esp8266.com/stable/package_esp8266com_index.json)- Installer le paquet "esp8266 by ESP8266 Community" via le gestionnaire de cartes
- Utiliser la carte nommée "NodeMCU 1.0 (ESP-12E Module)" pendant l'envoi du code
Bibliothèques arduino requises
- DallasTemperature (Version installable via Arduino IDE)- OneWire (Version installable via Arduino IDE)
- SimpleTimer (Cette version particulière est nécessaire : https://github.com/schinken/SimpleTimer)
Capteurs / Actionneurs reliés à la carte
- 3x DS18B20- 3x Capacitive Soil Moisture Sensor v1.2
- 4x Relais
Arduino Nano
Paramètrage de la carte
- Utiliser la carte nommée "Arduino Nano" pendant l'envoi du codeBibliothèques arduino requises
- ACROBOTIC SSD1306 (Version installable via Arduino IDE)- Blynk (Version installable via Arduino IDE)
- DHT sensor library (Version installable via Arduino IDE)
- SimpleTimer (Cette version particulière est nécessaire : https://github.com/schinken/SimpleTimer)
Capteurs / Actionneurs reliés à la carte
- DHT11- 3x bouton poussoir
- Écran OLED SSD1306
Blynk
Nous utilisons une application nommée Blynk pour afficher les valeurs des capteurs sur un smartphone.Configuration de l'application
Pour connecter le NodeMCU à l'application Blynk, vous devrez générer un token dans l'application et le copier dans la constante BLYNK_TOKEN dans le fichier src/NodeMCU/constants.h . Vous devrez également connecter le NodeMCU à une connection WiFi via les constantes WIFI_SSID (Nom du WiFi) et WIFI_PASSWD (Mot de passe du WiFi).Interface exposée
Le NodeMCU envoie les valeurs à Blynk sur les lignes virtuelles suivantes :- V10 : Température de l'air
- V11 : Humidité de l'air
- V12 : Température du sol de la plante 1
- V13 : Humidité du sol de la plante 1
- V14 : Temperature du sol de la plante 2
- V15 : Humidité du sol de la plante 2
- V16 : Température du sol de la plante 3
- V17 : Humidité du sol de la plante 3
Il contrôle également 4 LEDs pour refleter les états des relais :
- V0 : Pompe 1
- V1 : Pompe 2
- V2 : Pompe 3
- V3 : Lampe
Exemple de configuration
Voici comment nous avons configuré Blynk. En haut, nous avons deux "Value Display" affichant les valeurs des capteurs de l'air, au milieu, nous avons six "Value Display" pour afficher les valeurs des capteurs des plantes et en bas, nous avons 4 "LED" pour afficher les états des pompes et de la lampe.Contrôle manuel
Écran
L'écran OLED est utilisé pour afficher les valeurs des capteurs des trois plantes.L'écran à 4 états différents (éteins, plante 1, plante 2 et plante 3).
Dans chaque état "plante", vous trouverez les valeurs suivantes :
- Numéro de la plante
- Température de l'air (Commune à toutes les plantes)
- Humidité de l'air (Commune à toutes les plantes)
- Temperature du sol (Spécifique à chaque plante)
- Humidité du sol (Spécifique à chaque plante)
- État de la pompe (Spécifique à chaque plante)
- État de la lampe (Commune à chaque plante)
Bouttons
Le système comporte 3 boutons :- Bouton "capteurs" (Pin D6) : Utilisé pour changer l'état de l'écran (éteins -> plante 1 -> plante 2 -> plante 3 -> éteins -> ...)
- Bouton "pompe" (Pin D4) : Change l'état de la pompe de la plante courante
- Bouton "lampe" (Pin D5) : Change l'état de la lampe
Paramètres de contrôle automatique
Tout les paramètres de contrôle automatique sont stockés dans le fichier src/NodeMCU/constants.h . Cela signifie que le programme du NodeMCU doit être réuploadé quand vous voulez faire des changements dans les paramètres.Paramètres du sol
- PLANT1_DRY_SOIL: Valeur de l'humidité du sol en dessous de laquelle le sol est considéré sec. Valeur entre 0% et 100% (Défaut : 66).- PLANT1_WET_SOIL: Valeur de l'humidité du sol au dessus de laquelle le sol est considéré humide. Valeur entre 0% et 100% (Défaut : 85).
- PLANT1_TIME_PUMP_ON: Durée pendant laquelle la pompe sera active pour arroser la plante si le sol est sec. Valeur en ms avec un L à la fin (Défaut : 15000L).
Pour les plantes 2 et 3, utilisez les paramètres avec un 2 ou un 3 à la place du 1.
Paramètres de l'air
- COLD_TEMP: Valeur de la temperature de l'air en dessous de laquelle l'air est considéré froid. Valeur en degré Celsius (Défaut : 12).- HOT_TEMP: Valeur de la temperature de l'air au dessus de laquelle l'air est considéré chaud. Valeur en degré Celsius (Défaut : 22).
- TIME_LAMP_ON: Durée pendant laquelle la lampe sera active pour réchauffer les plantes si la température est froide. Valeur en ms avec un L à la fin (Défaut : 15000L).
Comment le construire
Instructions de construction
La manière la plus simple de construire le système est d'ajouter les différents composants un par un jusqu'à ce que tout soit connecté. Nous allons d'abord nous concentrer sur l'Arduino Nano puis sur le NodeMCU.
Chaque partie ajoute un nouveau composant mais même si les composants déjà placés n'apparaissent pas sur le dessin, vous n'avez pas besoin de les enlever.
Puis testez les capteurs avec le code présent dans le dossier src/Tests/ArduinoNano/DS18B20s et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Sensor 1: 22.1 C
Sensor 2: 22.2 C
Sensor 3: 22.1 C
Puis testez les capteurs avec le code présent dans le dossier src/Tests/ArduinoNano/SoilMoistureSensors et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Sensor 1: 65.2%
Sensor 2: 65.3%
Sensor 3: 65.3%
Puis testez les relais avec le code présent dans le dossier src/Tests/ArduinoNano/Relays.
Les relais vont être alimentés un par un pendant une seconde puis attendre 2 secondes avant de recommencer.
Puis testez le capteur avec le code présent dans le dossier src/Tests/NodeMCU/DHT11 et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Temperature : 22.1 C
Humidity : 65.1%
Puis testez les boutons avec le code présent dans le dossier src/Tests/NodeMCU/Buttons et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M) en appuyant dessus.
Vous devriez avoir quelque chose comme ça (en fonction des boutons appuyés):
Lamp button : 1
Pump button : 0
Sensors button : 1
Puis testez les boutons avec le code présent dans le dossier src/Tests/NodeMCU/OLED et du texte devrait apparaitre à l'écran pendant 5s puis un nombre se mettra à jour rapidement.
Attention : Ne connectez pas de cable USB à l'Arduino Nano, tout est alimenté par le NodeMCU !
Quelques secondes après avoir alimenté le système complet, vous devriez obtenir les valeurs de tous les capteurs sur l'écran (appuyez sur le bouton "capteurs" pour naviguer dans les menus) et le système de contrôle automatique devrait démarrer également.
Chaque partie ajoute un nouveau composant mais même si les composants déjà placés n'apparaissent pas sur le dessin, vous n'avez pas besoin de les enlever.
Arduino Nano
DS18B20s
D'abord, connectez les trois capteurs et la résistance à l'Arduino Nano comme montré sur le dessin :Puis testez les capteurs avec le code présent dans le dossier src/Tests/ArduinoNano/DS18B20s et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Sensor 1: 22.1 C
Sensor 2: 22.2 C
Sensor 3: 22.1 C
Capacitive Soil Moisture Sensors
D'abord, connectez les trois capteurs à l'Arduino Nano comme montré sur le dessin :Puis testez les capteurs avec le code présent dans le dossier src/Tests/ArduinoNano/SoilMoistureSensors et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Sensor 1: 65.2%
Sensor 2: 65.3%
Sensor 3: 65.3%
Relays
D'abord, connectez les quatre relais à l'Arduino Nano comme montré sur le dessin :Puis testez les relais avec le code présent dans le dossier src/Tests/ArduinoNano/Relays.
Les relais vont être alimentés un par un pendant une seconde puis attendre 2 secondes avant de recommencer.
NodeMCU
DHT11
D'abord, connectez le capteur au NodeMCU comme montré sur le dessin :Puis testez le capteur avec le code présent dans le dossier src/Tests/NodeMCU/DHT11 et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M).
Vous devriez avoir quelque chose comme ça :
Temperature : 22.1 C
Humidity : 65.1%
Push Buttons
D'abord, connectez les trois boutons au NodeMCU comme montré sur le dessin :Puis testez les boutons avec le code présent dans le dossier src/Tests/NodeMCU/Buttons et regardez les valeurs affichées sur le moniteur Série (Ctrl+Shift+M) en appuyant dessus.
Vous devriez avoir quelque chose comme ça (en fonction des boutons appuyés):
Lamp button : 1
Pump button : 0
Sensors button : 1
SSD1306 OLED Display
D'abord, connectez l'écran au NodeMCU comme montré sur le dessin :Puis testez les boutons avec le code présent dans le dossier src/Tests/NodeMCU/OLED et du texte devrait apparaitre à l'écran pendant 5s puis un nombre se mettra à jour rapidement.
Blynk
D'abord construisez l'interface de Blynk sur l'application comme expliqué plus haut puis envoyez le code présent dans le dossier src/Tests/NodeMCU/Blynk dans le NodeMCU (n'oubliez pas de mettre a jour les paramètres WiFi et Blynk au début du code) et vous devriez obtenir des values aléatoires dans l'application.UART
Une fois que tout fonctionne correctement, envoyez le code principal dans chaque microcontrolleur (src/ArduinoNano et src/NodeMCU (n'oubliez pas les paramètres WiFi et Blynk dans constants.h)) et connectez les ensemble comme montré sur le dessin :Attention : Ne connectez pas de cable USB à l'Arduino Nano, tout est alimenté par le NodeMCU !
Quelques secondes après avoir alimenté le système complet, vous devriez obtenir les valeurs de tous les capteurs sur l'écran (appuyez sur le bouton "capteurs" pour naviguer dans les menus) et le système de contrôle automatique devrait démarrer également.
Code de test
Plusieurs fichiers de code sont disponibles dans le dossier src/Tests pour tester les différentes parties du système. Pour plus d'informations, voir les instructions de construction.Code Source
Le code du projet est disponible ici : https://github.com/MaximeChretien/HerbBox2.0Ressources utilisées
- La première version du projet par Zoomacom
- Le projet Water Plants System sur hackster.io
- Une version francaise du projet avec plus de schéma sur genio.cc
- Se connecter au wifi avec un nodeMCU
- Le projet sur instructables.com
- Une version similaire sur arduino.cc
Ce contenu de Zoomacom est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.
Capteur de fumée et gaz (En cours de rédaction)
Capteur de fumée et gaz (En cours de rédaction)
Ce système permet de mesurer les taux de fumées, monoxydes de carbone et dioxyde de carbone dans l'air ainsi que la température et l'humidité.Cela permet, par exemple, de s'assurer de ma qualité de l'air dans les locaux d'OpenFactory.
Les données sont transimise sur la plateforme ThingSpeak afin de pouvoir visualiser leur évolution dans le temps. Un système d'alertes sur téléphone est également mis en place grâce à l'application IFTTT en plus des alertes visuelles et sonores produitent par le système.
Contexte
Ce projet a été réalisé dans le cadre du stage d'Élisa, une étudiante en BTS Conception et Industrialisation en Microtechniques, à OpenFactory en juin/juillet 2021.Schéma électronique
Projet KiCAD (.zip)Liste du matériel
Nom | Description | Quantité | Prix Unitaire | Prix |
ESP32 WROOM (Version 30 pins) | Microcontrolleur | 1 | ||
MQ-2 | Capteur de fumées | 1 | ||
MQ-7 | Capteur de monoxyde de carbone (CO) | 1 | ||
MQ-135 | Capteur de dioxyde de carbone (CO2) | 1 | ||
DHT11 | Capteur de température et humidité | 1 | ||
LED 1W Rouge+Bleu+Vert+Blanc """" | Alarme visuelle | 1 | ||
Buzzer | Alarme sonore | 1 | ||
Transistor 2N2222 | Transistor NPN (interrupteur électronique) | 5 | ||
Résistances 5ohm | Protection des LEDs | 4 | ||
Résistances 5.1k | Diviseur de tension | 3 | ||
Résistances 10k | Diviseur de tension et bus ""OneWire"" | 4 | ||
Condensateur 100nF | Filtrage d'alimentation | 1 | ||
Condensateur 100uF | Filtrage d'alimentation | 1 |
** Nous utilisons une puce (Cree XLamp XM-L) incluant 4 LEDs (Rouge, vert, bleu et blanc), elle peut être remplacée par des LEDs de puissance indépendantes.
NodeMCU
Paramètrage de la carte
- Ajouter la bibliothèque des cartes ESP8266 board dans Arduino IDE (http://arduino.esp8266.com/stable/package_esp8266com_index.json)- Installer le paquet "esp8266 by ESP8266 Community" via le gestionnaire de cartes
- Utiliser la carte nommée "NodeMCU 1.0 (ESP-12E Module)" pendant l'envoi du code
Bibliothèques arduino requises
- DallasTemperature (Version installable via Arduino IDE)- ThingSpeak (Version installable via Arduino IDE)
- MQUnifiedSensor (Version installable via Arduino IDE)
- ESP32 AnalogWrite (Version installable via Arduino IDE)
Code
Cliquez pour afficher
// Definition des pins #define PIN_MQ2 33 #define PIN_MQ7 35 #define PIN_ALIM_MQ7 26 #define PIN_MQ135 34 #define PIN_DHT11 16 #define PIN_LED_R 13 #define PIN_LED_G 12 #define PIN_LED_B 14 #define PIN_LED_W 27 #define PIN_BUZZER 18 // Gestion du capteur DHT11 #include <DHT.h> #define DHTTYPE DHT11 DHT dht(PIN_DHT11, DHTTYPE); // Gestion des capteurs MQ #include <MQUnifiedsensor.h> #define MQ_BOARD "ESP-32" #define MQ_VOLT_RES 3.3 #define MQ_ADC_RES 12 #define MQ2_R0 2.85 #define MQ7_R0 7.10 #define MQ135_R0 13.95 unsigned long mq7OldMillis = 0; int mq7State = 0; // 0 -> Chauffage | 1 -> Lecture MQUnifiedsensor MQ2(MQ_BOARD, MQ_VOLT_RES, MQ_ADC_RES, PIN_MQ2, "MQ-2"); MQUnifiedsensor MQ7(MQ_BOARD, MQ_VOLT_RES, MQ_ADC_RES, PIN_MQ7, "MQ-7"); MQUnifiedsensor MQ135(MQ_BOARD, MQ_VOLT_RES, MQ_ADC_RES, PIN_MQ135, "MQ-135"); // Gestion du WiFi #include <WiFi.h> #define SSID "XXXX" #define PASSWD "XXXX" WiFiClient tsClient; WiFiClient iftttClient; // Gestion Thingspeak #include <ThingSpeak.h> #define TS_API_KEY "XXXX" #define TS_CHANNEL XXXX #define TS_FUMEE_FIELD 1 #define TS_CO_FIELD 2 #define TS_CO2_FIELD 3 #define TS_TEMP_FIELD 4 #define TS_HUM_FIELD 5 // Gestion IFTTT #define IFTTT_HOST "maker.ifttt.com" #define IFTTT_API_KEY "XXXX" // Gases #define IFTTT_FIRE_EVENT "fire" #define IFTTT_FIRE_THRES 100 #define IFTTT_CO2_EVENT "co2" #define IFTTT_CO2_THRES 600 #define IFTTT_CO_EVENT "co" #define IFTTT_CO_THRES 100 // Temp #define IFTTT_HOT_EVENT "hot" #define IFTTT_HOT_THRES 35 #define IFTTT_COLD_EVENT "cold" #define IFTTT_COLD_THRES 15 // Hum #define IFTTT_DRY_EVENT "dry" #define IFTTT_DRY_THRES 20 #define IFTTT_WET_EVENT "wet" #define IFTTT_WET_THRES 80 bool co2EventSent = false; bool coEventSent = false; bool fireEventSent = false; bool hotEventSent = false; bool coldEventSent = false; bool wetEventSent = false; bool dryEventSent = false; // Gestion PWM #include <analogWrite.h> // Valeurs des capteurs int ppmFumee = 0; int ppmCO = 0; int ppmCO2 = 0; int temp = 0; int hum = 0; // Triggers LED et Buzzer bool fire = false; bool co = false; bool co2 = false; void setup() { Serial.begin(115200); ledInit(); pinMode(PIN_BUZZER, OUTPUT); sensorsInit(); wifiInit(); ThingSpeak.begin(tsClient); ledOff(); } void loop() { bool goodMQ7 = false; // Lecture des capteurs readMQ2(); goodMQ7 = readMQ7(); readMQ135(); readDHT(); // Envoi des valeurs sur ThingSpeak ThingSpeak.setField(TS_FUMEE_FIELD, ppmFumee); if(goodMQ7) { ThingSpeak.setField(TS_CO_FIELD, ppmCO); } ThingSpeak.setField(TS_CO2_FIELD, ppmCO2); ThingSpeak.setField(TS_TEMP_FIELD, temp); ThingSpeak.setField(TS_HUM_FIELD, hum); ThingSpeak.writeFields(TS_CHANNEL, TS_API_KEY); // Gestion des events et trigger IFTTT if(ppmFumee >= IFTTT_FIRE_THRES) { if(!fireEventSent) { sendIfttt(IFTTT_FIRE_EVENT); fireEventSent = true; } fire = true; } else { fireEventSent = false; fire = false; } if(goodMQ7 && ppmCO >= IFTTT_CO_THRES) { if(!coEventSent) { sendIfttt(IFTTT_CO_EVENT); coEventSent = true; } co = true; } else { coEventSent = false; co = false; } if(ppmCO2 >= IFTTT_CO2_THRES) { if(!co2EventSent) { sendIfttt(IFTTT_CO2_EVENT); co2EventSent = true; } co2 = true; } else { co2EventSent = false; co2 = false; } if(temp >= IFTTT_HOT_THRES) { if(!hotEventSent) { sendIfttt(IFTTT_HOT_EVENT); hotEventSent = true; } } else { hotEventSent = false; } if(temp <= IFTTT_COLD_THRES) { if (!coldEventSent) { sendIfttt(IFTTT_COLD_EVENT); coldEventSent = true; } } else { coldEventSent = false; } if(hum >= IFTTT_WET_THRES) { if(!wetEventSent) { sendIfttt(IFTTT_WET_EVENT); wetEventSent = true; } } else { wetEventSent = false; } if(hum <= IFTTT_DRY_THRES) { if(!dryEventSent) { sendIfttt(IFTTT_DRY_EVENT); dryEventSent = true; } } else { dryEventSent = false; } // Gestion des LEDs et du buzzer if(fire) { ledFire(); fireAlarm(); } else if (co) { ledCO(); coAlarm(); } else if (co2) { ledCO2(); co2Alarm(); } else { ledOff(); noTone(PIN_BUZZER); } // Delai delay(250); } // Function LEDs void ledInit() { pinMode(PIN_LED_R, OUTPUT); pinMode(PIN_LED_G, OUTPUT); pinMode(PIN_LED_B, OUTPUT); pinMode(PIN_LED_W, OUTPUT); analogWrite(PIN_LED_R, 100); analogWrite(PIN_LED_G, 100); analogWrite(PIN_LED_B, 100); analogWrite(PIN_LED_W, 100); } void ledOff() { analogWrite(PIN_LED_R, 0); analogWrite(PIN_LED_G, 0); analogWrite(PIN_LED_B, 0); analogWrite(PIN_LED_W, 0); } void ledFire() { analogWrite(PIN_LED_R, 255); analogWrite(PIN_LED_G, 0); analogWrite(PIN_LED_B, 0); analogWrite(PIN_LED_W, 0); } void ledCO() { analogWrite(PIN_LED_R, 0); analogWrite(PIN_LED_G, 255); analogWrite(PIN_LED_B, 0); analogWrite(PIN_LED_W, 0); } void ledCO2() { analogWrite(PIN_LED_R, 0); analogWrite(PIN_LED_G, 0); analogWrite(PIN_LED_B, 255); analogWrite(PIN_LED_W, 0); } // Fonctions buzzer void tone(uint8_t pin, int freq) { // On utilise le channel 15 pour eviter les conflits avec analogWrite ledcSetup(15, 50000, 13); ledcAttachPin(pin, 15); ledcWriteTone(15, freq); } void noTone(uint8_t pin) { tone(pin, 0); } void fireAlarm() { tone(PIN_BUZZER, 1000); } void coAlarm() { tone(PIN_BUZZER, 1500); } void co2Alarm() { tone(PIN_BUZZER, 2000); } // Fonctions capteurs void sensorsInit() { // DHT11 dht.begin(); // MQ-2 (Courbe CH4) MQ2.setRegressionMethod(true); MQ2.setA(4301.22); MQ2.setB(-2.65); MQ2.init(); MQ2.setR0(MQ2_R0); MQ2.setRL(1); // MQ-7 analogWrite(PIN_ALIM_MQ7, 255); MQ7.setRegressionMethod(true); MQ7.setA(99.042); MQ7.setB(-1.518); MQ7.init(); MQ7.setR0(MQ7_R0); MQ7.setRL(1); // MQ-135 MQ135.setRegressionMethod(true); MQ135.setA(110.47); MQ135.setB(-2.862); MQ135.init(); MQ135.setR0(MQ135_R0); MQ135.setRL(1); } void readMQ2() { MQ2.update(); ppmFumee = MQ2.readSensor(); } bool readMQ7() { // Temps de chauffe écoulé if(!mq7State && (millis() - mq7OldMillis) >= (60000UL)) { // Passage en mode lecture analogWrite(PIN_ALIM_MQ7, 20); mq7OldMillis = millis(); mq7State = 1; // Temps de lecture écoulé } else if (mq7State && (millis() - mq7OldMillis) >= (90000UL)) { // Passage en mode chauffage analogWrite(PIN_ALIM_MQ7, 255); mq7OldMillis = millis(); mq7State = 0; } if(mq7State) { analogWrite(PIN_ALIM_MQ7, 255); delay(5); MQ7.update(); ppmCO = MQ7.readSensor(); analogWrite(PIN_ALIM_MQ7, 20); // Valeur mise a jour return true; } // Pas de nouvelle valeur return false; } void readMQ135() { MQ135.update(); ppmCO2 = MQ135.readSensor() + 400; } void readDHT() { temp = dht.readTemperature(); hum = dht.readHumidity(); } // Fonctions WiFi et IOT void wifiInit() { WiFi.mode(WIFI_STA); // Init WiFi Serial.println(); Serial.print("Connexion en cours"); WiFi.begin(SSID, PASSWD); while(WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println("Connexion WiFi OK"); // Gestion MAC byte mac[6]; WiFi.macAddress(mac); // Affichage de l'adresse IP Serial.print("Adresse IP : "); Serial.println(WiFi.localIP()); } void sendIfttt(String event) { Serial.println(iftttClient.connect(IFTTT_HOST, 80)); iftttClient.println("GET http://maker.ifttt.com/trigger/"+event+"/with/key/"+IFTTT_API_KEY); }
Constantes à modifier
Il faut remplacer les XXXX dans le code pour configurer les différents services, on les trouve sur les lignes de ce type : #define NOM "XXXX"Configuration WiFi
SSID (ligne 38) : Nom de la connexion WiFiPASSWD (ligne 39) : Mot de passe de la connexion WiFi
Configuration ThingSpeak
TS_API_KEY (ligne 46) : Clé API de ThingSpeakTS_CHANNEL (ligne 47) : Numéro du canal ThingSpeak
Configuration IFTTT
IFTTT_API_KEY (ligne 56) : Clé API de IFTTTAlarmes
Fumées
Seuil : 100 ppmFréquence : 1 kHz
Couleur : Rouge
CO
Seuil : 100 ppmFréquence : 1.5 kHz
Couleur : Vert
CO2
Seuil : 600 ppmFréquence : 2 kHz
Couleur : Bleu
ThingSpeak
ThingSpeak est une plateforme d'analyse IoT qui vous permet d'agréger, de visualiser et d'analyser des flux de données en direct dans le cloud.Nous utilisons cette plateforme pour visualiser l'évolution des taux de gaz, de la température et de l'humidité mesurée par le système au cours du temps.
Visualisation des données du système
IFTTT
IFTTT est un service web permettant à ses utilisateurs de créer des chaînes d'instruction simples appelées applets. Cela permet de réagir à des évenements en activant d'autres systèmes.Nous l'utilisons pour envoyé des alertes sur téléphone quand les taux de gaz dépassent les seuils de danger défini dans le système.
Ce contenu de Zoomacom est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International.