delay de 2 sec ou plus sur un bp

bonjour a tous , voila j'ai un programme avec un bouton poussoir et 4 leds les quatre leds s'allument avec un delay ce qui est oke pour moi mais j'aurais besoin d'un delay sur le bouton poussoir. donc en résumer .... il faut appuyer pendent 2 ou 3 secondes sur le bouton pour que mon programme commence . au plus vite au mieux c'est urgent .. voici mon programme :

( // set pin numbers: const int buttonPin = 6; const int ledPin = 2; const int ledPin2 = 3; const int ledPin3 = 4; const int ledPin4 = 5; int delai1 = 1000; int delai2 = 1000; int delai3 = 1000;

// Variables will change: int ledState = LOW; // the current state of the output pin int ledState2 = LOW; int ledState3 = LOW; int ledState4 = LOW; boolean buttonState = true; // the current reading from the input pin unsigned long lastDebounceTime = 0; // the last time the output pin was toggled long debounceDelay = 100;

void setup() { Serial.begin(57600); pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); pinMode(ledPin4, OUTPUT);

// set initial LED state digitalWrite(ledPin, ledState); digitalWrite(ledPin2, ledState2); digitalWrite(ledPin3, ledState3); digitalWrite(ledPin4, ledState4); }

void loop() { int reading = digitalRead(buttonPin);

if (reading == 0) //si reading==0, alors il y a eu appui { lastDebounceTime = millis(); //on memorise le temps au début de l'appui while ((millis() - lastDebounceTime) > debounceDelay){} //on attend 100ms { buttonState = !buttonState; if (buttonState == 1) { Serial.print(" si buttonState = 1 "); Serial.println(buttonState); ledState = !ledState; ledState2 = !ledState2; ledState3 = !ledState3; ledState4 = !ledState4; delai1 = 0; delai2 = 1000; delai3 = 1000; allumage_leds(delai1, delai2, delai3); } if (buttonState == 0) { Serial.print(" si ledState == 0 "); Serial.println(ledState); ledState = !ledState; ledState2 = !ledState2; ledState3 = !ledState3; ledState4 = !ledState4; delai1 = 0; delai2 = 1000; delai3 = 1000; extinction_leds(delai1, delai2, delai3); } } } } void allumage_leds( int del1, int del2, int del3) { Serial.println(" __________________________________allumage des leds "); digitalWrite(ledPin, ledState); delay(del1); digitalWrite(ledPin2, ledState2); delay(del2); digitalWrite(ledPin3, ledState3); delay(del3); digitalWrite(ledPin4, ledState4); } void extinction_leds(int del1, int del2, int del3) { Serial.println("************************************* extinction des leds "); digitalWrite(ledPin4, ledState4); delay(del1); digitalWrite(ledPin3, ledState3); delay(del2); digitalWrite(ledPin2, ledState2); delay(del3); digitalWrite(ledPin, ledState); } )

Bonjour,

Je ne comprend pas ce que tu veux faire. Tu veux que quand tu appuie sur le bouton 3 secondes les leds s'allument jusqu'à ce que tu relaches? Dans ton programme je ne comprend pas l'ultilité de ledState, ledState2 ... Il suffit de les allumer dans allumage_leds() et eteindre dans extinction_leds().

bonjour,
merci de mettre le code entre balise code </>

au plus vite au mieux c’est urgent

heuuuu ca veut dire quoi?

sinon pour en revenir à ton truc, si je comprends bien.
tu veux pour lancer le programme que le bouton soit appuyé au moins pendant 2-3s, sinon ca ne fait rien.
dans ce cas, cherche fonction millis()
si bouton appuyé=>start = millis()
si bouton appuyé ET millis() - start>2000 ===> lance programme

Raphav:
j’aurais besoin d’un delay sur le bouton poussoir. donc en résumer … il faut appuyer pendent 2 ou 3 secondes sur le bouton pour que mon programme commence

Il suffit de jouer sur la valeur de debounceDelay et vérifier dans la condition du while que le bouton est toujours appuyé

Bonjour

Tu devrais peut-être commencer par prendre connaissance de ce topic (urgent ?? :smiling_imp: ) et en particulier lire la première réponse qui avait été apportée. Elle me semble parfaitement adaptée comme premier niveau de réponse à ta question.

C’est le deuxième sujet que tu ouvres et manifestement tu n’as pas encore lu le message de bienvenue.

Tu y aurais trouvé des consignes qui faciliteraient les réponses.

Urgent = c’est quoi ce mot ? Je ne connais pas de travail urgent mais par contre je connais des personnes en retard.

Balises : tu t’obstines à ne pas les utiliser. C’est le meilleur moyen pour ne pas obtenir de réponses.

nous pouvons t'aider, mais il faudrait quand meme que tu réfléchisses un peu

long debounceDelay = 100;   

lastDebounceTime = millis(); //on memorise le temps au début de l'appui
    while ((millis() - lastDebounceTime) > debounceDelay){} //on attend 100ms

c'est un project et il y a des modifications a faire ... en bref j'ai déjà essayer de jouer avec le delay mais il ne changent rien que je le change dans le long debouncedelay ou autre il ne change pas ..

pour le reste je m'excuse j'ai 16 ans et je vais à l'école en flandre mon français n'est pas parfait .. mais merci de vos conseils j'y ferais attention :wink:

peux tu refaire le test en changeant auparavant le signe dans:

while ((millis() - lastDebounceTime) > debounceDelay){} //on attend 100ms
tu mets <

et ensuite tu changes le debounce 100 en 3000 ( pour 3 secondes)

pour le reste je m'excuse j'ai 16 ans et je vais à l'école en flandre mon français n'est pas parfait .. mais merci de vos conseils j'y ferais attention :wink:

Ca tu nous l'a déjà sorti dans ton premier sujet et on t'a dit ce qu'il fallait faire. Une fois ça va, on ne va pas y avoir droit à chaque fois. Normalement sur ce sujet tu savais.

nous pouvons t'aider, mais il faudrait quand meme que tu réfléchisses un peu

+1

  while ((millis() - lastDebounceTime) > debounceDelay){} //on attend 100ms

Est-ce que c'est plus clair ? Ne faudrait-il pas changer la valeur de debounceDelay ?

Hello a tous,

Je suis le père de celui qui fait ces recherches. Je sais que les forums sont instructifs et que les adultes qui y participent sont patients et compréhensifs. Mon p'tit gars fait de son mieux pour résoudre un problème. Cependant, je pense donner un petit coup de main en expliquant la cause de son problème.

Le programme fonctionnait correctement à la maison, mais, une fois branché sur un secteur sur lequel se trouvent connectés des moteurs, l'ARDUINO réponds assez mal.

En effet, lorsqu'un des moteurs se coupe, il génère un pic sur la ligne. Force est de constater que l'ARDUINO traduit ce pic comme une commande et débute la séquence. L'idée qui semble être la plus simple serait de modifier le programme afin que la commande ne réagisse pas à une impulsion mais bien à une tenue pendant plus d'une seconde du poussoir.

Pour conclure, la solution donnée précédemment ne fait que retarder l'allumage d'autant de ms après l'impulsion.

Le but serait de tenir enfoncé le bouton poussoir pendant une durée de 1000 ou 2000 ms après quoi l'ARDUINO démarrerait sa séquence, et ce pour éviter qu'il confonde l'impulsion provenant d'un réseau avec celle d'un boutton poussoir.

Merci

Bonjour,

C’est un peu plus clair.
Je propose ceci

#include <servo.h>

// set pin numbers:
const int buttonPin = 6;   
const int ledPin = 2;       
const int ledPin2 = 3;
const int ledPin3 = 4;
const int ledPin4 = 5;

void setup()
{
  Serial.begin(57600);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, LOW);
  digitalWrite(ledPin2, LOW);
  digitalWrite(ledPin3, LOW);
  digitalWrite(ledPin4, LOW);
}

void loop()
{
  static bool prevButtonState=false;
  bool buttonState = !digitalRead(buttonPin);  // pour résonner en logique positive

  if (buttonState!=prevButtonState)
  {
    // le bouton a changé d'état
    if (buttonState)
    {
      // on a appuyé
      unsigned long debut=millis();
      while (buttonState && millis()-debut < 2000) // attente appuyé pendant 2s
      {
        delay(10);      // tempo anti rebond
        buttonState=!digitalRead(buttonPin);
      }
      if (buttonState)
      {
        // si on est tjrs appuyé on allume
        allumage_leds(0, 1000, 1000);
      }
    }
    else
    {
        extinction_leds(0, 1000, 1000);
    }
    prevButtonState=buttonState;
  }
  delay(10);
}

void allumage_leds( int del1,  int del2,  int del3)
{
  Serial.println(F(" __________________________________allumage des leds "));
  digitalWrite(ledPin, HIGH);
  delay(del1);
  digitalWrite(ledPin2, HIGH);
  delay(del2);
  digitalWrite(ledPin3, HIGH);
  delay(del3);
  digitalWrite(ledPin4, HIGH);
}

void extinction_leds(int del1, int del2, int del3)
{
  Serial.println(F("************************************* extinction des leds "));
  digitalWrite(ledPin4, LOW);
  delay(del1);
  digitalWrite(ledPin3, LOW);
  delay(del2);
  digitalWrite(ledPin2, LOW);
  delay(del3);
  digitalWrite(ledPin, LOW);
}

Alors, je viens de faire l'essai.

  1. le poussoir ne répond plus aux impulsions : OK
  2. J'enfonce le poussoir et après 2000ms, la séquence commence, mais... elle fait un aller retour.

donc voici ce qui se passe dans l'ordre : 1. Toutes les leds sont allumées (ON) 2. j'appuie sur le BP pendant 2000ms 3. la séquence commence a. LED 1 et LED 2 OFF b. LED 3 OFF c. LED 4 reste ON d. LED 3 ON e. LED 2 ON f. LED 1 ON

Merci pour votre retour.

Les leds sont branchées comment? Entre le GND et la pin ou entre le + et la pin. Dans le 2ème cas il faut inverser les HIGH/LOW dans le setup et dans allume/éteint

Quand est ce que les leds doivent s'éteindre? Dans ce que je t'ai proposé elles s'éteignent lorsqu'on relâche le bouton.

Tu serais peut-être plus à l’aise en utilisant la librairie simpleBouton.h, que j’ai conçue justement pour mon fils qui débute sur arduino.

Par exemple, si tu veux que tes leds s’allument ou s’éteignent après un appui prolongé sur le bouton poussoir, cela doit pouvoir se coder comme ci-dessous, ce qui est nettement plus facile à comprendre.

#include <servo.h>
#include "simpleBouton.h"

...

void setup()
{
...
//  pinMode(buttonPin, INPUT_PULLUP); Plus nécessaire
...
}

simpleBouton bouton(buttonPin);

void loop()
{
  static bool bouton_arme = false;
  static bool leds_allumees = false; 

  bouton.actualiser();

  if (bouton.estEnfonceDepuisPlusDe(2000))
  {
    bouton_arme = true;
  }
  
  if (bouton_arme && bouton.vientDEtreRelache())
  {
    if (leds_allumees)
    {
      extinction_leds(0, 1000, 1000);
      leds_allumees = false;
    }
    else
    {
      allumage_leds(0, 1000, 1000);
      leds_allumees = true;
    }
    bouton_arme = false;
  }
}
... suite inchangée

@ Kamill :

Les LED sont branchées entre le 5V et les Pins 2,3 4 et 5 pour le négatif. Ton système fonctionne, mais à l'origine, le cahier de charge est simple. Lorsque le bouton poussoir est appuyé, une séquence d'allumage s'enclenche allumant les LED 1,2 ensemble, puis respectivement les LED 3, puis 4. Ensuite, une pression sur le même poussoir enclenche la séquence inverse.

Après avoir enfoncé le poussoir pendant un temps "t" la séquence d'allumage s'enclenche puis, en appuyant à nouveau sur le poussoir pendant le même temps "t" la séquence d'extinction s'enclenche.

j'ai en effet testé ta configuration, et comme tu le stipules, qd on laisse le PB enfoncé, la séquence d'extinction fonctionne, mais dès qu'on relâche, les LED 3 et 4 s'allument en même temps puis respectivement les LED 2 puis LED 1.

J'espère que ces quelques explications te seront utiles...

@ Bricoleu :

Enchanté. Je passe l'info au fiston. Il sera plus à même de comprendre les codes que tu as écris. Cela semble en effet bien plus simple. On poursuit nos investigations. Merci.

Comme ça ça doit le faire

#include <servo.h>

// set pin numbers:
const int buttonPin = 6;   
const int ledPin = 2;       
const int ledPin2 = 3;
const int ledPin3 = 4;
const int ledPin4 = 5;

void setup()
{
  Serial.begin(57600);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);

  // set initial LED state
  digitalWrite(ledPin, HIGH);
  digitalWrite(ledPin2, HIGH);
  digitalWrite(ledPin3, HIGH);
  digitalWrite(ledPin4, HIGH);
}

void loop()
{
  static bool prevButtonState=false;
  static bool ledsAllumees=false;
  bool buttonState = !digitalRead(buttonPin);  // pour résonner en logique positive

  if (buttonState!=prevButtonState)
  {
    // le bouton a changé d'état
    if (buttonState)
    {
      // on a appuyé
      unsigned long debut=millis();
      while (buttonState && millis()-debut < 2000) // attente appuyé pendant 2s
      {
        delay(10);      // tempo anti rebond
        buttonState=!digitalRead(buttonPin);
      }
      if (buttonState)
      {
        // si on est tjrs appuyé on allume/ou eteint
        if (!ledsAllumees)
        {
          allumage_leds(0, 1000, 1000);
          ledsAllumees=true;
        }
        else
        {
          extinction_leds(0, 1000, 1000);
          ledsAllumees=false;
        }
      }
    }

    prevButtonState=buttonState;
  }
  delay(10);
}

void allumage_leds( int del1,  int del2,  int del3)
{
  Serial.println(F(" __________________________________allumage des leds "));
  digitalWrite(ledPin, LOW);
  delay(del1);
  digitalWrite(ledPin2, LOW);
  delay(del2);
  digitalWrite(ledPin3, LOW);
  delay(del3);
  digitalWrite(ledPin4, LOW);
}

void extinction_leds(int del1, int del2, int del3)
{
  Serial.println(F("************************************* extinction des leds "));
  digitalWrite(ledPin4, HIGH);
  delay(del1);
  digitalWrite(ledPin3, HIGH);
  delay(del2);
  digitalWrite(ledPin2, HIGH);
  delay(del3);
  digitalWrite(ledPin, HIGH);
}

@ Kamill :

Merci et bravo pour tes recherches et ton aide. Cela fonctionne parfaitement. Juste les LED 3 et 4 qui s'étaignent ensemble, mais mon fils pourra les reprogrammer.

@ Bricolleu :

Mon p'tit gars regarde avec attention vos codes et ils pourraient servir pour d'autres applications.

Un grand merci à vous deux et à ceux qui ont participé à ce poste. Espérons que cela puisse aussi aider d'autres qui en auront besoins.

Cordialement

Concernant les leds 3 et 4 qui s'éteignent en même temps, je n'ai rien changé par rapport au programme initial. C'est parce que del1=0. Il suffit de faire par exemple extinction_leds(1000, 1000, 1000);