Go Down

Topic: Répéter une boucle avec un bouton poussoir (Read 214 times) previous topic - next topic

3D58

Bonjour, je suis débutant en arduino et dans mon programme je voudrais quand j'appuie sur le bouton mon boucle singleclick tourne à l'infinie mais au final quand jappuie la boucle s'exécute qu'une seule fois.

Code: [Select]
#include <Servo.h>
#include "OneButton.h"
int port = A0;
OneButton button(4, true);     
int valeur = 0; 
float vin = 0;
int led = 2;
int led1= 3;
Servo monServomoteur;

void setup()
{
  Serial.begin(9600);
  pinMode(led,OUTPUT);
  monServomoteur.attach(9);

  button.attachClick(singleclick);                 
  button.attachLongPressStop(longclick); 
}

void loop()
{
  button.tick();                                    // check the status of the button
  delay(10);                                        // a short wait between checking the button
}
       
void singleclick(){                                 // what happens when the button is clicke
   
 
// Lit l'entrée analogique A0
  valeur = analogRead(port);   
  // convertit l'entrée en volt
  vin = (valeur * 5.0) / 1024.0;
  Serial.println(vin);     
  if (vin <3.5)
     {digitalWrite(led,HIGH);
     monServomoteur.write(179);}
  else
    {digitalWrite(led,LOW);
     monServomoteur.write(0);
    }
  delay(200);
}

void longclick(){                                   // what happens when buton is long-pressed
  digitalWrite(led1,HIGH);                            // light the blue LED
 delay(1000);                                       // wait one second
 digitalWrite(led1,LOW);                              // turn off the blue LED
}

dbrion06

SingleClick devrait se contenter de positionner un booleen, variable globale initialisée  à False; le code initial de SingleClick devrait migrer dans loop et n'être activé que si le booleen est vraiquelque chose comme ça (non testé, faute d'arduino)
Code: [Select]

#include <Servo.h>
#include "OneButton.h"


bool demarr=(1==0); // initialise à faux

int port = A0;
OneButton button(4, true);     
int valeur = 0;
float vin = 0;
int led = 2;
int led1= 3;
Servo monServomoteur;

void setup(){
  Serial.begin(115200); // on peut transmettre assez vite sans bloquer
  pinMode(led,OUTPUT);
  monServomoteur.attach(9);

  button.attachClick(singleclick);                 
  button.attachLongPressStop(longclick);
}

void loop(){
  button.tick();                                    // check the status of the button
  delay(10);
 if (demar) {                                        // a short wait between checking the button
  // Lit l'entrée analogique A0
  valeur = analogRead(port);   
  // convertit l'entrée en volt
  vin = (valeur * 5.0) / 1024.0;
  Serial.println(vin);     
  if (vin <3.5)
     {digitalWrite(led,HIGH);
     monServomoteur.write(179);
}  else    {
    digitalWrite(led,LOW);
     monServomoteur.write(0);
    }
//   delay(200); // il faut que l'on reste capable de scruter le bouton avec un delai raisonnable
   }
}
       
void singleclick(){                                 // what happens when the button is clicke
   demar = (1 == 1);
}
 

void longclick(){                                   // what happens when buton is long-pressed
 digitalWrite(led1,HIGH);                            // light the blue LED
 delay(1000);                                       // wait one second
 digitalWrite(led1,LOW);                              // turn off the blue LED
}

3D58

#2
Jun 27, 2019, 06:10 pm Last Edit: Jun 27, 2019, 06:18 pm by 3D58
Merci maintenant les boucles marchent mais j'ai modifié le programme pour pouvoir le contrôler manuellement le servo moteur à l'aide d'un potentiomètre mais maintenant le soucis est que quand je bascule d'un mode à l'autre le servo tremble

Code: [Select]
#include <Servo.h>
#include "OneButton.h"


bool prog1=(1==0);// initialise à faux
bool prog2=(1==0);

int port = A0;
OneButton button(4, true);     
int valeur = 0;
float vin = 0;
int led = 2;
int led1= 3;
int potpin = 5;                           // déclare le potentiomètre sur la PIN analogique 0.
int val;
Servo monServomoteur;

void setup(){
  Serial.begin(115200); // on peut transmettre assez vite sans bloquer
  pinMode(led,OUTPUT);
  monServomoteur.attach(9);

  button.attachClick(singleclick);                 
  button.attachLongPressStop(longclick);
}

void loop(){
  button.tick();                                    // check the status of the button
  delay(10);
 if (prog1) {
 
  // a short wait between checking the button
  // Lit l'entrée analogique A0
  valeur = analogRead(port);   
  // convertit l'entrée en volt
  vin = (valeur * 5.0) / 1024.0;
  Serial.println(vin);     
  if (vin <3.5)
     {digitalWrite(led,HIGH);
     monServomoteur.write(179);
}  else    {
    digitalWrite(led,LOW);
     monServomoteur.write(0);
    }
   delay(200); // il faut que l'on reste capable de scruter le bouton avec un delai raisonnable
   }
 if (prog2) {val = analogRead(potpin);               // lit la valeur du potentiomètre qui est comprise entre 0 et 1023 (car le potentiomètre est analogique)
  val = map(val, 0, 1023, 0, 180);        // permet de mettre à l'échelle la valeur du potentiomètre pour qu'il passe de 0 à 1023 (analogique) à  0 à 180 (degrés)
                                          // en d'autres termes adapte le potentiomètre qui lit des valeurs de 0 à 1023, en degrés pour permettre de faire de 0 à 180 degrés
  monServomoteur.write(val);                     // positionne le servomoteur en fonction de la valeur du potentiomètre.
  delay(15);
   }
 
}
       
void singleclick(){                                 // what happens when the button is clicke
   prog1 = (1 == 1);
   digitalWrite(led1,LOW);
   
}
 

void longclick(){                                   // what happens when buton is long-pressed
 prog1 = (1==0);
 prog2 = (1 ==1);
 digitalWrite(led1,HIGH); // light the blue LED
}

Go Up