Système d’Irrigation Agricole Intelligent utilisant Arduino Edge Control
- Posted by Instructor
- Categories Blog, projet
- Date October 23, 2025
- Comments 0 comment
Introduction
L’agriculture a toujours été un élément clé du développement humain. L’humanité ne cesse de croître, et la demande pour une agriculture plus efficace, rentable et respectueuse de l’environnement constitue l’un des défis sur lesquels le secteur travaille depuis plusieurs années.
![]()
Chaque pot représente une zone d’irrigation individuelle capable d’arroser un champ de culture.
L’agriculture intelligente est aujourd’hui plus accessible que jamais grâce à la révolution technologique et l’introduction des objets connectés en agriculture. En tirant parti des capacités de contrôle, de l’analyse des données des capteurs et de la connectivité au Cloud, Arduino est parfaitement adapté à la gestion des applications agricoles.
La note d’application présentée vise à reproduire une version réduite d’une application d’agriculture intelligente, pouvant être mise en œuvre sur de véritables champs agricoles en utilisant le même matériel et le même micrologiciel.
Objectif
L’objectif de cette note d’application est de présenter un système d’irrigation agricole intelligent utilisant une combinaison d’un Edge Control, d’un MKR WiFi 1010 et de l’Arduino Cloud. Les objectifs du projet sont les suivants :
Contrôler indépendamment quatre zones d’irrigation à l’aide de vannes à bille motorisées.
Prélever l’eau d’un réservoir intelligent avec surveillance du niveau d’eau.
Programmer les minuteries d’irrigation à distance via Arduino Cloud, en utilisant la connectivité Wi-Fi®.
Activer manuellement l’irrigation depuis Arduino Cloud grâce à des widgets dédiés.
Surveiller le temps d’irrigation moyen et la consommation d’eau sur des graphiques dédiés dans Arduino Cloud.
Planifier l’irrigation en fonction des prévisions météorologiques, en intégrant une station météo basée sur une API dans Arduino Cloud.
Exigences matérielles et logicielles

Exigences matérielles
Arduino Edge Control
Arduino MKR WiFi 1010
Kit d’enclosure pour Arduino Edge Control
Capteur de niveau liquide à pression différentielle – 4-20 mA (0-1 mètre) submersible
Vannes à bille motorisées 2 fils (les versions 3 fils sont également supportées) (x4)
Alimentation 12 VDC (x1)
3,4 mètres de tuyaux PVC de 15 mm (x1)
Té en PVC de 15 mm (x3)
Coudes en PVC de 15 mm (x8)
Robinet manuel de 15 mm (x1)
Bouchons PVC de 15 mm (x4)
Raccords mâles PVC de 15 mm (x11)
Supports muraux pour tuyaux de 15 mm (x7)
Jardinières rectangulaires (x4)
Rail DIN (x1)
Presse-étoupes (x6)
Câble duplex AWG 18 de 6 mètres (x1)
Boîte de dérivation électrique (x1)
Réservoir d’eau (x1)
Exigences logicielles
Arduino IDE 1.8.10 ou version supérieure, Arduino IDE 2, ou Arduino Cloud Editor.
Si vous utilisez un Arduino IDE hors ligne, vous devez installer les bibliothèques suivantes :
Arduino_EdgeControl
ArduinoIoTCloud
Arduino_JSON
ArduinoJson
ArduinoHttpClient
Arduino_ConnectionsHandler.
Ces bibliothèques peuvent être installées via le gestionnaire de bibliothèques de l’IDE Arduino.
Les sketches Arduino du système d’irrigation intelligent.
Arduino Create Agent pour provisionner le MKR WiFi 1010 sur Arduino Cloud.
Installation du système d’irrigation intelligent
Les connexions électriques de l’application prévue sont illustrées dans le schéma ci-dessous :

Connexions électriques du système d’irrigation
La carte Edge Control sera alimentée par une alimentation externe de 12 VDC connectée respectivement à BATT+ et GND du connecteur J11.

Connexion de l’alimentation électrique
- Les quatre vannes à bille motorisées seront connectées aux sorties à verrouillage (Latching outputs) de la carte Edge Control, via le connecteur J9, de OUT0 à OUT6.

Détail de la connexion de la vanne 2 fils et du capteur 4-20 mA
Vous pouvez également utiliser des vannes motorisées à 3 fils sans aucune modification du code. Consultez ce guide pour plus de détails.
Le transmetteur de niveau d’eau sera connecté à la référence +19 V et à l’entrée 4-20 mA numéro un du connecteur J7.

Connexions physiques du projet
Vue d’ensemble du système d’irrigation intelligent
Le système d’irrigation fonctionne dans son ensemble : il intègre la mesure du niveau d’eau et l’activation des vannes, assurées par l’Edge Control, avec la communication Cloud, réalisée via le MKR WiFi 1010.
L’Edge Control est responsable du suivi du temps grâce à son horloge temps réel intégrée (RTC), afin de programmer l’utilisation des vannes et de savoir quand une journée s’est écoulée. De plus, cette configuration permet également de :
Mesurer le niveau d’eau du réservoir avec un transmetteur de niveau liquide 4-20 mA pour calculer la consommation.
Contrôler un écran LCD affichant le statut des vannes et des minuteries. De plus, le bouton poussoir du LCD peut être utilisé pour activer manuellement les vannes.
Par ailleurs, le MKR WiFi 1010 assure la communication entre le système et le Cloud. Il informe l’Edge Control de toute modification dans le Cloud afin d’activer, désactiver ou configurer une minuterie pour contrôler les vannes. En retour, il transmet les valeurs des capteurs de l’Edge Control vers le Cloud. La communication entre les deux appareils utilise le protocole I2C.

Système d’irrigation intelligent avec Edge Control
Contrôle des vannes
Si une vanne est activée depuis le Cloud, le message « ouverture de la vanne » s’affichera sur l’écran LCD lorsque la vanne s’ouvrira. Si la vanne est activée par une minuterie depuis le Cloud, l’affichage affichera le même message, incluant un compte à rebours du temps d’irrigation restant. Le temps de fonctionnement des vannes est suivi et reporté sur le Cloud afin de permettre une visualisation efficace de la consommation moyenne quotidienne.
Consommation d’eau
À chaque démarrage du système, la quantité d’eau actuelle est mesurée et enregistrée. Ainsi, toute diminution est comptabilisée comme de l’eau consommée. La consommation d’eau est réinitialisée chaque jour pour permettre de suivre la consommation moyenne quotidienne via un graphique dédié dans Arduino Cloud.
Prise en compte des prévisions météorologiques
Le système est capable de connaître les prévisions météorologiques grâce à l’utilisation du MKR WiFi 1010 et de l’API OpenWeather. Si la probabilité de pluie dépasse 90 %, les minuteries d’arrosage automatique seront ignorées et l’irrigation intelligente ne démarrera pas. Cependant, il restera possible d’irriguer manuellement si l’utilisateur le souhaite.
Code Arduino Edge Control
Passons en revue quelques sections importantes du code pour rendre cette application pleinement opérationnelle, en commençant par les bibliothèques nécessaires :
Arduino_EdgeControl.h : active la prise en charge des périphériques de l’Edge Control ; installez-la en la recherchant dans le gestionnaire de bibliothèques.
Wire.h : permet la communication I2C entre l’Edge Control, le MKR WiFi 1010 et les autres périphériques. Cette bibliothèque est incluse dans le Board Support Package (BSP) de l’Edge Control.
Deux fichiers d’en-tête supplémentaires sont inclus dans le code du projet pour gérer des fonctions et structures utilitaires :
SensorValues.hpp : gère les variables partagées entre l’Edge Control et le MKR WiFi 1010 via I2C.
helpers.h : gère les fonctions de l’horloge temps réel (RTC) pour récupérer la date et l’heure locales.
Cette section du code contient également la structure définie pour gérer le nombre d’appuis sur les boutons de l’enclosure, permettant de contrôler manuellement chaque vanne.
#include "Helpers.h"
#include <Arduino_EdgeControl.h>
#include <Wire.h>
#include "SensorValues.hpp"
// The MKR1 board I2C address
#define EDGE_I2C_ADDR 0x05
/** UI Management **/
// Button statuses
enum ButtonStatus : byte {
ZERO_TAP,
SINGLE_TAP,
DOUBLE_TAP,
TRIPLE_TAP,
QUAD_TAP,
FIVE_TAP,
LOT_OF_TAPS
};
Pour économiser de l’énergie et des ressources, l’Edge Control dispose de différentes lignes d’alimentation qui doivent être activées pour alimenter les périphériques internes et externes. Dans ce cas, les lignes 3,3 V, 5 V, batterie, slot MKR1, ainsi que la référence +19 V pour la boucle de courant 4-20 mA du capteur doivent être activées.
Pour gérer toutes les entrées/sorties, l’extendeur d’E/S (I/O Expander), ainsi que l’écran LCD du kit d’enclosure et les entrées des capteurs, doivent être initialisés.
Avec la fonction setSystemClock, une date de référence de départ pour l’horloge temps réel (RTC) est définie. Si vous souhaitez configurer l’heure du RTC selon votre fuseau horaire, utilisez la fonction commentée :
RealTimeClock.setEpoch(<Votre temps unix régional>);
en remplaçant le paramètre par le temps Unix (en secondes) correspondant à votre région.
Il suffit de configurer l’horloge RTC une seule fois et de vous assurer qu’une pile CR2032 3V est installée dans le support de l’Edge Control pour maintenir les réglages de la RTC.
/**
Main section setup
*/
void setup() {
EdgeControl.begin();
Wire.begin();
delay(500);
Serial.begin(115200);
Serial.println(“Init begin”);
// Enable power lines
Power.enable3V3();
Power.enable5V();
Power.on(PWR_3V3);
Power.on(PWR_VBAT);
Power.on(PWR_MKR1);
delay(5000); // wait for the MKR board to boot
Power.on(PWR_19V);
// Init Edge Control IO Expander
Serial.print(“IO Expander initializazion “);
if (!Expander.begin()) {
Serial.println(“failed.”);
Serial.println(“Please, be sure to enable gated 3V3 and 5V power rails”);
Serial.println(“via Power.enable3V3() and Power.enable5V().”);
} else Serial.println(“succeeded.”);
// LCD button definition
pinMode(POWER_ON, INPUT);
attachInterrupt(POWER_ON, buttonPress, RISING);
// Arduino Edge Control ports init
Input.begin();
Input.enable();
Latching.begin();
analogReadResolution(adcResolution);
setSystemClock(__DATE__, __TIME__); // define system time as a reference for the RTC
//RealTimeClock.setEpoch(1684803771-(3600*4)); // use this to set the RTC time once.
// Init the LCD display
LCD.begin(16, 2);
LCD.backlight();
LCD.home();
LCD.print(“Smart Irrigation”);
LCD.setCursor(5, 1);
LCD.print(“System”);
delay(2000);
LCD.clear();
}
Le contrôle manuel des vannes par bouton est géré par l’Edge Control en comptant le nombre d’appuis sur le bouton, puis en effectuant l’action appropriée via une structure switch case.
La fonction updateSensors() met à jour les variables système, y compris les états des vannes. Elle envoie les valeurs des capteurs locaux vers le Cloud et récupère les modifications en ligne pour assurer la synchronisation.
Pour mesurer le niveau d’eau, un capteur 4-20 mA (0 à 1 mètre) est utilisé, mais il faut d’abord convertir cette information de courant en centimètres. L’Edge Control convertit le courant du capteur en tension via une résistance interne de 220 ohms, qui est lue par l’ADC interne. Pour convertir cette tension en courant, on utilise l’équation suivante issue d’un capteur 4-20 mA :
y=16x+4y = 16x + 4y=16x+4
Avec :
xxx = niveau en mètres
yyy = courant en mA
On résout pour xxx :
x=y−416x = \frac{y – 4}{16}x=16y−4
Pour obtenir la valeur en centimètres, on multiplie par 100 :
x=(y−4)×10016=(y−4)×6,25x = (y – 4) \times \frac{100}{16} = (y – 4) \times 6,25x=(y−4)×16100=(y−4)×6,25
L’expression utilisée dans le sketch pour convertir la tension du capteur en centimètres est :
float w_level = ((voltsReference / 220.0 * 1000.0) - 4.0) * 6.25;
Pour suivre la tendance quotidienne du temps d’activation des vannes sur Arduino Cloud, le temps accumulé est réinitialisé chaque jour à minuit.
La fonction valvesHandler() active, désactive et suit le temps d’activité de chaque vanne de zone.
void loop() {
// LCD button taps detector function
detectTaps();// Different button taps handler
switch (buttonStatus) {
case ZERO_TAP: // will execute always when the button is not being pressed.
if (controlLCD == 1 && showTimeLCD == 0) {
ValvesStatusLCD(); // when there is not an active timer
controlLCD = 0;
}
if (showTimeLCD == 1) {
ValvesTimersLCD(); // when there is an active timer
}
break;
case SINGLE_TAP: // will execute when the button is pressed once.
Serial.println(“Single Tap”);
vals.z1_local = !vals.z1_local;
sendValues(&vals);
buttonStatus = ZERO_TAP;
break;
case DOUBLE_TAP: // will execute when the button is pressed twice.
Serial.println(“Double Tap”);
vals.z2_local = !vals.z2_local;
sendValues(&vals);
buttonStatus = ZERO_TAP;
break;
case TRIPLE_TAP: // will execute when the button is pressed three times.
Serial.println(“Triple Tap”);
vals.z3_local = !vals.z3_local;
sendValues(&vals);
buttonStatus = ZERO_TAP;
break;
case QUAD_TAP: // will execute when the button is pressed four times.
Serial.println(“Quad Tap”);
vals.z4_local = !vals.z4_local;
sendValues(&vals);
buttonStatus = ZERO_TAP;
break;
case FIVE_TAP: // will execute when the button is pressed five times.
Serial.println(“Five Tap”);
LCD.backlight();
LCD.home();
break;
default:
Serial.println(“Too Many Taps”);
buttonStatus = ZERO_TAP;
break;
}
// reset the valves’ accumulated active time every day at midnight
if (getLocalhour() == ” 00:00:00″) {
Serial.println(“Resetting accumulators every day”);
vals.z1_on_time = 0;
vals.z2_on_time = 0;
vals.z3_on_time = 0;
vals.z4_on_time = 0;
delay(1000);
}
unsigned long currentMillis = millis();
if (currentMillis – previousMillis >= interval) {
previousMillis = currentMillis;
//Serial.println(getLocalhour());
// send local sensors values and retrieve Cloud variables status back and forth
updateSensors();
}
// activate, deactivate and keep time of valves function
valvesHandler();
}
Code Arduino MKR WiFi 1010
La carte MKR WiFi 1010 nécessite les bibliothèques suivantes :
ArduinoIoTCloud.h : gère la connexion à Arduino Cloud et la publication des variables du projet. Peut être installée directement via le gestionnaire de bibliothèques Arduino.
Arduino_ConnectionHandler.h : gère la connexion Wi-Fi®, installable via le gestionnaire de bibliothèques Arduino.
ArduinoJson.h et Arduino_JSON : permettent de parser et créer des structures JSON pour les requêtes HTTP. Installables via le gestionnaire de bibliothèques Arduino.
ArduinoHttpClient.h : réalise les requêtes météo auprès de l’API OpenWeather. Installable via le gestionnaire de bibliothèques Arduino.
Wire.h : active la communication I2C entre l’Edge Control, le MKR WiFi 1010 et les autres périphériques. Inclus dans le BSP de la carte MKR WiFi 1010.
utility/wifi_drv.h : contrôle la LED RGB intégrée du MKR. Inclus dans le BSP de la carte MKR WiFi 1010.
Deux fichiers d’en-tête supplémentaires sont inclus dans le code du projet pour gérer certaines fonctions et structures utilitaires :
thingProperties.h : généré automatiquement par Arduino Cloud. Si vous utilisez un IDE hors ligne, assurez-vous qu’il se trouve dans le même dossier que votre sketch et qu’il inclut toutes les variables Arduino Cloud.
SensorValues.hpp : gère les variables partagées entre l’Edge Control et le MKR WiFi 1010 via I2C.
Dans les variables globales, l’adresse I2C de la carte MKR est définie. Elle doit être identique à celle définie dans le code de l’Edge Control. De plus, les dimensions du réservoir d’eau sont également configurées.
#include "thingProperties.h"
#include <ArduinoJson.h>
#include <Wire.h>
#include "SensorValues.hpp"
#include <utility/wifi_drv.h>
#include <ArduinoHttpClient.h>
#include <Arduino_JSON.h>
// The MKR1 board I2C address
#define SELF_I2C_ADDR 0x05
// Water tank constants
#define PI 3.1415926535897932384626433832795
#define radius 0.28 // in meters
Pour récupérer correctement les informations météo via l’API Open Weather, vous devez créer un compte sur leur site. Vous y obtiendrez une clé API unique, nécessaire pour formater vos requêtes HTTP.
Remplacez les variables city et countryCode par celles correspondant à votre localisation.
// OpenWeather server address:
const char serverAddress[] = "api.openweathermap.org";
int port = 443;
// Your OpenWeather API Key
String openWeatherMapApiKey = “<API Key>”;
// Replace with your country code and city
String city = “Santiago de los Caballeros”;
String countryCode = “DO”;
La carte MKR WiFi 1010 communique avec l’Arduino Cloud et vérifie les changements sur toutes les variables, des interrupteurs des vannes aux minuteries programmées. Elle allume sa LED en bleu lorsqu’elle est connectée avec succès au Cloud.
De plus, elle interroge les prévisions météo toutes les 10 minutes pour mettre à jour la température, l’humidité et la probabilité de pluie sur le tableau de bord Arduino Cloud.
void loop() {
// function that asks for timers scheduled on the Cloud
scheduleHandler();unsigned long currentMillis = millis();
if (currentMillis – previousMillis >= intervalStat) {
// save the last time you asked for connectivity status
previousMillis = currentMillis;
// Turn on the blue LED if the board is successfully connected to the Cloud.
if (ArduinoCloud.connected()) {
WiFiDrv::analogWrite(27, 122);
} else {
WiFiDrv::analogWrite(27, 0);
}
}
// doing this just once when a WiFi connection is established
if (bootForecast == 1 && WiFi.status() == WL_CONNECTED) {
getForecast(); // request rain probability
getWeather(); // request temperature and humidity
bootForecast = 0;
}
if (millis() – lastRequest > interval) {
// request weather variables each interval
if (WiFi.status() == WL_CONNECTED) {
getForecast();
getWeather();
}
lastRequest = millis();
}
ArduinoCloud.update();
}
Le système doit être aussi rapide que possible lorsqu’une activation de vanne est demandée. Pour cette raison, chaque vanne dispose de sa propre fonction, appelée dès que son état change sur l’Arduino Cloud.
/*
Since Z1 is READ_WRITE variable, onZ1Change() is
executed every time a new value is received from IoT Cloud.
*/
void onZ1Change() {
// Add your code here to act upon Z1 change
Serial.println("Z1 changed!!");
SensorValues_t vals;
vals.z1_local = z1;
delay(1000);
}
La fonction *uploadValues(SensorValues_t vals) est exécutée à chaque fois que l’Edge Control demande des données au MKR via la communication I2C. Elle met à jour toutes les variables locales et celles partagées avec le Cloud, puis convertit la variable de niveau d’eau en volume d’eau en appliquant la formule du volume d’un cylindre :
v=πr2hv = \pi r^2 hv=πr2h
où :
rrr est le rayon du réservoir en mètres
hhh est la hauteur du réservoir en mètres
Comme rrr et hhh sont en mètres, le volume sera en mètres cubes (m³). Pour une meilleure compréhension de la quantité d’eau, le volume peut être converti en litres :
1 m3=1000 L1 \, m^3 = 1000 \, L1m3=1000L
Le capteur de niveau donne une sortie en centimètres, qu’on convertit en mètres en divisant par 100 :
h=water_level100h = \frac{\text{water\_level}}{100}h=100water_level
Pour obtenir le volume en litres, on calcule :
water_volume=π×r2×water_level100×1000\text{water\_volume} = \pi \times r^2 \times \frac{\text{water\_level}}{100} \times 1000water_volume=π×r2×100water_level×1000
Pour évaluer la consommation d’eau, le niveau initial de l’eau est enregistré comme référence. Toute mesure en dessous de ce niveau sera considérée comme de l’eau consommée, et la variable water_usage sera mise à jour en conséquence. Si le réservoir est rempli à nouveau, le nouveau niveau d’eau devient la nouvelle référence.
water_level = vals->water_level_local;
water_volume = PI * (radius) * (radius) * ((int)water_level/100) * 1000;
if (waterCtrl == 0) {
currentWater = water_volume;
Serial.println(“Initial Water Volume: “);
Serial.println(currentWater);
water_usage = 0;
waterCtrl = 1;
}
if (water_volume < currentWater) {
water_usage += currentWater – water_volume;
currentWater = water_volume;
} else if (water_volume > currentWater) {
currentWater = water_volume;
}
Le tableau de bord Arduino Cloud
En tirant parti d’Arduino Cloud, il est possible d’intégrer facilement un tableau de bord simple mais puissant pour surveiller et visualiser l’état du système à distance, offrant ainsi une interface homme-machine (IHM) professionnelle, comme illustré ci-dessous :

Tableau de bord du projet Arduino Cloud
Dans le tableau de bord Arduino Cloud, les variables du système peuvent être surveillées et contrôlées de la manière suivante :
La température, l’humidité et la probabilité de pluie sont affichées sous forme de jauges, montrant l’état actuel et les prévisions météo.
Chaque vanne motorisée peut être activée ou désactivée via un interrupteur dédié, accompagné d’un widget de planification pour définir des routines d’irrigation automatiques.
Le temps d’activation de chaque vanne est affiché dans un graphique en séries temporelles.
La consommation d’eau peut être suivie grâce à des widgets dédiés :
un widget affichant le niveau d’eau actuel en pourcentage (0-100 %) ;
un widget de volume d’eau indiquant les litres restants dans le réservoir ;
un widget de consommation d’eau montrant les litres consommés quotidiennement.

Tableau de bord du projet Arduino Cloud sur smartphone
Le tableau de bord est facilement accessible depuis un navigateur, un smartphone ou une tablette, permettant à l’utilisateur de recevoir une mise à jour instantanée sur l’état de l’irrigation, où qu’il soit.
Exemple complet du système d’irrigation intelligent
Tous les fichiers nécessaires pour reproduire cette application sont disponibles ci-dessous :
Le code complet est téléchargeable ici.
Fonctionnement du système d’irrigation
Vous trouverez ci-dessous quelques images et animations supplémentaires montrant comment le système fonctionne :

Irrigation manuelle de la zone un

Compte à rebours du minuteur d’irrigation automatique dans la zone deux (1,4 minute restante)

Zone deux après l’ouverture de la vanne motorisée

Conclusion
Dans cette note d’application, vous avez appris à concevoir un système d’irrigation intelligent capable d’arroser vos cultures automatiquement, manuellement ou à distance. Grâce à l’analyse météo en temps réel, vous pouvez éviter l’irrigation lors des périodes de pluie, ce qui permet d’économiser de l’eau et d’éviter les problèmes de sur-arrosage ou d’inondation.
L’Arduino Edge Control vous permet de mettre en œuvre facilement ce type de système agricole prêt pour un déploiement sur le terrain. Cependant, si l’accès au Wi-Fi® est limité dans votre zone, la connectivité peut être étendue en utilisant des cartes alternatives, comme l’Arduino MKR WAN 1310.
Grâce aux capacités de l’Edge Control à se connecter au Cloud et à être contrôlé à distance, c’est un excellent choix pour développer des solutions robustes et adaptées aux environnements agricoles exigeants.
Ce projet a été initialement publié sur le forum Arduino par Christopher Mendez.
You may also like
Projet de station météorologique avec Arduino
LMS WordPress plugin
