Bonjour,
Je me suis lancé dans un projet qui au final se complexifie au fur et a mesure et je souhaite avoir des avis sur la structure globale a donner au programme.
Je joint le programme actuel sur lequel j’ai un problème de temporisation bloquante ( la fonction arrosage bloque les autres pour le moment, normal j’ai des delay dessus je suis en train de m’entrainer sur la fonction millis et je vais rajouter un module RTC DS3231), et les valeurs ne se mettent a jours qu’une fois la 1ere fonction effectuée.
Je vais potasser cela dans le week end mais je suis preneur de conseils sur l’organisation d’un tel programme ou des pistes vers lesquels m’orienter.
A terme je pense faire prendre les mesures x fois par jour , pas de besoin de precision extreme et je vais rajouter de l’hystereris pour avoir une souplesse sur les declenchements des relais.
Mais avant de développer plus loin je souhaite avoir vos avis sur la façon dont j’ai coder, j’hésite a utiliser les fichiers ( ou onglets) mais je ne trouve pas beaucoup de tuto précis donc pour le moment j’ai fait comme ca :
Merci a ceux qui prendrons le temps
#include <LiquidCrystal_I2C.h> //librairie de l'ecran adresse apres scan 0x27
#include <Wire.h>
#include <Adafruit_Sensor.h> //librairies des capteurs tst sur DHT22
#include <DHT.h>
#include <DHT_U.h>
#define ADRESSE_I2C_RTC 0x68 // adresse I2C du module RTC DS3231
// Déclaration des variables de l'horloge
byte seconde, minute, heure, numJourSemaine, numJourMois, mois, annee;
String jourDeLaSemaine[8] = {"","Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};
// declaration des relais
const int Relais_Arrosage = 4; // voir programme arrosage automatique
const int Relais_Chauffage = 5; //voir prog Lcd et relais
const int Relais_Humidite = 6; //voir prog Lcd et relais
const int Relais_Ventilateur = 7; //declenchement programmée par cycle rtc a faire
const int Alim_Sonde=8; //alimentation de la sonde humidite sol
// declaration des capteurs
#define DHTPIN 12 //broche du DHT
#define DHTTYPE DHT22 // ou DHT 11 selon le modele utilisé
DHT dht(DHTPIN, DHTTYPE); // Initialise le capteur DHT22
//capteur d humidite sol de type capacitif calibré sec a 800 et eau a 400
int capteuranalogique = A1;
// declaration de l'ecran
LiquidCrystal_I2C lcd(0x27, 20, 4); // ecran lcd2004
//partie pour l'arrosage
int sensorValue1 = 0;
int maxi = 1023; // pour avoir toute la fenetre du traceur série
int mini = 0; // pour avoir toute la fenetre du traceur serie
//test fonction millis
const unsigned long DELAI_POMPE= 10000;
// gestion des temps de mise en route
void setup() {
// demarrages des elements
Wire.begin();
Serial.begin(9600); // moniteur série
lcd.begin ();
lcd.println("DEMARRAGE SYSTEME");
lcd.clear();
dht.begin();
// declaration des sorties
pinMode(Relais_Arrosage, OUTPUT); // broche d'alimentation du relais action en fonction de la sonde
pinMode(Alim_Sonde, OUTPUT); // broche d'alimentation de la sonde
pinMode(Relais_Chauffage,OUTPUT); //Relais pour le chauffage action selon consigne temperature
pinMode(Relais_Humidite,OUTPUT); //Relais humidité action en focntion de la consigne humidité air
pinMode(Relais_Ventilateur,OUTPUT); // Ventilo fonctionnement periodique (xtemps off/y temps ON)
//etat des sorties
digitalWrite(Relais_Arrosage, HIGH); // les relais sont en inverse
digitalWrite(Alim_Sonde, LOW); // met la sonde hors tension - protection oxydation
digitalWrite(Relais_Chauffage,HIGH);
digitalWrite(Relais_Humidite,HIGH);
digitalWrite(Relais_Ventilateur,HIGH);
}
void loop() {
// Réception de l'heure et de la date
Wire.beginTransmission(0x68);
Wire.write(0); // Positionner le pointeur de registre sur 00h
Wire.endTransmission();
Wire.requestFrom(0x68, 7);
// Accède aux données de l'horloge (à partir du registre 00h)
seconde = bcdToDec(Wire.read() & 0x7f);
minute = bcdToDec(Wire.read());
heure = bcdToDec(Wire.read() & 0x3f);
numJourSemaine = bcdToDec(Wire.read());
numJourMois = bcdToDec(Wire.read());
mois = bcdToDec(Wire.read());
annee = bcdToDec(Wire.read());
// Affichage de l'heure (afficheur LCD)
lcd.setCursor(15,0);
if (heure<10){lcd.print("0");}
lcd.print(heure, DEC);
lcd.print(":");
if (minute<10){lcd.print("0");}
lcd.print(minute, DEC);
//appel des fonctions du programmes
affichage();
capteursol();
capteurair();
affichage();
}
// Convertir les nombres décimaux codés binaires en décimaux normaux
byte bcdToDec(byte val){return( (val/16*10) + (val%16));}
void affichage(){
// releve des capteurs
sensorValue1 = analogRead(capteuranalogique); // mesure humidité
int humi = map(sensorValue1,810,390,0,100);
byte h = dht.readHumidity();
// Lit la temperature en degres Celsius (valeur par defaut
byte t = dht.readTemperature();
//gestion affichage lcd
lcd.setCursor(0, 0);
lcd.print("T.AIR = ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0, 1);
lcd.print("H.AIR = ");
lcd.print(h);
lcd.print(" % ");
lcd.setCursor(0, 2);
lcd.print("H.SOL = ");
lcd.print(humi);
lcd.print(" % ");
}
void capteursol(){
digitalWrite(8, HIGH); // met la sonde sous tension
sensorValue1 = analogRead(capteuranalogique); // mesure humidité
int humi = map(sensorValue1,810,390,0,100);
Serial.print(maxi);
Serial.print(" ; ");
Serial.print(mini);
Serial.print(" ; VALEUR ANALOGIQUE = ");
Serial.print(sensorValue1);
if (sensorValue1 > 600)
{
lcd.setCursor(17,2);
lcd.print("EAU"); // probleme ici eau ne s'efface pas a corriger
Serial.println(" TROP SEC - ACTIVATION ARROSAGE ");
for(int arrosage = 1 ; arrosage <= 10 ; arrosage = arrosage+1) // cycle maxi de 10 tests + arrosage
{
sensorValue1 = analogRead(capteuranalogique);
if (sensorValue1 > 600) {
Serial.print(arrosage);
Serial.print(" arrosage ");
Serial.print(" ; ");
Serial.println(sensorValue1);
digitalWrite(Relais_Arrosage, LOW);
delay(2000); // durée fixe activation pompe
digitalWrite(Relais_Arrosage, HIGH);
delay(10000); // pause pompe pour laisser a l'eau le tps de pénétrer la terre
}
}
}
}
void capteurair(){
// Lecture de température et de l'humiditer environ 250 millisecondes
// La durer des capteurs peuvent etre regler jusqu'a 2 secondes (capteur tres lent)
byte h = dht.readHumidity();
// Lit la temperature en degres Celsius (valeur par defaut
byte t = dht.readTemperature();
byte c = dht.readTemperature(true);
// Vérifie si toutes les lectures ont échoué et quitte le début (pour réessayer).
if (isnan(h) || isnan(t) || isnan(c)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
{
if (h >= 40 && h <= 60) // si hum. est = ou sup. a 75 ET hum infer. ou = a 80 relais ouvert
{
digitalWrite(Relais_Humidite, LOW);
digitalWrite(Relais_Chauffage,HIGH);
}
else
{
digitalWrite(Relais_Humidite, HIGH);
digitalWrite(Relais_Chauffage,HIGH);// Sinon relais fermé
}
if (t<=27)// si la temperature est inf a X° alors
{
digitalWrite (Relais_Chauffage,LOW);
}
else
{
digitalWrite (Relais_Chauffage,HIGH);
}
delay(1000);// Delai d'une seconde entre les mesures
}
}