Des tomates pour l'apéro

De Les Fabriques du Ponant
Aller à : navigation, rechercher

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

Diaporama du jour 1

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.

Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP

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

Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP

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 :

Toit de la serre

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.

Erreur lors de la création de la miniature : Fichier avec des dimensions supérieures à 12,5 MP
Annexe de la serre

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]