Bonjour à tous,
je suis débutant dans l'Arduino de formation dans l’électricité je ne peine pas trop dans le câblage des composants mais je galère pas mal dans la programmation, je suis de l’Auvergne.
J'ai un projet assez clair dans ma tête mais je n'arrive pas à le concrétiser dans la programmation
Je recherche de l'aide.
Je vous explique mon projet, c'est un système de feux tricolore (Rouge/orange/vert) jusque la rien de compliquer avec la fonction delay() pas de soucis, mais pour contrôler les feux j'utilise un bouton et un bouton arrêt.
A partir de là, je galère avec le fonction delay() le feux ne s’arrête pas (normal il faut attendre la fonction delay()) avec la fonction millis() cela ne fonctionne pas?
La fonctionnement du projet doit être : lors d'un appui du le bouton "marche" le feux rouge est fixe "5 sec" ensuite il s’éteint puis le feux vert passe a fixe "30 sec" et enfin le vert s’éteint et l'orange s'allume "10 sec" puis s’éteint il faut rappuyer sur le bouton marche pour reactiver le cycle. Le bouton "arrêt" sert lors du cycle à l'importe quelle moment du couper le cycle des feux.
mixofnode:
je galère pas mal dans la programmation, je suis de l’Auvergne.
Oui, ça explique tout...
Tu mets des delay dans ton code : lorsqu'il rencontre un delay, le processeur s'arrête pendant le temps demandé. Si tu appuies sur ton bouton à ce moment là, le processeur ne le voit pas.
Il faut que tu fasses un code 'non bloquant', c'est à dire sans delay. Le tuto standard pour cela est BlinkWithoutDelay mais si tu lis l'anglais tu trouveras mieux expliqué sur le forum
Je suis de l’Auvergne et en plus je ne comprends pas trop l'anglais
Trêve de plaisanterie les exemples trouvaient pour Millis() sont souvent avec une Led
j'ai fait ce code mais toutes les led reste allumé (normal les temps est superieur ou egale mais je ne trouve pas comment eteindre les Led et faire un cycle correct)
/*
Feux tricolore
Version 5 12/01/19
*/
// définition des broches:
const int FeuxRouge = 7; // Broche 7 pour la led rouge
const int FeuxJaune = 6; // Broche 6 pour la led rouge
const int FeuxVert = 5; // Broche 5 pour la led rouge
//const int BPMarche = 4; // Broche 4 pour le bouton de marche
//const int BPArret = 3; // Broche 3 pour le bouton d'arret
// Definition des variables qui change d'etat:
int EtatBPMarche = 0; // Lecture du BP marche
int EtatBPArret = 0;
int TempsDeTir = 10000; // Parametre par defaut du temps de tir (Feux vert)
int TempsOrange = 5000;
int TempsAppel = 3000;
long TempsMemorise = 0;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup()
{
// initialisation en entrée de toutes les broches
//pinMode(BPMarche, INPUT); // Bouton Marche
//pinMode(BPArret, INPUT); // Bouton Arret
// initialisation en sortie de toutes les broches
pinMode(FeuxRouge, OUTPUT); // Feux rouge
pinMode(FeuxJaune, OUTPUT); // Feux jaune
pinMode(FeuxVert, OUTPUT); // Feux vert
// on initialise toutes les LED éteintes au début du programme
digitalWrite(FeuxRouge, LOW);
digitalWrite(FeuxJaune, LOW);
digitalWrite(FeuxVert, LOW);
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop(){
if(millis() - TempsMemorise >= 1000) {
digitalWrite(FeuxRouge, HIGH);
TempsMemorise = millis(); //change la variable Tempsmemorise et donne la valeur de la fonction millis()
}
if(millis() - TempsMemorise >= TempsDeTir) {
digitalWrite(FeuxRouge, LOW);
digitalWrite(FeuxVert, HIGH);
}
if(millis() - TempsMemorise >= TempsDeTir + TempsOrange) {
digitalWrite(FeuxVert, LOW);
digitalWrite(FeuxJaune, HIGH);
}
}
/* le programme va reboucler et revenir au début */
mixofnode:
Le fonctionnement du projet doit être : lors d'un appui du le bouton "marche" le feux rouge est fixe "5 sec" ensuite il s’éteint puis le feux vert passe a fixe "30 sec" et enfin le vert s’éteint et l'orange s'allume "10 sec" puis s’éteint il faut rappuyer sur le bouton marche pour reactiver le cycle. Le bouton "arrêt" sert lors du cycle à l'importe quel moment du couper le cycle des feux.
Tu peux coder ce genre de chose avec une machine à états. Il y a des bibliothèques pour ça et même un tuto sur le forum...
Sinon, tu peux faire un truc comme ça :
Initialiser un booléen à false dans le setup
Dans la loop :
Tant que le bouton marche n'est pas appuyé, attendre.
Dès qu'il est appuyé, lancer le chrono et allumer la led rouge. Mettre le booléen à true
Tant que le booléen est true faire
Si le chrono est supérieur à 45 secondes, éteindre les leds et mettre le booléen à false
Sinon si le chrono est supérieur à 35 secondes allumer la led orange
Sinon si le chrono est supérieur à 5 secondes allumer la led verte
Sinon allumer la led rouge
Si le bouton arrêt est appuyé, éteindre les leds et mettre le booléen à false
mixofnode:
il me semble que le fonction attachInterrupt() pourrait faire l'affaire.
Dans la mesure où l'usage de millis() pour faire les temporisations ne bloque pas le déroulement du programme le recourt aux interruption n'est pas nécessaire. A la limite on pourrait voir ça comme un exercice de style mais c'est tout.
l'interruption ne vous permettra pas de reprendre le contrôle (à moins de rebooter dans l'ISR) de votre Arduino. certes vous pouvez éteindre tout dans l'interruption mais au retour de l'interruption le code continue là où il était, c'est à dire dans un délai de 45 secondes par exemple --> et là on ne pourra pas relancer le cycle
le plus simple c'est de faire une petite machine à état (cf mon tuto éventuellement pour comprendre le principe)