{"id":2794,"date":"2026-04-07T08:29:05","date_gmt":"2026-04-07T12:29:05","guid":{"rendered":"https:\/\/tgemaisonneuve.com\/?p=2794"},"modified":"2026-04-07T08:29:06","modified_gmt":"2026-04-07T12:29:06","slug":"systeme-dirrigation-via-wifi","status":"publish","type":"post","link":"https:\/\/tgemaisonneuve.com\/index.php\/2026\/04\/07\/systeme-dirrigation-via-wifi\/","title":{"rendered":"Syst\u00e8me d\u2019irrigation via WiFi"},"content":{"rendered":"\n<p>Ce projet consiste \u00e0 concevoir un syst\u00e8me d&rsquo;irrigation intelligent avec une pompe immerg\u00e9 dans l&rsquo;eau pour arroser la plante lorsque le sol est sec et surveille en temps r\u00e9el l&rsquo;humidit\u00e9 du sol de la plante, l&rsquo;humidit\u00e9 et la temp\u00e9rature ambiante. Les donn\u00e9es sont affich\u00e9es sur un \u00e9cran LCD ainsi qu&rsquo;une interface web h\u00e9berg\u00e9e sur un serveur local.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" data-id=\"2921\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_3_projet-2-1024x768.jpg\" alt=\"\" class=\"wp-image-2921\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_3_projet-2-1024x768.jpg 1024w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_3_projet-2-300x225.jpg 300w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_3_projet-2-768x576.jpg 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_3_projet-2.jpg 1290w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n\n\n<style>.kb-table-of-content-nav.kb-table-of-content-id2794_800aa0-5e .kb-table-of-content-wrap{padding-top:var(--global-kb-spacing-sm, 1.5rem);padding-right:var(--global-kb-spacing-sm, 1.5rem);padding-bottom:var(--global-kb-spacing-sm, 1.5rem);padding-left:var(--global-kb-spacing-sm, 1.5rem);}.kb-table-of-content-nav.kb-table-of-content-id2794_800aa0-5e .kb-table-of-contents-title-wrap{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.kb-table-of-content-nav.kb-table-of-content-id2794_800aa0-5e .kb-table-of-contents-title{font-weight:regular;font-style:normal;}.kb-table-of-content-nav.kb-table-of-content-id2794_800aa0-5e .kb-table-of-content-wrap .kb-table-of-content-list{font-weight:regular;font-style:normal;margin-top:var(--global-kb-spacing-sm, 1.5rem);margin-right:0px;margin-bottom:0px;margin-left:0px;}<\/style>\n\n\n<h1 class=\"wp-block-heading\"><strong>Mat\u00e9riel<\/strong><\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Breadboard<\/li>\n\n\n\n<li>Arduino UNO R4 WiFi<\/li>\n\n\n\n<li>Afficheur LCD 16*2<\/li>\n\n\n\n<li>Capteur de temp\u00e9rature et humidit\u00e9(DHT22)<\/li>\n\n\n\n<li>Capteur de l\u2019humidit\u00e9 du sol(terre)<\/li>\n\n\n\n<li>Module de Relai SRS-05VDC-SL<\/li>\n\n\n\n<li>Circuit int\u00e9gr\u00e9 TA6586<\/li>\n\n\n\n<li>Pompe \u00e0 eau<\/li>\n\n\n\n<li>Piles AA<\/li>\n\n\n\n<li>Fils jumper m\u00e2les<\/li>\n\n\n\n<li>Tubes<\/li>\n\n\n\n<li>Bocal en impression 3D<\/li>\n\n\n\n<li>Pot<\/li>\n\n\n\n<li>Plante<\/li>\n\n\n\n<li>Aimants<\/li>\n\n\n\n<li>Imprimante 3D<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Illustration du projet<\/h1>\n\n\n\n<p><strong>Vue de c\u00f4t\u00e9<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_10_projet-2-768x1024.jpg\" alt=\"\" class=\"wp-image-2926\" style=\"width:466px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_10_projet-2-768x1024.jpg 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_10_projet-2-225x300.jpg 225w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_10_projet-2-1152x1536.jpg 1152w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_10_projet-2.jpg 1290w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/figure>\n\n\n\n<p><strong>Vue arri\u00e8re<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_9_projet-1-1024x768.jpg\" alt=\"\" class=\"wp-image-2924\" style=\"width:474px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_9_projet-1-1024x768.jpg 1024w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_9_projet-1-300x225.jpg 300w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_9_projet-1-768x576.jpg 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/Image_9_projet-1.jpg 1290w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Vue int\u00e9rieur du boitier<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image_6_projet-1024x768.jpg\" alt=\"\" class=\"wp-image-2922\" style=\"width:540px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image_6_projet-1024x768.jpg 1024w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image_6_projet-300x225.jpg 300w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image_6_projet-768x576.jpg 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image_6_projet.jpg 1290w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Sch\u00e9ma<\/strong> Bloc<\/h1>\n\n\n\n<p>Voici le sch\u00e9ma du projet<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"724\" height=\"658\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemabloc-2.png\" alt=\"\" class=\"wp-image-2905\" style=\"aspect-ratio:1.1003168480506957;width:511px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemabloc-2.png 724w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemabloc-2-300x273.png 300w\" sizes=\"auto, (max-width: 724px) 100vw, 724px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Caract\u00e9ristiques des pi\u00e8ces<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"621\" height=\"291\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image.png\" alt=\"\" class=\"wp-image-2910\" style=\"width:498px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image.png 621w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/image-300x141.png 300w\" sizes=\"auto, (max-width: 621px) 100vw, 621px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-1024x1024.webp\" alt=\"\" class=\"wp-image-2929\" style=\"width:458px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-1024x1024.webp 1024w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-300x300.webp 300w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-150x150.webp 150w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-768x768.webp 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4-1536x1536.webp 1536w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/arduino-r4.webp 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Circuit \u00e9lectronique <\/h2>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1911\" height=\"1431\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique.png\" alt=\"\" class=\"wp-image-2915\" style=\"aspect-ratio:1.3354544490401952;width:543px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique.png 1911w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique-300x225.png 300w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique-1024x767.png 1024w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique-768x575.png 768w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/schemaelectronique-1536x1150.png 1536w\" sizes=\"auto, (max-width: 1911px) 100vw, 1911px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Description G\u00e9n\u00e9ral Du Projet<\/strong><\/h1>\n\n\n\n<p>Le capteur d&rsquo;humidit\u00e9 du sol s&rsquo;assure que le seuil de la terre n&rsquo;est plus bas que 41%. Si on obtient un seuil plus bas que 40%, alors la pompe va s&rsquo;activer pour arroser la terre pendant 2 secondes cons\u00e9cutives avant de s&rsquo;arr\u00eater pour recalculer le taux d&rsquo;humidit\u00e9 \u00e0 nouveau. Si le seuil id\u00e9al n&rsquo;est toujours pas atteint, la pompe va recommencer son arrosage jusqu&rsquo;\u00e0 ce qu&rsquo;on obtient le taux d&rsquo;humidit\u00e9 souhait\u00e9.<\/p>\n\n\n\n<p>L&rsquo;\u00e9cran LCD nous permet de voir le changement de temp\u00e9rature de la pi\u00e8ce, le taux d&rsquo;humidit\u00e9 de la terre et l&rsquo;adresse IP de La carte Arduino.  Gr\u00e2ce \u00e0 l&rsquo;adresse IP on a acc\u00e8s \u00e0 la page web du projet. L\u00e0 dessus on peut non seulement voir la temp\u00e9rature et le taux d&rsquo;humidit\u00e9 de la terre, mais on peut aussi contr\u00f4ler la pompe manuellement. Tout \u00e7a sur notre t\u00e9l\u00e9phone!<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Description Technique Des Composants<\/h1>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>Arduino UNO R4&nbsp;WiFi\u202f: La carte \u00e9lectronique lit les capteurs, envoie les donn\u00e9es, prend les d\u00e9cisions et communique avec le serveur internet.&nbsp;<\/li>\n\n\n\n<li>Capteur d\u2019humidit\u00e9 du sol\u202f: Il mesure le niveau d\u2019humidit\u00e9 du sol sous forme de valeur analogique.&nbsp;<\/li>\n\n\n\n<li>DHT22\u202f: C\u2019est un capteur qui mesure la temp\u00e9rature et l\u2019humidit\u00e9 de l\u2019air. Il permet d\u2019avoir un suivi des conditions environnementales de la pi\u00e8ce.&nbsp;<\/li>\n\n\n\n<li>Afficheur LCD\u202f:&nbsp;Il affiche localement les informations des capteurs tel qu\u2019humidit\u00e9 du sol, temp\u00e9rature, \u00e9tat de la pompe et de l\u2019adresse IP du serveur.&nbsp;<\/li>\n\n\n\n<li>TA6586 CI\u202f: Puce de contr\u00f4le de moteur qui sert de module de relais. Le circuit int\u00e9grer agit comme un interrupteur command\u00e9 par Arduino qui permet d\u2019activer la pompe en toute s\u00e9curit\u00e9.&nbsp;&nbsp;<\/li>\n\n\n\n<li>Serveur local\u202f: Il g\u00e8re la communication entre le t\u00e9l\u00e9phone et le syst\u00e8me. Il envoie les donn\u00e9es en temps r\u00e9el.&nbsp;<\/li>\n\n\n\n<li>T\u00e9l\u00e9phone\u202f: Il permet d\u2019acc\u00e9der \u00e0 l\u2019interface du syst\u00e8me&nbsp;WiFi. Il sert&nbsp;a&nbsp;visualiser les donn\u00e9es de la temp\u00e9rature, humidit\u00e9 du sol et de la pi\u00e8ce.&nbsp;<\/li>\n\n\n\n<li>Pompe \u00e0 eau\u202f: Pompe l\u2019eau depuis la source et l\u2019envoie vers la plante lorsque le relais est activ\u00e9.&nbsp;<\/li>\n\n\n\n<li>Source d\u2019eau\u202f: Contenant d\u2019eau utilis\u00e9 pour circuler dans la pompe qui servira \u00e0 rendre humide la terre de la plante.&nbsp;<\/li>\n\n\n\n<li>Plante\u202f: La plante re\u00e7ois l\u2019eau n\u00e9cessaire selon les d\u00e9cisions prises par l\u2019Arduino&nbsp;<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n<\/div><\/div>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Conception 3D <\/strong><\/h1>\n\n\n\n<p>Boitier du circuit \u00e9lectronique      Boitier de l&rsquo;\u00e9cran LCD                       Contenant pour l&rsquo;eau<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-grid wp-container-core-group-is-layout-9649a0d9 wp-block-group-is-layout-grid\">\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"453\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitier3d.png\" alt=\"\" class=\"wp-image-2911\" style=\"aspect-ratio:1.2937225523120641;width:308px;height:auto\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitier3d.png 586w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitier3d-300x232.png 300w\" sizes=\"auto, (max-width: 586px) 100vw, 586px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"344\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitierecran3d.png\" alt=\"\" class=\"wp-image-2912\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitierecran3d.png 575w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/boitierecran3d-300x179.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"575\" height=\"486\" src=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/contenantdeeau3d.png\" alt=\"\" class=\"wp-image-2913\" srcset=\"https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/contenantdeeau3d.png 575w, https:\/\/tgemaisonneuve.com\/wp-content\/uploads\/2026\/04\/contenantdeeau3d-300x254.png 300w\" sizes=\"auto, (max-width: 575px) 100vw, 575px\" \/><\/figure>\n<\/div>\n\n\n\n<h1 class=\"wp-block-heading\"><strong>Programmation<\/strong><\/h1>\n\n\n\n<p>On a programm\u00e9 avec Arduino, le programme se trouve sur le lien ci dessous:<\/p>\n\n\n<style>.kb-block-show-more-container2794_15c382-5b > .kb-show-more-sr-excerpt{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;}.kb-block-show-more-container2794_15c382-5b > .wp-block-kadence-advancedbtn{margin-top:1em;}.kb-block-show-more-container2794_15c382-5b > .wp-block-kadence-advancedbtn .kt-btn-wrap:nth-child(2), .kb-block-show-more-container2794_15c382-5b > .wp-block-kadence-advancedbtn .wp-block-kadence-singlebtn:nth-of-type(2){display:none;}.kb-block-show-more-container2794_15c382-5b > .wp-block-kadence-column{max-height:250px;overflow-y:hidden;}.kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-column{max-height:none;-webkit-mask-image:none;mask-image:none;overflow-y:unset;}.kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-advancedbtn .kt-btn-wrap:nth-child(1), .kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-advancedbtn .wp-block-kadence-singlebtn:nth-of-type(1){display:none;}.kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-advancedbtn .kt-btn-wrap:nth-child(2), .kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-advancedbtn .wp-block-kadence-singlebtn:nth-of-type(2){display:inline-flex;}.kb-block-show-more-container2794_15c382-5b.kb-smc-open > .wp-block-kadence-advancedbtn.kt-force-btn-fullwidth .kt-btn-wrap:nth-child(2){display:block;}<\/style>\n<div class=\"wp-block-kadence-show-more kb-block-show-more-container kb-block-show-more-container2794_15c382-5b\"><div class=\"kb-show-more-sr-excerpt\" aria-live=\"polite\"><\/div><style>.kadence-column2794_0fb567-3c > .kt-inside-inner-col,.kadence-column2794_0fb567-3c > .kt-inside-inner-col:before{border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-right-radius:0px;border-bottom-left-radius:0px;}.kadence-column2794_0fb567-3c > .kt-inside-inner-col{column-gap:var(--global-kb-gap-sm, 1rem);}.kadence-column2794_0fb567-3c > .kt-inside-inner-col{flex-direction:column;}.kadence-column2794_0fb567-3c > .kt-inside-inner-col > .aligncenter{width:100%;}.kadence-column2794_0fb567-3c > .kt-inside-inner-col:before{opacity:0.3;}.kadence-column2794_0fb567-3c{position:relative;}@media all and (max-width: 1024px){.kadence-column2794_0fb567-3c > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}@media all and (max-width: 767px){.kadence-column2794_0fb567-3c > .kt-inside-inner-col{flex-direction:column;justify-content:center;}}<\/style>\n<div class=\"wp-block-kadence-column kadence-column2794_0fb567-3c kb-show-more-content\"><div class=\"kt-inside-inner-col\">\n<pre class=\"wp-block-code\"><code>#include &lt;Adafruit_Sensor.h&gt;\n#include &lt;WiFiS3.h&gt;\n#include &lt;Wire.h&gt;\n#include &lt;LiquidCrystal_I2C.h&gt;\n#include &lt;DHT.h&gt;\n\n\/\/ =======================\n\/\/ WIFI (connexion au r\u00e9seau + serveur web)\n\/\/ =======================\nchar ssid&#091;] = \"TCOM2026\";\nchar pass&#091;] = \"TCOM2026\";\nWiFiServer server(80);\nint status = WL_IDLE_STATUS;\n\n\/\/ =======================\n\/\/ MAT\u00c9RIEL (broches et capteurs utilis\u00e9s)\n\/\/ =======================\n#define DHTPIN 4\n#define DHTTYPE DHT22\n#define SOIL_MOISTURE_PIN A0\n#define WATER_PUMP_PIN 8\n\n\/\/ =======================\n\/\/ CALIBRATION DU CAPTEUR D'HUMIDIT\u00c9 DU SOL\n\/\/ =======================\nconst int SOIL_DRY = 700;      \/\/ valeur brute quand le sol est sec\nconst int SOIL_WET = 300;      \/\/ valeur brute quand le sol est tr\u00e8s humide\nconst int DRY_THRESHOLD = 40;  \/\/ seuil (%) pour d\u00e9clencher l\u2019arrosage en mode AUTO\n\n\/\/ =======================\n\/\/ PARAM\u00c8TRES DE TEMPS (en millisecondes)\n\/\/ =======================\nconst unsigned long PUMP_ON_MS = 1000;  \/\/ dur\u00e9e d\u2019activation de la pompe\nconst unsigned long SENSOR_MS  = 2000;  \/\/ intervalle de lecture des capteurs\nconst unsigned long LCD_MS     = 5000;  \/\/ intervalle de rafra\u00eechissement de l\u2019\u00e9cran LCD\n\n\/\/ =======================\n\/\/ OBJETS DES COMPOSANTS\n\/\/ =======================\nLiquidCrystal_I2C lcd(0x27, 16, 2);\nDHT dht(DHTPIN, DHTTYPE);\n\n\/\/ =======================\n\/\/ VARIABLES DES MESURES\n\/\/ =======================\nfloat temperature = 0.0;\nfloat humidity = 0.0;\nint soilRaw = 0;\nint soilPercent = 0;\nbool dhtOk = false;\n\n\/\/ =======================\n\/\/ MODES DE FONCTIONNEMENT DE LA POMPE\n\/\/ =======================\nenum PumpMode { AUTO, MANUAL_ON, MANUAL_OFF };\nPumpMode pumpMode = AUTO;\nbool pumpIsOn = false;\nunsigned long pumpStartMs = 0;\n\n\/\/ =======================\n\/\/ MINUTERIES\n\/\/ =======================\nunsigned long lastSensorMs = 0;\nunsigned long lastLcdMs = 0;\nint lcdScreen = 0;\n\n\/\/ =======================\n\/\/ FONCTIONS UTILITAIRES\n\/\/ =======================\nint soilToPercent(int raw) {\n  raw = constrain(raw, SOIL_WET, SOIL_DRY);\n  return map(raw, SOIL_DRY, SOIL_WET, 0, 100);\n}\n\nconst char* modeText() {\n  if (pumpMode == AUTO) return \"AUTO\";\n  if (pumpMode == MANUAL_ON) return \"MANUAL ON\";\n  return \"MANUAL OFF\";\n}\n\n\/\/ =======================\n\/\/ \u00c9CRAN LCD\n\/\/ =======================\nvoid lcdConnect() {\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"Connexion WiFi\");\n  lcd.setCursor(0, 1);\n  lcd.print(ssid);\n}\n\nvoid lcdIP() {\n  lcd.clear();\n  lcd.setCursor(0, 0);\n  lcd.print(\"IP:\");\n  lcd.setCursor(0, 1);\n  lcd.print(WiFi.localIP());\n}\n\n\/\/ =======================\n\/\/ LECTURE DES CAPTEURS\n\/\/ =======================\nvoid readSensors() {\n  humidity = dht.readHumidity();\n  temperature = dht.readTemperature();\n\n  soilRaw = analogRead(SOIL_MOISTURE_PIN);\n  soilPercent = soilToPercent(soilRaw);\n\n  dhtOk = !(isnan(temperature) || isnan(humidity));\n}\n\n\/\/ =======================\n\/\/ GESTION DE LA POMPE\n\/\/ =======================\nvoid handlePump(unsigned long now) {\n  if (pumpMode == MANUAL_ON) {\n    digitalWrite(WATER_PUMP_PIN, HIGH);\n    pumpIsOn = true;\n    return;\n  }\n\n  if (pumpMode == MANUAL_OFF) {\n    digitalWrite(WATER_PUMP_PIN, LOW);\n    pumpIsOn = false;\n    return;\n  }\n\n  \/\/ Mode AUTO\n  if (soilPercent &lt; DRY_THRESHOLD &amp;&amp; !pumpIsOn) {\n    digitalWrite(WATER_PUMP_PIN, HIGH);\n    pumpIsOn = true;\n    pumpStartMs = now;\n  }\n\n  if (pumpIsOn &amp;&amp; (now - pumpStartMs &gt;= PUMP_ON_MS)) {\n    digitalWrite(WATER_PUMP_PIN, LOW);\n    pumpIsOn = false;\n  }\n}\n\n\/\/ =======================\n\/\/ MISE \u00c0 JOUR DU LCD\n\/\/ =======================\nvoid updateLCD(unsigned long now) {\n  if (now - lastLcdMs &lt; LCD_MS) return;\n  lastLcdMs = now;\n\n  lcd.clear();\n\n  if (lcdScreen == 0) {\n    \/\/ \u00c9cran 1 : temp\u00e9rature + humidit\u00e9\n    if (dhtOk) {\n      lcd.setCursor(0, 0);\n      lcd.print(\"T:\");\n      lcd.print(temperature, 1);\n      lcd.print((char)223);\n      lcd.print(\"C\");\n\n      lcd.setCursor(0, 1);\n      lcd.print(\"H:\");\n      lcd.print(humidity, 0);\n      lcd.print(\"%\");\n    } else {\n      lcd.setCursor(0, 0);\n      lcd.print(\"DHT ERREUR\");\n    }\n  }\n  else if (lcdScreen == 1) {\n    \/\/ \u00c9cran 2 : humidit\u00e9 sol + pompe\n    lcd.setCursor(0, 0);\n    lcd.print(\"Sol:\");\n    lcd.print(soilPercent);\n    lcd.print(\"%\");\n\n    lcd.setCursor(0, 1);\n    lcd.print(\"Pompe:\");\n    lcd.print(pumpIsOn ? \"ON\" : \"OFF\");\n  }\n  else {\n    \/\/ \u00c9cran 3 : mode + IP\n    lcd.setCursor(0, 0);\n    lcd.print(\"Mode:\");\n    lcd.print(modeText());\n\n    lcd.setCursor(0, 1);\n    lcd.print(WiFi.localIP());\n  }\n\n  lcdScreen = (lcdScreen + 1) % 3;\n}\n\n\/\/ =======================\n\/\/ ENVOI JSON\n\/\/ =======================\nvoid sendJSON(WiFiClient &amp;c) {\n  c.println(\"HTTP\/1.1 200 OK\");\n  c.println(\"Content-Type: application\/json\");\n  c.println(\"Connection: close\");\n  c.println();\n\n  c.print(\"{\\\"temp\\\":\");\n  c.print(dhtOk ? temperature : 0);\n\n  c.print(\",\\\"hum\\\":\");\n  c.print(dhtOk ? humidity : 0);\n\n  c.print(\",\\\"soil\\\":\");\n  c.print(soilPercent);\n\n  c.print(\",\\\"pump\\\":\");\n  c.print(pumpIsOn ? \"true\" : \"false\");\n\n  c.print(\",\\\"mode\\\":\\\"\");\n  c.print(modeText());\n  c.print(\"\\\"}\");\n}\n\n\/\/ =======================\n\/\/ ENVOI PAGE WEB\n\/\/ =======================\nvoid sendPage(WiFiClient &amp;c) {\n  c.println(\"HTTP\/1.1 200 OK\");\n  c.println(\"Content-Type: text\/html; charset=utf-8\");\n  c.println(\"Connection: close\");\n  c.println();\n\n  c.println(R\"rawliteral(\n&lt;!doctype html&gt;\n&lt;html lang=\"fr\"&gt;\n&lt;head&gt;\n&lt;meta charset=\"utf-8\"&gt;\n&lt;meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"&gt;\n&lt;title&gt;PROJET OBED MARIANE&lt;\/title&gt;\n\n&lt;style&gt;\n:root{\n  --blue:#19a7ff;\n  --bg:#f3f6fb;\n  --card:#ffffff;\n  --text:#1f2a37;\n  --muted:#6b7280;\n  --shadow:0 10px 30px rgba(0,0,0,.08);\n  --radius:14px;\n}\n*{box-sizing:border-box}\nbody{\n  margin:0;\n  font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif;\n  background:var(--bg);\n  color:var(--text);\n}\n.topbar{\n  height:64px;\n  background:var(--blue);\n  color:#fff;\n  display:flex;\n  align-items:center;\n  padding:0 18px;\n  font-weight:800;\n  letter-spacing:.2px;\n  box-shadow:0 6px 16px rgba(25,167,255,.35);\n}\n.wrap{display:flex; min-height:calc(100vh - 64px);}\n.sidebar{\n  width:240px;\n  background:#fff;\n  box-shadow: 6px 0 16px rgba(0,0,0,.04);\n  padding:18px 14px;\n}\n.brand{\n  display:flex; gap:10px; align-items:center;\n  padding:6px 8px 14px;\n  border-bottom:1px solid #eef2f7;\n  margin-bottom:12px;\n}\n.logo{\n  width:38px;height:38px;border-radius:10px;\n  background: linear-gradient(135deg, #ffb703, #fb8500);\n}\n.brand b{display:block; line-height:1.1}\n.brand small{color:var(--muted); font-weight:700}\n.nav a{\n  display:flex; gap:10px; align-items:center;\n  padding:10px 10px;\n  border-radius:10px;\n  text-decoration:none;\n  color:var(--text);\n  font-weight:750;\n}\n.nav a:hover{background:#f3f6fb}\n.nav .active{background:#eaf6ff; color:#0b76c9}\n.icon{width:18px;height:18px;border-radius:5px;background:#e5e7eb}\n.main{flex:1; padding:18px;}\n.header{\n  display:flex; align-items:flex-end; justify-content:space-between;\n  gap:14px; margin-bottom:14px;\n}\n.header h1{margin:0;font-size:28px}\n.header p{margin:4px 0 0;color:var(--muted);font-weight:650;font-size:13px}\n.kpis{\n  display:grid;\n  grid-template-columns: repeat(3, 1fr);\n  gap:12px;\n}\n.kpi{\n  background:var(--card);\n  border-radius:var(--radius);\n  box-shadow:var(--shadow);\n  padding:12px;\n  min-height:140px;\n}\n.kpi .label{color:var(--muted); font-weight:750; font-size:12px; margin-top:8px}\n.kpi .big{font-size:18px; font-weight:900; margin-top:2px}\n.donut{\n  width:86px;height:86px; position:relative;\n  display:grid; place-items:center; margin:auto;\n}\n.donut svg{transform:rotate(-90deg)}\n.donut .center{\n  position:absolute; text-align:center;\n  font-weight:900; font-size:14px;\n}\n.donut .center small{\n  display:block; font-weight:750; color:var(--muted); font-size:10px\n}\n.card{\n  background:var(--card);\n  border-radius:var(--radius);\n  box-shadow:var(--shadow);\n  padding:14px;\n  margin-top:14px;\n}\n.card h3{margin:0 0 10px;font-size:14px;color:#374151}\n.row{\n  display:flex; align-items:center; justify-content:space-between;\n  padding:10px 0;\n  border-bottom:1px solid #eef2f7;\n}\n.row:last-child{border-bottom:none}\n.k{color:var(--muted); font-weight:700}\n.v{font-weight:900}\n.controls{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}\n.btn{\n  flex:1; min-width:120px;\n  padding:12px 12px;\n  border:none;\n  border-radius:12px;\n  font-weight:900;\n  font-size:14px;\n  cursor:pointer;\n  box-shadow:0 10px 22px rgba(0,0,0,.08);\n}\n.btn:active{transform:translateY(1px)}\n.auto{background:#22c55e;color:#fff}\n.on{background:#3b82f6;color:#fff}\n.off{background:#ef4444;color:#fff}\n.badge{\n  display:inline-flex; align-items:center; gap:8px;\n  padding:8px 10px;\n  border-radius:999px;\n  background:#fff;\n  box-shadow:var(--shadow);\n  font-weight:900;\n}\n.dot{width:10px;height:10px;border-radius:999px;background:#9ca3af}\n.dot.on{background:#22c55e}\n.dot.off{background:#ef4444}\n@media (max-width: 920px){\n  .sidebar{display:none}\n  .kpis{grid-template-columns:1fr}\n}\n&lt;\/style&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n  &lt;div class=\"topbar\"&gt;PROJET OBED MARIANE&lt;\/div&gt;\n\n  &lt;div class=\"wrap\"&gt;\n    &lt;aside class=\"sidebar\"&gt;\n      &lt;div class=\"brand\"&gt;\n        &lt;div class=\"logo\"&gt;&lt;\/div&gt;\n        &lt;div&gt;\n          &lt;b&gt;IRRIGATION INTELLIGENT&lt;\/b&gt;\n          &lt;small&gt;UNO R4 WiFi&lt;\/small&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n      &lt;nav class=\"nav\"&gt;\n        &lt;a class=\"active\" href=\"#\"&gt;&lt;span class=\"icon\"&gt;&lt;\/span&gt;Tableau&lt;\/a&gt;\n      &lt;\/nav&gt;\n    &lt;\/aside&gt;\n\n    &lt;main class=\"main\"&gt;\n      &lt;div class=\"header\"&gt;\n        &lt;div&gt;\n          &lt;h1&gt;Dashboard&lt;\/h1&gt;\n          &lt;p&gt;Syst\u00e8me d'irrigation intelligent&lt;\/p&gt;\n        &lt;\/div&gt;\n\n        &lt;div class=\"badge\"&gt;\n          &lt;span id=\"pumpDot\" class=\"dot off\"&gt;&lt;\/span&gt;\n          Pompe: &lt;span id=\"pState\"&gt;OFF&lt;\/span&gt; \u00b7 Mode: &lt;span id=\"mState\"&gt;AUTO&lt;\/span&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n\n      &lt;section class=\"kpis\"&gt;\n        &lt;div class=\"kpi\"&gt;\n          &lt;div class=\"donut\"&gt;\n            &lt;svg width=\"86\" height=\"86\" viewBox=\"0 0 100 100\"&gt;\n              &lt;circle cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#e5e7eb\" stroke-width=\"12\" fill=\"none\"\/&gt;\n              &lt;circle id=\"soilArc\" cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#ef4444\" stroke-width=\"12\" fill=\"none\"\n                      stroke-linecap=\"round\" stroke-dasharray=\"0 999\"\/&gt;\n            &lt;\/svg&gt;\n            &lt;div class=\"center\"&gt;&lt;span id=\"soilPct\"&gt;--&lt;\/span&gt;&lt;small&gt;Soil&lt;\/small&gt;&lt;\/div&gt;\n          &lt;\/div&gt;\n          &lt;div class=\"label\"&gt;Humidit\u00e9 du sol&lt;\/div&gt;\n          &lt;div class=\"big\"&gt;&lt;span id=\"sVal\"&gt;--&lt;\/span&gt; %&lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;div class=\"kpi\"&gt;\n          &lt;div class=\"donut\"&gt;\n            &lt;svg width=\"86\" height=\"86\" viewBox=\"0 0 100 100\"&gt;\n              &lt;circle cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#e5e7eb\" stroke-width=\"12\" fill=\"none\"\/&gt;\n              &lt;circle id=\"humArc\" cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#22c55e\" stroke-width=\"12\" fill=\"none\"\n                      stroke-linecap=\"round\" stroke-dasharray=\"0 999\"\/&gt;\n            &lt;\/svg&gt;\n            &lt;div class=\"center\"&gt;&lt;span id=\"humPct\"&gt;--&lt;\/span&gt;&lt;small&gt;Hum&lt;\/small&gt;&lt;\/div&gt;\n          &lt;\/div&gt;\n          &lt;div class=\"label\"&gt;Humidit\u00e9 (DHT22)&lt;\/div&gt;\n          &lt;div class=\"big\"&gt;&lt;span id=\"hVal\"&gt;--&lt;\/span&gt; %&lt;\/div&gt;\n        &lt;\/div&gt;\n\n        &lt;div class=\"kpi\"&gt;\n          &lt;div class=\"donut\"&gt;\n            &lt;svg width=\"86\" height=\"86\" viewBox=\"0 0 100 100\"&gt;\n              &lt;circle cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#e5e7eb\" stroke-width=\"12\" fill=\"none\"\/&gt;\n              &lt;circle id=\"tempArc\" cx=\"50\" cy=\"50\" r=\"38\" stroke=\"#3b82f6\" stroke-width=\"12\" fill=\"none\"\n                      stroke-linecap=\"round\" stroke-dasharray=\"0 999\"\/&gt;\n            &lt;\/svg&gt;\n            &lt;div class=\"center\"&gt;&lt;span id=\"tempPct\"&gt;--&lt;\/span&gt;&lt;small&gt;Temp&lt;\/small&gt;&lt;\/div&gt;\n          &lt;\/div&gt;\n          &lt;div class=\"label\"&gt;Temp\u00e9rature (DHT22)&lt;\/div&gt;\n          &lt;div class=\"big\"&gt;&lt;span id=\"tVal\"&gt;--&lt;\/span&gt; \u00b0C&lt;\/div&gt;\n        &lt;\/div&gt;\n      &lt;\/section&gt;\n\n      &lt;div class=\"card\"&gt;\n        &lt;h3&gt;\u00c9tat du syst\u00e8me&lt;\/h3&gt;\n        &lt;div class=\"row\"&gt;&lt;span class=\"k\"&gt;Temp\u00e9rature&lt;\/span&gt;&lt;span class=\"v\" id=\"t\"&gt;--&lt;\/span&gt;&lt;\/div&gt;\n        &lt;div class=\"row\"&gt;&lt;span class=\"k\"&gt;Humidit\u00e9&lt;\/span&gt;&lt;span class=\"v\" id=\"h\"&gt;--&lt;\/span&gt;&lt;\/div&gt;\n        &lt;div class=\"row\"&gt;&lt;span class=\"k\"&gt;Humidit\u00e9 sol&lt;\/span&gt;&lt;span class=\"v\" id=\"s\"&gt;--&lt;\/span&gt;&lt;\/div&gt;\n        &lt;div class=\"row\"&gt;&lt;span class=\"k\"&gt;Pompe&lt;\/span&gt;&lt;span class=\"v\" id=\"p\"&gt;--&lt;\/span&gt;&lt;\/div&gt;\n        &lt;div class=\"row\"&gt;&lt;span class=\"k\"&gt;Mode&lt;\/span&gt;&lt;span class=\"v\" id=\"m\"&gt;--&lt;\/span&gt;&lt;\/div&gt;\n\n        &lt;div class=\"controls\"&gt;\n          &lt;button class=\"btn auto\" onclick=\"setMode('auto')\"&gt;Mode AUTO&lt;\/button&gt;\n          &lt;button class=\"btn on\" onclick=\"setMode('on')\"&gt;Pompe ON&lt;\/button&gt;\n          &lt;button class=\"btn off\" onclick=\"setMode('off')\"&gt;Pompe OFF&lt;\/button&gt;\n        &lt;\/div&gt;\n      &lt;\/div&gt;\n    &lt;\/main&gt;\n  &lt;\/div&gt;\n\n&lt;script&gt;\nfunction setDonut(arcEl, pct, color){\n  pct = Math.max(0, Math.min(100, pct));\n  const r = 38;\n  const c = 2 * Math.PI * r;\n  arcEl.style.strokeDasharray = (c * pct \/ 100) + \" \" + c;\n  arcEl.style.stroke = color;\n}\n\nasync function refresh(){\n  try{\n    const r = await fetch('\/data', {cache:'no-store'});\n    const d = await r.json();\n\n    document.getElementById('t').textContent = d.temp + \" \u00b0C\";\n    document.getElementById('h').textContent = d.hum + \" %\";\n    document.getElementById('s').textContent = d.soil + \" %\";\n    document.getElementById('p').textContent = d.pump ? \"ON\" : \"OFF\";\n    document.getElementById('m').textContent = d.mode;\n\n    document.getElementById('pState').textContent = d.pump ? \"ON\" : \"OFF\";\n    document.getElementById('mState').textContent = d.mode;\n    document.getElementById('pumpDot').className = \"dot \" + (d.pump ? \"on\" : \"off\");\n\n    document.getElementById('tVal').textContent = d.temp;\n    document.getElementById('hVal').textContent = d.hum;\n    document.getElementById('sVal').textContent = d.soil;\n\n    const tempPctVal = Math.round((Math.min(50, Math.max(0, Number(d.temp))) \/ 50) * 100);\n    document.getElementById('tempPct').textContent = tempPctVal + \"%\";\n    document.getElementById('humPct').textContent = Number(d.hum) + \"%\";\n    document.getElementById('soilPct').textContent = Number(d.soil) + \"%\";\n\n    setDonut(document.getElementById('tempArc'), tempPctVal, \"#3b82f6\");\n    setDonut(document.getElementById('humArc'), Number(d.hum), \"#22c55e\");\n\n    const soilVal = Number(d.soil);\n    const soilColor = (soilVal &lt; 30) ? \"#ef4444\" : (soilVal &lt; 60) ? \"#f59e0b\" : \"#22c55e\";\n    setDonut(document.getElementById('soilArc'), soilVal, soilColor);\n  } catch(e) {}\n}\n\nasync function setMode(mode){\n  try{\n    await fetch('\/pump?mode=' + encodeURIComponent(mode), {cache:'no-store'});\n  } catch(e) {}\n  refresh();\n}\n\nsetInterval(refresh, 2000);\nrefresh();\n&lt;\/script&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\n)rawliteral\");\n}\n\n\/\/ =======================\n\/\/ INITIALISATION\n\/\/ =======================\nvoid setup() {\n  Serial.begin(9600);\n  dht.begin();\n\n  \/\/ Ent\u00eate CSV pour Excel \/ Data Streamer\n  Serial.println(\"Humidity,TempC,SoilPercent,Pump,Mode\");\n\n  pinMode(WATER_PUMP_PIN, OUTPUT);\n  digitalWrite(WATER_PUMP_PIN, LOW);\n\n  lcd.init();\n  lcd.backlight();\n\n  lcdConnect();\n\n  while (status != WL_CONNECTED) {\n    status = WiFi.begin(ssid, pass);\n    delay(8000);\n  }\n\n  server.begin();\n\n  lcdIP();\n  delay(2000);\n\n  \/\/ Lecture initiale\n  readSensors();\n}\n\n\/\/ =======================\n\/\/ BOUCLE PRINCIPALE\n\/\/ =======================\nvoid loop() {\n  unsigned long now = millis();\n\n  \/\/ Lecture p\u00e9riodique des capteurs + envoi CSV pour Excel\n  if (now - lastSensorMs &gt;= SENSOR_MS) {\n    lastSensorMs = now;\n    readSensors();\n\n    if (dhtOk) {\n      Serial.print(humidity, 1);\n      Serial.print(\",\");\n      Serial.print(temperature, 1);\n      Serial.print(\",\");\n      Serial.print(soilPercent);\n      Serial.print(\",\");\n      Serial.print(\",\");\n    } else {\n      Serial.println(\"ERROR,ERROR,ERROR,ERROR,ERROR\");\n    }\n  }\n\n  handlePump(now);\n  updateLCD(now);\n\n  WiFiClient c = server.available();\n  if (!c) return;\n\n  String req = c.readStringUntil('\\r');\n  c.readStringUntil('\\n');\n\n  while (c.available()) c.read();\n\n  if (req.indexOf(\"\/data\") &gt;= 0) {\n    sendJSON(c);\n  }\n  else if (req.indexOf(\"\/pump?mode=auto\") &gt;= 0) {\n    pumpMode = AUTO;\n    sendJSON(c);\n  }\n  else if (req.indexOf(\"\/pump?mode=on\") &gt;= 0) {\n    pumpMode = MANUAL_ON;\n    sendJSON(c);\n  }\n  else if (req.indexOf(\"\/pump?mode=off\") &gt;= 0) {\n    pumpMode = MANUAL_OFF;\n    sendJSON(c);\n  }\n  else {\n    sendPage(c);\n  }\n\n  c.stop();\n}<\/code><\/pre>\n<\/div><\/div>\n\n\n<style>.wp-block-kadence-advancedbtn.kb-btnsbutton-one-31{gap:var(--global-kb-gap-xs, 0.5rem );justify-content:flex-start;align-items:center;}.kt-btnsbutton-one-31 .kt-button{font-weight:normal;font-style:normal;}.kt-btnsbutton-one-31 .kt-btn-wrap-0{margin-right:5px;}.wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button{color:#555555;border-color:#555555;}.wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button:focus{color:#ffffff;border-color:#444444;}.wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button::before{display:none;}.wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button:hover, .wp-block-kadence-advancedbtn.kt-btnsbutton-one-31 .kt-btn-wrap-0 .kt-button:focus{background:#444444;}<\/style>\n<div class=\"wp-block-kadence-advancedbtn kb-buttons-wrap kb-btnsbutton-one-31 kb-show-more-buttons\"><style>ul.menu .wp-block-kadence-advancedbtn .kb-btn2794_226dad-f7.kb-button{width:initial;}<\/style><button class=\"kb-button kt-button button kb-btn2794_226dad-f7 kt-btn-size-small kt-btn-width-type-auto kb-btn-global-fill  kt-btn-has-text-true kt-btn-has-svg-false  wp-block-kadence-singlebtn\"><span class=\"kt-btn-inner-text\">Voir plus<\/span><\/button>\n\n<style>ul.menu .wp-block-kadence-advancedbtn .kb-btn2794_a01d47-39.kb-button{width:initial;}<\/style><button class=\"kb-button kt-button button kb-btn2794_a01d47-39 kt-btn-size-small kt-btn-width-type-auto kb-btn-global-fill  kt-btn-has-text-true kt-btn-has-svg-false  wp-block-kadence-singlebtn\"><span class=\"kt-btn-inner-text\">Afficher moins<\/span><\/button><\/div>\n<\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ce projet consiste \u00e0 concevoir un syst\u00e8me d&rsquo;irrigation intelligent avec une pompe immerg\u00e9 dans l&rsquo;eau pour arroser la plante lorsque le sol est sec et surveille en temps r\u00e9el l&rsquo;humidit\u00e9 du sol de la plante, l&rsquo;humidit\u00e9 et la temp\u00e9rature ambiante. Les donn\u00e9es sont affich\u00e9es sur un \u00e9cran LCD ainsi qu&rsquo;une interface web h\u00e9berg\u00e9e sur un&#8230;<\/p>\n","protected":false},"author":5422,"featured_media":2921,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[64,6],"tags":[73,70,40,35,21,12,7],"ppma_author":[154],"class_list":["post-2794","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projet-etudiant","category-projets","tag-arduino","tag-circuit","tag-diy","tag-impression-3d","tag-moteur","tag-programmation","tag-wifi"],"authors":[{"term_id":154,"user_id":5422,"is_guest":0,"slug":"marianeobed","display_name":"MarianeObed","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/537e6cb5e8f4995dd805e56424f2afdc60c2fdea8567931512474ca23811da8b?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/posts\/2794","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/users\/5422"}],"replies":[{"embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/comments?post=2794"}],"version-history":[{"count":19,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/posts\/2794\/revisions"}],"predecessor-version":[{"id":2932,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/posts\/2794\/revisions\/2932"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/media\/2921"}],"wp:attachment":[{"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/media?parent=2794"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/categories?post=2794"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/tags?post=2794"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/tgemaisonneuve.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=2794"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}