Bonjour à tous et à toutes.
Je suis en train de construire un système de feux tricolore pour une piste de karting afin de sensibiliser les jeunes au respect de la vitesse.
La première partie de mon code qui sert à détecter une survitesse doit restée bloquante avec des delay(). Jusque la pas de soucis.
Mais c'est en cas de vitesse respectée que je planche depuis un moment sans résultats. Celle ci ne doit pas être bloquante, car si il arrive plusieurs Kartings d'affilé, le feux doit resté au vert. à savoir que c'est un feux récompense, donc il est toujours au rouge. Voici la version bloquante:
De cette façon le rouge s’éteint au bout de 4 secondes puis passe au vert. Mais je ne vois pas comment faire pour la suite, toujours sans avoir une fonction bloquante.
Auriez vous une idée?
Voilà une façon d'allumer une LED x secondes sans être bloquante,
2 variables: feuxRougeTempo qui est la durée d'allumage. feuxRougeMillis qui est le chronomètre.
Si feuxRougeMillis est différent de 0, cela signifie que l'état FeuxRougeAllumé est actif.
Pour activer l'état FeuxRougeAllumé il faut:
digitalWrite(feuxRougePin, HIGH); // On allume le feu rouge
feuxRougeMillis = millis(); // On démarre le chrono
unsigned long feuxRougeTempo = 4000; // Temps d'allumage du feux rouge
unsigned long feuxRougeMillis = 0; // Temps d'allumage du feux rouge chrono
const int feuxRougePin = 7;
void setup()
{
Serial.begin(115200);
pinMode(feuxRougePin, OUTPUT);
digitalWrite(feuxRougePin, LOW);
delay(2000);
digitalWrite(feuxRougePin, HIGH); // On allume le feu rouge
feuxRougeMillis = millis(); // On démarre le chrono
}
void loop()
{
// Test si chrono feux rouge est démarré et est arrivé à échéhenc
if (feuxRougeMillis != 0 && (millis() - feuxRougeMillis >= feuxRougeTempo))
{
digitalWrite(feuxRougePin, LOW); // On éteind le feu rouge
feuxRougeMillis = 0; // Arrêt du chrono
}
}
Bonsoir, merci pour vos réponses.
Je pense que je vais plutôt regarder du coté de la machine à état proposé par lesept.
C'est un peu compliqué pour ma petite tête, mais je pense y arriver.
jpbbricole, j'ai testé ton code qui me semblait intéressant, mais sans succès, cela ne fonctionne pas.
Si vous avez d'autres solutions, méthodes, je suis preneur. En attendant, je regarde du coté de la machine à état.
Alors oui, son code est fonctionnel tel qu’il est, mais dans mon cas, j’utilise une entrée pour déclencher le chrono, et c’est la que ça ne fonctionne plus. je vous met mon code:
const int entree_low = 0;
const int entree_speed = 2;
const int rouge = 9;
const int jaune = 10;
const int vert = 11;
//const int croix = 12;
unsigned long pasttime = 0;
unsigned long presenttime = 0;
const unsigned long detectiontime = 4000;
const unsigned long verttime = 10000;
const unsigned long jaunetime = 2000;
void setup() {
Serial.begin(115200);
pinMode(entree_low, INPUT);
pinMode(entree_speed, INPUT);
digitalWrite(entree_low, HIGH);
digitalWrite(entree_speed, HIGH);
pinMode(rouge, OUTPUT);
pinMode(jaune, OUTPUT);
pinMode(vert, OUTPUT);
pinMode(croix, OUTPUT);
digitalWrite(rouge, HIGH);
}
void loop() {
if (digitalRead(entree_speed) == LOW) {
Serial.println("TROP VITE");
delay(16000);
digitalWrite(rouge, LOW);
digitalWrite(vert, HIGH);
delay(10000);
digitalWrite(vert, LOW);
digitalWrite(jaune, HIGH);
delay(2000);
digitalWrite(jaune, LOW);
digitalWrite(rouge, HIGH);
}
if (digitalRead(entree_low) == LOW) {
//Serial.println("VITESSE RESPECTEE");
detection();
}
}
void detection(){
presenttime = millis();
Serial.println(presenttime);
if (presenttime - pasttime >= detectiontime){
Serial.println("ok");
digitalWrite(rouge, LOW);
digitalWrite(vert, HIGH);
pasttime = presenttime;
}
Dans cette configuration, le feux passe bien au vert, mais tout de suite, alors qu'il doit ce passer 4s avant de passer au vert.
je me suis permis de modifier son code, pour correspondre à ton cas.
Mais je pense que tu aurais pu l'adapter tout seul
L'idéal serait que tu essaye et que tu montre ton code, pour que l'on puisse t'indiquer ce qui ne va pas.
La modification que j'ai fait et dans la même idée que ton programme, mais je pense que tu devrais passer à une machine d'état, cela te permettrais de suivre la logique de ton programme plus facilement.
Non, un objet qui quand on appelle sa fonction start() appelle une fonction utilisateur X secondes après. Si une voiture passe trop vite, je démarre un temporisateur et c'est lui qui déclenche les suivants et c'est eux qui font les actions.
Par exemple MTclock
C'était un blague
Par contre je suppose que la classe utilise un Timer, qui sont en nombre limités et peux parfois rentrer en conflit avec d'autre classes.
Oui à la vue de ton code, c'est tout à fait ce que je voulais. Je n'ai pas pensé à imbriquer deux conditions, on ne peut pas penser à tout
Je ne suis pas débutant, mais plutôt novice, j’apprends grâce à ce forum, notamment grâce à toi pour la deuxième fois.
Merci de votre aide à tous.
Oui, le nombre est limité, Avec une uno, je n'ai pu en mettre que 35, avec une mega que 250. C'est en fait les variables permettant de stocker les temps et les états qui limitent.
Par contre pour entrer en conflit, j'y crois assez peu, la seule ressource que j'utilise est le timer 0 qui n'est pas à ma connaissance utilisé par d'autres bibliothèque hormis la bibliothèque système qui elle n'est pas en conflit.