Aujourd’hui on va apprendre à créer un système pour remplir la réserve d’eau de sont réfrigérateur avec un esp8266 et avoir de l’eau fraiche tous les jours.
On va devoir avoir un code fiable pour éviter les fuites 😁
#include <WiFiUdp.h> #include <ESP8266WiFi.h> #include <NTPClient.h> #include <arduino-timer.h> #define SSID "MON-WIFI" #define PASSWORD "MON-CODE-WIFI" #define VANNEPIN D1 #define ALARMEPIN D3 #define NIVHAUTPIN D8 #define NIVBASPIN D6 #define REMPLISSAGE D5 #define TEMPMAX 60000 #define HEURESTART 1 #define MINUTESTART 00 // parametre NTP pour le serveur et parametre de l'heure const char *ntpServer = "europe.pool.ntp.org"; const long gmtOffset_sec = 3600; const int daylightOffset_sec = 3600; // parametrage NTP date et heure WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, ntpServer, gmtOffset_sec, daylightOffset_sec); // timer auto timer = timer_create_default(); // booléen pour vérifier si le timer est lancé ou non bool timerStarted = false; bool timerAlarm = false; bool resetTimer = false; bool resetDoubleSensor = false; bool boutonAppuye = false; // recuperation du temps et heure sur le serveur bool miseAJourTimeWeb(void *){ timeClient.update(); Serial.print("TempsWeb"); Serial.println(timeClient.getFormattedTime()); return true; // repeter } // Fonction de réinitialisation de la carte ESP8266 bool resetESP8266(void *) { if(timerAlarm == false){ ESP.reset(); delay(5000); } return true; // repeter } void setup() { Serial.begin(115200); digitalWrite(VANNEPIN, LOW); //connexion au wifi WiFi.begin(SSID, PASSWORD); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } pinMode(ALARMEPIN, OUTPUT); pinMode(VANNEPIN, OUTPUT); pinMode(NIVHAUTPIN, INPUT); pinMode(NIVBASPIN, INPUT); pinMode(REMPLISSAGE, INPUT); digitalWrite(ALARMEPIN, LOW); //activation timeClient timeClient.begin(); // recuperation date et heure miseAJourTimeWeb(NULL); // creation d'un timer de recuperation date et heure //timer.every(86400000, miseAJourTimeWeb); timer.every(86400000, resetESP8266); //timer.every(302000, testServeur); } // fonction pour arreter la vanne automatiquement apres un temps donné auto timerStopVanne = [](void*) -> bool { digitalWrite(VANNEPIN, LOW); //fermer la vanne si le temps est écoulé timerAlarm = true; //alarme declenchée Serial.println("Alarme"); digitalWrite(ALARMEPIN, HIGH); return false; }; Timer<>::Task task; void loop() { // ticker de l'horloge, pour le timer timer.tick(); int heure = timeClient.getHours(); int minutes = timeClient.getMinutes(); bool capteurHaut=digitalRead(NIVHAUTPIN); bool capteurBas=digitalRead(NIVBASPIN); //static Timer<>::Task task; // il faut que l'alarme ne se soit pas declenchée if(timerAlarm == false){ // si heure atteinte et que capteur haut pas activé alors remplissage if (heure == HEURESTART && minutes == MINUTESTART && capteurHaut == LOW && timerStarted == false ) { Serial.println("Remplissage"); digitalWrite(VANNEPIN, HIGH); //Si le temps de remplissage est depassé alors on appelle la fonction timerStopVanne task = timer.in(TEMPMAX, timerStopVanne); // le timer est demarré timerStarted = true; } else if(timerStarted == true && capteurHaut == HIGH ){ // si le timer a été demarré et que le capteur dit rempli alors digitalWrite(VANNEPIN, LOW); timerStarted = false; timer.cancel(task); Serial.println("Stop Remplissage"); } // fonction 2 capteur vide peu importe l'heure, // enlever les commentaires /* */ pour activer cette partie /* // fonction avec doubler capteur if(capteurBas == LOW && capteurHaut == LOW){ if (!timerStarted ) { Serial.println("remplissage 2 capteurs"); digitalWrite(VANNEPIN, HIGH); // démarrer le timer si les conditions sont remplies pour la première fois task = timer.in(TEMPMAX, timerStopVanne); timerStarted = true; resetTimer = true; resetDoubleSensor=true; } } else if (capteurBas == HIGH && capteurHaut == HIGH && resetDoubleSensor == true){ // annuler le timer si les conditions ne sont plus remplies timer.cancel(task); Serial.println("plein 2 capteurs"); timerStarted = false; resetDoubleSensor=false; digitalWrite(VANNEPIN, LOW); } */ } // replissage forcé et reset alarme bool boutonForcage=digitalRead(REMPLISSAGE); if(boutonForcage == HIGH){ Serial.println("remplissage forcé"); if(capteurHaut == LOW){ digitalWrite(VANNEPIN, HIGH); } else{ digitalWrite(VANNEPIN, LOW); } boutonAppuye=true; timerAlarm = false;// remet l'alarme a false digitalWrite(ALARMEPIN, LOW); }else if(boutonAppuye == true ){ Serial.println("stop bouton"); digitalWrite(VANNEPIN, LOW); boutonAppuye=false; timerStarted = false; resetTimer = false; timer.cancel(task); } }
En matériel il nous faut un ESP8266
– 1 pcb
– 1 L7805CV
– 1 TIP120
– 2 condensateur 100µF ou supérieur et minimum 16V
– 1 résistance 220Ω ( pour le bouton )
– 1 résistance 2.2kΩ (pour le TIP120)
– 1 résistance 330Ω (pour la led )
– 1 led
– 1 diode 1N4001 ou supérieur
– 1 electrovanne 12v DCF-HSY4
– 1 ou 2 capteur de niveau XKC-Y25-V
– 1 bouton poussoir
– un tuyaux pour réfrigérateur américain, coudes et robinet
– 1 alimentation 12v minimum 1A
Branchements et câblages
On va devoir générer une alimentation en 5V pour alimenter l’ESP8266 et les capteurs de niveau. Notre alimentation de base est une alimentation en 12V pour commander l’électrovanne. Pour la transformer en 5V on utilise un L7805CV avec un condensateur en entrée et un en sortie.
Le pin 1 du L7805CV est pour le 12V entrant, le pin 2 est pour le gnd et le pin 3 est pour la sortie en 5V.
Le 5V sert à alimenter le XKC-Y25-V sur le pin câble bleu, le gnd va sur le pin câble marron.
Restons sur les capteurs de niveau d’eau, vous avez le choix, un ou deux capteur.
De mon coté j’ai choisi un seul capteur.
Niveau branchement pour un capteur c’est le pin D8 de l’esp qui doit être connecté au câble jaune du capteur de niveau ( capteur de niveau haut ). Avec deux capteur il faut connecter le deuxième capteur sur le pin D6 ( capteur de niveau bas ).
Parlons maintenant de la partie électrovanne DCF-HSY4, d’un coté elle est connecté au 12V et de l’autre elle est connecté au TIP120 le pin 2. Le pin 3 est connecté au gnd et une diode relie le pin 3 et 2 du TIP120. Le pin 1 est quand a lui relié au une résistance de 2.2kΩ qui est elle même reliée au pin D1 de l’ESP.
Une led est utilisée pour afficher l’alarme en cas de disfonctionnement du dispositif de remplissage. Cette led est connectée au gnd d’un coté puis de l’autre a un résistance de 330Ω qui elle même est connecté au pin D3 de l’ESP.
Et enfin un bouton poussoir est la pour remettre à 0 l’alarme de disfonctionnement ou forcer le remplissage. Sur un des coté du bouton on y emmène le 5V de l’autre coté une résistance de 220Ω qui elle même est connecté au gnd et aussi au pin D5 de l’esp.
Si vous n’avez pas encore effectué cette étape dans votre logiciel Arduino, suivez ces instructions : allez dans “Préférences”, puis “Gestionnaire de cartes supplémentaires” et ajoutez l’URL suivante : http://arduino.esp8266.com/stable/package_esp8266com_index.json
Ajouter la carte dans outils, type de carte, gestionnaire de carte et ajouter esp8266
Lorsque vous téléversez votre programme, assurez-vous de sélectionner la carte correcte pour un transfert de code réussi.
Que va t’on faire dans le code ?
Maintenant, entrons dans la partie de programmation du microcontrôleur ESP8266 ! Voici ce que j’ai prévu :
- Établir une connexion à un réseau Wi-Fi.
- Récupérer la date et l’heure actuelle depuis un serveur en France.
- Programmer l’ouverture d’une vanne à une heure spécifique.
- Avoir la possibilité de forcer l’ouverture de la vanne manuellement.
Pour réaliser ces tâches, nous utilisons plusieurs bibliothèques indispensables dans notre programme :
- NTPClient de Fabrice Weinberg pour la gestion de l’heure.
- Arduino Timer de Michael Contreras pour gérer les délais et les temporisations.
- En ce qui concerne les autres librairies nécessaires, elles sont incluses lorsque vous ajoutez le package ESP8266. Si par hasard vous ne les trouvez pas, une recherche sur Internet devrait vous permettre de les localiser. 😄
Code , programmation de l’esp8266
On appelle nos différentes librairies WiFiUdp.h et ESP8266WiFi.h pour gérer le wifi.
Ensuite NTPClient.h pour nous permettre de synchroniser l’horloge de l’esp8266 avec un serveur ntp pour obtenir l’heure exacte.
Pour finir la librairie arduino-timer.h pour gérer des minuteries.
On passe aux définitions des variables, avec SSID et PASSWORD pour les informations de connexion au wifi.
Ensuite les pin pour l’électrovanne D1,la led alarme D3, le capteur niveau haut D8, le capteur de niveau bas (optionnel) D6 et pour le bouton de forçage de remplissage et remise à zéro de l’alarme le pin D5.
Le TEMPMAX est le temps maximal pendant lequel l’électrovanne s’active avant de se mettre en alarme, 60000 correspond a 1 minute. C’est à adapter au temps de remplissage maximum de votre réservoir.
Puis 2 variable HEURESTART et MINUTESTART pour définir l’heure et les minutes à laquelle activer le remplissage du réservoir.
Ensuite nous avons toute la partie NTP pour la synchronisation de l’heure sur internet.
Puis définition du timer ainsi que des variables booléen pour les timer d’alarme et le bouton.
La fonction miseAJourTimeWeb pour mettre a jour l’heure avec ntp.
Ensuite la fonction resetESP8266 qui sert à relancer l’esp et ne pas crash après quelques jours de fonctionnement. Le reset ne se fait pas si l’alarme est enclenchée.
Partie setup, le serial pour debug mais pas obligatoire, on entre dans le dur avec la connexion wifi avec WiFi.begin, on enchaine avec une boucle ou on s’assure d’être connecté avant de poursuivre.
Puis on définir les pinMode, vanne et alarme en OUTPUT car on envoie une tension et les capteurs de niveau et le bouton en INPUT car on reçoit une tension. Et on met l’alarme à LOW pour éteindre la led.
Activons le timer avec timeClient.begin et appeler la miseAJourTimeWeb.
Et on crée un timer qui se lance tous les jour pour reset l’esp avec timer.every(86400000, resetESP8266)
Nous avons la fonction timerStopVanne qui arrête la vanne quand le temps est écoulé. Et créer ensuite un timer task.
Attaquons la boucle avec un timer.tick pour faire fonctionner le timer.
Ensuite nos variables heure et minutes qui récupère l’heure et minute du moment.
Deux autres variables pour les capteurs de niveau , capteurHaut et capteurBas.
Notre premier condition est timerAlarm qui évite de déclencher le remplissage si il y a eu une alarme de dysfonctionnement.
La condition suivante permet de déclencher le remplissage si l’heure, minutes est atteinte ainsi que le capteurHaut est a l’état LOW et que timerStarted est à faux, cette variable permet un seul déclenchement.
Dans cette condition on passe VANNEPIN à l’état HIGH et déclenchement du timer pour arrêter la vanne en cas de temps dépassé.
Et on passe timerStarted à true.
Dans la condition else if elle se déclenche une fois que le remplissage a commencé avec timerStarted et que le capteurHaut est à l’état HIGH.
Dans cette condition on bascule VANNEPIN à LOW, on passe timerStarted à false et un arrêt du timer de temps dépassé pour l’alarme avec timer.cancel(task).
Voyons une partie optionnelle avec deux capteur, j’ai préféré utiliser un seul capteur car je ne vide pas mon réservoir en une journée au pire je pourrais le déclencher manuellement.
Dans cette partie on a une condition if et une else if, dans le if on vérifie que les deux capteurs capteurBas et capteurHaut sont à LOW.
Le if suivant vérifie que nous ne somme pas dans le timerStarted, on rempli le réservoir VANNEPIN et on déclenche le timer de sécurité timer.in(TEMPMAX, timerStopVanne).
On passe nos variables timerStarted, resetTimer et resetDoubleSensor à true.
Dans le else if on vérifie que les capteurs capteurBas et capteurHaut sont à HIGH et que resetDoubleSensor soit à true.
Dedans on annule le timer d’alarme avec timer.cancel ; on passe timerStarted et resetDoubleSensor à false.
Puis arrêt de la vanne VANNEPIN avec un état à LOW.
Passons à la dernière partie, la gestion du bouton pour allumage forcé et reset de l’alarme.
On récupère l’état du bouton de remplissage boutonForcage.
Dans la condition if on vérifie que le bouton est enfoncé, on vérifie ensuite si le capteurHaut est à l’état LOW et si c’est le cas activer la vanne sur VANNEPIN sinon on arrête la vanne.
On met boutonAppuye à true , timerAlarm à false ( remise de l’alarme à false ) et l’état de la led d’alarme ALARMEPIN à LOW.
Dans la condition else if on vérifie que la variable boutonAppuye est à true.
A l’intérieur on arrête la vanne avec VANNEPIN à LOW, on passe boutonAppuye, timerStarted, resetTimer à false et on cancel le timer d’arrêt avec timer.cancel(task).
Ce que je vous recommande c’est de faire tourner le code avec un seul capteur, c’est suffisant et on peut passer le câble plus facilement.
Télécharger le code pour l’esp8266 pour remplir notre réserve d’au automatiquement
Et voici le code : Télécharger
Et pour les fichiers 3d le seul vraiment exploitable pour votre projet est celui pour le capteur de niveau d’eau mais je vous met le projet complet aussi pour fusion 360
Télécharger projet fusion
Télécharger stl capteur XKC-Y25-V
N’hésitez pas à poser vos questions sur les réseaux sociaux de la chaîne instagram , twitter , facebook ,youtube , discord; si vous ne comprenez pas certaines parties du tutoriel n’hésitez pas , me dire ce que vous aimeriez que je crée pour en faire des vidéos tutoriel et à partager les projets que vous aimeriez créer etc…
Comme toujours allez sur la page de C’est quoi Retro et Geek pour connaître tout ce que je recherche à faire sur la chaîne.
Merci les RetroGeeker et RetroGeekeuse