Librairie OneButton

postez tout votre code - là on parle dans le vide.


si vous regardez le fichier .h de la bibliothèque vous verrez qu'il dit que SetDebounceTicks() est déprécié (il ne faut plus l'utiliser mais ça reste pour compatibilité pour le moment)

Normalement le debounce par défaut est largement suffisant pour tous les boutons que j'ai pu voir.

C'est setDebounceMs

#include <OneButton.h>

const int bouton1Pin =11;
const int bouton12Pin =12;
const int sortie1Pin=4;

OneButton bouton1(bouton1Pin);

const unsigned long debounceDelay=1000;

void simpleClickBouton1(){
digitalWrite(sortie1Pin,HIGH);
delay(500);
digitalWrite(sortie1Pin,LOW);
}

void setup (){
pinMode(sortie1Pin,OUTPUT);
bouton1.attachClick(simpleClickBouton1);

//bouton1.setDebounceMs(debounceDelay);
}

void loop(){
bouton1.tick();
}

Voilà c'est du recopiage
Je suis sur le forum avec mon phone mais j'emprunte un ordi pour coder donc faut envoyer un mail tout ça...bref
Voilà c'est un code minimal pour dompter la librairie
Concernant l'antirebond j'ai besoin d'environ 800ms pour ce que je veux en faire

C'est longPress qu'il te faut.

Non je veux qu'un appui très court envoie un seul signal mais qu'on ne peut pas répéter durant 800ms donc qui dure 800ms

C bien ça !?

ce n'est plus de l'anti-rebond alors...

Peut être devriez vous explorer la programmation par machine à états (cf mon tuto éventuellement j'ai un exemple de bouton temporisé justement)

Pour ça, il faut démarrer un timer de 800 ms, avec les millis(), que, pendant que ce timer est actif, ça bloque l'action du bouton.

J'ai adapté ton programme de post#23

#include <OneButton.h>

const int bouton1Pin =11;
const int bouton12Pin =12;
const int sortie1Pin=4;

OneButton bouton1(bouton1Pin);

const unsigned long debounceDelay=1000;

const unsigned long nonRepetitionTempo = 800;     // Temps de non répétition
unsigned long nonRepetitionMillis = 0;     // Temps de non répétition, chrono
boolean nonRepetition = false;

void simpleClickBouton1()
{
	if (nonRepetition)  // Si c'est bloqué
	{
		return;
	}
	digitalWrite(sortie1Pin,HIGH);
	delay(500);
	digitalWrite(sortie1Pin,LOW);

	nonRepetition = true;  // Bloquer la répétition
	nonRepetitionMillis = millis();  // Démarrer le chrono
}

void setup (){
	pinMode(sortie1Pin,OUTPUT);
	bouton1.attachClick(simpleClickBouton1);

	//bouton1.setDebounceMs(debounceDelay);
}

void loop(){
	bouton1.tick();

	if (nonRepetition && (millis() - nonRepetitionMillis) >= nonRepetitionTempo)  // Si fin de non répétition
	{
		nonRepetition = false;
	}
}

Justement j'ai bien tenté quelquechose de ce côté là qui fonctionnait presque(du coup j'ai ecrit un truc tout seul avec ms pour la première fois faut que je maîtrise aussi)mais j'ai compris qu'un antirebond doit faire l'affaire pour ce que je veux faire et que commencer à utiliser une librairie de gestion de boutons me sera utile pour mes futurs projets

Je suis toujours débutant donc je vais au plus logique pour moi en essayant d'apprendre un peu plus à chaque fois
Mes projets sont tous ludiques donc c'est que du loisir

Jpeux expliquer le projet si vous voulez pour que ça soit plus clair

Non. pas pour bloquer un nouvel appui pendant un certain temps. ce n'est pas fait pour cela. C'est juste fait pour gérer les rebonds.

regardez mon tuto sur les machines à état. J'utilise oneButton et il y a la notion de temps qui passe etc... et c'est non bloquant (votre delay(500) lors de l'appui risque de vous jouer des tours plus tard si vous avez des besoins pendant que la sortie est HIGH)

Non ça n'est pas fait pour cela mais si je le règle à 1000ms
Une fois enclenché,il ne reste pas en l'etat pendant 1seconde même si je relâche le bouton??

la machine à état qui pilote l'appel des callback est décrite ainsi dans la documentation

regardez où est utilisé le debounce time

Tu veux que je vois que 800ms ça peut pas pour une souris donc on peut pas paramétrer autant?enfin ça se voit dans schéma
(Je prends le risque d'être ridicule là :laughing::laughing:)

Je le dis avec mes mots😁

Bon j'arrête pour aujourd'hui
Cool jpbricole le nonrepetition j'ai un modèle propre comme ça

Et je regarderais la machine à état mais je pense c'est une autre paire de manche
Merci tous

jouez avec le code, c'est le meilleur moyen de vous faire une idée :slight_smile:

C'est ça l'idée
Et en partant d'un code qui marche ben quand il marche plus c'est que j'ai ajouté une erreur que je vais trouver du coup

A bientôt

pas forcément lié directement à ce que vous ajoutez : le code ajouté peut fonctionner mais vous changez le timing ou vous utilisez trop de mémoire et un bug sous jacent peut apparaître par exemple.

Bonjour
J'ai tout d'abord une interrogation sur le programme de jpbricole
Je pensais que le delay de la sortiePin bloquerai le programme mais l'antirepetition marche bien en même temps
Il y a des conditions pour que delay bloque un programme?
Après j'ai plein de questions autres😁

Salut!
Je suis curieux de connaître le projet qu'il y a derrière ta demande (qui, si je comprends bien, se résume à gérer un bouton et son anti-rebond avec à chaque clique un temps non bloquant de 800ms pendant lequel on ne peut pas répéter le clique ?) :slight_smile:.

Pas forcément une fois qu'on à compris le principe :wink:
Si tu attends jusqu'à demain je te fais un exemple avec la machine à état conseillée par @J-M-L pour que tu aies un exemple à étudier si tu le souhaite ? Il me semble que c'est une solution plus fiable que millis mais qui demande un peu plus de mémoire en revanche.


Non, aucune. La fonction delay "gèle" complètement l'exécution du programme (un Arduino classique c'est monocore donc on peut pas faire deux opérations en même temps - si on utilise delay, on condamne à attendre toutes le reste pendant ce temps)

Cordialement,
Pandaroux007

Donc je ne me suis pas rendu compte que mon antirepetition dure 1300ms dans ce programme??

Delay + antirepetition

Quant au projet c'est pour l'airsoft,un capteur de dégâts pour un mastodonte
Mais comme je voudrais aussi faire plus tard des capture de territoire ou horloge d'échecs je voudrais être bien sur la gestion des boutons et du temps
Du coup la les boutons c'est pour les essais
Ensuite j'ai regardé la machine à etat et la librairie de bricoleau ça a l'air bien une fois apprivoisé mais pour ce projet jpense rester un peu sur la base que je maîtrise pas assez... là j'essaie de me servir d'une librairie quelconque en même temps

Si vous avez un peu d’ambition pour vos projets, passez du temps pour maîtriser la base du c++ et du monde arduino. Cela vous fera gagner beaucoup de temps plus tard.

N’essayez pas non plus d’utiliser une fonction pour un but qui n’est pas celui qui est le sien. L’anti rebond, c’est pour les rebonds de quelques dixièmes de seconde. C’est pensé pour cela, pas pour autre chose.