if else statement

Bonsoir,

je suis nouveau dans le monde de l'arduino.

Je me trouve face à une difficulté.

J'ai un capteur DHT22, j'aimerai commander un ruban de led en fonction de la température ET de l'hygrométrie.

En revanche, je ne sais pas comment faire pour qu'une condition intègre deux variable, cad, si la température est supérieur à X ET si l'hygro est supérieur à Y alors action 1

voici un bout de code qui fonctionne. mais qui ne satisfaire pas mes attentes.

D'avance merci.

#include "DHT.h" //librairie du DHT22

#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

int ledPinRed = 9;
int ledPinBlue = 10;
int ledPinGreen = 11;

void setup() {
  Serial.begin(9600);
  Serial.println("Le Capteur fonctionne correctement");
  
  dht.begin();
  
}

void loop () {
  delay(500); //temps entre chaque mesures
  
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // température en Celsius
  float f = dht.readTemperature(true); // température en Fahrenheit
 
   if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Impossible d'établir une connection avec le capteur DHT:(");
    return;
   } 
   
if(float t = dht.readTemperature() >20)
 {Serial.println("très chaud"); 
  { 
  // fade in de min à max par incrément de n points:
  for(int fadeValue = 32 ; fadeValue <= 255; fadeValue +=10) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 32; fadeValue -=25) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}
 }
 else
 {
   analogWrite(ledPinRed,32);
 }
 
 if (float h = dht.readHumidity() >60)   
 {Serial.println("très humide"); 
  { 
  
  for(int fadeValue = 32 ; fadeValue <= 255; fadeValue +=10) { 
    
    analogWrite(ledPinRed, fadeValue); 
    analogWrite(ledPinGreen, fadeValue);    
       
    delay(30);                            
  } 

 
  for(int fadeValue = 255 ; fadeValue >= 32; fadeValue -=25) { 
   
    analogWrite(ledPinRed, fadeValue); 
    analogWrite(ledPinGreen, fadeValue);    
   
    delay(30);                            
  } 
}
 }
 else
 {
   analogWrite(ledPinRed,32);
   analogWrite(ledPinGreen,32);
 }
  float hi = dht.computeHeatIndex(f, h);
   
  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(hi);
  Serial.println(" *F");
}

bonjour,
utilises la balise code <> ca sera plus clair.

pour une condition à 2 variables, une petite recherche aurait donné

if (temp>X && hygro>Y){ection a faire}

infobarquee:
bonjour,
utilises la balise code <> ca sera plus clair.

pour une condition à 2 variables, une petite recherche aurait donné

if (temp>X && hygro>Y){ection a faire}

Operators in C and C++ - Wikipedia

Bonsoir, j'ai déjà essayé, cela ne compil pas, surement une erreur de frappe, je réitère et reviens vers vous.

En tout cas merci de la rapide réponse

Impossible de compiler :confused:

#include "DHT.h" //librairie du DHT22

#define DHTPIN 2

#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

int ledPinRed = 9;
int ledPinBlue = 10;
int ledPinGreen = 11;

void setup() {
  Serial.begin(9600);
  Serial.println("Le Capteur fonctionne correctement");
  
  dht.begin();
  
}

void loop () {
  delay(500); //temps entre chaque mesures
  
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // température en Celsius
  float f = dht.readTemperature(true); // température en Fahrenheit
 
   if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Impossible d'établir une connection avec le capteur DHT:(");
    return;
   } 
   
if (float t = dht.readTemperature() >20 && float h = dht.readHumidity() >60)
 {Serial.println("très chaud très humide");  
  { 
  // fade in de min à max par incrément de n points:
  for(int fadeValue = 32 ; fadeValue <= 255; fadeValue +=10) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 32; fadeValue -=25) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);         
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}
for(int fadeValue = 32 ; fadeValue <= 255; fadeValue +=10) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);
    analogWrite(ledPinGreen, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 32; fadeValue -=25) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPinRed, fadeValue);  
     analogWrite(ledPinGreen, fadeValue);    
    // wait for 30 milliseconds to see the dimming effect    
    delay(30);                            
  } 
}
 }
 else
 {
   analogWrite(ledPinRed,32);
 }
 
 if (float h = dht.readHumidity() >60)   
 {Serial.println("très humide"); 
  { 
  
  for(int fadeValue = 32 ; fadeValue <= 255; fadeValue +=10) { 
    
    analogWrite(ledPinRed, fadeValue); 
    analogWrite(ledPinGreen, fadeValue);    
       
    delay(30);                            
  } 

 
  for(int fadeValue = 255 ; fadeValue >= 32; fadeValue -=25) { 
   
    analogWrite(ledPinRed, fadeValue); 
    analogWrite(ledPinGreen, fadeValue);    
   
    delay(30);                            
  } 
}
 }
 else
 {
   analogWrite(ledPinRed,32);
   analogWrite(ledPinGreen,32);
 }
  float hi = dht.computeHeatIndex(f, h);
   
  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(hi);
  Serial.println(" *F");
}

ca serait bien de mettre les erreurs.
déjà y en a une belle ici et ca veut rien dire

if (float t = dht.readTemperature() >20 && float h = dht.readHumidity() >60)

mets ca

float t = dht.readTemperature();
 float h = dht.readHumidity() ;
if ( t  >20 &&  h  >60)

aussi tôt dit :wink:

   This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows 7), Board: "Arduino Uno"
LedTemp_hygroDependant.ino: In function 'void loop()':
LedTemp_hygroDependant:34: error: expected primary-expression before 'float'
LedTemp_hygroDependant:34: error: expected `)' before 'float'
LedTemp_hygroDependant.ino: At global scope:
LedTemp_hygroDependant:71: error: expected unqualified-id before 'else'
LedTemp_hygroDependant:76: error: expected unqualified-id before 'if'

infobarquee:
ca serait bien de mettre les erreurs.
déjà y en a une belle ici et ca veut rien dire

if (float t = dht.readTemperature() >20 && float h = dht.readHumidity() >60)

[/code]

C'est surement une erreur en revanche si j'écris if (float t = dht.readTemperature() >20 )

cela fonctionne correctement :wink:

Merci,

celà fonctionne correctement maintenant, je ne comprends pquoi, si il y a une seule condition je peux ecrire

 if (float t = dht.readTemperature() >20 )

mais si j'en met deux

 if (float t = dht.readTemperature() >20 && float h = dht.readHumidity() >60)

cela ne fonctionne plus ...

Déclare tes variables avec leur genre au début du sketch et lorsque tu les utilises ne mets pas le genre devant (int, float,...)

Ensuite dans ta loop() tu fais une première lecture de tes valeurs que tu attribue à une variable:

void loop () {
  delay(500); //temps entre chaque mesures
  
  float h = dht.readHumidity();
  float t = dht.readTemperature(); // température en Celsius
  float f = dht.readTemperature(true); // température en Fahrenheit

Puis tu refais une lecture dans ta condition pour attribuer une valeur à une variable que tu redéclares :

 if (float h = dht.readHumidity() >60)

Est ce que ça ne fonctionnerait pas comme ça, en plus ce serait plus simple :

if ( t >= 20 &&  h >= 60)

En plus tes signes de comparaisons étaient inversés :

x == y (x is equal to y)
x != y (x is not equal to y)
x < y (x is less than y)
x > y (x is greater than y)
x <= y (x is less than or equal to y)
x >= y (x is greater than or equal to y)

Bonjour JF et merci pour ce complément d'information.

Cela fonctionne correctement merci.

En revanche ma question qui n'est pas une question visant à améliorer le sketch mais bien une question pour ma culuture perso est la suivante :

Pourquoi le fait de déclarer une variable après un if ne pose pas de problème en revanche le fait d'en déclarer deux après ce if pose un problème ?

cordialement.

Problème lié à la priorité des opérateurs.
L'égalité et la moins prioritaire. Du coup le && ne s'effectue pas sur les bonnes expressions.
Il aurait fallu mettre des parenthèses pour forcer l'affectation en premier.

Ok merci beaucoup, j'essayerai de ne plus reproduire cette erreur dorénavant !

Bonne journée à tous.