Des tomates pour l'apéro
Sommaire
Réalisation d'une serre connectée et partiellement automatisée.
Le but de ce projet est de réaliser une serre qui sera pilotée par une interface en ligne et qui sera partiellement automatisée pour créer un climat propice à la culture de fruit ou légume et ainsi ne plus tenir rigueur du milieu extérieur.
Modules disponibles
- Interface de monitoring de la serre
- Arrosage à distance.
- Gestion de l'éclairage.
- Possibilités de gérer l'air.
Participants
- Malo MORICE
- Alexandre CARON
- Guillaume HIVER
- Alexis CAILLARD
- Elie BITAULD
- Oscar MARIE--TAILLEFER
- Tom RICHER
- Pierre POULAIN
- Bastien BOULIC
Diaporama pour les présentations
Liste du matériel utilisé
- Deux boites
- 2 relais
- Deux cartes Wemos D1 mini
- Un ventilateur
- Un capteur d’humidité en sol
- Un capteur de température et d'humidité hors-sol
- Des câbles
- Un transformateur 230-12V
- Une photo-résistance
- Un servomoteur
- Des pochettes plastiques
- Un sac poubelle
- Terre
- Eau
Réalisation
Base de la serre
Pour la partie bricolage, nous commençons par prendre notre boîte.
La boîte est utilisée dans ce projet pour miniaturiser une serre. Les dimensions de la serre n'a donc pas d'importance tant qu'on a assez de place pour placé la partie électrique et les différents éléments d'une serre classique.
Nous utilisons un sac poubelle mis au fond de la boîte pour la rendre hermétique. Ensuite nous récupérons de la terre que nous disposons dans la boîte qui fera le sol de nôtre serre.
Mise en place du réservoir d'eau
Pour la mise en place du réservoir d'eau, nous allons utilisés un contenant hermétique. Sur ce contenant, nous perçons un trou qui va nous servir à insérer le tube pour distribuée l'eau. Nous insérons donc le tube et nous utilisons un pisto-colle pour fixer hermétiquement le tube au contenant.
Nous fixons ensuite l'autre extrémité du tube à un servomoteur.
La photo suivante représente la partie câblage du servomoteur
Construction d'un toit pour la serre
Pour crée le toit de la serre, nous avons utilisée des pochettes plastiques et des piques à brochette. Les piques à brochettes permettent de mettre en place la forme du toit.
On fixe ensuite les pochettes plastifiés pour obtenir le résultat suivant :
Annexe électrique
Pour stocker les composants électriques, nous avons décidé de crée un annexe. Nous avons donc pour cela utilisée un boîtier de lecteur CD que nous avons vidé. Ensuite, nous avons coupé une feuille de papier carton pour faire le fond et la porte.
Programme arduino
Nous avons repris le programme de base de la station Anna Mani, que l'on peut trouver ici : [1] Il a été modifié afin d'y ajouter la gestion du servo-moteur et du ventilateur.
/*--------------------------- DES TOMATES POUR L'APERO------------------------- Projet mené dans le cadre de l'intersemestre 3 de la formation ENIB. Les petits Débrouillards - CC-By-Sa http://creativecommons.org/licenses/by-nc-sa/3.0/ */ #include "DHT.h" #include <Servo.h> //servo for hydratation //Bibliothèques Wifi// #include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino #include <DNSServer.h> #include <ESP8266mDNS.h> #include <ESP8266WebServer.h> #include <WiFiManager.h> //https://github.com/tzapu/WiFiManager ESP8266WebServer server(80);//objet serveur const char* hostAP = "Tomatoes"; #define DHTPIN D2 // what digital pin we're connected to #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //for the dht : // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); //pin for moisture sensor int rainPin = A0; // you can adjust the threshold value int thresholdValue = 500; //450 //Publication sur Thingspeak // String apiKey = "7TNDBIW0NINZUDEO"; //c'est ici qu'on place la clé d'API de Thingspeak const char* serverpub = "api.thingspeak.com"; //adresse du serveur thingspeak pour publier WiFiClient client; //démarrage du client Wifi int tempo = 0; //création de la variable tempo, //servira à temporiser l'envoie de donnée à Thingspeak Servo hydroControl; //Variables : float hygrometrie ; float temperature ; int moistureValue; void setup() { Serial.begin(9600); Serial.println("DHT ready"); dht.begin(); hydroControl.attach(D1); // pin 9 : servo control hydroControl.write(5); // position: 0° /* //Auto connexion au cas ou le wemos ne trouve pas de réseau wifi "familier" WiFiManager wifiManager; wifiManager.autoConnect("AutoConnectAP"); Serial.println(""); Serial.println("WiFi connecté"); Serial.println("addresse IP : "); Serial.println(WiFi.localIP()); // impression sur le moniteur série de l'adresse IP du serveur du Wemos MDNS.begin(hostAP); MDNS.addService("http", "tcp", 80); server.begin(); // demarrage du serveur de fichiers */ } void Watering() { int timeWatering=6000; //temps d'arrosage en millisecondes hydroControl.write(150); //position "d'arrosage" delay(timeWatering); hydroControl.write(10); //position "par defaut" (pas d'arrosage) } void HumTemp(){ // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) hygrometrie = dht.readHumidity(); // Read temperature as Celsius (the default) temperature = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(hygrometrie) || isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); return; } float hic = dht.computeHeatIndex(temperature, hygrometrie, false); Serial.print("Humidity: "); Serial.print(hygrometrie); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(temperature); Serial.print(" *C "); Serial.print("Heat index: "); Serial.print(hic); Serial.println(" *C "); } void MoistureSensor() { // read the input on analog pin 0: moistureValue = analogRead(rainPin); Serial.print("Moisture Sensor's Resistor :"); Serial.println(moistureValue); if(moistureValue < thresholdValue){ Serial.println(" - Doesn't need watering"); } else { Serial.println(" - Time to water your plant"); Watering(); } delay(1000); } void thingspeak() { // Cette fonction envoie les données à Thingspeak if (client.connect(serverpub,80)) { // Contacte le site api.thingspeak.com Serial.println("go"); String URL = apiKey; // Construit l'URL en ajoutant les différents éléments URL +="&field1="; URL += String(temperature); URL +="&field3="; URL += String(moistureValue); URL +="&field4="; URL += String(hygrometrie); URL += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(URL.length()); client.print("\n\n"); client.print(URL); Serial.println("Température: "); Serial.print(temperature); Serial.print(" degrés Celcius, Hygrométrie: "); Serial.print(hygrometrie); Serial.println("Humidité terre "); Serial.print(moistureValue); Serial.println(" envoyés a Thingspeak"); Serial.println(URL); } client.stop(); } /* void serveur() { //Cette fonction nommée "Serveur" est celle qui va renvoyer les données lorsqu'on appelle les différentes pages // gestion de l'appel de la page http://adresseIP/temp // qui renvoit la valeur de la température mesurée par le capteur DHT11 server.on("/temp", HTTP_GET, []() { temperature = dht.readTemperature(); // Lit la température et l'affecte à la variable température server.send(200, "text/json", String(temperature)); // Renvoie une page web avec le contenu de la variable température }); // gestion de l'appel de la page http://adresseIP/hum // qui renvoit la valeur de l'hygrométrie mesurée par le capteur DHT11 server.on("/hum", HTTP_GET, []() { hygrometrie = dht.readHumidity(); // Lit l'hygrométrie et l'affecte à la variable hygrometrie server.send(200, "text/json", String(hygrometrie)); // Renvoie une page web avec le contenu de la variable hygrometrie }); // gestion de l'appel de la page http://adresseIP/analog // qui renvoit la valeur reçue par la broche analogique du wemos - A0 server.on("/analog", HTTP_GET, []() { int moistureValue = analogRead(A0); // Lit la broche analogique A0 et met la valeur dans la variable "analogique" Serial.println(moistureValue); // L'écrit sur le moniteur série server.send(200, "text/json", String(moistureValue));// Renvoie une page web avec le contenu de la variable "analogique" }); } */ void loop() { // Wait a few seconds between measurements. delay(1500); HumTemp(); MoistureSensor(); //server.handleClient(); thingspeak(); //serveur(); }
#include <ESP8266WiFi.h> int In = A0; int lumiere = 4; int lum = 0; void setup (){ Serial.begin(9600); pinMode(A0, INPUT); pinMode(lumiere, OUTPUT); } void loop(){ delay(100); lum = analogRead(In);//mesure de luminosité if(lum > 800)// si il fait sombre on allume la led { digitalWrite(lumiere, HIGH); } else//sinon on l'éteint { digitalWrite(lumiere,LOW); } }
ThingSpeak
Dans le cadre du projet, nous utilisons une chaine ThingSpeak pour connaître l'état de nôtre serre.
Nous allons donc obtenir sur cette chaine 4 champs :
- La température
- L'humidité de l'air
- L'humidité du sol
- La luminosité
Cela nous permet de savoir si la serre est fonctionnel ou non.
Pour recréer la chaîne, vous aurez besoin des données suivantes
Name : Serre automatisée Field 1 : Temperature Field 2 : Luminosité Field 3 : Humidité du sol Field 4 : Humidité de l'air
Après avoir crée la chaîne, il faut obtenir une "APIKey" et l'insérer dans les programmes de notre projet pour la bonne connexion des appareils
Un tutoriel plus complet est disponible ici proposé par Antony Auffret
Visionner les données : [2]