Skip to main content

Projet ventilateur Grow Box

Dans ce projet on cherche a répondre a un problème qui est la surchauffe de panneau LED dans un Grow Box à l'espace Greenlab. Pour y remédier, le but est de créer un programme sur un Arduino UNO qui va permettre d'activer un ventilateur lorsque la température est trop élevé. Pour l'instant j'ai un schéma de montage avec une carte Arduino UNO branché à un capteur de température qui, en fonction de la température, vas ouvrir ou fermer un relai ce qui aura pour effet d'ouvrir ou de fermer le circuit du ventilateur. Le code que j'ai utilisé est le suivant :

#include <Adafruit_Sensor.h>
#include <DHT.h>
#define DHTpin 2             // pin2 devient le pin du DHT11
#define Relai 3                // pin3 devient le pin du relai
#define DHTTYPE DHT22          // on règle le modèle de capteur
DHT dht(DHTpin, DHTTYPE);

void setup() {
  pinMode(DHTpin, INPUT);       // règle le pin 2 en input
  pinMode(Relai, OUTPUT);      // règle le pin 3 en output
  Serial.begin(9600);          // initialise la comm.
  dht.begin();                 // allume le capteur
}



void loop() {

  delay(2000);                       //attend un peu entre chaque mesures
  float t = dht.readTemperature();   // lit la température exterieur et l'associe à la variable t=température

  if ( t >= 25 ) {                    // si la temérature est au dessus de 35°C
    digitalWrite(Relai, HIGH);      // le relai se ferme => le ventilateur s'allume
    Serial.println("closed");
  }
  else {                            // la température est a 35°C ou moins
    digitalWrite(Relai, LOW);       // le relai s'ouvre => le ventilateur s'arrête
    Serial.println("open");
  }
  if (isnan(t)) {
    Serial.println("x(");           // verifie le bon fonctionnement du capteur
  }
  Serial.println(t);
}


Maintenant, il ne reste plus qu'a rajouter des fonctionnalités tels qu'un écran LCD avec possibilité de régler la température de déclenchement, mais aussi des moyens de régler l'hygrométrie !!

J'ai ajouté ci-joint les librairies utilisé dans ce code.

Paul SPIRCKEL : J'ai ajouté un LCD (https://learn.adafruit.com/character-lcds/wiring-a-character-lcd). A chaque déclenchement du relais, il est parasité par de nombreux de caractères mais le circuit fonctionne toujours en arrière-plan.

A noter qu'il faudrait ajouter un petit delta de température de façon à ce que le ventilateur ne s'active/désactive pas sans arrêt autour de 25°C (typiquement ventiler jusqu'à 22°C avant de se désactiver).

Voici le code mis à jour : 

#include <Adafruit_Sensor.h>

#include <DHT.h>

#include <LiquidCrystal.h>

#define DHTpin 2             // pin2 devient le pin du DHT11

#define Relai 3                // pin3 devient le pin du relai

#define DHTTYPE DHT22          // on règle le modèle de capteur

DHT dht(DHTpin, DHTTYPE);

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);    // connexion des ports de l'écran LCD

void setup() {

  pinMode(DHTpin, INPUT);       // règle le pin 2 en input

  pinMode(Relai, OUTPUT);      // règle le pin 3 en output

  Serial.begin(9600);          // initialise la comm.

  dht.begin();                 // allume le capteur

  lcd.begin(16, 2);

  lcd.setCursor(1, 0);

  lcd.write("Temperature =");

  lcd.setCursor(6, 1);

   lcd.write(" C");

  
}





void loop() {



  delay(2000);                       //attend un peu entre chaque mesures

  float t = dht.readTemperature();   // lit la température exterieur et l'associe à la variable t=température

  lcd.setCursor(0, 1);

  lcd.print(dht.readTemperature());
 


  if ( t <= 25 ) {                    // si la temérature est au dessus de 35°C

    digitalWrite(Relai, HIGH);      // le relai se ferme => le ventilateur s'allume

    Serial.println("closed");

  }

  else {                            // la température est a 35°C ou moins

    digitalWrite(Relai, LOW);       // le relai s'ouvre => le ventilateur s'arrête

    Serial.println("open");

  }

  if (isnan(t)) {

    Serial.println("x(");           // verifie le bon fonctionnement du capteur

  }

  Serial.println(t);

  

  }

Paul SPIRCKEL : J'ai finalisé le code pour 1 ventilateur, avec un delta de température de 3°C et un potentiomètre permettant de choisir le seuil de température à ne pas dépasser. Le LCD ne fonctionne toujours pas correctement. Il peut s'agir d'un problème matériel donc je n'ai rien changé tant que le circuit ne sera pas posé sur une platine. Aussi, il faut faire attention à ne pas allumer le circuit avec le potentiomètre réglé pour une température en dessous de la température ambiante sinon le ventilateur ne s'arrêtera jamais de tourner. Si c'est le cas, il faut juste éteindre le circuit, remonté le potentiomètre et tout rallumer.

#include <Adafruit_Sensor.h>

#include <DHT.h>

#include <LiquidCrystal.h>

#define DHTpin 2             // pin2 devient le pin du DHT11

#define Relai 3                // pin3 devient le pin du relai

#define DHTTYPE DHT22          // on règle le modèle de capteur

DHT dht(DHTpin, DHTTYPE);

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);    // connexion des ports de l'écran LCD

int adcPin = A0;                // attribution du pin analogique A0 comme entrée du signal du potentiomètre
int poten = 0;                  // poten est la variable modifiée par le potentiomètre

void setup() {

  pinMode(DHTpin, INPUT);       // règle le pin 2 en input

  pinMode(Relai, OUTPUT);      // règle le pin 3 en output

  pinMode(adcPin, INPUT);      // règle le pin A0 (analogique) comme entrée du signal du potentiomètre

  Serial.begin(9600);          // initialise la comm.

  dht.begin();                 // allume le capteur
  
  lcd.begin(16, 2);

  lcd.setCursor(0, 0);

  lcd.println("Temp =");

  lcd.setCursor(0, 1);

  lcd.println("Set  = ");

  
}

void loop() {

  delay(2000);                       //attend un peu entre chaque mesures

  poten = (analogRead(adcPin)/10);   // poten prend comme valeur celle envoyée par le potentiomètre, divisée par 10 pour avoir un interval de température entre 0 et 70°C

  Serial.println(3+poten);           // on fixe une valeur minimum de T à 3°C de façon à créer un delta en additionnant la valeur poten

  lcd.setCursor(6, 1);

  lcd.println(3+poten);

  if ( dht.readTemperature() >= (3+poten) ) {                    // si la température est au dessus de (3+poten)

    while (dht.readTemperature() >= (poten)) {                   // et tant qu'elle n'est pas repassée en dessous de poten (donc 3°C en dessous de la valeur de déclenchement), on active le ventilateur 

    delay(2000);
  
    digitalWrite(Relai, LOW);      // le relai se ferme => le ventilateur s'allume

    Serial.println(dht.readTemperature());
    
    Serial.println("closed");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

    }

  }

  else {                            // la température est a 35°C ou moins

    digitalWrite(Relai, HIGH);       // le relai s'ouvre => le ventilateur s'arrête

    Serial.println(dht.readTemperature());

    Serial.println("open");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

  }

}

Avec 2 relais

#include <Adafruit_Sensor.h>

#include <DHT.h>

#include <LiquidCrystal.h>

#define DHTpin 2             // pin2 devient le pin du DHT11

#define Relai_1 3                // pin3 devient le pin du relai 1

#define Relai_2 4               // pin4 devient le pin du relai 2

#define DHTTYPE DHT22          // on règle le modèle de capteur

DHT dht(DHTpin, DHTTYPE);

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);    // connexion des ports de l'écran LCD

int adcPin = A0;                // attribution du pin analogique A0 comme entrée du signal du potentiomètre
int poten = 0;                  // poten est la variable modifiée par le potentiomètre

void setup() {

  pinMode(DHTpin, INPUT);       // règle le pin 2 en input

  pinMode(Relai_1, OUTPUT);      // règle le pin 3 en output

  pinMode(Relai_2, OUTPUT);      // règle le pin 4 en output

  pinMode(adcPin, INPUT);      // règle le pin A0 (analogique) comme entrée du signal du potentiomètre

  Serial.begin(9600);          // initialise la comm.

  dht.begin();                 // allume le capteur
  
  lcd.begin(16, 2);

  lcd.setCursor(0, 0);

  lcd.println("Temp =");

  lcd.setCursor(0, 1);

  lcd.println("Set  = ");

  
}

void loop() {

  delay(2000);                       //attend un peu entre chaque mesures

  poten = (analogRead(adcPin)/10);   // poten prend comme valeur celle envoyée par le potentiomètre, divisée par 10 pour avoir un interval de température entre 0 et 70°C

  Serial.println(3+poten);           // on fixe une valeur minimum de T à 3°C de façon à créer un delta en additionnant la valeur poten

  lcd.setCursor(6, 1);

  lcd.println(3+poten);

  if ( dht.readTemperature() >= (3+poten) ) {                    // si la température est au dessus de (3+poten)

    while (dht.readTemperature() >= (poten)) {                   // et tant qu'elle n'est pas repassée en dessous de poten (donc 3°C en dessous de la valeur de déclenchement), on active le ventilateur 

    delay(2000);
  
    digitalWrite(Relai_1, LOW);      // le relai se ferme => le ventilateur s'allume

    Serial.println(dht.readTemperature());
    
    Serial.println("closed 1");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

       while (dht.readTemperature() >= (poten+2)) {                   // et tant qu'elle n'est pas repassée en dessous de poten (donc 3°C en dessous de la valeur de déclenchement), on active le ventilateur 

       delay(2000);
   
       digitalWrite(Relai_2, LOW);      // le relai se ferme => le ventilateur s'allume

       Serial.println(dht.readTemperature());
    
       Serial.println("closed 2");

       }

    }

  }

  else {                            // la température est a 35°C ou moins

    digitalWrite(Relai_1, HIGH);       // le relai s'ouvre => le ventilateur s'arrête

    Serial.println(dht.readTemperature());

    Serial.println("open");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

  }

}