Éteindre un ventilateur

Bonjour,
Je fais fonctionner un petit ventilateur, un bouton pour allumer et éteindre, et un autre pour régler la vitesse. Cela fonctionne mais par contre le ventilateur ne s'éteint pas quand je rappuie sur le premier bouton. Une idée du pourquoi?

#include <analogWrite.h>
#define fanPin1 19
#define fanPin2 18
#define btn1 16
int btn_count = 0; //Used to count the clicked button times 
#define btn2 27
int btn_count2 = 0;
int speed_val = 130; //Define the speed variables

void setup() {
Serial.begin(9600);
pinMode(btn1, INPUT);
pinMode(btn2, INPUT);
pinMode(fanPin1, OUTPUT);
pinMode(fanPin2, OUTPUT);
}

void loop() {
boolean btn1_val = digitalRead(btn1);
if(btn1_val == 0) //If the button is pressed
{
    delay(10);  //Delay 10ms to eliminate button jitter
    if(btn1_val == 0) //Make sure the button is pressed again  
    {
    boolean btn_state = 1;
    while(btn_state == 1) //Loop indefinitely until the button is released
    {
        boolean btn_val = digitalRead(btn1);
        if(btn_val == 1)  //If the button is released
        btn_count++;    //Automatically increments by 1 to count the clicked button times 
        Serial.println(btn_count);
        btn_state = 0;  //The button is released and exits the loop
        }
    }
    }
    boolean value = btn_count % 2; //Take the remainder of the value, you will get 0 or 1
    while(value == 1)
    {
    //Serial.println("on");
    digitalWrite(fanPin1, LOW); //pwm = 0
    analogWrite(fanPin2, speed_val);
    
    boolean btn2_val = digitalRead(btn2);
    if(btn2_val == 0)
    {
        delay(10);
        if(btn2_val == 0)
        {
        boolean btn_state2 = 1;
        while(btn_state2 == 1)
        {
            boolean btn2_val = digitalRead(btn2);
            if(btn2_val == 1)
            {
            btn_count2++;
            if(btn_count2 > 3)
            {
                btn_count2 = 1;
            }
            switch(btn_count2)
            {
                case 1: speed_val = 130; Serial.println(speed_val);break;  //Adjust the speed
                case 2: speed_val = 180; Serial.println(speed_val);break;
                case 3: speed_val = 230; Serial.println(speed_val);break;
            }
            btn_state2 = 0;
            }
        }
        }
    
    boolean btn1_val = digitalRead(btn1);
    if(btn1_val == 0) //If the button is pressed
    {
        digitalWrite(fanPin1, LOW); //pwm = 0
        analogWrite(fanPin2, 0);
        value = 0;  //Exit the loop 
    }
    
    }
}
}  

votre gestion du bouton laisse à désirer

par exemple

Outre qu'il vaut mieux utiliser les bons types et valeurs (HIGH ou LOW ne sont pas des boolean) comme vous n'avez pas relu l'état du bouton après la pause de 10ms, il n'y a aucune raison pour que btn1_val ait changé...

et vous oubliez des {} sur vos if sans doute

là dans le code ça fait juste

  if(btn_val == 1) btn_count++;    

et le

        Serial.println(btn_count);
        btn_state = 0;  //The button is released and exits the loop

est toujours exécuté

➜ Pour simplifier votre gestion des boutons, éventuellement utilisez la bibliothèque Button dans easyRun de @bricoleau ou OneButton de Matthias Hertel ou encore Toggle de @dlloyd (il y en a d'autres comme Bounce2, ...)

Sinon c'est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Je suis désolée mais je débute complètement. Je réalise le kit Keyes Studio SmartHome et les codes sont fournis avec. Il y a une dizaine de petits projets et pour l'instant ils ont tous fonctionné... Je n'ai jamais programmé moi-même ! Pourriez-vous m'indiquer un peu plus précisément ce que je dois rajouter ? Merci beaucoup

Pour bien débuter avec l'arduino, un bon point de départ c'est de lire les tutos d'eskimon et de lire le tuto de base sur le C++ de OpenClassroom

Prenez le temps d'acquérir les bases du langage sinon vous ferez toujours n'importe quoi.

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