Probleme de Condition

Bonjour , alors de je vous expliques:
Depuis quelques jours je fais un projet de radiateur contrôler avec un arduino + xbee Hc06 , le capteur DHT11 .
Le but est de faire un “mode automatique (relay1)sur pin 12” avec le dht11 sur pin 8 et relais sur pin 13 …
j’ai déjà fais l’application android et elle fonctionne parfaitement j’y ai aussi mis la reconnaissance vocal :slight_smile: …Bref le problème que je rencontre est que je n’arrive pas a coder le faite que si le relay1 est HIgh alors le dht11 fais son boulot …Si quelqu’un peut m’apporter son aide ce serais formidable.
Bonne journée a tous

Noter que je suis largement débutant en la matière mais passionnés,

#include "DHT.h"
#define DHTPIN 8
#define DHTTYPE DHT11
const int Relay1 = 12; //led
 const int Relay2 = 13; //radiaterur
const int Relay3 = 7; //PIN 5 FOR RELAY #3
const int Relay4 = 6; //PIN 4 FOR RELAY #4
byte serialA;
DHT dht(DHTPIN, DHTTYPE);


void setup(){
  Serial.begin(9600);
   dht.begin();
  pinMode(Relay1,OUTPUT); //SETTING THE OUTPUT FOR RELAY #1
  pinMode(Relay2,OUTPUT); //SETTING THE OUTPUT FOR RELAY #2
  pinMode(Relay3,OUTPUT); //SETTING THE OUTPUT FOR RELAY #3
  pinMode(Relay4,OUTPUT); //SETTING THE OUTPUT FOR RELAY #4
// digitalWrite (Relay1 ,HIGH) ;
}

void loop()  {
   float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = false)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = true)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f); 
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");



 
if  (Serial.available()>0) {serialA =Serial.read(); Serial.println(serialA);}
  switch(serialA){
    //case 49:
    //digitalWrite(Relay1, !digitalRead(Relay1));
   // break;
    //if recieving a 49(ascii for 1) turn on Relay #1
   
    case 50:
    digitalWrite(Relay2, !digitalRead(Relay2));
   
    delay(100);
    break;
    //if recieving a 50(ascii for 2) turn on Relay #2
   
    case 51:
    digitalWrite(Relay3, !digitalRead(Relay3));
    delay(100);
    break;
    //if recieving a 51(ascii for 3) turn on Relay #3
   
    case 52:
    digitalWrite(Relay1,HIGH);
    Serial.print("OKKKKKKKKKKKHIGH");
  
    break;
    //if recieving a 52(ascii for 4) turn on Relay #4
   
    case 53:
    digitalWrite(Relay1, HIGH);
    digitalWrite(Relay2, HIGH);
    digitalWrite(Relay3, HIGH);
    digitalWrite(Relay4, HIGH);
    break;
    //if recieving a 53(ascii for 5) turn on ALL Relays
   
    case 54:
    digitalWrite(Relay1, LOW);
    Serial.print ("OKKKLOW");
   digitalWrite(Relay2, LOW);
digitalWrite(Relay3, LOW);
  digitalWrite(Relay4, LOW);
    break;
    //if recieving a 54(ascii for 6) turn OFF ALL Relays
 
  }
 if
 

((Relay2==HIGH)&&(t>26))// Si la temperature est superieur a 23 alors il eteint le relay 2
{
  digitalWrite(Relay2,LOW);
  delay(20500);
}
if ((Relay1==LOW)&&(t<24))//si la temperature est inferieur a 19 alors il s'allume
{
  digitalWrite(Relay2,HIGH);
  delay(2500);
  }}

Je pense que le plus simple serait de faire un test sur la valeur du relais par un digitalread(12) et faire la mesure du DHT11 en fonction du résultat. Mais je n'ai jamais fait ça...
Voir éventuellement :

https://www.worldofgz.com/electronique/piloter-un-relais-avec-un-arduino/

Bonjour , et merci de votre réponse , comme je le disais , je débute et j'ai essayer de le mettre en HIGH plus haut et ensuite tous en bas j'ai mis la condition .. mais mon appareil apparemment ignore le code en bas .. n'est t'il pas possible que je mette tous ce qui fais reference au capteur dans une condition

ex :if ((relay1== HIGH)&&(t>20));

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = false)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = true)
float hic = dht.computeHeatIndex(t, h, false);

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");

En tous cas merci mille fois de votre intervention

if ((relay1== HIGH)&&(t>20))[color=red];[/color] --> le point virgule après le if lui dit grosso modo ne fait rien si cette condition est vérifiée. la syntaxe correcte serait

if [color=blue]([/color]condition[color=blue]) {[/color]choses à faire si vrai;[color=blue]}[/color]

ou

if [color=blue]([/color]condition[color=blue]) {[/color]choses à faire si vrai;[color=blue]} else {[/color]choses à faire si faux;[color=blue]}[/color]

Bonjour merci de votre réponse mais dans mon code tous en haut j'ai bien cette syntaxe tous en bas du code et il ne fonctionne pas.quand j'active le relais 1 je voudrais qu'il compare5la température et si besoin allume le relais 2 ..mais sa ne fais rien..

dans mon code tous en haut j’ai bien cette syntaxe tous en bas du code

Je ne comprends pas ce dont vous parlez…

Dans votre code vous avez un point virgule après la condition. Ce n’est sans doute pas correct. Faut fixer cela

Bonjour,

Moi ce que j’ai compris c’est que tu veux que quand Relay1 est HIGH ce soit le mode automatique.
Dans ce cas le test devrait être:

  if (Relay1 == HIGH)
  {
    if (t > 26)
    {
      digitalWrite(Relay2, LOW);
      delay(2500);
    }
    if (t < 24)
    {
      digitalWrite(Relay2, HIGH);
      delay(2500);
    }
  }

J M L Ce que je voulais dire c'est que dans mon premier poste le code ne comporte pas de point virgule mais sa ne fonctionne pas.quand j'active le relais 1 le mode auto ne fonctionne pas..en tous cas merci à tous de vos réponse. Kamill merci j'essaye sa cet après-midi après le boulot

Et si sa intéresse quelqu'un. Je posterai l'application Android et le code ainsi que le plan de connexion des composants une fois que sa fonctionnera.

ah OK - je comprends mieux

dans le premier code il serait sans doute utile de ne mettre les commandes à exécuter que lorsque vous avez reçu un nouveau caractère

Pour le moment vous faites:

 if  (Serial.available() > 0) {
    serialA = Serial.read();
    Serial.println(serialA);
  } // <<--- FIN DU IF NOUVELLE COMMANDE RECUE


// DONC CECI S'EXECUTE EN PERMANENCE AVEC LA VALEUR DE serialA MEME SI VOUS N'AVEZ RIEN RECU
  switch (serialA) {
.....

petite note au passage pour la lisibilité du code, au lieu de faire case 50: et mettre un commentaire, faites directement case '2': pour tester si vous avez reçu le caractère ‘2’

quand au code, difficile de dire si ça fait ce que vous voulez vu que les commentaires ne sont pas en accord avec ce que fait le code, par exemple

   case 52:
      digitalWrite([color=red]Relay1[/color], HIGH);
      Serial.print("OKKKKKKKKKKKHIGH");

      break;
    //if recieving a 52(ascii for 4) [color=red]turn on Relay #4[/color]

sinon dans le premier code vous avez aussi un   delay(20500);… plus de 20 secondes. vous êtes sûr?

Super :smiley: Enfaite je doit vous avouez que si j'ai mis le relay1 c'est juste pour m'en servir comme déclencheur pour activer le mode automatique..Car j'ai essayer plusieurs truc pour activer directement le sensor et je n'est pas réussi.. Sa va venir après quelque années je pense .. :smiley: j'ai hâte bref ..
Alors j'essaye de vous comprendre .. étant noob ..
Quand vous dites regarde si j'ai reçus le caractère 2 ? sa veux dire que dans le moniteur je devrais voir quelque chose ? ou que dans mon programme android j'envoie 2 /n avec le bouton automatique sur le xbee?j'avoue que je rame encore lol .. mais c'est tellement bon de ce chauffer le crâne comme sa ..
En tous cas merci encore de votre aides .. vraiment
Et puis pour le delay élever c’était juste pour tester et en même temps éviter que mon relay s'active et ce désactive trop souvent .. d’ailleurs j'ai vus quelque part que je pouvais faire autre chose pour éviter ce genre de chose .. mais bref je trouverais .. maintenant je suis vraiment bloquer depuis un moment sur ce mode automatique

Bonjour , apparement sa fonctionne comme sa a voir encore … Mais merci beaucoup pour vos informations :-DD

#include “DHT.h”
#define DHTPIN 8

#define DHTTYPE DHT11
int ledPrincipale = 13;
int ledTableDeNuit =12;
int ledOrdi= 9;
byte state = 0;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
pinMode(ledPrincipale, OUTPUT);
pinMode(ledTableDeNuit, OUTPUT);
pinMode(ledOrdi, OUTPUT);

Serial.begin(9600); // Default connection rate for my BT module
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = false)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Failed to read from DHT sensor!”);
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = true)
float hic = dht.computeHeatIndex(t, h, false);

// digitalWrite (Relay1 ,HIGH) ;
}

void loop() {

float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = false)
float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Failed to read from DHT sensor!”);
return;
}

// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = true)
float hic = dht.computeHeatIndex(t, h, false);

Serial.print(“Humidity: “);
Serial.print(h);
Serial.print(” %\t”);
Serial.print(“Temperature: “);
Serial.print(t);
Serial.print(” *C “);
Serial.print(f);
Serial.print(” *F\t”);
Serial.print(“Heat index: “);
Serial.print(hic);
Serial.print(” *C “);
Serial.print(hif);
Serial.println(” *F”);
delay(1000);

if(Serial.available() > 0){state =Serial.read(); Serial.println(state);}
switch(state){

//if(state == ‘1’)
case 49:
if (t < 24)

digitalWrite(ledPrincipale, HIGH);
delay(2500);

if (t > 26)

digitalWrite(ledPrincipale, LOW);
delay(2500);

while (state == ‘2’)
digitalWrite(ledPrincipale, LOW);
break;

case 50://if (state == ‘2’)
digitalWrite(ledPrincipale, LOW);
delay(2500);

break;

case 51 ://if (state == ‘3’)
digitalWrite(ledPrincipale, HIGH);
break;

case 52://if (state == ‘4’)
digitalWrite(ledTableDeNuit, LOW);
break;
}}
//
//if (state == ‘5’) {
// digitalWrite(ledOrdi, HIGH);
//}
//
//if (state == ‘6’) {
// digitalWrite(ledOrdi, LOW);
//}
//
//if (state == ‘7’) {
// digitalWrite(ledPrincipale, HIGH);
// digitalWrite(ledTableDeNuit, HIGH);
// digitalWrite(ledOrdi, HIGH);
//}
//
// if (state == ‘8’) {
// digitalWrite(ledPrincipale, LOW);
// digitalWrite(ledTableDeNuit, LOW);
// digitalWrite(ledOrdi, LOW);
//}}}
////if (ledTableDeNuit==HIGH)
//

//while(ledTableDeNuit==HIGH)
// if (t>25)// Si la temperature est superieur a 23 alors il eteint le relay 2
// {digitalWrite(ledPrincipale, LOW);}
// else
// {
// digitalWrite(ledPrincipale,HIGH);
// }
//while (ledTableDeNuit==HIGH)
//if (t<25)
////si la temperature est inferieur a 19 alors il s’allume
//{
// digitalWrite(ledPrincipale, HIGH);
// delay(2000);
//
//}}

Alors Du nouveaux et derniers poste .. bien que pas de réponse .voici l'application avec le code retravailler ici

ai2.appinventor.mit.edu/?galleryId=6243190460645376

Merci a vous et bonne continuations

votre code ci dessus est mal posté... ça pique les yeux alors ça n'encourage pas à la lecture..

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

ok alors voici le tous retravailler et qui fonctionne parfaitement:-D , certes quelques retouches s’imposeront forcement surtout au niveau des delay mais sinon bien dans l’ensemble

Tester avec 1 arduino+Xbee HC06 + shild Xbee

Application Android >>ai2.appinventor.mit.edu/?galleryId=6243190460645376

Code pour l’arduino :

#include "DHT.h"
#define DHTPIN 8

#define DHTTYPE DHT11
int Radiateur = 13;
int led =12;

byte state = 0;


DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
 pinMode(Radiateur, OUTPUT);
 pinMode(led, OUTPUT);

 
 Serial.begin(9600); // Default connection rate for my BT module
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = false)
 // float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  //float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = true)
  float hic = dht.computeHeatIndex(t, h, false);


}





 
void loop() {

    float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = false)
  //float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  //float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = true)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  //Serial.print(f);
  Serial.print(" *\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  //Serial.print(hif);
 // Serial.println(" *F");
  delay(1000);

 
 if(Serial.available() > 0){state =Serial.read(); Serial.println(state);}
switch(state){
 
 

case 49://=adresse 1 sur xbee
 if (t < 23)
 
 
         digitalWrite(Radiateur, HIGH);
 
   
if (t > 24)
   
         digitalWrite(Radiateur, LOW);

     
    while  (state == '2')
         digitalWrite(Radiateur, LOW);
 break;

case 50:////=adresse 2 sur xbee
         digitalWrite(Radiateur, LOW);


 break;
 
case 51 :////=adresse 3 sur xbee
         digitalWrite(Radiateur, HIGH);
 break;


case 52:////=adresse 4 sur xbee
        digitalWrite(led, LOW);
 break;
case 53://=adresse 5 sur xbee
        if (t < 23)
 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
     
        if (t > 23)
        
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        break;
     
case 54://=adresse 6 sur xbee
        if (t < 24)
 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
      
        
        if (t>24)  
        
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
          
       break;
       
case 55://=adresse 7 sur xbee 
        if (t < 25)
 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
            
        if(t>25) 
        
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        
         
        break;
        
case 56://=adresse 8 sur xbee
        if (t < 26)
 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
    
        
        if (t>25)  
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
               
        break;
        
case 57: //=adresse 9 sur xbee
        if (t < 25)
 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
  
      
        if(t>27)
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
 
         
}}

vous êtes sûr qu’il ne manque pas des {} pour vos if

case 53://=adresse 5 sur xbee
[color=red]        if (t < 23)
[/color] 
 
        digitalWrite(Radiateur, HIGH);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
     
[color=red]        if (t > 23)
[/color]        
        digitalWrite(Radiateur, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        break;

et partout ailleurs? en C ce n’est pas l’indentation qui dicte ce qui est dans le if…

le code ci dessus fait ça (j’ai mis en rouge ce que le if couvre)

case 53://=adresse 5 sur xbee
[color=red]        if (t < 23) digitalWrite(Radiateur, HIGH);[/color] 
        digitalWrite(led,HIGH);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led, LOW);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led,HIGH);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led, LOW);[color=green]// SERA TOUJOURS EXECUTE[/color]
     
[color=red]        if (t > 23) digitalWrite(Radiateur, LOW);[/color]        
        digitalWrite(led,HIGH);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led, LOW);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led,HIGH);[color=green]// SERA TOUJOURS EXECUTE[/color]
        digitalWrite(led, LOW);[color=green]// SERA TOUJOURS EXECUTE[/color]
        break;

cf ce que je vous disais déjà dans le post #3

de plus

        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);
        digitalWrite(led,HIGH);
        digitalWrite(led, LOW);

va être exécuté tellement rapidement que vous ne verrez aucun clignotement de la LED

Bonjour , oui justement j'en avais pries compte et sa na rien changer de plus quasiment tous les codes que j'ai vus étaient avec ; En plus quand je n'en mets pas :

XBEE_ARDUINO_V2:127: error: expected ';' before 'digitalWrite'

digitalWrite(led, HIGH)

^

Plusieurs bibliothèque trouvées pour "DHT.h"
Utilisé : C:\Users\PHENOMIX\Documents\Arduino\libraries\DHT_sensor_library
Non utilisé : C:\Users\PHENOMIX\Documents\Arduino\libraries\DHT-sensor-library-master
exit status 1
expected ';' before 'digitalWrite'

Ça n’a rien changé parce que le clignotement se fait trop vite de toutes façons donc vous ne voyez rien

Il faut bien sûr mettre des points virgules après chaque instruction les {} servent à grouper des instructions ensemble

if (condition) {
   Instruction1;
   Instruction2;
   Instruction3;
}

Faut réviser les bases de la programmation là…

Pour la librairie mettez à la poubelle tout le dossier C:\Users\PHENOMIX\Documents\Arduino\libraries\DHT-sensor-library-master (celui qui finit en master) ça veut dire que vous avez mal installé la librairie → relire comment installer des libraires sur ARDUINO