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 😁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | <span style="background-color: #ffff99;"> #include <WiFiUdp.h> #include <ESP8266WiFi.h></span> <span style="background-color: #ccffcc;">#include <NTPClient.h></span> <span style="background-color: #ccffff;">#include <arduino-timer.h></span> <span style="background-color: #99ccff;">#define SSID "MON-WIFI" #define PASSWORD "MON-CODE-WIFI"</span> <span style="background-color: #cc99ff;">#define VANNEPIN D1 #define ALARMEPIN D3 #define NIVHAUTPIN D8 #define NIVBASPIN D6 #define REMPLISSAGE D5</span> <span style="background-color: #ffcc99;">#define TEMPMAX 60000</span> <span style="background-color: #ffff99;">#define HEURESTART 1 #define MINUTESTART 00</span> <span style="background-color: #ccffcc;"> // 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);</span> // timer <span style="background-color: #ccffff;">auto timer = timer_create_default();</span> // booléen pour vérifier si le timer est lancé ou non <span style="background-color: #ccffff;">bool timerStarted = false; bool timerAlarm = false; bool resetTimer = false; bool resetDoubleSensor = false;</span> bool boutonAppuye = false; // recuperation du temps et heure sur le serveur <span style="background-color: #99ccff;">bool miseAJourTimeWeb(void *){ timeClient.update(); Serial.print("TempsWeb"); Serial.println(timeClient.getFormattedTime()); return true; // repeter }</span> // Fonction de réinitialisation de la carte ESP8266 <span style="background-color: #cc99ff;">bool resetESP8266(void *) { if(timerAlarm == false){ ESP.reset(); delay(5000); } return true; // repeter }</span> void setup() { Serial.begin(115200); digitalWrite(VANNEPIN, LOW); //connexion au wifi <span style="background-color: #ffcc99;">WiFi.begin(SSID, PASSWORD);</span> while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } <span style="background-color: #ffff99;"> pinMode(ALARMEPIN, OUTPUT); pinMode(VANNEPIN, OUTPUT);</span> <span style="background-color: #ccffcc;"> pinMode(NIVHAUTPIN, INPUT); pinMode(NIVBASPIN, INPUT); pinMode(REMPLISSAGE, INPUT);</span> <span style="background-color: #ccffff;">digitalWrite(ALARMEPIN, LOW);</span> //activation timeClient <span style="background-color: #99ccff;">timeClient.begin();</span> // recuperation date et heure <span style="background-color: #cc99ff;">miseAJourTimeWeb(NULL);</span> // creation d'un timer de recuperation date et heure //timer.every(86400000, miseAJourTimeWeb); <span style="background-color: #ffcc99;">timer.every(86400000, resetESP8266);</span> //timer.every(302000, testServeur); } // fonction pour arreter la vanne automatiquement apres un temps donné auto <span style="background-color: #ffff99;">timerStopVanne</span> = [](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; }; <span style="background-color: #ffff99;">Timer<>::Task task;</span> void loop() { // ticker de l'horloge, pour le timer <span style="background-color: #ccffcc;">timer.tick();</span> <span style="background-color: #ccffff;">int heure = timeClient.getHours(); int minutes = timeClient.getMinutes();</span> <span style="background-color: #99ccff;">bool capteurHaut=digitalRead(NIVHAUTPIN); bool capteurBas=digitalRead(NIVBASPIN);</span> //static Timer<>::Task task; // il faut que l'alarme ne se soit pas declenchée if(<span style="background-color: #cc99ff;">timerAlarm</span> == false){ // si heure atteinte et que capteur haut pas activé alors remplissage if (heure == HEURESTART && minutes == MINUTESTART && <span style="background-color: #ffcc99;">capteurHaut</span> == LOW && <span style="background-color: #ffcc99;">timerStarted</span> == false ) { Serial.println("Remplissage"); digitalWrite(<span style="background-color: #ffff99;">VANNEPIN</span>, HIGH); //Si le temps de remplissage est depassé alors on appelle la fonction timerStopVanne <span style="background-color: #ccffcc;">task = timer.in(TEMPMAX, timerStopVanne);</span> // le timer est demarré <span style="background-color: #ccffff;">timerStarted = true;</span> } else if(<span style="background-color: #99ccff;">timerStarted</span> == true && <span style="background-color: #99ccff;">capteurHaut</span> == HIGH ){ // si le timer a été demarré et que le capteur dit rempli alors digitalWrite(<span style="background-color: #cc99ff;">VANNEPIN</span>, LOW); <span style="background-color: #ffcc99;">timerStarted = false;</span> <span style="background-color: #ffff99;">timer.cancel(task);</span> Serial.println("Stop Remplissage"); } // fonction 2 capteur vide peu importe l'heure, // enlever les commentaires /* */ pour activer cette partie /* // fonction avec doubler capteur if(<span style="background-color: #ccffcc;">capteurBas</span> == LOW && <span style="background-color: #ccffcc;">capteurHaut</span> == LOW){ if (!<span style="background-color: #ccffff;">timerStarted</span> ) { Serial.println("remplissage 2 capteurs"); digitalWrite(<span style="background-color: #99ccff;">VANNEPIN</span>, HIGH); // démarrer le timer si les conditions sont remplies pour la première fois <span style="background-color: #cc99ff;">task = timer.in(TEMPMAX, timerStopVanne);</span> <span style="background-color: #ffcc99;">timerStarted = true;</span> <span style="background-color: #ffcc99;">resetTimer = true;</span> <span style="background-color: #ffcc99;">resetDoubleSensor=true;</span> } } else if (<span style="background-color: #ffff99;">capteurBas</span> == HIGH && <span style="background-color: #ffff99;">capteurHaut</span> == HIGH && <span style="background-color: #ffff99;">resetDoubleSensor</span> == true){ // annuler le timer si les conditions ne sont plus remplies <span style="background-color: #ccffcc;">timer.cancel(task);</span> Serial.println("plein 2 capteurs"); <span style="background-color: #ccffff;">timerStarted = false;</span> <span style="background-color: #ccffff;">resetDoubleSensor=false;</span> digitalWrite(<span style="background-color: #99ccff;">VANNEPIN</span>, LOW); } */ } // replissage forcé et reset alarme bool <span style="background-color: #cc99ff;">boutonForcage=digitalRead(REMPLISSAGE);</span> if(boutonForcage == HIGH){ Serial.println("remplissage forcé"); if(<span style="background-color: #ffcc99;">capteurHaut</span> == LOW){ digitalWrite(<span style="background-color: #ffff99;">VANNEPIN</span>, HIGH); } else{ digitalWrite(<span style="background-color: #ffff99;">VANNEPIN</span>, LOW); } <span style="background-color: #ccffcc;">boutonAppuye</span>=true; <span style="background-color: #ccffff;">timerAlarm</span> = false;// remet l'alarme a false digitalWrite(<span style="background-color: #99ccff;">ALARMEPIN</span>, LOW); }else if(<span style="background-color: #cc99ff;">boutonAppuye</span> == true ){ Serial.println("stop bouton"); digitalWrite(<span style="background-color: #ffcc99;">VANNEPIN</span>, LOW); <span style="background-color: #ffff99;">boutonAppuye</span>=false; <span style="background-color: #ffff99;">timerStarted</span> = false; <span style="background-color: #ffff99;">resetTimer</span> = false; <span style="background-color: #ccffcc;">timer.cancel(task);</span> } } |
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
📌 FAQ – Fontaine connectée avec ESP8266
Q : Pourquoi utiliser un ESP8266 pour automatiser une fontaine d’eau ?
R : L’ESP8266 permet de connecter facilement ton projet à un réseau Wi-Fi pour récupérer l’heure pour l’automatisation. Tu pourras avec des modification de code contrôler ou surveiller ta fontaine d’eau à distance via une interface web, une app ou même avec des notifications.
Q : Est-ce dangereux d’installer un système connecté dans un réfrigérateur ?
R : Non, si les composants sont bien isolés et protégés contre l’humidité. Il est recommandé d’utiliser des boîtiers étanches ou imprimés en 3D pour isoler l’électronique, ainsi que des connexions fiables. Si ton alimentation est bien isolée aucun problème.
Q : Quel type de capteur ou d’électrovanne peut-on utiliser ?
R : Tu peux utiliser une électrovanne 12 V ou 5 V pour contrôler l’arrivée d’eau, pilotée via un relais.
Q : Est-ce que ce projet peut être alimenté par une batterie ?
R : Techniquement oui, mais comme le système est dans un frigo et a besoin d’une alimentation stable, il est préférable d’utiliser un bloc secteur ou de se raccorder sur l’alim du frigo (en toute sécurité).
Q : Est-ce que je peux contrôler la fontaine depuis mon smartphone ?
R : Oui, avec l’ESP8266 tu peux créer une interface web simple, ou utiliser des services comme Blynk, Telegram Bot ou même ESPHome pour un contrôle mobile.
🔗 À découvrir aussi sur Retro&Geek
👉 Créer une application Android avec AppInventor pour contrôler un Arduino en Bluetooth
Idéal pour comprendre comment interfacer des projets maison avec un smartphone.
👉 Configurer le module HC-05 pour Arduino
Apprends à paramétrer un module Bluetooth HC-05 pour des projets domotiques simples.
👉 Créer une caméra thermique DIY avec AMG8833 et ESP8266
Un autre projet avancé utilisant l’ESP8266 pour afficher des données en ligne.
👉 Fabriquer un caisson pour imprimante 3D – Tevo Tornado
Pour protéger ton imprimante si tu fabriques des boîtiers ou composants 3D liés à la domotique.
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






