[AIDE] - possiblité d'un seul bouton pour manu et / ou auto ?

Salut tout le monde !!

ma logique me perd un peu !

Je me demande, si je peux programmer avec un seul bouton sur une entrée de mon arduino une commande sois manuel sois auto de mon moteur..

je m'explique :

Si appuye long sur le bouton = mise en marche manu du moteur (et il s'arrete quand je relance le bouton)

si j'appuye qu'une fois , mis en marche auto du moteur (il va tourner quelsues tours pré-programmer)

Est-ce que la logique Arduino permet de faire cela ?

Exemple de code auquel je pense :

void setup() {


boolean buttonState = 0;
int buttonPin = 4;
int ledPin = 13;


}

void loop() {

 
 // marche manuelle
 
   buttonState = digitalRead(buttonPin);
   if (buttonState ==0) {
      digitalWrite(ledPin, buttonState); //allumage led.. mais idealement moteur en manuel
      buttonState = !buttonState;
      while (!digitalRead(buttonPin); // attendre que le bouton soit relaché
   }

//marche auto
      buttonState = digitalRead(buttonPin);
   if (buttonState ==0) {
      digitalWrite(ledPin, buttonState); //allumage led pedant 10s (mais idealement.. lanbcement fonction du moteur en auto)
      delay(10000);
      buttonState = !buttonState;
     
   }


}

peut etre plus utiliser interupt ? genre.. le bouton de l'etat bas à haut.. ? donc juste un appuye simple.

bref.. je me perd !!
merci à tous !

hello

oui, c’est possible

si BP appuyé
tempo=millis();
tant que (BP appuyé) si ((millis()-tempo)>1000) moteur tourne en manuel
if millis-tempo<1000 alors moteur tourne en auto

tempo=0

merci pour ton retour !!

entre temps j’avais edité ma réponse , mais j’ai modifé le code avec ton aide,

cela te parait correct dans ce sens ?

void setup() {


boolean buttonState = 0;
int buttonPin = 4;
int ledPin = 13;
long tempo = millis();

pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);


}

void loop() {


if (DigitalRead(buttonPin) == LOW)
{
    while (DigitalRead(buttonPin) == LOW; {

        if ((millis()-tempo)>1000 ){ digitalWrite(ledPin) ; } //marche manuelle 
        if ((millis()-tempo)<1000 ){ // marche auto
        digitalWrite(ledPin); 
        delay(10000); 
                                   }
    
}

non, relis ce que je t’ai posté

cette ligne n’est pas dans le while

if ((millis()-tempo)<1000 ){ // marche auto

je t’ai préparé ce code

byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin,LOW);
}

void loop() 
{
  if (digitalRead(buttonPin) == LOW)          //si BP appuye
    {
      delay(200);                             //on filtre les rebonds
      tempo=millis();                         //on demarre la tempo
      while (digitalRead(buttonPin) == LOW)   //tant que le BP est appuye
        {                                     //on mesure la durée de l'appui
          if ((millis()-tempo)>1000 )         //si la duree est > que 1000 ms
            { 
              digitalWrite(ledPin,HIGH) ;     //on allume le moteur
            } //marche manuelle 
        }                                     //dès que le BP est relache
      digitalWrite(ledPin,LOW);               //on stoppe le moteur
                                              
    if ((millis()-tempo)<1000 )               //si la durée était < 1000
      {                                        
        tempo=millis();                       //on reinitialise la tempo
        while((millis()-tempo)<2000)          //tant qu'il ne s'est pas écoule 5 secondes
          {
            digitalWrite(ledPin,HIGH) ;       //on laisse le moteur allume pendant 5 secondes
          }
        digitalWrite(ledPin,LOW) ;            //puis on le stoppe
      }         
   }
}

merci beaucoup !!

j'ai encore du mal avec la logique de programmation :wink:

c'est top, cela m’évite 1 bouton e, plus sur le montage final.

encore merci pour ton aide.

Je me permet encore de te solliciter :wink:

J’ai bien adapté ton code et cela fonctionne très bien… j’ai juste ajouté un 2° appuie pendant le mode auto afin d’arreter la fonction auto (au cas ou…)

mais le break ne semble pas etre la solution… c’est mes yeux ou bien ?

byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
int dureMoteur1 = 4000;



void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Les croquettes aux touftoufs !");
Serial.println("V 1.0!");
Serial.println();
digitalWrite(ledPin,LOW);
}


///////////////////////////
// Fonctions du programme
//////////////////////////


void FunctionMarcheManu()
{
  digitalWrite(ledPin,HIGH) ;
  Serial.println("Fonction moteur Manu");//on allume le moteur
}


void FunctionMarcheAuto()
{

  digitalWrite(ledPin,HIGH) ;
  Serial.println("Fonction moteur Auto");//on allume le moteur
}


//////////
// boucle
//////////

void loop() 
{



  
  if (digitalRead(buttonPin) == LOW)          //si BP appuye
    {
      delay(200);                             //on filtre les rebonds
      tempo=millis();                         //on demarre la tempo
      while (digitalRead(buttonPin) == LOW)   //tant que le BP est appuye
        {                                     //on mesure la durée de l'appui
          if ((millis()-tempo)>500 )         //si la duree est > que 500 ms
            { 
              
              FunctionMarcheManu();
              
            } //marche manuelle 
        }                                     //dès que le BP est relache
      digitalWrite(ledPin,LOW);               //on stoppe le moteur
      Serial.println("Fin de Fonction moteur Manu");
                                              
    if ((millis()-tempo)<500 )               //si la durée était < 500ms
      {                                        
        tempo=millis();                       //on reinitialise la tempo
        while((millis()-tempo)< dureMoteur1)          //tant qu'il ne s'est pas écoule durée Moteur 1
          {
            FunctionMarcheAuto();

             // stop si 2°eme appuye sur le bouton
              if (digitalRead(buttonPin) == LOW)
                  {
                  digitalWrite(ledPin,LOW) ;
                  break;
                 } 
                 
          }
        digitalWrite(ledPin,LOW) ;            //puis on le stoppe
        Serial.println("Fin de Fonction moteur auto");
      }         
   }

  
   
}

suis enore preneur de ton avis !

boolean flag_arret=false;
byte buttonPin = 4;
byte ledPin = 13;
unsigned long tempo = 0;
int dureMoteur1 = 4000;

void setup() 
{
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
Serial.println("Les croquettes aux touftoufs !");
Serial.println("V 1.0!");
Serial.println();
digitalWrite(ledPin,LOW);
}

///////////////////////////
// Fonctions du programme
//////////////////////////

void FunctionMarcheManu()
{
  digitalWrite(ledPin,HIGH) ;
  Serial.println("Fonction moteur Manu");//on allume le moteur
}


void FunctionMarcheAuto()
{
  digitalWrite(ledPin,HIGH) ;
  Serial.println("Fonction moteur Auto");//on allume le moteur
}


//////////
// boucle
//////////

void loop() 
{
  if (digitalRead(buttonPin) == LOW)          //si BP appuye
    {
      delay(200);                             //on filtre les rebonds
      tempo=millis();                         //on demarre la tempo
      while (digitalRead(buttonPin) == LOW)   //tant que le BP est appuye
        {                                     //on mesure la durée de l'appui
          if ((millis()-tempo)>500 )         //si la duree est > que 500 ms
            { 
              
              FunctionMarcheManu();
              
            } //marche manuelle 
        }                                     //dès que le BP est relache
      digitalWrite(ledPin,LOW);               //on stoppe le moteur
      Serial.println("Fin de Fonction moteur Manu");
                                              
    if ((millis()-tempo)<500 )               //si la durée était < 500ms
      {                                        
        tempo=millis();                       //on reinitialise la tempo
        flag_arret=false;
        while((millis()-tempo)< dureMoteur1)          //tant qu'il ne s'est pas écoule durée Moteur 1
          {
            if (flag_arret==true){digitalWrite(ledPin,LOW) ;}
            else{FunctionMarcheAuto();}

             // stop si 2°eme appuye sur le bouton
              if (digitalRead(buttonPin) == LOW)
                  {
                  flag_arret=true;
                  } 
          }
        digitalWrite(ledPin,LOW) ;            //puis on le stoppe
        Serial.println("Fin de Fonction moteur auto");
      }         
   }
}

rhaaa ca m’énerve quand je lis et que je me dis “merde… j’aurais pu y arriver” !!

en tout cas, merci beaucoup !!