Skip to main content

Projet Ventilateur Grow Box

Dans ce projet on cherche a pondre a un problèproblème qui est la surchauffe de panneau LED dans un Grow Box àà l'espace Greenlab. Pour y reméremédier, le but est de crécréer un programme sur un Arduino UNO qui va permettre d'activer un ventilateur lorsque la tempétempérature est trop élevéélevé. Pour l'instant j'ai un schéschéma de montage avec une carte Arduino UNO branchébranché àà un capteur de tempétempérature qui, en fonction de la tempé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é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 gle le modèmodèle de capteur
DHT dht(DHTpin, DHTTYPE);


void setup() {
  pinMode(DHTpin, INPUT);       // gle le pin 2 en input
  pinMode(Relai, OUTPUT);      // 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étempérature exterieur et l'associe àà la variable t=tempétempérature


  if ( t >= 25 ) {                    // si la temétemérature est au dessus de 35°35°C
    digitalWrite(Relai, HIGH);      // le relai se ferme => le ventilateur s'allume
    Serial.println("closed");
  }
  else {                            // la tempétempérature est a 35°35°C ou moins
    digitalWrite(Relai, LOW);       // le relai s'ouvre => le ventilateur s'arrê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éfonctionnalités tels qu'un éécran LCD avec possibilitépossibilité de gler la tempétempérature de clenchement, mais aussi des moyens de gler l'hygroméhygrométrie !!

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

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

A noter qu'il faudrait ajouter un petit delta de tempétempérature de façfaçon àà ce que le ventilateur ne s'active/sactive pas sans arrêarrêt autour de 25°25°C (typiquement ventiler jusqu'àà 22°22°C avant de se 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 gle le modè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);       // gle le pin 2 en input

  pinMode(Relai, OUTPUT);      // 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étempérature exterieur et l'associe àà la variable t=tempétempérature

  lcd.setCursor(0, 1);

  lcd.print(dht.readTemperature());
 


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

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

    Serial.println("closed");

  }

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

    digitalWrite(Relai, LOW);       // le relai s'ouvre => le ventilateur s'arrê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éfinalisé le code pour 1 ventilateur, avec un delta de tempétempérature de C et un potentiomèpotentiomètre permettant de choisir le seuil de tempétempérature àà ne pas passer. Le LCD ne fonctionne toujours pas correctement. Il peut s'agir d'un problèproblème matématériel donc je n'ai rien changéchangé tant que le circuit ne sera pas poséposé sur une platine. Aussi, il faut faire attention àà ne pas allumer le circuit avec le potentiomèpotentiomètre régléréglé pour une tempétempérature en dessous de la tempétempérature ambiante sinon le ventilateur ne s'arrêarrêtera jamais de tourner. Si c'est le cas, il faut juste ééteindre le circuit, remontéremonté le potentiomè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 gle le modè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éentrée du signal du potentiomèpotentiomètre
int poten = 0;                  // poten est la variable modifiémodifiée par le potentiomèpotentiomètre

void setup() {

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

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

  pinMode(adcPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomè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éenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C

  Serial.println(3+poten);           // on fixe une valeur minimum de T àà C de façfaçon àà cré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étempérature est au dessus de (3+poten)

    while (dht.readTemperature() >= (poten)) {                   // et tant qu'elle n'est pas repassérepassée en dessous de poten (donc C en dessous de la valeur de 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étempérature est a 35°35°C ou moins

    digitalWrite(Relai, HIGH);       // le relai s'ouvre => le ventilateur s'arrê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 gle le modè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éentrée du signal du potentiomèpotentiomètre
int poten = 0;                  // poten est la variable modifiémodifiée par le potentiomèpotentiomètre

void setup() {

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

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

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

  pinMode(adcPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomè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éenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C

  Serial.println(3+poten);           // on fixe une valeur minimum de T àà C de façfaçon àà cré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étempérature est au dessus de (3+poten)

    while (dht.readTemperature() >= (poten)) {                   // et tant qu'elle n'est pas repassérepassée en dessous de poten (donc C en dessous de la valeur de 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érepassée en dessous de poten (donc C en dessous de la valeur de 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étempérature est a 35°35°C ou moins

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

    Serial.println(dht.readTemperature());

    Serial.println("open");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

  }

}

Miro Von der Borch : J'ai aujourd'hui tentétenté de soudre certains problèproblèmes de la version précéprécédente du code et du montage :

-Des bugs d'affichage sur l'éécran LDC

-La communication serial qui ne renvoie rien

-La valeur des potentiomèpotentiomètres qui se fige si elle est en dessous de la tempétempérature

Une premièpremière modification que j'ai apportéapporté a étéété de brancher le file de contraste directement àà la masse pour se barrasser d'un des potentiomèpotentiomètres inutile. Ensuite, j'ai modifier le code àà deux relais en ajoutant des espaces àà la fin de chaque print du LCD ce qui a corrigécorrigé l'un des bugs d'affichage, mais pas le second qui fait que la premièpremière valeur de tempétempérature du capteur DHT est un caractècaractère éétrange. J'ai aussi ajoutéajouté des actualisation au sein de chaque "while" de la valeur "poten" :

#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 gle le modè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éentrée du signal du potentiomèpotentiomètre
int adcPinfine = A1;            // attribution du pin analogique A1 comme entréentrée su signal du potentiomèpotentiomètre de glage fin
int poten = 0;                  // poten est la variable modifiémodifiée par les potentiomèpotentiomètres

void setup() {

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

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

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

  pinMode(adcPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomè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 = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

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

  lcd.setCursor(7, 0);

  lcd.println(dht.readTemperature());

  lcd.setCursor (12, 0);

  lcd.println(" C  ");

  lcd.setCursor (7, 1);

  lcd.println(3+poten);

  lcd.setCursor (9, 1);

  lcd.println (" C     ");

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

    while (dht.readTemperature() >= (poten)) {                   // et tant qu'elle n'est pas repassérepassée en dessous de poten (donc C en dessous de la valeur de 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.println(dht.readTemperature());

    lcd.setCursor (12, 0);

    lcd.println(" C  ");  // aprèaprès chaque print de l'éécran LCD j'ai rajouter une instruction pour afficher d'une part l'unitéunité mais aussi pour se barrasser les symboles éétranges qui apparraissaient àà la fin des print

    poten = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));  // Ici j'ai ajoutéajouté une actualisation de la valeure poten afin d'ééviter que la valeur ne se fige

    lcd.setCursor (7, 1);

    lcd.println(3+poten);

    lcd.setCursor (9, 1);

    lcd.println (" C     ");

       while (dht.readTemperature() >= (poten+2)) {                   // et tant qu'elle n'est pas repassérepassée en dessous de poten (donc C en dessous de la valeur de 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");
       
        lcd.setCursor(7, 0);

        lcd.println(dht.readTemperature());

        lcd.setCursor (12, 0);

        lcd.println(" C  ");

        poten = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));

        lcd.setCursor (7, 1);

        lcd.println(3+poten);

        lcd.setCursor (9, 1);

        lcd.println (" C     ");

       }

    }

  }

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

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

    Serial.println(dht.readTemperature());

    Serial.println("open");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

  }

}

Je n'ai cependant pas ussi àà faire fonctionner la communication rial.

Pour le bug d'affichage de la valeur de tempétempérature du DHT, il n'est pas toujours préprésent, notamment, l'affichage se fait correctement si les relais sont ééteint (le circuit est ferméfermé). Je suspect donc que le problèproblème viens du fait que les relais sont sur la me alimentation que l'éécran. Piste àà creuser...

Paul SPIRCKEL :

J'ai continuécontinué àà améaméliorer le code. J'ai notamment essayéessayé de modifier les boucles while car lorsque la condition n'est plus valide, les signaux déclarédéclarés en LOW ne repassent pas en HIGH. Pour ce faire il faut éécrire quelque part "digitalWrite(Relai_..., HIGH)". Ainsi plutôplutôt que d'imbriquer 2 boucles while, j'ai essayéessayé de faire marrer les deux ventilateurs tant que la tempétempérature n'éétait pas redescendue en dessous de (2+poten) et une fois sorti de la boucle, que le relai 2 s'ouvre mais que le premier reste bien ferméfermé jusqu'àà ce que le if ne soit plus vrai. Un deuxièdeuxième problèproblème s'est alors poséposé, la sortie d'une boucle while comprise dans un if renvoie imméimmédiatement au else. me en essayant de mettre un deuxièdeuxième while dans le if (pour T < (2+poten), les deux ventilateurs s'ééteignent imméimmédiatement.

Ce code n'est clairement pas abouti

#include <Adafruit_Sensor.h>

#include <DHT.h>

#include <LiquidCrystal.h>

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

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

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

#define DHTTYPE DHT22          // on gle le modè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éentrée du signal du potentiomèpotentiomètre
int adcPinfine = A1;            // attribution du pin analogique A1 comme entréentrée su signal du potentiomèpotentiomètre de glage fin
int poten = 0;                  // poten est la variable modifiémodifiée par les potentiomèpotentiomètres

void setup() {

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

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

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

  pinMode(adcPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomè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 = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

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

  lcd.setCursor(7, 0);

  lcd.println(dht.readTemperature());

  lcd.setCursor (12, 0);

  lcd.println(" C  ");

  lcd.setCursor (7, 1);

  lcd.println(3+poten);

  lcd.setCursor (9, 1);

  lcd.println (" C     ");

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

       delay(2000);   

       Serial.println(dht.readTemperature());
    
       Serial.println("closed 1");
       
        lcd.setCursor(7, 0);

        lcd.println(dht.readTemperature());

        lcd.setCursor (12, 0);

        lcd.println(" C  ");

        poten = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));

        lcd.setCursor (7, 1);

        lcd.println(3+poten);

        lcd.setCursor (9, 1);

        lcd.println (" C     ");

        do {
        
            delay(2000);
          
            digitalWrite(Relai_1, LOW);
            digitalWrite(Relai_2, LOW);
                    
            Serial.println(dht.readTemperature());
            
            Serial.println("closed 1 & 2");
        
            lcd.setCursor(7, 0);
        
            lcd.println(dht.readTemperature());
        
            lcd.setCursor (12, 0);
        
            lcd.println(" C  ");  // aprèaprès chaque print de l'éécran LCD j'ai rajouter une instruction pour afficher d'une part l'unitéunité mais aussi pour se barrasser des symboles éétranges qui apparraissaient àà la fin des print
        
            poten = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));  // Ici j'ai ajoutéajouté une actualisation de la valeure poten afin d'ééviter que la valeur ne se fige
        
            lcd.setCursor (7, 1);
        
            lcd.println(3+poten);
        
            lcd.setCursor (9, 1);
        
            lcd.println (" C     ");

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

      do {
        
          delay(2000);
          
            digitalWrite(Relai_2, HIGH);
                    
            Serial.println(dht.readTemperature());
            
            Serial.println("closed 1 & open 2");
        
            lcd.setCursor(7, 0);
        
            lcd.println(dht.readTemperature());
        
            lcd.setCursor (12, 0);
        
            lcd.println(" C  ");  // aprèaprès chaque print de l'éécran LCD j'ai rajouter une instruction pour afficher d'une part l'unitéunité mais aussi pour se barrasser des symboles éétranges qui apparraissaient àà la fin des print
        
            poten = ((7+analogRead(adcPin)/40)+(analogRead(adcPinfine)/125));  // Ici j'ai ajoutéajouté une actualisation de la valeure poten afin d'ééviter que la valeur ne se fige
        
            lcd.setCursor (7, 1);
        
            lcd.println(3+poten);
        
            lcd.setCursor (9, 1);
        
            lcd.println (" C     ");
        
      }

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

  }

  else {                            // la tempétempérature est àà (3+poten) ou moins

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

    Serial.println(dht.readTemperature());

    Serial.println("open");

    lcd.setCursor(7, 0);

    lcd.write(dht.readTemperature());

  }

}

Miro VON DER BORCH (24/11/2023) :

J'ai reproduit le circuit àà l'identique dans l'espace prototypage pour pouvoir continuer àà avancer dessus. Je l'ai mis dans un des grands bacs en plastique en bas de l'étagèétagère des projets. J'ai ainsi apportéapporté les modifications suivantes au circuit :

  • J'ai abandonnéabandonné le capteur DHT trop peu préprécis (plusieurs degrédegrés d'incertitude) pour un capteur SHT31 bien plus préprécis (incertitude de l'ordre du dixièdixième de degrédegré àà préprésent). Cependant, il n'apparait pas dans le montage ci-dessous car il se branche pour l'instant sur un shield seeeduino via les port I2C. Mais s'il existe un moyen de contourner le shield je suis preneur.
  • J'ai échangééchangé les "slide potentiometer" de chez Arduino pour des potentiomèpotentiomètres rotatif plus préprécis (8 et 10kOHm) et plus esthéesthétique aussi ! Seulement pour cela j'ai t ajouter quelques sistances pour ééviter tout risque de cours circuit.
  • J'ai aussi ajoutéajouté trois relais supplésupplémentaire.
    • Un qui actionnerais une sistance de chauffe afin d'éélever la tempétempérature de la serre au dessus de la tempétempérature ambiante.
    • Un autre qui actionnerais un systèsystème de refroidissement (une pompe àà eau par exemple).
    • Un dernier qui actionnerais un systèsystème de brumisation afin de pouvoir contrôcontrôler l'hygroméhygrométrie àà terme !
  • J'ai aussi remis un tout petit potentiomèpotentiomètre pour la luminositéluminosité (c'est finalement plus agréagréable).

J'ai aussi fait un premier aperçaperçut du circuit impriméimprimé que l'on pourrais faire pour ce montage avec toute les modifications que j'ai mentionnémentionné plus haut incluse dedans :

Capture d'écran 2023-11-24 201305.pngCapture d'écran 2023-11-24 201305.png

Le schéschéma du circuit sur KiCad

Capture d'écran 2023-11-24 195806.pngCapture d'écran 2023-11-24 195806.png

La PCB

J'ai joins le fichier de la PCB

Pour ce qui est du code :

  • Il faudra maintenant apporter quelques modifications pour l'adapter àà la librairie du capteur SHT31 (essentiellement changer les "dht.read" par des "sht.get").
  • J'ai connectéconnecté
    • "sistance de chauffe" -----> pin digitale 5
    •  "cooler" ---------------------> pin digitale 6
    • "systèsystème d'humidification" -> pin digital 13
  • Il faudrait éétablir des conditions d'allumage des nouveaux systèsystème liélié àà la gulation de la tempétempérature, àà savoir, le chauffage et le refroidissement actif.
  • Il faudrait éétablir un systèsystème de gulation de l'humiditéhumidité (quand allumer le brumisateur pour humidifier et quand allumer les ventilateurs pour cher l'air).
  • Peut-êêtre aussi que centrer le delta d'allumage autour de la valeur demandédemandé serais plus judicieux pour avoir une meilleur préprécision. Par çça j’j’entends, au lieu d'allumer les ventilateurs lorsque la tempétempérature souhaitésouhaité est atteinte et les ééteindre trois degrédegré en dessous, les allumer un degrédegré au dessus de la valeurs souhaitésouhaité et les ééteindre un degrédegré en dessous de la valeur souhaitésouhaité

Lors de mes essais pour gler le problèproblème d'affichage qui survenait lorsque les relais s'allumait (Le premier chiffre de la valeur de tempétempérature lut par le capteur éétait remplacéremplacé par un caractècaractère éétrange), je pensai d'abords qu'ils en éétaient la cause, mais aprèaprès quelques essais, les boucles "while", pour une raison que j'ignore, semblent êêtre en cause, en effet le problèproblème survient me si les relais sont déconnectédéconnectés. Cependant peut-êêtre qu'avec la nouvelle version du code il n'est plus préprésent.

Miro VON DER BORCH (25/11/23) :

J'ai revus un peu la PCB ce matin afin d'ajouter deux potentiomèpotentiomètres en plus sur le circuit actuel, ces potentiomèpotentiomètres devrais servir àà controler l'humiditéhumidité souhaitésouhaité àà terme. Je les ai donc branchébranché au pins analogue suivant :

A2 -> PotentiomèPotentiomètre d'humiditéhumidité

A3 -> PotentiomèPotentiomètre d'humiditéhumidité fin

Voici les captures d'éécran de ce que çça donne et j'ai joins le fichier KiCad :

Capture d'écran 2023-11-25 130909.pngCapture d'écran 2023-11-25 130909.png

Le schéschéma mis àà jour

Capture d'écran 2023-11-25 130922.pngCapture d'écran 2023-11-25 130922.png

La PCB mis àà jour

Paul SPIRCKEL (29/11/2023) :

AprèAprès avoir consultéconsulté les modifications faites par Miro, je me suis lancélancé dans l'éécriture du programme. Je n'avais pas accèaccès au nouveau circuit donc j'ai programméprogrammé àà l'aveugle. Afin d'êêtre r que toutes les conditions sont lues, j'ai préférépréféré crire 4 if (trop chaud, trop froid, trop humide, top sec)  avec des deltas (centrécentrés sur la valeur voulue) adaptéadaptés àà chaque situation (on préfépréférera trop froid plutôplutôt que trop chaud et trop humide plutôplutôt que trop sec). Je propose éégalement d'ajouter au circuit un switch àà 3 pins pour choisir entre le refroidissement par ventilation ou par cooler. Je propose les deux codes ci-dessous :

Ventilation et cooler séparéséparés
#include <Adafruit_Sensor.h>

#include <DHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include <Wire.h>
#include "Adafruit_SHT31.h"
//#include <Adafruit_I2CDevice.h>

#define SHTpin 

#define Relai_1 3              // pin3 devient le pin du relai 1 (Ventilateur 1)
#define Relai_2 4              // pin4 devient le pin du relai 2 (Ventilateur 2)
#define Relai_3 5              // pin5 devient le pin du relai 3 (sistance de chauffe)
#define Relai_4 6              // pin6 devient le pin du relai 4 (Cooler)
#define Relai_5 13             // pin13 devient le pin du relai 5 (SystèSystème d'humidification)

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

int adcTempPin = A0;                // attribution du pin analogique A0 comme entréentrée du signal du potentiomèpotentiomètre de tempétempérature
int adcTempPinfine = A1;            // attribution du pin analogique A1 comme entréentrée su signal du potentiomèpotentiomètre de glage fin de tempétempérature
int Temp_poten = 0;                  // Temp_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà la tempétempérature
int adcHumPin = A2;                // attribution du pin analogique A2 comme entréentrée du signal du potentiomèpotentiomètre d'humiditéhumidité
int adcHumPinfine = A3;            // attribution du pin analogique A3 comme entréentrée su signal du potentiomèpotentiomètre de glage fin d'humiditéhumidité
int Hum_poten = 0;                  // Hum_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà l'humiditéhumidité




void setup() {

pinMode(Relai_1, OUTPUT);      // gle le pin 3 en output
pinMode(Relai_2, OUTPUT);      // gle le pin 4 en output
pinMode(Relai_3, OUTPUT);      // gle le pin 5 en output
pinMode(Relai_4, OUTPUT);      // gle le pin 6 en output
pinMode(Relai_5, OUTPUT);      // gle le pin 13 en output

pinMode(adcTempPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT);      // gle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT);      // gle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT);      // gle le pin A3 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Humfine

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

//Section consacréconsacrée àà l'affichage vouévouée àà éévoluer en fonction du systèsystème d'affichage choisi

 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

Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision
Hum_poten = ((7+analogRead(adcHumPin)/40)+(analogRead(adcHumPinfine)/125));      // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

serial.print(Temp_poten);

//  ---- CONTROLE DE LA TEMPERATURE ----

//  TempéTempérature trop élevéélevée (max C ou dessus de la tempétempérature souhaitésouhaitée)

if (sht31.readTemperature() > (1+Temp_poten) ){ // Si la tempétempérature est supésupérieure àà C au dessus de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() >= (Temp_poten-1) { // Le systèsystème de refroidissement se met en marche tant que la tempétempérature n'est pas redescendue en dessous de C sous Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop élevéélevée");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, LOW); // Le Relai_1 se ferme (Ventilateur 1 en fonctionnement)
       digitalWrite(Relai_2, LOW); // Le Relai_2 se ferme (Ventilateur 2 en fonctionnement)

    }

}

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("Conditions atteintes");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, HIGH); // Le Relai_1 s'ouvre (Ventilateur 1 en arrêarrêt)
       digitalWrite(Relai_2, HIGH); // Le Relai_2 s'ouvre (Ventilateur 2 en arrêarrêt)

}


//  La tempétempérature est trop faible (Maximum C en dessous de la tempétempérature souhaitésouhaitée, ne pas monter plus haut que la tempétempérature souhaitésouhaitée)

if (sht31.readTemperature() < (Temp_poten-3) ){ // Si la tempétempérature est inféinférieure àà C en dessous de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() < (Temp_poten) { // Le systèsystème de chauffage se met en marche tant que la tempétempérature n'est pas remontéremontée àà Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop faible");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_3, LOW); // Le Relai_3 se ferme (Chauffage en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("Conditions atteintes");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_3, HIGH); // Le Relai_3 s'ouvre (Chauffage en arrêarrêt) 
}

//  TempéTempérature trop élevéélevée MALGRE LA VENTILATION (plutôplutôt un cas d'étéété) (max C ou dessus de la tempétempérature souhaitésouhaitée)

if (sht31.readTemperature() > (5+Temp_poten) ){ // Si la tempétempérature est supésupérieure àà C au dessus de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() >= (Temp_poten-1) { // Le systèsystème de refroidissement se met en marche tant que la tempétempérature n'est pas redescendue en dessous de C sous Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop élevéélevée");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_4, LOW); // Le Relai_4 se ferme (Cooler en fonctionnement)

    }

}

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("Conditions atteintes");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_4, HIGH); // Le Relai_4 s'ouvre (Cooler en arrêarrêt)

}

//    ---- CONTROLE DE L'HUMIDITE ----

// HumiditéHumidité trop élevéélevée

if (sht31.readHumidity() > (Hum_poten+10) ){ // Si l'humiditéhumidité est 10% au dessus de celle souhaitésouhaitée

    while (sht31.readHumidity() > (Hum_poten) { // Le systèsystème de ventilation se met en marche tant que l'humiditéhumidité n'est pas redescuendue jusqu'àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop élevéélevée");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, LOW); // Le Relai_1 se ferme (Ventilateur 1 en fonctionnement)
       digitalWrite(Relai_2, LOW); // Le Relai_2 se ferme (Ventilateur 2 en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("Conditions atteintes");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, HIGH); // Le Relai_1 s'ouvre (Ventilateur 1 en arrêarrêt)
       digitalWrite(Relai_2, HIGH); // Le Relai_2 s'ouvre (Ventilateur 2 en arrêarrêt)

}

// HumiditéHumidité trop faible

if (sht31.readHumidity() < (Hum_poten-5) ){ // Si l'humiditéhumidité est 5% en dessous de celle souhaitésouhaitée

    while (sht31.readHumidity() <= (Hum_poten) { // Le systèsystème d'humidification se met en marche tant que l'humiditéhumidité n'est pas remontéremontée àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop faible");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_5, LOW); // Le Relai_5 se ferme (SystèSystème d'humidification en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("Conditions atteintes");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_5, HIGH); // Le Relai_5 s'ouvre (SystèSystème d'humidification àà l'arrêarrêt)

}

}

 

Ventilation ou cooler
#include <Adafruit_Sensor.h>

#include <DHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include <Wire.h>
#include "Adafruit_SHT31.h"
//#include <Adafruit_I2CDevice.h>

#define SHTpin 

#define cooling 6              // pin6 devient le pin du qui commande soit la paire de ventilateurs soit le cooler en fonction de la position de l'interrupteur
#define Relai_1 3              // pin3 devient le pin du relai 1 (Ventilateur 1)
#define Relai_2 4              // pin4 devient le pin du relai 2 (Ventilateur 2)
#define Relai_3 5              // pin5 devient le pin du relai 3 (sistance de chauffe)
#define Relai_5 13             // pin13 devient le pin du relai 5 (SystèSystème d'humidification)

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

int adcTempPin = A0;                // attribution du pin analogique A0 comme entréentrée du signal du potentiomèpotentiomètre de tempétempérature
int adcTempPinfine = A1;            // attribution du pin analogique A1 comme entréentrée su signal du potentiomèpotentiomètre de glage fin de tempétempérature
int Temp_poten = 0;                  // Temp_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà la tempétempérature
int adcHumPin = A2;                // attribution du pin analogique A2 comme entréentrée du signal du potentiomèpotentiomètre d'humiditéhumidité
int adcHumPinfine = A3;            // attribution du pin analogique A3 comme entréentrée su signal du potentiomèpotentiomètre de glage fin d'humiditéhumidité
int Hum_poten = 0;                  // Hum_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà l'humiditéhumidité




void setup() {

pinMode(cooling, OUTPUT);      // gle le pin 6 en output
pinMode(Relai_1, OUTPUT);      // gle le pin 3 en output
pinMode(Relai_2, OUTPUT);      // gle le pin 4 en output
pinMode(Relai_3, OUTPUT);      // gle le pin 5 en output
pinMode(Relai_5, OUTPUT);      // gle le pin 13 en output

pinMode(adcTempPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT);      // gle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT);      // gle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT);      // gle le pin A3 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Humfine

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

//Section consacréconsacrée àà l'affichage vouévouée àà éévoluer en fonction du systèsystème d'affichage choisi

 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

Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision
Hum_poten = ((7+analogRead(adcHumPin)/40)+(analogRead(adcHumPinfine)/125));      // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

serial.print(Temp_poten);

//  ---- CONTROLE DE LA TEMPERATURE ----

//  TempéTempérature trop élevéélevée (max C ou dessus de la tempétempérature souhaitésouhaitée)

if (sht31.readTemperature() > (1+Temp_poten) ){ // Si la tempétempérature est supésupérieure àà C au dessus de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() >= (Temp_poten-1) { // Le systèsystème de refroidissement se met en marche tant que la tempétempérature n'est pas redescendue en dessous de C sous Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop élevéélevée");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(cooling, LOW); // Le systèsystème de refroidissement sélectionnésélectionné se met en marche

    }

}

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("Conditions atteintes");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(cooling, HIGH); // Le systèsystème de refroidissement sélectionnésélectionné s'arrêarrête

}


//  La tempétempérature est trop faible (Maximum C en dessous de la tempétempérature souhaitésouhaitée, ne pas monter plus haut que la tempétempérature souhaitésouhaitée)

if (sht31.readTemperature() < (Temp_poten-3) ){ // Si la tempétempérature est inféinférieure àà C en dessous de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() < (Temp_poten) { // Le systèsystème de chauffage se met en marche tant que la tempétempérature n'est pas remontéremontée àà Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop faible");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_3, LOW); // Le Relai_3 se ferme (Chauffage en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("Conditions atteintes");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_3, HIGH); // Le Relai_3 s'ouvre (Chauffage en arrêarrêt) 
}

//    ---- CONTROLE DE L'HUMIDITE ----

// HumiditéHumidité trop élevéélevée

if (sht31.readHumidity() > (Hum_poten+10) ){ // Si l'humiditéhumidité est 10% au dessus de celle souhaitésouhaitée

    while (sht31.readHumidity() > (Hum_poten) { // Le systèsystème de ventilation se met en marche tant que l'humiditéhumidité n'est pas redescuendue jusqu'àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop élevéélevée");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, LOW); // Le Relai_1 se ferme (Ventilateur 1 en fonctionnement)
       digitalWrite(Relai_2, LOW); // Le Relai_2 se ferme (Ventilateur 2 en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("Conditions atteintes");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, HIGH); // Le Relai_1 s'ouvre (Ventilateur 1 en arrêarrêt)
       digitalWrite(Relai_2, HIGH); // Le Relai_2 s'ouvre (Ventilateur 2 en arrêarrêt)

}

// HumiditéHumidité trop faible

if (sht31.readHumidity() < (Hum_poten-5) ){ // Si l'humiditéhumidité est 5% en dessous de celle souhaitésouhaitée

    while (sht31.readHumidity() <= (Hum_poten) { // Le systèsystème d'humidification se met en marche tant que l'humiditéhumidité n'est pas remontéremontée àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop faible");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_5, LOW); // Le Relai_5 se ferme (SystèSystème d'humidification en fonctionnement)

    }
}

else {

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("Conditions atteintes");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_5, HIGH); // Le Relai_5 s'ouvre (SystèSystème d'humidification àà l'arrêarrêt)

}

}

 

Quelques modifications sont àà apporter puisque je n'avais pas le matématériel :

  • RedéRedéfinir l'ééchelle des valeurs Temp_poten correspondant au nouveau potentiomèpotentiomètre
  • CréCréer l'ééchelle des valeurs (%) Hum_poten correspondant au nouveau potentiomèpotentiomètre
  • Ajouter toutes les lignes d'affichage sur éécran
  • Essayer d'utiliser des elsif avec une seule condition else qui permet de sactiver tous les relais
  • Trouver un moyen de contourner la connexion I2C
  • Ajouter toutes les bibliothèbibliothèques cessaires si elles n'y sont pas déjàdéjà
  • Trouver un moyen de connecter tous les appareils chauffants si la tempétempérature est trop élevéélevée pendant trop longtemps
  • Ajouter le shield de carte SD et faire en sorte que le programme soit lu dessus

Paul SPIRCKEL (13/12/2023) :

Je n'avais toujours pas le matématériel àà ma disposition. Je me suis penchépenché sur la possibilitépossibilité de récupérécupérer le signal I2C du capteur directement en analogique sur la carte Arduino. Ceci ne semble pas possible car une connexion I2C requiert une communication entre 2 composants, typiquement le capteur et le contrôcontrôleur Arduino. Il faudra donc probablement ajouter un shield ou autre extension comportant des connexions I2C. Il faudra faire attention àà ce que certains pins utiliséutilisés pour d'autres fonctions ne nent pas des connexions du shield, sinon il ne fonctionnera pas. Idem si on utilise le "Wireless SD Shield" pour ajouter de la moire. D'ailleurs je me suis renseignérenseigné et il semblerait que la carte SD ne puisse êêtre utiliséutilisée que pour stocker des donnédonnées et pas du code. Il doit êêtre possible de faire cela mais avec d'autres composants que je ne connais pas. C'est donc toujours un aspect àà velopper si un Arduino simple est un peu trop juste (quelques solutions ici ?). Sinon peut-êêtre serait-il intéintéressant d'utiliser deux cartes (une pour la tempétempérature, une pour l'humiditéhumidité) reliéreliées au me capteur.

J'ai essayéessayé d'éécrire le programme avec des else if :

#include <Adafruit_Sensor.h>

#include <DHT.h>
#include <LiquidCrystal.h>
#include "Arduino.h"
#include <Wire.h>
#include "Adafruit_SHT31.h"
//#include <Adafruit_I2CDevice.h>

#define SHTpin 

#define Relai_1 3              // pin3 devient le pin du relai 1 (Ventilateur 1)
#define Relai_2 4              // pin4 devient le pin du relai 2 (Ventilateur 2)
#define Relai_3 5              // pin5 devient le pin du relai 3 (sistance de chauffe)
#define Relai_4 6              // pin6 devient le pin du relai 4 (Cooler)
#define Relai_5 13             // pin13 devient le pin du relai 5 (SystèSystème d'humidification)

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

int adcTempPin = A0;                // attribution du pin analogique A0 comme entréentrée du signal du potentiomèpotentiomètre de tempétempérature
int adcTempPinfine = A1;            // attribution du pin analogique A1 comme entréentrée su signal du potentiomèpotentiomètre de glage fin de tempétempérature
int Temp_poten = 0;                  // Temp_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà la tempétempérature
int adcHumPin = A2;                // attribution du pin analogique A2 comme entréentrée du signal du potentiomèpotentiomètre d'humiditéhumidité
int adcHumPinfine = A3;            // attribution du pin analogique A3 comme entréentrée su signal du potentiomèpotentiomètre de glage fin d'humiditéhumidité
int Hum_poten = 0;                  // Hum_poten est la variable modifiémodifiée par les potentiomèpotentiomètres liéliés àà l'humiditéhumidité




void setup() {

pinMode(Relai_1, OUTPUT);      // gle le pin 3 en output
pinMode(Relai_2, OUTPUT);      // gle le pin 4 en output
pinMode(Relai_3, OUTPUT);      // gle le pin 5 en output
pinMode(Relai_4, OUTPUT);      // gle le pin 6 en output
pinMode(Relai_5, OUTPUT);      // gle le pin 13 en output

pinMode(adcTempPin, INPUT);      // gle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT);      // gle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT);      // gle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT);      // gle le pin A3 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Humfine

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

//Section consacréconsacrée àà l'affichage vouévouée àà éévoluer en fonction du systèsystème d'affichage choisi

 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

Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision
Hum_poten = ((7+analogRead(adcHumPin)/40)+(analogRead(adcHumPinfine)/125));      // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

serial.print(Temp_poten);

//  ---- CONTROLE DE LA TEMPERATURE ----

//  TempéTempérature trop élevéélevée (max C ou dessus de la tempétempérature souhaitésouhaitée)

if ((sht31.readTemperature() > (1+Temp_poten)) and (sht31.readTemperature() < (5+Temp_poten))) { // Si la tempétempérature est supésupérieure àà C au dessus de la tempétempérature souhaitésouhaité

    while (sht31.readTemperature() >= (Temp_poten-1) { // Le systèsystème de refroidissement se met en marche tant que la tempétempérature n'est pas redescendue en dessous de C sous Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop élevéélevée");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, LOW); // Le Relai_1 se ferme (Ventilateur 1 en fonctionnement)
       digitalWrite(Relai_2, LOW); // Le Relai_2 se ferme (Ventilateur 2 en fonctionnement)

    }

}

//  La tempétempérature est trop faible (Maximum C en dessous de la tempétempérature souhaitésouhaitée, ne pas monter plus haut que la tempétempérature souhaitésouhaitée)

else if (sht31.readTemperature() < (Temp_poten-3) ){ // Si la tempétempérature est inféinférieure àà C en dessous de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() < (Temp_poten) { // Le systèsystème de chauffage se met en marche tant que la tempétempérature n'est pas remontéremontée àà Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop faible");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_3, LOW); // Le Relai_3 se ferme (Chauffage en fonctionnement)

    }
}

//  TempéTempérature trop élevéélevée MALGRE LA VENTILATION (plutôplutôt un cas d'étéété) (max C ou dessus de la tempétempérature souhaitésouhaitée)

else if (sht31.readTemperature() > (5+Temp_poten) ){ // Si la tempétempérature est supésupérieure àà C au dessus de la tempétempérature souhaitésouhaitée

    while (sht31.readTemperature() >= (Temp_poten-1) { // Le systèsystème de refroidissement se met en marche tant que la tempétempérature n'est pas redescendue en dessous de C sous Temp_poten

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println("TempéTempérature trop élevéélevée");
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_4, LOW); // Le Relai_4 se ferme (Cooler en fonctionnement)

    }

}

//    ---- CONTROLE DE L'HUMIDITE ----

// HumiditéHumidité trop élevéélevée

else if (sht31.readHumidity() > (Hum_poten+10) ){ // Si l'humiditéhumidité est 10% au dessus de celle souhaitésouhaitée

    while (sht31.readHumidity() > (Hum_poten) { // Le systèsystème de ventilation se met en marche tant que l'humiditéhumidité n'est pas redescuendue jusqu'àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop élevéélevée");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, LOW); // Le Relai_1 se ferme (Ventilateur 1 en fonctionnement)
       digitalWrite(Relai_2, LOW); // Le Relai_2 se ferme (Ventilateur 2 en fonctionnement)

    }
}

// HumiditéHumidité trop faible

else if (sht31.readHumidity() < (Hum_poten-5) ){ // Si l'humiditéhumidité est 5% en dessous de celle souhaitésouhaitée

    while (sht31.readHumidity() <= (Hum_poten) { // Le systèsystème d'humidification se met en marche tant que l'humiditéhumidité n'est pas remontéremontée àà Hum_poten

       delay(2000);   
       Serial.println(sht31.readHumidity());
       Serial.println("HumiditéHumidité trop faible");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_5, LOW); // Le Relai_5 se ferme (SystèSystème d'humidification en fonctionnement)

    }
}

// Si aucune des conditions précéprécédentes n'est remplie, tout les relais sont ouverts.

else {

       delay(2000);   
       Serial.println(sht31.readTemperature());
       Serial.println(sht31.readHumidity());
       Serial.println("Conditions atteintes");
       Hum_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));
       Temp_poten = ((7+analogRead(adcTempPin)/40)+(analogRead(adcTempPinfine)/125));

       digitalWrite(Relai_1, HIGH); // Le Relai_1 s'ouvre (Ventilateur 1 àà l'arrêarrêt)
       digitalWrite(Relai_2, HIGH); // Le Relai_2 s'ouvre (Ventilateur 2 àà l'arrêarrêt)
       digitalWrite(Relai_3, HIGH); // Le Relai_3 s'ouvre (sistance de chauffe àà l'arrêarrêt)
       digitalWrite(Relai_4, HIGH); // Le Relai_4 s'ouvre (Cooler àà l'arrêarrêt)
       digitalWrite(Relai_5, HIGH); // Le Relai_5 s'ouvre (SystèSystème d'humidification àà l'arrêarrêt)


}

}

 

Il reste donc àà faire : 

  • RedéRedéfinir l'ééchelle des valeurs Temp_poten correspondant au nouveau potentiomèpotentiomètre
  • CréCréer l'ééchelle des valeurs (%) Hum_poten correspondant au nouveau potentiomèpotentiomètre
  • Ajouter toutes les lignes d'affichage sur éécran
  • Corriger le programme (je n'ai pour le moment pas pu me rendre compte de potentielles erreurs)
  • Ajouter toutes les bibliothèbibliothèques cessaires si elles n'y sont pas déjàdéjà
  • Trouver un moyen de connecter tous les appareils chauffants si la tempétempérature est trop élevéélevée pendant trop longtemps (fusible ou relai en plus)
  • Tester d'empiler l'Arduino Uno + le shield I2C et changer certaines connections pour que rien n'interfèinterfère (voir ici les pins I2C sont ceux de la rangérangée du bas)
  • Utiliser une autre carte ou augmenter la moire de programmation si celle de la carte ne suffit pas
  • Essayer d'ajouter un switch àà 3 pins pour choisir le mode de refroidissement

Paul SPIRCKEL (24/01/2024) :

Je n'avais pas le matématériel donc je me suis penchépenché sur l'organisation du boitier et de la PCB. L'idéidée est de rendre la PCB trètrès compacte et certainement de solidariser le LCD de la PCB. J'ai commencécommencé àà faire un dessin de coupe de boite (plexiglas de préfépréférence) qui permet sur une face d'avoir le LCD avec les 4 potentiomèpotentiomètres, sur les tranches, il faudrait mettre des sortes de prises pour connecter les diffédifférents appareils que l'on souhaite utiliser (aussi bien pour le côtécôté modulaire de l'appareil que pratique quand il va falloir l'installer). A l'arrièarrière, j'ai préprévu un emplacement pour l'alimentation de l'Arduino (àà voir si on met un transfo dans le boitier ou pas, ce qui risque de l'alourdir et de le chauffer). On pourrait rajouter un crochet sur le dessus pour suspendre le boitier par exemple. Avoir les composants partis sur diffédifférentes faces implique de les solidariser de la PCB, mais donc de la rendre plus petite (àà voir ce qui est le mieux puisque qu'on va devoir ajouter des fils àà l'intéintérieur). 

J'aimerais si possible avoir accèaccès aux dimensions des diffédifférents composants pour pouvoir finir ce modèmodèle :)

Paul SPIRCKEL (31/01/2024) :

J'ai continuécontinué le patron du boitier. J'ai éégalement réorganiséréorganisé la PCB (fichier en pièpièce jointe). L'idéidée est de placer le LCD en haut, les potentiomèpotentiomètres alignéalignés sur le côtécôté, l'Arduino plus ou moins au centre et les relais alignéalignés en bas. De cette manièmanière on aura le plus de composants directement soudésoudés sur la PCB. Il suffira d'adapter le patron du boitier aux bonnes dimensions. Il faudra aussi intéintégrer une alimentation 230V pour les relais et une rivation de courant pour l'Arduino. Je n'ai jamais utiliséutilisé KiCad avant donc mon schéschéma est seulement visuel mais pas du tout fonctionnel. Si quelqu'un se sent de le faire proprement, ce serait super (je vais essayer d'apprendre d'ici ).

Paul SPIRCKEL (07/02.2024) :

Cette ance je me suis intéresséintéressé àà la façfaçon dont on pourrait faire varier la tension des panneaux LED. On pourrait utiliser un variateur de tension externe, sauf si l'on veut que la luminositéluminosité soit régléréglée automatiquement (mais est-ce que çça fait du sens ?). J'ai couvert une technique appeléappelée PWM qui permet de génégénérer des signaux analogiques glables àà partir de signaux numénumériques. Pour autant j'ai l'impression que çça ne génègénère que des sinusoïsinusoïdes et pas des tensions constantes, mais la piste reste àà creuser. Je n'ai pas pu le tester par manque de temps mais aussi parce que je n'ai jamais travaillétravaillé sur un ESP32 et je n'ai pas ussi àà corriger des erreurs certainement causécausées par des problèproblèmes de bibliothèbibliothèques et autres. J'ai testétesté le capteur de luminositéluminosité, il fonctionne bien.

La boîboîte du projet est restérestée en Biologie / Chimie

Miro VON DER BORCH (05/06/2024) :

J'ai beaucoup avancéavancé sur le programme et la PCB du greenduino. Pour l'instant le montage tel quel permet de gler la tempétempérature, l'humiditéhumidité, l'arrosage désirédésiré par un systèsystème de menu àà deux bouton et àà l'aide de deux potentiomèpotentiomètres.

J'ai essayéessayé sans grand succèsuccès d'ajouter un logbook sur une carte SD et un Backup en cas de coupure de courant, mais pour une raison que j'ignore çça ne fonctionne pas... J'ai donc décidédécidé d'abandonner l'idéidée du logbook et du backup pour le moment, j'ai laissélaissé en commentaire les bouts de code que j'ai essayéessayé d'ajouter pour faire fonctionner la partie carte SD.

Le code ci dessous est fonctionnel et se comporte correctement, avec le schéschéma de montage ci joint (les pins digital et analogique ne correspondent pas entre le schéschéma et le code mais c'est juste que ce sont ceux de la bread board sur laquelle je travaille et que je n'ai pas encore modifiémodifié les pins pour les faire correspondre àà ceux de la PCB). Le code comporte une phase de menu et une phase d'action. Il prend en entréentré les deux boutons, deux potentiomèpotentiomètre d'interface ainsi que le capteur humiditéhumidité/.tempétempérature haute préprécision SHT35 et l'interaction se fait via un éécran LCD. Il contrôcontrôle ainsi indéindépendamment 6 relais qui sont respectivement : Chauffage, Refroidissement,  Ventilation niveau 1, Ventilation niveau 2, Arrosage et Humidification. Les conditions préprécises de clenchement peuvent êêtre adaptéadapté au besoin dans le code.

Voici le code pour l'instant et des captures d'éécrans du schéschéma et de la PCB :

#include <Arduino.h>

#include <Wire.h>

#include <DFRobot_SHT3x.h>

#include "rgb_lcd.h"

/*#include <SPI.h>

#include <SD.h>*/

#define Fan1 13              // pin3 devient le pin du relai(Fan 1

#define Fan2 12               // pin4 devient le pin du relai(Fan 2

#define Cooler 11                      // pin6 devient le pin du Cooler

#define Heating 10                     // pin5 devient le pin du chauffage

#define Watering 8                    // pin0 devient le pin de l'arrosage

#define Moisturing 9                 // pin13 devient le pin de l'humidification

#define OK 5                          // pin2 devient le pin du bouton OK

#define Select 6                      // pin1 devient le pin du bouton Select

#define Screen 7                     // Permet d'ééteindre l'éécran et ééconomiser de l'éénergie

DFRobot_SHT3x   sht3x;                // initie le SHT35

rgb_lcd lcd;

//File GrowBox;

//Sd2Card card;

//SdVolume volume;

//SdFile root;

int GroundSensor = A0;         // attribution du pin analogique A0 comme entréentrée du signal du capteur d'humiditéhumidité du sol

int Poten = A1;                // attribution du pin analogique A2 comme entréentrée du signal du potentiomèpotentiomètre

int PotenFine = A2;            // attribution du pin analogique A3 comme entréentrée su signal du potentiomèpotentiomètre de glage fin

// Les variables suivantes sont pour les glages

float T = 0;

float H = 0;

float W = 0;

float P = 0;

float Pf = 0;

// Les variables suivantes sont pour le backup

float T1 = 0;

float H1 = 0;

float W1 = 0;

// Les variable suivantes sont pour naviguer entre les menus de glage

int Menu = 1;

int Valider = 0;

// Les variables suivantes sont pour savoir si les relais sont ouverts ou ferméfermé

int Fan1Mode = 0;

int Fan2Mode = 0;

int CoolerMode = 0;

int HeatingMode = 0;

int WateringMode = 0;

int MoisturingMode = 0;

// l'horloge

unsigned long ScreenClock;

//unsigned long LogClock;

unsigned long Clock;

// L'éécran

int S = 1;

// Sauvegardes

/*float Log[4];

String dataString = "";

int i = 0;

char C = 0;*/




void setup() {

  sht3x.begin();

  pinMode(Screen, OUTPUT);

  digitalWrite(Screen, HIGH);

  delay (100);

  pinMode(Fan1, OUTPUT);      // gle le pin 3 en output

  pinMode(Fan2, OUTPUT);      // gle le pin 4 en output

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

  pinMode(PotenFine, INPUT);

  pinMode(Cooler, OUTPUT);

  pinMode(Heating, OUTPUT);

  pinMode(Watering, OUTPUT);

  pinMode(Moisturing, OUTPUT);

  pinMode(OK, INPUT_PULLUP);

  pinMode(Select, INPUT_PULLUP);

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

  while(!Serial){

  }

  Serial.println();

  Serial.println("Serial start");
  
  lcd.begin(16, 2);

  Serial.println("init SD card");

  lcd.print("Initialization...");

/*  if (!card.init(SPI_HALF_SPEED, 4)) {

    Serial.println("init failed");

    while (1);

  }*/

  Serial.println("init done");




  /*if (SD.exists("Log.txt")){

    Serial.println("Log.txt exist");

  } else {

    Serial.println("Log.txt doesn't exist");

    GrowBox = SD.open("Log.txt", FILE_WRITE);

    if (GrowBox) {
      
      GrowBox.println("T;H;W");

      GrowBox.close();

    } else {

      Serial.println("error opening Log.txt");

    }

  }

 if (SD.exists("Backup.txt")){

    Serial.println("Backup.txt exists");

    GrowBox = SD.open("Backup.txt", FILE_READ);

    GrowBox.seek(0);

    i = 0;

    while (GrowBox.available()) {

      C = GrowBox.peek();
      
      if (C == ';'){

        GrowBox.read();

      } else {

        float newvalue = GrowBox.parseInt();
  
        Log[i] = newvalue;
  
        i++;

      }

      
    }

    GrowBox.close();

    T=Log[0];

    H=Log[1];

    W=Log[2];

  } else {

    Serial.println("Backup.txt not exist");

    GrowBox = SD.open("Backup.txt", FILE_WRITE);

    if (GrowBox) {

      GrowBox.seek(0);

      GrowBox.print("10;0;0");

      GrowBox.close();
      
    } else {

      Serial.println("error opening Backup.txt");

    }

  }*/

lcd.clear();

}






void loop () {

  if ((Valider = 0) || (Menu =! 0)){

    Validation();

  }

  if (Menu == 1) {

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set temp");

    lcd.setCursor(0, 1);

    lcd.print("Current :");

    lcd.setCursor(8, 1);

    lcd.print(T);

    lcd.setCursor(12, 1);

    lcd.print(" C");

    delay (500);

    lcd.setCursor(15, 1);

    lcd.print("X");

    while (Menu == 1) {

      if (digitalRead(OK) == LOW) {

        Serial.println("OK");

        Menu = 2;

      }

      if (digitalRead(Select) == LOW) {

        Serial.println("Sel");

        Set_T();
        
      }

      delay(100);

    }

  }




  if (Menu == 2) {

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set hum");

    lcd.setCursor(0, 1);

    lcd.print("Current :");

    lcd.setCursor(8, 1);

    lcd.print(H);

    lcd.setCursor(13, 1);

    lcd.print(" %");

    delay (500);

    lcd.setCursor(15, 1);

    lcd.print("X");

    while (Menu == 2) {

      if (digitalRead(OK) == LOW) {

        Serial.println("OK");

        Menu = 3;

        
      }
      if (digitalRead(Select) == LOW) {

        Serial.println("Sel");

        Set_H();

      }

      delay(100);

    }

  }




  if (Menu == 3) {

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set watering");

    lcd.setCursor(0, 1);

    lcd.print("Current :");

    lcd.setCursor(8, 1);

    lcd.print(W);

    lcd.setCursor(13, 1);

    lcd.print("%");

    delay (500);

    lcd.setCursor(15, 1);

    lcd.print("X");

    while (Menu == 3) {

      if (digitalRead(OK) == LOW) {

        Serial.println("OK");

        Menu = 0;

        Validation();

      }

      if (digitalRead(Select) == LOW) {

        Serial.println("Sel");
        
        Set_W();
      }

      delay(100);

    }

  }





  if ((Menu == 0) && (Valider == 1)){

    lcd.clear();

    lcd.setCursor(0,0);

    lcd.print("Starting...");

    Serial.print("Starting...");

/*    Log[0] = T;
    
    Log[1] = H;

    Log[2] = W;

    dataString = "";

    for (int i = 0; i < 2; i++){

      dataString += String(Log[i]);

      if (i < 2){

        dataString += ";";

      }

    }

    GrowBox = SD.open("Backup.csv", O_RDWR);

    if (GrowBox) {

      GrowBox.seek(0);

      GrowBox.print(dataString);

      GrowBox.close();
      
    } else {
      Serial.println("error opening datalog.txt");
    }

    dataString = "";

    delay(500);*/

    ScreenClock = millis();

//    LogClock = millis();

    while ((Menu == 0) && (Valider == 1)) {

      Working();

      Clock = millis();

      if ((Clock-ScreenClock >= 10000) && (S == 1)){

        digitalWrite(Screen, 0);

        Serial.println("Screen OFF");

        S = 0;

      }


      if (digitalRead(Select) == LOW) {

        Serial.println("Sel");

        digitalWrite(Screen, HIGH);

        Serial.println("Screen ON");

        S = 1;

        delay(500);

        lcd.begin(16, 2);

        Menu = 1;

      }


      if (digitalRead(OK) == LOW) {

        Serial.println("OK");

        digitalWrite(Screen, HIGH);

        Serial.println("Screen ON");

        S = 1;

        delay(500);

        lcd.begin(16, 2);

        ScreenClock = millis();

        Clock = millis();

      }

      Serial.print("Screen O/I : ");
      Serial.println(S);

/*      if (Clock-LogClock >= 900000){

        LogBook();

        LogClock = millis();

      }*/

      delay(500);

    }
  }

  delay (100);

}






void Ventilation() {

  if ((sht3x.getTemperatureC() >= T) && (Fan1Mode == 0)) {

    digitalWrite(Fan1, LOW);          // le relai se ferme => le ventilateur s'allume
    
    Fan1Mode = 1;

  }

  if ((sht3x.getTemperatureC() >= T+1) && (Fan1Mode == 1) && (Fan2Mode == 0)) {

    digitalWrite(Fan2, LOW);

    Fan2Mode = 1;

  }

  if ((T >= sht3x.getTemperatureC()) && (Fan2Mode == 1)) {

    digitalWrite(Fan2, HIGH);

    Fan2Mode = 0;

  }

  if (T-1 >= sht3x.getTemperatureC()) {

    digitalWrite(Fan1, HIGH);

    Fan1Mode = 0;

    digitalWrite(Fan2, HIGH);

    Fan2Mode = 0;

  }

  Serial.print("Fan1 O/I : ");
  Serial.println(Fan1Mode);

  Serial.print("Fan2 O/I : ");
  Serial.println(Fan2Mode);

}






void Chauffage () {

  if ((T-3 >= sht3x.getTemperatureC()) && (HeatingMode == 0)) {

    digitalWrite(Heating, LOW);

    HeatingMode = 1;

  }

  if ((sht3x.getTemperatureC() >= T-2) && (HeatingMode == 1)) {

    digitalWrite(Heating, HIGH);

    HeatingMode = 0;

  }

  Serial.print("Heating O/I : ");
  Serial.println(HeatingMode);

}






void Refroidissement () {

  if ((sht3x.getTemperatureC() >= T+5) && (CoolerMode == 0)) {

    digitalWrite(Cooler, LOW);

    CoolerMode = 1;

  }

  if ((T >= sht3x.getTemperatureC()) && (CoolerMode == 1)) {

    digitalWrite(Cooler, HIGH);

    CoolerMode = 0;

  }

  Serial.print("Cooler O/I : ");
  Serial.println(CoolerMode);

}






void Arrosage () {

  if (W+10 >= (constrain(map(analogRead(GroundSensor), 670, 440, 0, 100), 0, 100)) && (WateringMode == 0)) {

    digitalWrite(Watering, LOW);

    WateringMode = 1;

  }

  if (((constrain(map(analogRead(GroundSensor), 670, 440, 0, 100), 0, 100)) >= W-10) && (WateringMode == 1)) {

    digitalWrite(Watering, HIGH);

    WateringMode = 0;

  }

  Serial.print("Watering O/I : ");
  Serial.println(WateringMode);

}





void Humidification () {

  if ((H-10 >= sht3x.getHumidityRH()) && (MoisturingMode == 0)) {

    digitalWrite(Moisturing, LOW);

    MoisturingMode = 1;

  }

  if ((sht3x.getHumidityRH() >= H) && (MoisturingMode == 1)) {

    digitalWrite(Moisturing, HIGH);

    MoisturingMode = 0;

  }

  Serial.print("Moisturing O/I : ");
  Serial.println(MoisturingMode);

}





void Set_T () {

  Serial.println("Setting Temp");

  T1 = T;

  lcd.clear();

  lcd.setCursor(0,0);

  lcd.print("Wait...");

  delay (500);

  while (Menu == 1) {

    P = map(analogRead(Poten), 60, 996, 100, 500);

    Pf = map(analogRead(PotenFine), 50, 999, -5, 5);
    
    T = constrain((P+Pf), 100, 500)/10;   // poten prend comme valeur celle envoyéenvoyée par le potentiomèpotentiomètre, divisédivisée par 10 pour avoir un interval de tempétempérature entre 0 et 70°70°C àà laquelle on ajoutte celle d'un deuxièdeuxième potentiomèpotentiomètre divisédivisé par 100 pour avoir plus de préprécision

    Serial.print("Setting temp to : ");
    Serial.print(T);
    Serial.println("Celsius");

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set temp to:");

    lcd.setCursor(0, 1);

    lcd.print("T=");

    lcd.setCursor(2, 1);

    lcd.print(T);

    lcd.setCursor (7, 1);

    lcd.print(" C");

    if (digitalRead(OK) == LOW) {

      Serial.println("OK");

      Menu = 2;

    }

    if (digitalRead(Select) == LOW) {

      Serial.println("Sel");

      Menu = 2;
      
      T=T1;

    }

    delay(100);

  }

}






void Set_H () {

  Serial.println("Setting Humidity");

  H1 = H;

  lcd.clear();

  lcd.setCursor(0,0);

  lcd.print("Wait...");

  delay (500);

  while (Menu == 2) {

    P = map(analogRead(Poten), 60, 996, 0, 1000);

    Pf = map(analogRead(PotenFine), 50, 999, -5, 5);
    
    H = constrain((P+Pf)/10, 0, 100);

    Serial.print("Setting Humidity to : ");
    Serial.print(H);
    Serial.println("%");

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set hum to:");

    lcd.setCursor(0, 1);

    lcd.print("H=");

    lcd.setCursor(2, 1);

    lcd.print(H);

    lcd.setCursor (8, 1);

    lcd.print(" %");

    if (digitalRead(OK) == LOW) {

      Serial.println("OK");

      Menu = 3;

    }

    if (digitalRead(Select) == LOW) {

      Serial.println("Sel");

      Menu = 3;
      
      H=H1;

    }

    delay(100);

  }

}






void Set_W () {

  Serial.println("Setting Watering");

  W1 = W;

  lcd.clear();

  lcd.setCursor(0,0);

  lcd.print("Wait...");

  delay (500);

  while (Menu == 3) {

    P = map(analogRead(Poten), 60, 996, 0, 1000);

    Pf = map(analogRead(PotenFine), 50, 999, -5, 5);
    
    W = constrain((P+Pf)/10, 0, 100);

    Serial.print("Setting Watering to : ");
    Serial.print(W);
    Serial.println("%");

    lcd.clear();

    lcd.setCursor(0, 0);

    lcd.print("Set watering to:");

    lcd.setCursor(0, 1);

    lcd.print("W=");

    lcd.setCursor(2, 1);

    lcd.print(W);

    lcd.setCursor (7, 1);

    lcd.print("%");

    if (digitalRead(OK) == LOW) {

      Serial.println("OK");

      Menu = 0;

    }

    if (digitalRead(Select) == LOW) {

      Serial.println("Sel");

      Menu = 0;
      
      W=W1;

    }

    delay(100);

  }

}





void Validation () {

  Valider = 0;

  Menu = 0;

  off();

  Serial.print("Setting : T= ");
  Serial.print(T);
  Serial.print("C H= ");
  Serial.print(H);
  Serial.print("% W=");
  Serial.print(W);
  Serial.println("%");

  lcd.clear();

  lcd.setCursor(0, 1);

  lcd.print("T=   H=    W=   ");

  lcd.setCursor(2, 1);

  lcd.print(round(T));

  lcd.setCursor(7, 1);

  lcd.print(round(H));

  lcd.setCursor(13, 1);

  lcd.print(round(W));

  lcd.setCursor(0, 0);

  lcd.print("    Valider?    ");

  delay (500);

  lcd.setCursor(15, 0);

  lcd.print("X");

  ScreenClock = millis();

  while ((Valider == 0) && (Menu == 0)) {

    Clock = millis();

    if ((digitalRead(OK) == LOW) || (Clock-ScreenClock >= 5000)) {

      Serial.println("OK");

      Valider = 1;

    }

    if (digitalRead(Select) == LOW) {

      Serial.println("Sel");

      Menu = 1;

    }
    
    delay(100);

  }

}





void off () {

  digitalWrite(Fan1, HIGH);

  digitalWrite(Fan2, HIGH);

  digitalWrite(Heating, HIGH);

  digitalWrite(Cooler, HIGH);

  digitalWrite(Watering, HIGH);

  digitalWrite(Moisturing, HIGH);

  MoisturingMode = 0;

  CoolerMode = 0;

  HeatingMode = 0;

  Fan1Mode = 0;

  Fan2Mode = 0;

  WateringMode = 0;

  Serial.println("Off");

}



void Working(){

  Serial.print("Setting : T= ");
  Serial.print(T);
  Serial.print("C H= ");
  Serial.print(H);
  Serial.print("% W=");
  Serial.print(W);
  Serial.println("%");

  Serial.print("Mesured : T= ");
  Serial.print(sht3x.getTemperatureC());
  Serial.print("C H= ");
  Serial.print(sht3x.getHumidityRH());
  Serial.print("% W=");
  Serial.print(constrain(map(analogRead(GroundSensor), 670, 440, 0, 100), 0, 100));
  Serial.println("%");

  lcd.clear();

  lcd.setCursor(0, 1);

  lcd.print("T=   H=    W=   ");

  lcd.setCursor(2, 1);

  lcd.print(round(T));

  lcd.setCursor(7, 1);

  lcd.print(round(H));

  lcd.setCursor(13, 1);

  lcd.print(round(W));

  lcd.setCursor(0, 0);

  lcd.print("T=   H=    W=   ");

  lcd.setCursor(2, 0);

  lcd.print(round(sht3x.getTemperatureC()));

  lcd.setCursor(7, 0);

  lcd.print(round(sht3x.getHumidityRH()));

  lcd.setCursor(13, 0);

  lcd.print(constrain(map(analogRead(GroundSensor), 670, 440, 0, 100), 0, 100));

  Ventilation ();

  Chauffage ();

  Refroidissement ();

  Arrosage ();

  Humidification ();

}


/*void LogBook (){

  Clock = millis();

  T1 = sht3x.getTemperatureC();

  H1 = sht3x.getHumidityRH();

  W1 = constrain(map(analogRead(GroundSensor), 670, 440, 0, 100), 0, 100);

  Log[0] = T;
    
  Log[1] = H;

  Log[2] = W;

  dataString = "";

  dataString += String(Clock);

  dataString += ";";

  for (int i = 0; i < 2; i++){

    dataString += String(Log[i]);

    if (i < 1){

      dataString += ";";

    }

  }

  GrowBox = SD.open("Backup.csv", FILE_WRITE);

  if (GrowBox) {

    GrowBox.println(dataString);

    GrowBox.close();
      
  } else {
    Serial.println("error opening datalog.txt");
  }

  dataString = "";

}*/

Capture d'écran 2024-06-05 225402.pngCapture d'écran 2024-06-05 225402.png

Capture d'écran 2024-06-05 225422.pngCapture d'écran 2024-06-05 225422.png

Dimensions : 128 x 91 mm

PS : On pourra noter que la PCB comporte quelques problèproblèmes au niveau du plan de masse qui n'est pas connectéconnecté partout (broches "Humidification/arrosage" et "Ventilateur 1/2") mais je pensait gler ce problèproblème aprèaprès coup avec un bout de fil.

Je travail maintenant sur le design de la boite dans laquelle je veux mettre tout çça. Je pensait àà quelques chose de ce type :

Screenshot_20240605-230006.png

Dimensions : 130(+ la languette avec les relais) x 120 x 100 mm

Alex et MikhaïMikhaïl 18/10/2024

Il faudrait simplifier le dispositif afin de le rendre opéopérationnel le plus rapidement possible, puis itéitérer avec des versions ultéultérieures en y ajoutant des fonctionnalitéfonctionnalités additionnelles.

En premier lieu faire un dispositif avec un éécran et des boutons permettant de contrôcontrôler la tempétempérature

Partie du code àà faire:

bool histeresisStatusHigh = false

bool checkTemperatureSurpassed(){
  
  if(hysteresisStatusHigh == false && temperatureGlobal >= TEMPERATUREHIGHPOINT){
    return(true);
  }
  if(hysteresisStatusHigh && temperatureGlobal >= TEMPERATURELOWPOINT){
    return(true);
  }
  return(false);
  }

void getTemperature(){
  temperatureStatus = checkTemperatureSurpassed();
}

25/10/2024 MikhaïMikhaïl et Irina

Le code pour activer le ventilateur (branchébranché sur le pin 5) en fonction de la tempétempérature ambiante (thermomèthermomètre branchébranché sur le pin 2 ), contrôlécontrôlé par les boutons (branchébranchés sur des pins 3 et 4)

photo_5249143273954599018_y.jpg

#include "DHT.h"

#define DHTPIN 2
#define DHTTYPE DHT21

DHT dht(DHTPIN, DHTTYPE);

#define BUTTON_INCREASE 3
#define BUTTON_DECREASE 4
#define FUN_PIN 5

float targetTemperature = 25.0;
float temperature;

void setup() {
  Serial.begin(9600);
  dht.begin();

  pinMode(BUTTON_INCREASE, INPUT_PULLUP);
  pinMode(BUTTON_DECREASE, INPUT_PULLUP);
  pinMode(FUN_PIN, OUTPUT);

}

void loop() {
  float temperature = dht.readTemperature();
  
  Serial.print("Current temperature:");
  Serial.print(temperature);
  delay(1000);
  
  if (digitalRead(BUTTON_INCREASE)== LOW){
    targetTemperature += 0.5;
    Serial.print("Target temperature:");
    Serial.println(targetTemperature);
    }

  if (digitalRead(BUTTON_DECREASE)== LOW){
    targetTemperature -= 0.5;
    Serial.print("Target temperature:");
    Serial.println(targetTemperature);
    }
    
  if (temperature > targetTemperature){
    digitalWrite(FUN_PIN,LOW);
    } else if(temperature < targetTemperature - 1.0){
      digitalWrite(FUN_PIN,HIGH);
      }
  
  }


 

Taha,04/12/2024 Micha
29/11/2024

L'ensemble du circuit marche plutôt bien. La configuration du seuil de températureAlex et duIryna

Nouveau deltawiki est---> bien pris en compte. EN revanche, nous avons constaté un petit problème concernant l'activation des ventilateurs. En effet, les relais que nous utilisons allument le ventilateur lorsque nous sommes en dessous de la température seuil, alors que nous voulons l'inverse (les ventilateurs doivent s'allumer quand il fait trop chaud !). Pour résoudre le problème, il faut simplement mettre le pin à l'état LOW (au lieu de HIGH) lorsqu'on dépasse la température seuil pour pouvoir allumer le ventilateur. 
A faire :
- dans le code, inverser l'état du pin permettant d'allumer les ventilateurshttps://wiki.fablab.sorbonne-universite.fr/BookStack/books/systeme-ventilation-fablab