Créer une double condition avec un extracteur / dht22 et L'heure

Bonjour, je vous présente mon code juste en dessous ainsi que le projet. Il s'agit d'une serre de culture de tomate paramétrés suivant une étude pro de culture de tomate en serre.

Voici mon problème : Dans l'étude il explique qu'une augmentation de température douce au matin est favorable pour la nouaison des tomates, donc après installation d'un ds3231 et d'un capteur dht22, j'ai conditionné ma température avec une condition d'extraction d'air pendant la journée : Si température > 27 alors extraction on et en dessous de 26 OFF, pour maintenir un 1° d'écart la journée, ( vérifier avec un thermohygromètre enregistreur extérieur à l'arduino) , sauf que je n'arrive pas à trouver le bon code pour garder cette condition et activer pendant une plage horaire précise l'extracteur.

Jai tenter des OR , and not , l'appareil s'allume 2 secondes puis s'éteint, j'ai testé plusieurs code de personnes mais à chaque fois j'ai le même problèmes...

Auriez vous une solution ou une explication du fonctionnement de ce que je souhaiterais faire ?

Merci à vous

#include <DHT.h>
#include <Wire.h>
#include <ds3231.h>
#define DHTPIN 2 // broche DATA -> broche 2
#define RELAIS 9
#define RELAISS 4
#define DHTTYPE DHT22

struct ts temps;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
pinMode(RELAIS, 9);
pinMode(RELAISS, 4);
Wire.begin();
DS3231_init(DS3231_INTCN);
temps.hour = 18;
temps.min = 10;
temps.sec = 30;
temps.mday = 8;
temps.mon = 05;
temps.year = 2022;

DS3231_set(temps);
dht.begin();
}

void loop() {
delay(2500);

float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);

if (t > 27) {
digitalWrite (RELAISS, HIGH);
delay(2000);
}
if (t < 26 ) {
digitalWrite(RELAISS, LOW);
delay(2000);
}
if (h < 35 ) { // ici je pensais h< 35 or temps.hour > 17
digitalWrite (RELAIS, HIGH);
delay(2000);
}
if (h > 45 ) { // ici je pensais h> 45 or temps.hour > 20
digitalWrite(RELAIS, LOW);
delay(2000);
}
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}

// Affiche l'humidité et la température du capteur
// On imprime la température de l'air
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));

// -----------------------------------------------

//-------------------------------------------------
// -----------------------------------------------

// Affiche l'heure du ds3231 ----------
DS3231_get(&temps);
Serial.print("date : ");
Serial.print(temps.mday);
Serial.print("/");
Serial.print(temps.mon);
Serial.print("/");
Serial.print(temps.year);
Serial.print("\t Heure : ");
Serial.print(temps.hour);
Serial.print(":");
Serial.print(temps.min);
Serial.print(".");
Serial.println(temps.sec);
delay(2000);
}

Tu as 4 conditions dont certaines peuvent être simultanées et les ordres qui en découlent peuvent être contradictoires..
Cela crée donc 4 possibilités qu'ils faut traiter séparément.

if ((t > 27) && (h < 35 )){
// mettre ici le code associé à cette condition si elle est remplie
}
if ((t > 27) && (h > 45 )){
// mettre ici le code associé à cette condition si elle est remplie
}
if ((t < 26 ) && (h < 35 )){
// mettre ici le code associé à cette condition si elle est remplie
}
if ((t < 26 ) && (h > 45 )){
// mettre ici le code associé à cette condition si elle est remplie
}

Oui ils sont contradictoires, après je ne comprend pas trop ce que tu me dit car il n'y a pas l'heure intégré dedans ^^, je souhaiterais dire en gros : Si il fait >27 allumage ou si il est 18H allumage ( peu importe la température),

et si <26 extracteur éteint ou si il est 20H éteint ( peu importe la température ) ,

En gros de 18 à 20H il fonctionne, et après 20H ou avant 18H le programme exécute la condition >27 ou <26

merci pour ta réponse

Je n'avais pas vu qu'il y avait 2 relais différents les noms sont plutôt ambigus.

Quand on commence à coder, il faut être précis pour ne pas avoir à recommencer plusieurs fois.

Pourrait donner quelque chose comme ça.

if((heure>=HEURE_DEBUT) && (heure<=HEURE_FIN)){
  // faire une chose
}
if((heure>HEURE_FIN) || (heure<HEURE_DEBUT)){
   if(temp<TEMP_MIN) {
       // faire quelque chose
   }
   if(temp>TEMP_MAX){
       //faire autre chose
   }
}

Merci beaucoup sa marche ! j'ai donc testé à 17H59 > passage à 18Heure sa s'allume peut importe le taux d'humidité ( testé sur l'humidité), puis le passage de 19 à 20H, le programme éteint bien le relais.

J'ai bien compris comment tu as créé le code, mais je me pose la question pour rajouter une deuxième plage horaire. C'est à dire précisément ^^ 18 à 20 heure extraction de l'air peut importe la température. Puis de 20 à 17h utilisation du relais selon les paramètres. Mais si dans ce même code je souhaite rajouter une place horaire de 9h00 à 11H, re allumage de l'extracteur peut importe les paramètres.

vous avez été aidé - :warning: Merci de nous aider à conserver le forum lisible et d'éditer vos posts pour rajouter les balises de de code,

  • sélectionner la partie du texte qui correspond au code
  • appuyez sur l'icône </> dans la barre d'outils pour indiquer que c'est du code

(Assurez vous aussi d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)


Lire les recommandations listées dans "Les bonnes pratiques du Forum Francophone”

Ok, J-M-L, voici donc le nouveau code, merci pour vos réponses,


   if (( m >= 9) && (m <=10))
  {
  digitalWrite (RELAISS, HIGH);
    delay(2000);
  }
  else if (( m >= 18) && (m <=19))
  {
    digitalWrite (RELAISS, HIGH);
    delay(2000);
  }
  //-------------------------
  
  if ((m>10) && (m <18)){
   if (t > 27) {
    digitalWrite (RELAISS, HIGH);
    delay(2000);
  }
  if (t < 26 ) {
    digitalWrite(RELAISS, LOW);
    delay(2000);
  }
  else if ((m>20) && (m <9)){
   if (t > 27) {
    digitalWrite (RELAISS, HIGH);
    delay(2000);
  }
  if (t < 26 ) {
    digitalWrite(RELAISS, LOW);
    delay(2000);
  }
  }
  }

je n'ai pas vu les posts modifiés...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.