Communicateur de plantes intelligent : Bundle Arduino MKR IoT pour jardinage automatisé
Composants et fournitures
| Composant | Quantité |
|---|---|
| Bundle Arduino MKR IoT | 1 |
Applications et services en ligne
- Zapier (automatisation en ligne)
- ThingSpeak API (visualisation de données)
À propos de ce projet
Note : Ce tutoriel pourrait être obsolète, veuillez consulter ici pour une version plus récente.
Introduction
Comme l'a dit le poète anglais William Wordsworth : « Votre esprit est le jardin, vos pensées sont les graines, la récolte peut être fleurs ou mauvaises herbes. »
Garder ses plantes en vie est un défi car elles communiquent très mal. Une solution serait de les emporter partout, mais peu pratique pour un gros cactus ou un fougère. De plus, la plupart des plantes n'aiment pas le froid.
Après des mois à essayer de communiquer avec notre plante araignée (Chlorophytum), nous avons abandonné et utilisé les composants du MKR IoT Bundle pour créer un dispositif qui surveille à distance le bien-être de toute plante.
En résumé
Dans cette expérience, vous apprendrez à protéger vos plantes et assurer leur survie grâce à la magie Arduino. En surveillant l'humidité, la température et la lumière, vous pouvez garantir le bonheur de vos plantes. Le système peut envoyer des emails et des graphiques quotidiennement et vous notifier des besoins.
Composants utilisés
- Capteur de température TMP36
- Phototransistor (lumière)
- Capteur d'humidité DIY
Objectifs d'apprentissage
- Introduction au service d'automatisation Zapier
- Envoi de requêtes HTTP
- Gestion de l'horloge temps réel (RTC) et alarmes
- Construction d'un capteur d'humidité DIY
- Tracé de valeurs avec ThingSpeak #ProTips
- Styliser vos emails avec HTML et CSS #ProTips
- Tester les API avec PostMan #ProTips
Configuration de Zapier
Zapier est un outil d'automatisation en ligne qui gère facilement les APIs d'autres applications. Idéal pour combiner plusieurs tâches ou quand l'API souhaitée est trop complexe pour un Arduino.
Nous l'utiliserons pour envoyer un email avec les données récupérées de l'Arduino.
Étapes pour créer votre Zap :
- Créer un Webhook personnalisé comme déclencheur
- Tester le hook en ajoutant les paramètres à l'URL :
votre_webhook_URL?temperature=0&moisture=0&light=0&warning=0 - Copier-coller l'URL dans un navigateur pour tester
- Configurer l'action « Envoyer un email » via Gmail
- Personnaliser le corps de l'email avec les variables de la requête
Félicitations ! Vous venez d'envoyer une requête HTTP ! C'est exactement ce que fera notre carte Arduino, mais en envoyant directement l'URL au serveur Zapier avec les vraies valeurs des capteurs.
Configuration de la carte
Bibliothèques nécessaires :
- WiFi101 (connexion Internet et scan réseaux)
- RTCZero (gestion événements temporels)
Disponibles dans le gestionnaire de bibliothèques.
Pour utiliser l'API Zapier, il faut uploader les certificats sur le MKR1000 (valable pour la plupart des services en ligne).
Uploader l'exemple FirmwareUpdater de la bibliothèque WiFi101 et ajouter hooks.zapier.com aux domaines.
> Exemples > WiFi101 > FirmwareUpdater
Si vous utilisez l'Arduino Web Editor, cette fonctionnalité n'est pas encore implémentée, utilisez l'application de bureau Arduino.
Envoi de requête HTTP
Nous sommes prêts à envoyer la requête HTTP depuis l'Arduino. Pour l'instant, valeurs arbitraires qui seront remplacées par les vraies valeurs des capteurs.
float temperature = 22;
int moisture = 150;
int light = 40;
String warning = "This is a warning message";
warning.replace(" ", "%20"); // Encodage URL : espaces → %20
#include <WiFi101.h>
#include <WiFiSSLClient.h>
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
String httpsRequest = SECRET_REQUEST; // Votre URL Zapier
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void setup() {
Serial.begin(9600);
while (!Serial); delay(2000);
Serial.print("Connexion WiFi: "); Serial.println(ssid);
while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); }
Serial.println(""); Serial.println("WiFi connecté");
}
void loop() {
float temperature = 22;
int moisture = 150;
int light = 40;
String warning = "This is a warning message";
warning.replace(" ", "%20");
send_email(temperature, moisture, light, warning);
delay(20000);
}
void send_email(float temperature, int moisture, int light, String warning) {
String _temperature = String(temperature);
String _moisture = String(moisture);
String _light = String(light);
String _warning = warning;
if (client.connect(host, 443)) {
client.println("POST " + httpsRequest + "?temperature=" + _temperature + "&moisture=" + _moisture + "&light=" + _light + "&warning=" + _warning + " HTTP/1.1");
client.println("Host: " + String(host));
client.println("Connection: close");
client.println();
delay(1000);
while (client.available()) {
char c = client.read();
Serial.write(c);
}
client.stop();
} else {
Serial.println("Échec connexion au client");
}
}
Enverra un email toutes les 20 secondes. Attention : Zapier limite à 100 requêtes gratuites par mois.
RTC et alarmes
L'horloge temps réel du MKR1000 permet d'envoyer un email chaque jour à une heure précise. Ce sketch règle l'heure au 4 décembre 2017 16:00 et déclenche une alarme quotidienne à 16:01.
Comme l'alarme est attachée à une fonction d'interruption, pas de délais autorisés, mais on peut utiliser une variable booléenne pour déclencher des actions dans loop().
#include <RTCZero.h>
RTCZero rtc;
const byte seconds = 0, minutes = 0, hours = 16;
const byte day = 4, month = 12, year = 17;
bool email_already_sent = false;
void setup() {
Serial.begin(9600); while (!Serial); delay(2000);
rtc.begin();
rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);
rtc.setAlarmTime(16, 1, 0);
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmMatch);
}
void loop() {
if (!email_already_sent) { /* send_email(); */ email_already_sent = true; }
}
void alarmMatch() {
Serial.println("Alarme déclenchée !");
email_already_sent = false;
}
Capteur d'humidité du sol DIY
Deux fils dans le pot forment une résistance variable dont la résistance varie selon l'humidité du sol. Connectés en diviseur de tension, l'Arduino lit une tension proportionnelle à la résistance entre les deux fils.
Plus le sol est humide, moins la tension mesurée sera élevée.
Avec une résistance de 1 MΩ et deux fils, on crée notre capteur d'humidité DIY !
Uploader le sketch suivant pour lire les valeurs. Testez d'abord dans un sol sec et notez la valeur pour définir un seuil : l'Arduino saura quand vos plantes ont soif et enverra un email d'urgence.
int moisturePin = A2;
int threshold = 800; // À calibrer selon votre résistance
void setup() { Serial.begin(9600); while (!Serial); delay(2000); }
void loop() { Serial.println(get_average_moisture()); delay(5000); }
int get_average_moisture() {
int tempValue = 0;
for (int a = 0; a < 10; a++) {
tempValue += analogRead(moisturePin);
delay(100);
}
return tempValue / 10;
}
Ajouter capteurs de température et lumière
Voir le schéma pour le câblage. Fonctions de lecture :
float get_temperature() {
int reading = analogRead(A1);
float voltage = reading * 3.3 / 1024.0;
float temperatureC = (voltage - 0.5) * 100; // 10 mV/°C avec offset 500 mV
return temperatureC;
}
int get_light() {
return analogRead(A0);
}
#ProTip : Tracer les valeurs avec ThingSpeak
Pour visualiser toutes les données collectées en beaux graphiques. Étapes : créer un compte ThingSpeak, nouveau channel, activer les champs 1-3 (lumière, température, humidité), noter l'API Key d'écriture.
Télécharger la bibliothèque ThingSpeak. Ce sketch uploade les valeurs toutes les minutes :
#include <WiFi101.h>
#include <WiFiSSLClient.h>
#include "ThingSpeak.h"
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
WiFiClient ThingSpeakClient;
unsigned long myChannelNumber = 356392;
const char * myWriteAPIKey = SECRET_WRITE_API;
void setup() {
Serial.begin(9600); while (!Serial); delay(2000);
Serial.print("Connexion WiFi: "); Serial.println(ssid);
while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); }
Serial.println("WiFi connecté");
ThingSpeak.begin(ThingSpeakClient);
}
void loop() {
ThingSpeak.setField(1, get_light());
ThingSpeak.setField(2, get_temperature());
ThingSpeak.setField(3, get_average_moisture());
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
Serial.println("Message envoyé au cloud");
delay(60000);
}
Dans le sketch complet Pro, cet upload est attaché à une alarme RTC déclenchée chaque minute.
Malheureusement Gmail n'autorise pas l'intégration de graphiques/iframes dans le corps de l'email, mais on peut envoyer le lien via un beau bouton.
#ProTip : Styliser votre email
Zapier permet d'intégrer du HTML et CSS dans le corps de l'email pour de jolis emails stylisés.
Pour ce faire : changer le type de corps en HTML sur l'interface Zapier et ajouter votre HTML/CSS personnalisé.
<!doctype html>
<html><head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.container{ margin: 0 10%; background:#ECF1F1; min-height:100%; padding:5% 0 10%; font-family:monospace; letter-spacing:2px; }
.title{ text-align:center; color:#0CA1A6; font-size:1.5em; padding-top:0.2vh; }
.subtitle{ text-align:center; color:#0CA1A6; font-size:1.1em; padding:0 4% 4%; }
.data{ padding:2% 5%; margin:0 15%; background:#F7F9F9; text-align:left; color:#4E5B61; font-size:1em; font-weight:bold; }
.bttn{ padding:3%; margin:10% 25%; background:#00979D; text-align:center; color:#F7F9F9; font-size:1.4em; }
.disclaimer{ text-align:center; color:#DA5B4A; font-size:1.1em; font-weight:bold; margin-top:10%; }
.bttn:hover{ background:#008184; }
a{ text-decoration:none; }
</style></head><body>
<div class="container">
<h2 class="title">BONJOUR !</h2>
<h4 class="subtitle">Voici votre mise à jour quotidienne sur votre jardin ☘</h4>
<div class="data">♨ Température: {{querystring__temperature}} C</div>
<div id="humidity" class="data">☔ Humidité: {{querystring__moisture}}</div>
<div class="data">☀ Lumière: {{querystring__light}}</div>
<div class="disclaimer">{{querystring__warning}}</div>
<a href="votre_lien_ThingSpeak"><div class="bttn">VOIR LE GRAPHIQUE</div></a>
</div></body></html>
#ProTip : Tester l'API avec PostMan
Travailler avec des requêtes HTTP peut être difficile. Postman est un excellent outil : collez l'URL initiale de Zapier, ajoutez les paramètres et envoyez. Il affiche la réponse du serveur et compose l'URL pour vous.
Code complet
Sketch complet avec tous les #ProTips intégrés (RTC, ThingSpeak, email HTML, capteurs).
Schémas

Processus de fabrication
- Maîtriser la syntaxe des netlists SPICE : nommage, composants passifs/actifs, sources
- Engrais : Science, Production et Avenirs Durables
- Lancement de Reliable Plant : Votre guide de référence pour l'excellence en maintenance
- Kit MOSMusic : MOSFET, Arduino et plus pour éclairage musical
- Maintenance d'Usine Démystifiée : Meilleures Pratiques pour Industries Modernes
- Débloquer la valeur des usines chimiques de base : stratégies de croissance
- Composants Essentiels d'une Perceuse : Vue d'Ensemble Complète
- Maîtriser la maintenance d'usine : pratiques éprouvées pour une production d'énergie fiable
- Composants clés d'un moteur à combustion interne