[Résolu] [Conseil] chronomètre

bonjour
j'aimerais faire 2 chose

1er) alumer une lampe avec un bouton si rien ne ce passe (nouveau appuis) elle s'étain au bous de 2 seconde

2eme) imaginons que on fait un appuis cour sur un bouton sa lance un void fonction et si on en fait mes si on font un long ~2seconde sa lance un void fonction différent

void loop();{

//impulsion court
void1();

//impulsion long 
void2(); 
}

void void1(){

//blabla
}

void void2(){

//blabla
}

m'aiguillier sur comment on peux faire ?

Bonjour ludocraft,

ludocraft:
2eme) imaginons que on fait un appuis cour sur un bouton sa lance un void et si on en fait mes si on font un long ~2seconde sa lance un void différent

Quid ?

Cordialement,
bidouilleelec

pour simplifier votre gestion des boutons, éventuellement utilisez la librairie de @bricoleau ou alors la librairie OneButton de Matthias Hertel.

Dans la première vous avez un exemple qui détecte la durée d’appui et dans la seconde directement la possibilité d’associer différentes fonctions pour un appui court ou appui long.

Le code étant dispo vous pouvez aussi étudier ces deux librairies, la première est un bon exemple d’usage de l’abstraction objet et la seconde un exemple sympa de machine à etat encapsulé en objet.

Notez que l’on ne dit pas un void, ça veut rien dire, void c’est un mot clé qui veut dire vide/sans objet/sans type précis. Utilisez le mot fonction qui est correct et fait pour cela.

je refait en fr mieux XD
"2eme) imaginons que on fait un appuis cour sur un bouton sa lance une voidfonction et si on en fait mes si on font un long ~2seconde sa lance un void fonction différent"

imaginons que on a 2 fonction void1 void2

appuie cour => void 1 fonction 1
appuie long => void 2 fonction 2

(j'ai tous ce qui faut dans ce que ma donner J-M-L)

merci J-M-L ^^

ludocraft:
merci J-M-L ^^

j'accepte le merci si vous cessez l'usage du mot void à tout va :frowning:
--> dites fonction

chef oui chef ^^

promis ^^

:smiley: :smiley:

On peut aussi faire, à l'ancienne, un truc comme ça :

unsigned long chrono = 0;
bool appui = false;

...


if (digitalRead(pinbouton) == LOW)  { //On suppose INPUT_PULLUP
  appui = true; 
  chrono = millis();
  delay (30);  // debounce
}
while (appui) {
  if (digitalRead(pinbouton) == HIGH) { // bouton relaché
    appui = false;
    if (millis()-chrono>longueDuree) fonctionAppuilong () ;
    else fonctionAppuiCourt ();
  }
}

Evidemment, ça bloque le code pendant l'appui sur le bouton (à cause du while)

lesept:
On peut aussi faire, à l'ancienne, un truc comme ça :

unsigned long chrono = 0;

bool appui = false;

...

if (digitalRead(pinbouton) == LOW)  { //On suppose INPUT_PULLUP
  appui = true;
  chrono = millis();
  delay (30);  // debounce
}
while (appui) {
  if (digitalRead(pinbouton) == HIGH) { // bouton relaché
    appui = false;
    if (millis()-chrono>longueDuree) fonctionAppuilong () ;
    else fonctionAppuiCourt ();
  }
}




Evidemment, ça bloque le code pendant l'appui sur le bouton (à cause du while)

Merci Lesept, je mets de côté. :wink:

N'étant pas familier avec la programmation, mes premières étaient en basic, j'évitais justement "while" à cause du côté bloquant. J'ai préféré utiliser la simplicité de la librairie.

J'avais des ratés avec simpleBouton, du coups je suis passé à l'autre solution proposée par Bricoleau qu'est boutonAction encore plus simple à utiliser, mais en double clic pour la deuxième fonction et là, plus de ratés.

Le côté bloquant de la chose est ennuyeux souvent

avec oneButton, vous faites un truc du genre
(Tapé ici donc pas testé, à utiliser avec la console série ouverte à 115200 bauds et un bouton correctement câblé sur pin2 — bouton — GND)

#include <OneButton.h>  // http://www.mathertel.de/Arduino/OneButtonLibrary.aspx

OneButton bouton(2, true);  // sur pin 2 avec câblage pin2 -- bouton -- GND

void unClick() {
  Serial.println(F("un click"));
}

void deuxClicks() {
  Serial.println(F("deux clicks"));
}

void setup() {
  Serial.begin(115200);
  bouton.setDebounceTicks(50); // 50ms pour les rebonds
  bouton.attachClick(unClick);
  bouton.attachDoubleClick(deuxClicks);
}

void loop() {
  bouton.tick();
  // autre chose ici si ça ne bloque pas trop longtemps
}

Merci JML, c'est aussi simple avec simpleBouton.

La proposition de lesept fonctionne, mais dans mon cas, si on règle 1000 pour la longue période, l'opérateur doit appuyer au moins une seconde et si il n'a pas de chrono dans la tête, il y a des ratés, ou il attends plus longtemps avant de relâcher ... fastidieux.

Le double clic est plus sur en fin de compte, dans mon cas.

achess:
Merci JML, c'est aussi simple avec simpleBouton.

oui, c'était juste à titre d'exemple :slight_smile:

Je viens de découvrir OneButton/TwoButtons.ino at master · mathertel/OneButton · GitHub

Ce qu'on peut ajouter à l'exemple c'est :

  button1.attachLongPressStart(longPressStart1);
  button1.attachLongPressStop(longPressStop1);
  button1.attachDuringLongPress(longPress1);

5 fonctions sur le même bouton, c'est cool

Bricoleau avait prévu le triple click, absent ici il me semble. :wink:

héhé plus rapide je lais déjà fait :wink: ;p