Bascule JK avec arduino

Bonsoir
Je suis débutant avec arduino
Je souhaiterais avec un arduino, 2 BP et deux leds :
On appuie sur BP1 : la led 1 s’allume 2 secondes puis s’eteind.
Si on appuie de nouveau sur BP 1, led1 reste éteinte
Il faut appuyer sur BP2 pour : allumer led2 2 secondes et du coup débloquer le BP1 pour la suite
De même BO2 sera bloqué tant que BP1 n’aura pas été appuyé
On appuyé sur BP 1 pour allumer led 1 etc....
Pourriez-vous m’aider svp

c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

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

Merci pour votre réponse rapide
J’ai survolé votre tuto qui me paraît cohérent par rapport à ma demande
Çela dit’ étant vraiment novice en la matière, cela va être compliqué car j’ai besoin de 2BP et sachant que là doit bloquer le suivant et vice versa
Je vais relire votre tuto pour essayer de l’adapter à ma demande
Merci dans tous les cas

cela va être compliqué car j'ai besoin de 2BP et sachant que là doit bloquer le suivant et vice versa

Pas vraiment plus compliqué. Essayez de faire le dessin de la machine à états et postez une photo ici, on vous aidera

Les questions à se poser:
Quel est votre système ? (2 LEDs ou 2 LEDs + 2 BP ?)
Quels sont les états possibles du système ?
Dans un état donné, quels sont les événements qui peuvent me faire changer d’état (Transition) ?
Que dois je faire ou mémoriser lors de chaque transition identifiée ?

Petites questions subsidiaires :

  • que veut dire appui sur le bouton ? détectez vous l’appui ou vous déclenchez au relâchement ?
  • doit on prendre en compte l’appui du second bouton si le premier n’a pas été relâché ?

J’ai donc réétudié ma demande et votre tuto :
Voici mon cahier des charges :
1 BP (a prendre en compte lors de la pression)
2 sorties Led 1 et led 2
2 sorties Impulsion 1 et impulsion 2

Fonctionnement :
à la mise sous tension :

  • forcing de led 1 à l’etat haut (reste allumée jusqu’à la prochaine pression de BP)
  • génération d’une impulsion de 1 seconde sur Impulsion 1( qui sera exploitée en tant que commande logique sur d’autres cartes électroniques.

Appui sur BP :

  • led 1 s’éteint
  • led 2 s’allume
  • impulsion 1 seconde sur Impulsion 2

Nouvel appui sur BP:
-led 2 s’éteint

  • led 1 s’allume
  • impulsion 1 seconde sur Impulsion 1

Nouvel appui sur BP:
-led 1s’éteint

  • led 2 s’allume
  • impulsion 1 seconde sur Impulsion 2

Et ainsi de suite....

Et comment di-t’on au programme de recommencer le cycle ?
Excusez-moi pour les erreurs certainement nombreuses mais je suis plus à l’aise sur de la logique intégrée que programmable
Merci d’avance

bonjour

merci de lire comment utiliser correctement le forum pour poster du code. Editez et corrigez votre post ci dessus et rajoutez les code tags autour du code:

[code]

[color=blue]// votre code ici[/color]

[/code]

.

ça doit ressembler à cela:

// votre code ici

(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)


je ne sais pas comment faire pour dire qu'a la mise sous tension

Quand on veut faire quelque chose une fois à l'allumage du système on met le code dans le setup()

il n'y a donc plus qu'un seul bouton pression maintenant et votre système semble comporter 2 LEDs d'état et 2 pins d'impulsion.

Voici à quoi ça pourrait ressembler:


Que se passe-t-il si l'utilisateur appuie sur le BP pendant les phases d'émission d'impulsion ? (les 2 flèches rouges sur le schéma ci dessus). Ce sont des phases courtes d'une seule seconde mais faut-il enregistrer la demande de bascule ou interdire l'appui pendant la phase d'impulsion ?

En fait
il faut interdire l'appui pendant la phase d'impulsion
Un seul BP pour deux fonctions séquentielles (après forcing de Led 1 à 1 avec impulsion sur Impulsion 1 et Led é éteinte) :

1 appui, led 1 s'éteint et led 2 s'allume tout en générant une impulsion sur Impulsion 2
1 appui, Led 2 s'éteint et Led 1 s'allume, tout en générant une impulsion sur Impulsion1
1 appui, led 1 s'éteint et led 2 s'allume tout en générant une impulsion sur Impulsion 2
etc...
comme un "chenillard" avec deux voies

Merci

OK donc c'est assez simple, pour interdire l'appui il suffit de ne pas le traiter => Le schéma précédent sans les 2 flèches rouges avec le '?' correspond donc à ce que vous voulez faire.

vous essayez ?

PS: merci de corriger votre post précédent pour mettre les balises de code. ça fait désordre sur le forum.

Ok j'ai enlevé le code sur le forum

Par contre j'ai du mal à saisir votre schéma : vous faite intervenir une notion de comparaison avec une variante de temps ??? Delta T ???

∆t c'est juste pour noter qu'on attend un délai de 1s, c'est un évènement de transition sur le temps, comme dans le tuto

Vous déclarez une variable globale qui va servir à mesurer un temps de début de signal unsigned long t0;puis lors de la transition précédente vous affectez l'heure courante à cette variable pour mémoriser le moment de début

digitalWrite(pinLed1, HIGH);
digitalWrite(pinImpulsion1, HIGH);
etat = IMPULSION1;
t0 = millis();

et enfin dans l'état IMPULSION1 le seul événement qui vous fait franchir la transition c'est l'expiration du délai de 1 seconde donc vous feriez

...
case IMPULSION1:
  if (millis() - t0 >= 1000) { // si une seconde est écoulée
    digitalWrite(pinImpulsion1, LOW); // on éteint l'impulsion
    etat = ATTENTE1;
  }
  break;
...

Je dois vous avouer que je reste complètement perdu devant toutes ces données. Comme je l'ai signalé au début du post, je suis débutant sur arduino et suis loin de connaitre ce langage de programmation.

Merci pour toutes ces infos et le temps que vous m'avez alloué mais je ne réussi pas à comprendre ce langage. Il me faut impérativement me plonger dans l'univers arduino, le seul problème est mon manque de temps et ce projet devient pour moi urgent.

Cordialement

je suis plus à l’aise sur de la logique intégrée que programmable

Pourquoi ne pas prendre un circuit intégré 74LS73 / SN5476 / … ou faire une bascule JK hardware en chainant 2 verrous RSH alors ?

A quoi sert l’arduino ? Est ce un projet scolaire ?

J'ai déjà mis en place un circuit avec du JK et fonctionne parfaitement dans le cadre d'une utilisation modélisme
mais le but est de :

  • réduire le nombre de composants ainsi que la taille du CI :1 flip Flop, Monostable + composants discrets et pour la puissance : UN
  • et surtout de ne pas se refuser à l'évolution des technologies...
    J'utilise déjà de l'Attiny mais avec des fonctions simplistes....

:slight_smile:

Si c’est pour du modélisme quel est l’urgence? Prenez le temps de découvrir la plateforme et les bases du C/C+