Bouton poussoir et fonction Millis [Résolu]

Bonjour à tous,

Je m'intéresse à l'Arduino depuis quelques temps et je m'amuse à faire de petits montages relativement simples.

Mais aujourd'hui j'aimerai réaliser un petit scénario avec des relais et une télécommande.
Je vais essayer de vous expliquer simplement ce que je voudrais faire.

Pour rendre les choses plus simples, je remplace la télécommande par un simple Bouton Poussoir pour le moment. Et mes relais (au nombre de deux) seront remplacés par de simples LED.

Maintenant le scénario: J'appui sur le Bouton Poussoir, LED1 s'allume, 1 seconde après, LED2 s'allume, 4 secondes après, LED1 s'éteint, et LED2 reste allumer tant que j'appuie sur le Bouton Poussoir. Si je relâche le Bouton Poussoir à n'importe quel moment du scénario, les 2 LED s'éteignent.

J'ai donc besoin d'utiliser une fonction Millis. Malgré tout les tutos que j'ai pu lire j'avoue que je galère vraiment pour utiliser cette foutue fonction.

Mon scénario doit être largement simpliste pour la plupart d'entre vous alors je vous demande votre aide.

Merci.

ici :

http://www.areaprog.com/arduino/article-629-millis-et-micros-utilisation-des-fonctions-millis-et-micros-pour-tirer-profit-de-l-horloge-interne-de-l-arduino

Autre exemple:

Le programme me semble simple: il suffit de mettre sur papier le chronogramme et tu vera ça ira tout seul.

Yan_duino.

millis utilise un "counter/timer" numéro 0.
Cet étrange objet est un morceau d'électronique qui tourne librement à l'intérieur de la puce microcontroleur. Il a le gros avantage de ne pas bloquer le programme.

Le compteur reçoit des impulsions d'horloge et il s'incrémente de 1 unité a chaque impulsion.
Le compteur du timer 0 compte sur 8 bits soit de 0 à 255 ensuite il repasse à 0 : on dit que le compteur déborde.

La fonction millis utlise ce compteur et gère ses débordements pour pouvoir compter pendant environ 50 jours, au delà elle déborde à son tour.
La fonction millis retourne des millisecondes

Sur ce site regarde l'onglet "LEARNING, Reference puis cherche millis et tu trouvera des exemples d'application

Attention la variable qui reçoit la réponse de millis doit être unsigned long int

unsigned long temps;
temps = milli();

Merci Messieurs pour vos réponses. Je vais essayer de comprendre le fonctionnement de cette fonction.
Je suis électricien et habituellement je programme en langage LADDER pas en C++.
Faut que je m'habitue !

Bonjour,

Voilà à présent j'arrive à utiliser la fonction millis(). Vous aviez raison ce n'était pas bien difficile au final (facile à dire une fois que l'on a compris).

J'ai presque réussi à faire ce que je voulais mais il me reste un problème.

Je rappelle mon scenario pour vous n'ayez pas besoin de tout relire (un bouton et deux led).

J'appuie sur le bouton (et je reste appuyé) la led rouge s'allume, 1 seconde après la led jaune s'allume, 4 secondes après, la led rouge s'éteint.
Quand je relâche le bouton la led jaune s'éteint. Je vous mets mon code et vous explique mon problème.

1
2 const int ledRouge = 3; //led rouge sur le broche 3
3 const int ledJaune = 4; //led jaune sur la broche 4
4 const int bouton = 2; //bouton sur le broche 2
5 
6 boolean etatBouton; //variable qui enregistre l'état du bouton
7 
8 long temps; //variable qui stocke la mesure du temps
9 
10 void setup() {
11  
12  pinMode (ledRouge, OUTPUT); //la led est une sortie
13  pinMode (ledJaune, OUTPUT); //le led est une sortie
14  pinMode (bouton, INPUT_PULLUP); // le bouton est une entrée
15 
16  etatBouton = HIGH; } //on initialise l'état du bouton comme "relaché"
17 
18  void loop() {
19
20  etatBouton = digitalRead(bouton); // le bouton est sur la broche 2
21  
22    if ( etatBouton == LOW ) {
23      digitalWrite (ledRouge, HIGH);
24      delay(1000);
25      digitalWrite (ledJaune, HIGH);
26      temps = millis();}
27    
28    if (millis() - temps >= 4000) {
29      digitalWrite (ledRouge, LOW);
30      temps = millis(); }    
31      
32    if (etatBouton == HIGH){
33      digitalWrite (ledJaune, LOW);
34      digitalWrite (ledRouge, LOW);}

Voila mon problème c'est que je n'arrive pas à éteindre ma led rouge. Le programme passe de la ligne 30 à la ligne 22 si le bouton est toujours appuyé. Du coup il exécute la ligne 23 et ma led rouge reste allumé à la place de s'éteindre (elle s'éteint et se rallume instantanément en fait).

Auriez-vous la solution pour arrêter la boucle (sans delay() puisque j'ai besoin de lire l'information de mon bouton en continu) pour éteindre ma led rouge ?

Merci pour votre temps les amis :slight_smile:

(edit: code entre balise code, et désolé :slight_smile: )

Peut être si tu met ton code entre balise code.
Voir : http://forum.arduino.cc/index.php?topic=324322.0

Un petit message pour vous signaler que j'ai trouvé la solution.

Merci pour votre aide sur ce projet. Je m'amuse vraiment avec ce petit Arduino.

Je vous poste le code, si vous voyez une amélioration n'hésitez pas.

const int ledRouge = 3; //led rouge sur le broche 3
const int ledJaune = 4; //led jaune sur la broche 4
const int bouton = 2; //bouton sur le broche 2

boolean etatBouton; //variable qui enregistre l'état du bouton
boolean initialisationUneFoisTemps = false;
boolean allumerUneFoisRouge = false;
unsigned long temps = 0; //variable qui stocke la mesure du temps

void setup() {
 
 pinMode (ledRouge, OUTPUT); //la led est une sortie
 pinMode (ledJaune, OUTPUT); //le led est une sortie
 pinMode (bouton, INPUT_PULLUP); // le bouton est une entrée
 
 etatBouton = HIGH;  //on initialise l'état du bouton comme "relaché"
 }

void loop() {

  etatBouton = digitalRead(bouton); // le bouton est sur la broche 2
  
  if (etatBouton == LOW) {
    if (initialisationUneFoisTemps == false) 
    {
      temps = millis();
      initialisationUneFoisTemps = true;
    }
   
   if (allumerUneFoisRouge == false) {
      digitalWrite (ledRouge, HIGH); //allumer led rouge
      allumerUneFoisRouge = true;
      }
      delay(1000); //attendre 1 seconde
      digitalWrite (ledJaune, HIGH); //allumer led jaune
     
   if (millis() - temps >= 4000)
    {
      digitalWrite (ledRouge, LOW); //éteindre led rouge 
      temps = millis();
      }
  }  
    if (etatBouton == HIGH)
    {
      digitalWrite (ledJaune, LOW);
      digitalWrite (ledRouge, LOW);
      initialisationUneFoisTemps = false;
      allumerUneFoisRouge = false;
      }
    
    }

Merci encore.