HydroMazing : Système de jardin intelligent IoT – Soins avancés pour plantes
Composants et fournitures
| Composant | Quantité | Notes |
|---|---|---|
| Raspberry Pi 3 Model B | 1 | Optionnel – IoT, envoi SMS |
| Arduino Nano R3 | 2 | |
| Shield d'extension Arduino Nano | 2 | |
| Capteur température/humidité DHT21/22 | 1 | Peut nécessiter résistance 10k entre Vcc/Data |
| Module photorésistance (capteur de lumière) | 1 | |
| Module radio nRF24L01 2,4GHz | 1 | Avec ou sans antenne SMA |
| Sonde température Dallas (pour solution nutritive) | 1 | Nécessite probablement un connecteur |
| Modules émetteur/récepteur RF 433MHz | 1 | |
| Kit 3-5 prises commandées sans fil avec télécommande | 1 | |
| Écran LCD avec boutons DFRobot pour Arduino Uno | 1 |
Outils nécessaires
- Fer à souder
Applications et services en ligne
- Arduino IDE
- Microsoft Visual Studio 2015
À propos du projet
Je n'avais pas l'intention de faire un produit. Je voulais simplement résoudre un problème courant : faire pousser des plantes en intérieur ou en conditions contrôlées. Comment créer un environnement optimal pour que les plantes prospèrent avec de l'électronique courante et des objets du quotidien ? Terre ou hydroponie ?
hydroMazing est un outil pour faciliter la fourniture de conditions de culture optimales pour réussir ses plantes à la maison. Un système de collecte de données indépendant et une interface web sur votre propre appareil, pas sur un cloud distant.
Apprendre à cultiver peut être compliqué et coûteux. Les plantes sont résilientes, mais une seule omission peut ruiner la récolte. Évitez ces erreurs coûteuses en laissant un système de jardinage intelligent faire le travail difficile !
Automatisation domestique
L'idée d'utiliser des prises commandées sans fil avec télécommande me trottait dans la tête. Pirater la télécommande pour envoyer le signal ON/OFF sélectionné par une broche de l'Arduino ne devrait pas être trop difficile, non ? La crainte que le signal ne soit pas fiable m'a freiné. Finalement, j'ai testé. Les résultats n'étaient guère meilleurs que la tentative avec relais.
Une recherche web pour « Arduino » + tout capteur donne des produits à quelques euros. J'ai trouvé les paires émetteur/récepteur 315/433MHz dans la gamme de fréquence des prises commerciales. L'avantage d'Arduino : des bibliothèques open-source pour démarrer. J'ai pu lire les codes de la télécommande, les enregistrer, et programmer l'Arduino pour piloter les prises correspondantes.
Concevoir le logiciel pour l'Arduino Uno est devenu le défi. Les exemples fournis sont un bon début, mais combiner et modifier mène vite à un mur. Je ne suis pas un bon programmeur, je suis un perfectionniste obstiné.
Dans Zen and the Art of Motorcycle Maintenance, Robert Pirsig parle du « piège à ardeur » (gumption trap) : événement ou état d'esprit qui fait perdre l'enthousiasme. Savoir quand persévérer ou faire une pause est un défi personnel. Parfois, une pause d'un mois sur un autre projet ravive l'énergie. Si le projet est assez important, on y revient. Le piège est de se convaincre qu'il ne vaut pas la peine, même s'il pourrait être extraordinaire.
Programmation
Le logiciel développé est programmé dans le microcontrôleur avec des paramètres de base pour la temporisation, la gestion, l'émission et la réception d'objets « capteur » et « appareil ». Le contrôle des appareils passe par des algorithmes nommés « TheDecider », qui décident d'allumer/éteindre les prises sans fil selon les lectures des capteurs et seuils programmés. Je voulais un système facilement modifiable pour aquaponie, culture de champignons, etc. – partout où le contrôle se fait par lecture de capteurs et action sur appareils selon des règles.
Les prises sans fil se sont révélées fiables pour piloter les ventilateurs via l'Arduino selon la sonde de température. Le code a vite grossi. La famille Arduino est limitée en instructions et la limite de taille de programme arrive vite quand on veut contrôler plus que quelques LED. Cette contrainte m'a forcé à écrire du code plus efficace. Même avec gestion créative des variables et bibliothèques personnalisées, il faut finalement un autre microcontrôleur ou un plus gros.
Surveillance sans fil sans Internet
Plusieurs façons pour les microcontrôleurs de communiquer. La moins chère : le transceiver radio nRF24L01. Faible consommation, léger, type Bluetooth, donne à hydroMazing la capacité de communiquer avec une unité de surveillance.
J'ai ajouté un autre Arduino Uno avec shield LCD pour afficher les lectures des capteurs, l'état des appareils, alertes et notifications. J'ai créé ma propre plateforme ouverte et adaptable, personnalisable pour une grande variété de besoins de jardinage, tout en étant un système sans fil autonome. L'architecture ouverte permet d'intégrer facilement la connectivité Internet et les services web.
Surveillance Internet
Arrive le Raspberry Pi connecté avec un module nRF24L01. J'ai adapté mon code Arduino pour écouter les transmissions entrantes et écrire les données dans des fichiers :
- Fichier log : toutes communications entre Pi et hydroMazing Monitor
- État actuel de tous les objets capteurs
- Fichier pour tous les objets appareils
- Fichier d'alerte quand une alerte survient
Un script PHP lit les objets de données depuis leurs fichiers et les affiche en direct sur le serveur Apache du Pi. Un script Python surveille le dossier des alertes : s'il existe, il le lit, extrait l'info et envoie un email ou SMS. Il déplace aussi le fichier d'alerte pour que le PHP l'affiche. Avec les logs, j'importe les données dans une base de données sur le Pi pour faire de l'analytique et générer des rapports. La surveillance et le contrôle sont mostly automatisés, mais hydroMazing peut maintenant alerter via le Pi.
L'assistant de jardin hydroMazing vous guide tout au long de votre culture ! Le système donne des retours et conseils pour gérer les problèmes identifiés. www.hydroMazing.com
Surveillance de la solution nutritive
Le niveau de la solution nutritive du système hydroponique doit être surveillé. S'il baisse, il faut le réapprovisionner en eau fraîche, sinon la solution se concentre et certaines plantes ne réagissent pas bien. Le contrôleur nutritif hydroMazing peut activer une pompe pour ajouter de l'eau fraîche et ramener la concentration au niveau initial (« top-off »). Il surveille aussi pH et EC, active des pompes pour gérer la solution, et vous notifie quand des changements sont nécessaires.
Envie d'en savoir plus ?
- Crise existentielle – Simulateur RPG Arduino
- Pourquoi DIY quand on peut acheter ?
- Qu'est-ce qu'un jardin « intelligent » ?
- Démarrer un jardin intelligent d'intérieur
- Creuser plus loin dans le jardinage d'intérieur
- Jardinage d'intérieur : que peut-il mal tourner ?
- Gérer les systèmes de solution nutritive
- Pourquoi Arduino quand on peut avoir un Pi ?
Code
Settings of objects – CoreSettings.h (C/C++)
Le fichier CoreSettings.h contient les paramètres critiques : réseau nRF, codes de la télécommande des prises, définitions des objets Timer, Appliance et Sensor utilisés par hydroMazing.
/* CoreSettings.h - Copyright (C) 2015 Cory J. Potter - All Rights Reserved
Licence : voir LICENSE.txt - PAS POUR USAGE COMMERCIAL ! */
#ifndef __CORESETTINGS_H__
#define __CORESETTINGS_H__
#ifdef ARDUINO
#define RX_PIN 103
#define TONE_PIN 104
#define TX_PIN 8
uint8_t node_address = 1;
uint8_t totalNodes = 3;
unsigned long lastRxTimeStamp = 0;
const uint64_t nRFbaseAddress = 1034834473100;
uint8_t nRFaddress = 0;
uint64_t tx_pipes[3] = { 0xF0F0F0F0F8LL, 0xF0F0F0F0F7LL, 0xF0F0F0F0F6LL };
uint64_t rx_pipes[3] = { 0xF0F0F0F0F1LL, 0xF0F0F0F0F2LL, 0xF0F0F0F0F3LL };
/************************************************************************/
// Prises commandées sans fil
/************************************************************************/
// ETEKCITY #0319
uint8_t totalSwitches = 5;
unsigned long mySwitchOn[] = {24, 333107, 333251, 333571, 335107, 341251};
unsigned long mySwitchOff[] = {24, 333116, 333260, 333580, 335116, 341260};
/************************************************************************/
/* Communications I2C */
/************************************************************************/
const int MY_ADDRESS = 42;
const int SEND_TO_ADDRESS = 22;
/************************************************************************/
/* Timers */
/************************************************************************/
Timer Timer_txData = { TIMER_TX_DATA, 30000UL, true, false, 0, NULL };
Timer Timer_Lcd = { TIMER_LCD, 12000UL, true, false, 0, &Timer_Log };
Timer Timer_Lcd_Cycle = { TIMER_LCD_CYCLE, 6000UL, true, false, 0, &Timer_Lcd };
Timer Timer_Lcd_Scroller = { TIMER_LCD_SCROLLER, 500UL, true, false, 0, &Timer_Lcd_Cycle };
Timer Timer_Save_Settings = { TIMER_SAVE_SETTINGS, 3600000UL, true, false, 0, &Timer_txData };
Timer Timer_Sensor_Read = { TIMER_SENSOR_READINGS, 7000UL, true, false, 0, &Timer_Save_Settings };
Timer Timer_Alerts = { TIMER_ALERTS, 45000UL, true, false, 0, &Timer_Sensor_Read };
Timer Timer_rxData = { TIMER_RX_DATA, 6000UL, true, false, 0, &Timer_Save_Settings };
/************************************************************************/
// Initialisation des appareils
/************************************************************************/
Appliance Appliance_Light_1 = {101, 1, APPLIANCE_LIGHT, DEFAULT_TIME, true, false, OFF, NULL };
Appliance Appliance_IntakeFan = {104, 1, APPLIANCE_INTAKE_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_Light_1 };
Appliance Appliance_ExhaustFan = {103, 1, APPLIANCE_EXHAUST_FAN, DEFAULT_TIME, true, false, OFF, &Appliance_IntakeFan };
Appliance Appliance_Humidifier = {102, 0, APPLIANCE_HUMIDIFIER, DEFAULT_TIME, true, false, OFF, &Appliance_ExhaustFan };
Appliance Appliance_Heater = {101, 0, APPLIANCE_HEATER, DEFAULT_TIME, true, false, OFF, &Appliance_Humidifier };
Appliance Appliance_FeedPump = {105, 1, APPLIANCE_PUMP, DEFAULT_TIME, true, false, OFF, &Appliance_Heater };
uint8_t totalAppliances = 6;
/************************************************************************/
// Initialisation des capteurs
/************************************************************************/
Sensor Sensor_Photocell = { PIN_A0, 1, SENSOR_PHOTO, 100, 50, 100, 0, 25, NULL };
Sensor Sensor_Temp = { PIN7, 1, SENSOR_TEMPF, 50, 70, 80, 0, 75, &Sensor_Photocell };
Sensor Sensor_Humidity = { PIN7, 1, SENSOR_HUMIDITY, 50, 40, 70, 0, 50, &Sensor_Temp };
Sensor Sensor_WaterTemp = { PIN3_INT1, 1, SENSOR_WATER_TEMPF, 100, 50, 70, 0, 65, &Sensor_Humidity };
Sensor Sensor_Flow = { PIN2_INT0, 2, SENSOR_FLOW, 100, 50, 50, 0, 75, &Sensor_WaterTemp };
Sensor Sensor_Float = { PIN_A2, 1, SENSOR_FLOAT, 100, 0, 1, 0, 1, &Sensor_Flow };
Sensor Sensor_Voltage = { PIN1_TX, 1, SENSOR_VOLTAGE, 100, 0, 100, 0, 50, &Sensor_Float };
uint8_t totalSensors = 7;
#endif
Schémas
Disponibles dans la section « Schémas » : ventilateurs d'entrée/sortie, lampes de culture, chauffages, déshumidificateurs, pompes commandés automatiquement via prises sans fil ; prises sans fil courantes utilisées ; assemblage et test ; interface web prototype hydroMazing ; interface d'alertes.
Processus de fabrication
- Surveillance de température professionnelle sur Raspberry Pi avec DS18B20
- Système de contrôle de température basé LM35 avec microcontrôleur AT89S52
- Utiliser un ADC MCP3008 pour lire des capteurs analogiques avec Raspberry Pi
- Combler le fossé des compétences smart home : pourquoi la Grande-Bretagne traîne l'Europe
- L'avenir de la vie urbaine : traits clés des smart cities émergentes – Partie 1
- Comment fonctionne l'ABS (système antiblocage des roues) : guide complet
- Comment fonctionnent les systèmes d'allumage électronique : guide complet
- Comment fonctionnent les systèmes d'allumage magnéto : principes clés et applications
- Le système de fabrication américain : histoire, techniques et impact