probleme mode automatique capteurs

bonjour je suis en terminale sti2d et j’ai un projet à faire.Mon projet est de faire tourner un ventilateur sur 3 vitesses avec 3 boutons poussoirs et à chaque vitesse une led s’allume(il y a 4 led en tout, 3 pour les vitesses et une pour le mode automatique) ou avec un mode automatique où quand j’appuie sur le bouton poussoir destiné au mode automatique le ventilateur se règle par rapport à la température,l’humidité et la luminosité.Mais je n’arrive pas à changer la vitesse du ventilateur, il reste toujours sur une vitesse et les leds spécifiées pour chaque vitesse ne changent pas non plus.

voici mon programme à part que j’ai remplacé la température par la luminosité:

int VENTILO = A0;
#include “DHT.h”
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int ledauto = 6;
const int LDR = A2;
int pourcent = 0;
int valeur = 0;
int etatldr;
int DHTPIN = A1;//DHT11 connecté à la broche A0
const int BPA = 5;
int etatbpa = 0;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);// définie la vitesse d’horloge
pinMode(LDR, INPUT);
pinMode(BPA, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(ledauto, OUTPUT);
pinMode(VENTILO, OUTPUT);
dht.begin();
}

void loop()
{
// put your main code here, to run repeatedly:
float h = dht.readHumidity();//lit la valeur du capteur d’humidité
float t = dht.readTemperature();//lit la valeur du capteur de température
etatldr = analogRead(LDR);
etatbpa = digitalRead(BPA);
Serial.print("Analog reading = ");
Serial.print(etatldr);//afficher les informations de la LDR
Serial.println("temp: ");//afficher le texte
Serial.println(t);//afficher les informations du capteur de température
Serial.println("hum: ");//afficher le texte
Serial.println(h);//afficher les informations du capteur d’humidité

if(etatbpa == LOW)
{
digitalWrite(ledauto, HIGH);

if ( etatldr < 35) // intervalle 0 22 eclus
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
pourcent = 0;
valeur = (pourcent255)/100;
analogWrite(VENTILO, valeur);
}
else // >=22
{
if ( etatldr < 100)
{
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
pourcent = 33;
valeur = (pourcent
255)/100;
analogWrite(VENTILO, valeur);

}
else
{
if ( etatldr < 150)
{
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
pourcent = 66;
valeur = (pourcent255)/100;
analogWrite(VENTILO, valeur);
}
else
{
if ( etatldr < 270)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
pourcent = 100;
valeur = (pourcent
255)/100;
analogWrite(VENTILO, valeur);
}
}
}
}

}

}

je pense que tu n'utilises pas les bonnes pins ... elles ne sont pas toutes pareilles ...

bonjour,
code entre balise code </> merci

tu veux quoi avec les boutons?
si tu appuie et maintient le bouton ca fait quelque chose
ou
si tu appuie une fois sur un bouton ca fait quelque chose?

après, ton code ne comporte qu’un seul bouton.

et ceci n’est pas bon

 else
                 {   
                   if (

la syntax est celle ci

if(condition){
faire ceci;
}else if(autre condition){
faire ceci;
}

dans ton cas, j’utiliserai une variable qui va stocker quel bouton est appuyé avec un switch case après
le switch case renvoi à des void séparés pour rentre le code plus clair.

je veux appuyer qu’une fois sur le bouton et
<else
{
if(

c’est mon professeur qui m’a dit de faire ça

As-tu remarqué que tu ne mémorises pas le mode choisi par l'appui sur le bouton.
Ton programme fonctionne (peut-être) mais il faut garder le poussoir enfoncé. Ce n'est sans doute pas le comportement souhaité.

La manière d’enchaîner les if else n'est pas "académique" mais cela devrait fonctionner.
L'écriture
if ()
....
else if()
....
else if()
....
else
....
est plus facile à lire dans la mesure ou les indentation sont régulières.

remoda:
je veux appuyer qu’une fois sur le bouton et
<else
{
if(

c’est mon professeur qui m’a dit de faire ça

code entre balise, deuxième fois, merci.

ton professeur veut te faire décomposer le code, mais la solution la plus claire est le elseif :wink:

réponds aussi à la question

tu veux quoi avec les boutons?
si tu appuie et maintient le bouton ca fait quelque chose
ou
si tu appuie une fois sur un bouton ca fait quelque chose?

si tu veux appuyer une seule fois et que cela fonctionne tant que tu n’as pas appuyé sur un autre bouton, j’ai donné la solution au dessus.
autre solution, utiliser des boolean pour les boutons, cela permet de mettre en action ou arrêter l’action en appuyant à nouveau sur le même bouton. :wink:

Conseil supplémentaire : utilise les messages dans le moniteur
Quelques Serial.print bien placés te permettront de vérifier

  • que le programme passe bien par là ou tu veux
  • que le résultats des if est bien celui que tu veux
  • la valeur des variables.

Cela s'appelle du debogage pour la mise au point c'est à toi de le faire.

Et les balises nom d'une pipe !
Si tu ne comprends pas ce qu'on dit c'est que tu n'a pas lu les deux messages épinglés en tête de forum : alors lis les..

en fait, je fais la partie automatique du projet, donc j’utilise qu’un bouton et quand j’appuis sur le bouton ça met le mode automatique et le ventilateur démarre si la luminosité est assez élevé et les vitesses se règle en fonction de la température mais la j’ai remplacé la température par la luminosité pour faire des tests
sinon le programme de base c’est celui là:

int VENTILO = A0;
#include "DHT.h"
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int ledauto = 5;
const int LDR = A2;
int pourcent = 0;
int valeur = 0;
int etatldr = 0;
int DHTPIN = A1;//DHT11 connecté à la broche A0
const int BPA = 9;
int etatbpa = 0;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
 // put your setup code here, to run once:
   Serial.begin(9600);// définie la vitesse d'horloge
   pinMode(LDR, INPUT);
   pinMode(BPA, INPUT);
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(led3, OUTPUT);
   pinMode(ledauto, OUTPUT);
   pinMode(VENTILO, OUTPUT);
   dht.begin();
}

void loop() 
{
 // put your main code here, to run repeatedly:
 float h = dht.readHumidity();//lit la valeur du capteur d'humidité 
 float t = dht.readTemperature();//lit la valeur du capteur de température
 etatldr = analogRead(LDR);
 etatbpa = digitalRead(BPA);
 Serial.print("Analog reading = ");
 Serial.print(etatldr);//afficher les informations de la LDR
 Serial.println("temp: ");//afficher le texte 
 Serial.println(t);//afficher les informations du capteur de température
 Serial.println("hum: ");//afficher le texte 
 Serial.println(h);//afficher les informations du capteur d'humidité
 
 if(etatbpa == LOW)
   {
     digitalWrite(ledauto, HIGH);
     if (etatldr > 20)
       {
        if ( t < 22)  // intervalle 0 22 eclus
           {
             digitalWrite(led1, LOW);
             digitalWrite(led2, LOW);
             digitalWrite(led3, LOW);
             pourcent = 0;
             valeur = (pourcent*255)/100;
             analogWrite(VENTILO, valeur);
           } 
           else // >=22
           {
              if ( t < 26)
              {
                digitalWrite(led1, HIGH);
                digitalWrite(led2, LOW);
                digitalWrite(led3, LOW);
                pourcent = 33;
                valeur = (pourcent*255)/100;
                analogWrite(VENTILO, valeur);
                }
                else 
                {   
                  if ( t < 30)
                  {
                   digitalWrite(led1, LOW);
                   digitalWrite(led2, HIGH);
                   digitalWrite(led3, LOW);
                   pourcent = 66;
                   valeur = (pourcent*255)/100;
                   analogWrite(VENTILO, valeur);
                  }
                   else 
                   {
                     if ( t < 50)
                     {
                      digitalWrite(led1, LOW);
                      digitalWrite(led2, LOW);
                      digitalWrite(led3, HIGH);
                      pourcent = 100;
                      valeur = (pourcent*255)/100;
                      analogWrite(VENTILO, valeur);
                     }
                  }
                 }
               }    
       }
   }  
}
[code]

attends, un truc m’échappe,
chacun fais un bout de code?
toi l’automatique et les autres le reste?

vous allez vous prendre le choux les gars.

apparemment tu ne lis pas nos réponses
tu veux appuyer une fois et ca lance le programme sans rester appuyé
SOLUTION ===> BOOLEAN pour le bouton
si true ===> marche du programme, donc 1 appui
si false ===> arrêt du programme, un autre appui

int etatbpa = 0;

a remplacer par

boolean etatbpa = false;

j’ai essayé tout ce que vous m’avez dit mais j’ai toujours le même probleme mon bouton quand j’appuie une fois reste à l’état non appuyée(1 dans mon programme) et je suis obligé de rester appuyé ( 0 sur mon programme).

message du moniteur quand je reste appuyé

luminosite
1

temp:
25.00

hum:
31.00

etat du bouton 
0

nuit
luminosite
78

temp:
25.00

hum:
32.00

etat du bouton
0

peu eclaire
luminosite
129

temp:
25.00

hum:
32.00

etat du bouton 
0

eclaire
luminosite
236

temp:
25.00

hum:
31.00

etat du bouton:
0

jour

message du moniteur quand j’appuie une fois sur le bouton:

luminosite
134

temp:
25.00

hum:
33.00

etat du bouton
1

voici le programme modifié:

int VENTILO = A0;
#include "DHT.h"
const int led1 = 2;
const int led2 = 3;
const int led3 = 4;
const int ledauto = 5;
const int LDR = A2;
int pourcent = 0;
int valeur = 0;
int etatldr;
int DHTPIN = A1;//DHT11 connecté à la broche A0
int BPA = 9;
boolean etatbpa = false;
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

void setup() 
{
  // put your setup code here, to run once:
    Serial.begin(9600);// définie la vitesse d'horloge
    pinMode(LDR, INPUT);
    pinMode(BPA, INPUT);
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(ledauto, OUTPUT);
    pinMode(VENTILO, OUTPUT);
    dht.begin();
}

void loop() 
{
  // put your main code here, to run repeatedly:
  float h = dht.readHumidity();//lit la valeur du capteur d'humidité 
  float t = dht.readTemperature();//lit la valeur du capteur de température
  etatldr = analogRead(LDR);
  etatbpa = digitalRead(BPA);
  Serial.println("luminosite");
  Serial.println(etatldr);//afficher les informations de la LDR
  Serial.println("temp: ");//afficher le texte 
  Serial.println(t);//afficher les informations du capteur de température
  Serial.println("hum: ");//afficher le texte 
  Serial.println(h);//afficher les informations du capteur d'humidité
  Serial.println("etat du bouton");
  Serial.println(etatbpa);
  
  
  switch(etatbpa)
    {
      case false:
      digitalWrite(ledauto, HIGH);
      if ( etatldr < 35)  //si la luminosité est inférieure à 35
            {
              Serial.println("nuit");
              digitalWrite(led1, LOW);
              digitalWrite(led2, LOW);
              digitalWrite(led3, LOW);
              pourcent = 0;
              valeur = (pourcent*255)/100;
              analogWrite(VENTILO, valeur);
            } 
             // >=22
            else if ( etatldr < 100)//si la luminosité est supérieur à 35 et inférieur à 100
               {
                 Serial.println("peu eclaire");
                 digitalWrite(led1, HIGH);
                 digitalWrite(led2, LOW);
                 digitalWrite(led3, LOW);
                 pourcent = 33;
                 valeur = (pourcent*255)/100;
                 analogWrite(VENTILO, valeur);
                 
                }
                 
                    
                else if ( etatldr < 150)//si la luminosité est supérieur à 100 et inférieur à 150
                {
                    Serial.println("eclaire");
                    digitalWrite(led1, LOW);
                    digitalWrite(led2, HIGH);
                    digitalWrite(led3, LOW);
                    pourcent = 66;
                    valeur = (pourcent*255)/100;
                    analogWrite(VENTILO, valeur);
                   }
                     
                    
                    else if ( etatldr < 510)//si la luminosité est supérieur à 150 et inférieur à 270
                    {
                       Serial.println("jour");
                       digitalWrite(led1, LOW);
                       digitalWrite(led2, LOW);
                       digitalWrite(led3, HIGH);
                       pourcent = 100;
                       valeur = (pourcent*255)/100;
                       analogWrite(VENTILO, valeur);
                     }
                   
                  
                    
        break;
       
    }  
  
}

*false correspond à 0
*true correspond à 1

remoda:
j'ai essayé tout ce que vous m'avez dit mais j'ai toujours le même probleme

Façon de parler parce qu'en regardant le code on ne voit justement pas ce que l'on t'a dit.

Un petit pseudo code

si (bouton appuyé ET modeauto==false)
  alors modeauto=true

si (bouton appuyé ET modeauto==true)
  alors modeauto=false

ainsi on ne prend en compte que les appuis du bouton. Si le bouton est relâché on ne change pas l'état.

Concernant ton code actuel, un switch avec un seul case se remplace par un if ce qui rend le code plus clair

Mon projet est de faire tourner un ventilateur sur 3 vitesses avec 3 boutons poussoirs et à chaque vitesse une led s'allume

ou sont les autres boutons?

comment veux tu avoir l'état du bouton en boolean si tu ne mémorise pas son état?
regardes les exemples boolean arduino sur internet.

et le switch ne fait rien de plus que d'alourdir le code.

EDIT
fdufnews a répondu plus vite que moi :wink:

en fait,j'avais mis

boolean etatbpa = false;

au lieu de:

boolean etatbpa = true;

je ne vois pas très bien le rapport!

Bonjour,

Ça n'a aucune importance puisque dans loop() une des premières choses que tu fais est de mettre à jour etatbpa.