probleme programme debutant

Bonjour
je suis débutant avec arduino
je souhaite réaliser le montage suivant dans un cadre de modélisme

2 leds (1 rose et 1 blanche)
1 BP
programme sous arduino transcrit sur atttiny 45

A la mise sous tension: les 2 leds éteintes.
1er appui sur le BP: la led blanche s’allume (en fixe).
2eme appui sur le BP: led blanche s’éteint et led rose clignote.
3eme appui: led rose s’éteint et led blanche s’allume (en fixe).
4eme appui: led blanche s’éteint et led rose clignote … et ainsi de suite.

J’ai donc réalisé ce code

[code]

#include <OneButton.h>
const byte buttonPin = 3; // notre bouton est sur la pin 3
OneButton button(buttonPin, true); // true pour le mettre en INPUT_PULLUP
long temps;

// les pins utilisées pour les LEDs
const byte pinLedBlanche = 4;
const byte pinLedRose = 0;


// la liste des états possible de notre système
// ainsi qu'une variable etatCourant prenant une de ces valeurs
enum {REPOS, ETAT_blanc, ETAT_V, ETAT_rose, ETAT_R} etatCourant;

// ------------------------------------------------------
// Cette fonction installe l'état initial
// ------------------------------------------------------
void mettreAuRepos()
{

  digitalWrite(pinLedBlanche,  LOW);
  digitalWrite(pinLedRose, LOW);
  etatCourant = REPOS;
}

// ------------------------------------------------------
// La fonction de call back, appellée automatiquement quand on clique
// ------------------------------------------------------
void simpleclick()
{
  switch (etatCourant) {
    case REPOS: // on était au repos et on a un appui, on allume la blanche
      digitalWrite(pinLedBlanche, HIGH); // LED blanche alimentée

      etatCourant = ETAT_blanc; // on note le nouvel état de notre système
      break;


    case ETAT_blanc:// blanc allumées, on a un appui,ETEINTE
      digitalWrite(pinLedBlanche, LOW); // LED blanche ETEINTE
      if ((millis() - temps) > 1000)
        ETAT_rose == !ETAT_rose; // on inverse l'état de la led rose
      digitalWrite(pinLedRose, ETAT_rose); // LED rose alimentée
      temps = millis(); // on stocke la nouvelle heure


      etatCourant = ETAT_V; // on note le nouvel état de notre système
      break;

    case ETAT_V:// Blanc allumée, on a un appui,ETEINTE
      digitalWrite(pinLedRose, LOW); // LED rose eteinte
      digitalWrite(pinLedBlanche, HIGH); // LED blanche allumée


      etatCourant = ETAT_R; // on note le nouvel état de notre système
      break;

  }
}

// ------------------------------------------------------
// On initialise notre système dans le setup
// ------------------------------------------------------
void setup() {
  pinMode (pinLedBlanche, OUTPUT);
  pinMode(pinLedRose, OUTPUT);
  temps = millis();


  //conditions Initiales
  mettreAuRepos();

  // On attache la fonction simpleClick() comme callBack
  button.attachClick(simpleclick);
}

void loop() {
  // On vérifie l'état des boutons, ce qui déclenche l'appel de la fonction callBack si nécessaire
  button.tick();

  // ici on peut faire autre chose du moment que ça ne prend pas trop longtemps

}

[/code]
1er appui: led blanche s’allume
2eme appui led blanche s’éteint et led rose s’allume MAIS NE CLIGNOTE PAS
3eme appui: led rose s’éteint et led blanche s’allume.
puis, TOUT SE BLOQUE. > :(> :(> :frowning:
Pouvez-vous m’aider?

Merci d’avance.

Bonjour,

Ce qu'il faut que tu fasses c'est de faire évoluer l'état dans simpleclick(), mais il faut traiter les états (et en particulier le clignotement) dans loop().

relisez la programmation par machine à états (cf mon tuto éventuellement) et postez un graphe de vos états et comparez si vous traitez bien toutes les flèches et actions

merci pour cette réponse rapide
mais je ne comprends pas bien tes infos
je ne maitrise pas bien le code. Je suis parti d'une commande par BP simple qui fonctionnait et depuis que j'ai installé milllis , je galère, pourtant il me semble que ds le void, les lignes suivent une logique ????

ds le void

ça ne veut rient dire; void n'est pas synonyme de fonction ou méthode; c'est un type qui représente un type vide, ou inconnu ou générique, ou qui veut dire qu'une fonction ne retourne rien.

Ne connectez rien sur la pin 0 si vous pouvez faire autrement...Cette pin est connectée au port série

const byte pinLedRose = 0;

la variable temps devrait être un unsigned long

et relisez le tuto et postez le dessin du graphe

pour ce qui est du pin 0, mes essais tournent sur un attiny 45 et ne devraient pas poser de soucis je crois ?

en relisant ces infos, je me rends compte que dans ces lignes

case ETAT_blanc:// blanc allumées, on a un appui,ETEINTE
      digitalWrite(pinLedBlanche, LOW); // LED blanche ETEINTE
      if ((millis() - temps) > 1000)
        ETAT_rose == !ETAT_rose; // on inverse l'état de la led rose
      digitalWrite(pinLedRose, ETAT_rose); // LED rose alimentée
      temps = millis(); // on stocke la nouvelle heure


      etatCourant = ETAT_V; // on note le nouvel état de notre système
      break;

il faut je pense, lorsque la led s'est allumée lui dire de clignoter jusqu'à la prochaine pression sur le bp, mais la je bloque >:( >:(

ah oui j'avais pas percuté sur le ATTINY

3ème fois: dessinez le graphe des états et postez le.

Il ne faut pas mettre le clignotement dans simpleclick() qui n'est appelé que lors de l'appui sur une touche, mais dans loop()

j’ai fait ce schéma reprenant le défilement des états… mais je cela ne m’avance pas beaucoup dans la compréhension du code

ETAT.pdf (15.5 KB)

Clignote n’est pas un état de votre système - il y a deux états à décrire (led allumée et led éteinte avec une transition sur un temps écoulé )

oui je comprends mais je ne sais pas comment modifier le programme pour que l’inversion de l’état de la led rose bascule en fonction de la valeur de milli indéfiniment jusqu’à la prochaine interruption par le bp

etat.pdf (18.8 KB)

Il manque des flèches sur les états clignotants

On passe de l’un à l’autre sur expiration d’un certain délai mais il faut aussi gérer le bouton dans les deux états

Tu était bien parti dans ton programme mais

  • tu ne traites pas les appuis quand tu es dans l'état ETAT_R (qui ne sert à rien) -> quand tu arrives en ETAT_R tu es bloqué
  • il faut gérer le clignotement dans la loop()

quand tu dis qu'il faut gérer le clignotement dans la loop, il faut que je déplace le code dans la loop ??
Je ne comprends pas ce que tu veux dire par " tu ne traites pas les appuis quand tu es dans l'état ETAT_R

je suis désolé pour ces questions mais suis vraiment novice en la matière.

votre système doit répondre à 2 types d’événements: soit une action sur le bouton (qui appelle la fonction associée) soit le temps qui passe. Donc dans la loop on doit vérifier la présence d’un de ces évènements et agir en conséquence en fonction de l’état courant

cela veut dire qu’il faut , dans la loop, verifier l’état du BP, qu’il ne change pas, et dans ce cas laisser le clignotement se faire ???

cela revient à déplacer la ligne de code du clignotement dans la loop ? Je suis perdu.....

philippe22:
cela veut dire qu'il faut , dans la loop, verifier l'état du BP, qu'il ne change pas, et dans ce cas laisser le clignotement se faire ???

dans la loop() l'appel de

  button.tick();

ne vérifie que ce qu'il se passe sur les boutons. Donc toutes les flêches du graphe d'état qui se rapportent au bouton doivent être traitées dans simpleClick().

Pour ce qui est du temps qui passe, c'est un autre type d'événement. Il faut le traiter quand c'est nécessaire, c'est à dire uniquement si votre machine à état est dans un des 2 états qui alternent

voici à quoi devrait ressembler la machine, il y a 2 flèches aussi à définir (et aussi définir quand on éteint la LED blanche, est-ce lors de la transition vers LED ROSE OFF ?)

Pour les points d'interrogation, peu importe si la led est éteinte ou allumée lorsque l'on presse le BP : il faut simplement revenir à l'allumage de la led blanche.

pour l'extinction de la led blanche, la transition est plutot vers la led rose on : la blanche s'éteint, la rose s'allume

Donc voilà le diagramme d'état modifié, essayez de coder cela.