Projet Ventilateur Grow Box
Dans ce projet on cherche a réré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 rèrègle le modèmodèle de capteur
DHT dht(DHTpin, DHTTYPE);
void setup() {
pinMode(DHTpin, INPUT); // rèrègle le pin 2 en input
pinMode(Relai, OUTPUT); // rè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é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 rérégler la tempétempérature de dédéclenchement, mais aussi des moyens de réré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 dédé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/dédésactive pas sans arrêarrêt autour de 25°25°C (typiquement ventiler jusqu'àà 22°22°C avant de se dé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èrè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); // rèrègle le pin 2 en input
pinMode(Relai, OUTPUT); // rè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é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 3°3°C et un potentiomèpotentiomètre permettant de choisir le seuil de tempétempérature àà ne pas dédé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 rèrè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); // rèrègle le pin 2 en input
pinMode(Relai, OUTPUT); // rèrègle le pin 3 en output
pinMode(adcPin, INPUT); // rèrè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 àà 3°3°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 3°3°C en dessous de la valeur de dé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é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 rèrè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); // rèrègle le pin 2 en input
pinMode(Relai_1, OUTPUT); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(adcPin, INPUT); // rèrè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 àà 3°3°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 3°3°C en dessous de la valeur de dé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érepassée en dessous de poten (donc 3°3°C en dessous de la valeur de dé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é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 réré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 dédé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 rèrè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 réréglage fin
int poten = 0; // poten est la variable modifiémodifiée par les potentiomèpotentiomètres
void setup() {
pinMode(DHTpin, INPUT); // rèrègle le pin 2 en input
pinMode(Relai_1, OUTPUT); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(adcPin, INPUT); // rèrè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 àà 3°3°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 3°3°C en dessous de la valeur de dé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.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 dédé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 3°3°C en dessous de la valeur de dé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");
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 réréussi àà faire fonctionner la communication sésé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 mêmê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 dédé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. MêMê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 rèrè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 réréglage fin
int poten = 0; // poten est la variable modifiémodifiée par les potentiomèpotentiomètres
void setup() {
pinMode(DHTpin, INPUT); // rèrègle le pin 2 en input
pinMode(Relai_1, OUTPUT); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(adcPin, INPUT); // rèrè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 àà 3°3°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 dédé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 3°3°C en dessous de la valeur de dédé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 dédé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 3°3°C en dessous de la valeur de dédé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 peupréprécis (plusieursdegrédegrés d'incertitude) pour un capteur SHT31 bien pluspréprécis (incertitude de l'ordre dudixièdixième dedegré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 despotentiomèpotentiomètres rotatif pluspréprécis (8 et 10kOHm) et plusesthéesthétique aussi ! Seulement pour cela j'aidûdût ajouter quelquesrérésistances pourééviter tout risque de cours circuit. - J'ai aussi
ajoutéajouté trois relaissupplésupplémentaire.- Un qui actionnerais une
rérésistance de chauffe afin d'éélever latempétempérature de la serre au dessus de latempé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 pouvoircontrôcontrôler l'hygroméhygrométrieàà terme !
- Un qui actionnerais une
- J'ai aussi remis un tout petit
potentiomèpotentiomètre pour laluminositéluminosité (c'est finalement plusagré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 :
Le schéschéma du circuit sur KiCad
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é- "
réré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 nouveauxsystèsystèmeliéliéàà larérégulation de latempétempérature,àà savoir, le chauffage et le refroidissement actif. - Il faudrait
éétablir unsystèsystème derérégulation de l'humiditéhumidité (quand allumer le brumisateur pour humidifier et quand allumer les ventilateurs poursésécher l'air). - Peut-
êêtre aussi que centrer le delta d'allumage autour de la valeurdemandédemandé serais plus judicieux pour avoir une meilleurpréprécision. Parççaj’j’entends, au lieu d'allumer les ventilateurs lorsque latempétempératuresouhaitésouhaité est atteinte et lesééteindre troisdegrédegré en dessous, les allumer undegrédegré au dessus de la valeurssouhaitésouhaité et lesééteindre undegrédegré en dessous de la valeursouhaitésouhaité
Lors de mes essais pour réré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 mêmê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 :
Le schéschéma mis àà jour
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 sûsûr que toutes les conditions sont lues, j'ai préférépréféré dédé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 (RéRé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 réré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 réré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); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(Relai_3, OUTPUT); // rèrègle le pin 5 en output
pinMode(Relai_4, OUTPUT); // rèrègle le pin 6 en output
pinMode(Relai_5, OUTPUT); // rèrègle le pin 13 en output
pinMode(adcTempPin, INPUT); // rèrègle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT); // rèrègle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT); // rèrègle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT); // rèrè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 1°1°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 àà 1°1°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 1°1°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 3°3°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 àà 3°3°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 5°5°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 àà 5°5°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 1°1°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 (RéRé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 réré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 réré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); // rèrègle le pin 6 en output
pinMode(Relai_1, OUTPUT); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(Relai_3, OUTPUT); // rèrègle le pin 5 en output
pinMode(Relai_5, OUTPUT); // rèrègle le pin 13 en output
pinMode(adcTempPin, INPUT); // rèrègle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT); // rèrègle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT); // rèrègle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT); // rèrè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 1°1°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 àà 1°1°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 1°1°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 3°3°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 àà 3°3°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 nouveaupotentiomèpotentiomètreCréCréer l'ééchelle des valeurs (%) Hum_poten correspondant au nouveaupotentiomèpotentiomètre- Ajouter toutes les lignes d'affichage sur
éécran - Essayer d'utiliser des elsif avec une seule condition else qui permet de
dédésactiver tous les relais - Trouver un moyen de contourner la connexion I2C
- Ajouter toutes les
bibliothèbibliothèquesnénécessaires si elles n'y sont pasdéjàdéjà - Trouver un moyen de
dédéconnecter tous les appareils chauffants si latempé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 gêgênent pas des connexions du shield, sinon il ne fonctionnera pas. Idem si on utilise le "Wireless SD Shield" pour ajouter de la mémé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 àà dédé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 mêmê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 (RéRé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 réré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 réré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); // rèrègle le pin 3 en output
pinMode(Relai_2, OUTPUT); // rèrègle le pin 4 en output
pinMode(Relai_3, OUTPUT); // rèrègle le pin 5 en output
pinMode(Relai_4, OUTPUT); // rèrègle le pin 6 en output
pinMode(Relai_5, OUTPUT); // rèrègle le pin 13 en output
pinMode(adcTempPin, INPUT); // rèrègle le pin A0 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Temp
pinMode(adcTempPinfine, INPUT); // rèrègle le pin A1 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Tempfine
pinMode(adcHumPin, INPUT); // rèrègle le pin A2 (analogique) comme entréentrée du signal du potentiomèpotentiomètre Hum
pinMode(adcHumPinfine, INPUT); // rèrè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 1°1°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 àà 1°1°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 1°1°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 3°3°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 àà 3°3°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 5°5°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 àà 5°5°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 1°1°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 (RéRé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 nouveaupotentiomèpotentiomètreCréCréer l'ééchelle des valeurs (%) Hum_poten correspondant au nouveaupotentiomè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èquesnénécessaires si elles n'y sont pasdéjàdéjà - Trouver un moyen de
dédéconnecter tous les appareils chauffants si latempé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 larangérangée du bas) - Utiliser une autre carte ou augmenter la
mémé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 dédésolidariser le LCD de la PCB. J'ai commencécommencé àà faire un dessin de dédé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 rérépartis sur diffédifférentes faces implique de les dédé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 dédé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 làlà).
Paul SPIRCKEL (07/02.2024) :
Cette sésé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 dédécouvert une technique appeléappelée PWM qui permet de génégénérer des signaux analogiques réré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 réré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 réré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 dédé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 réréglage fin
// Les variables suivantes sont pour les réré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 réré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); // rèrègle le pin 3 en output
pinMode(Fan2, OUTPUT); // rèrègle le pin 4 en output
pinMode(Poten, INPUT); // rèrè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 = "";
}*/
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 réré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 :
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)
#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 Micha29/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