Bonjour à tous,
Plongé sur un projet de modification gestion éclairage vélo, j'ai créé une fonction buzzer double finalité, d'une part lors d'un signalement danger (tous feux clignottants) et de l'autre en rappel en cas d'oubli d'arret des clignotants au terme de 90 secondes.
Je suis parti d'un feu arrière vélo ( Aliexpress) piloté par télécommande au guidon. l'ennui était que le buzzer original beepait dès n'impore quel demande, j'ai souhaité faire un montage plus abouti. De plus , en annexe de la carte Nano V3 utilisée, différentes tensions sont à gérer. (36V,12V,5V). Quasi tout fonctionne dans mon application, exepté de pouvoir arrêter le buzzer par un ré-appui sur la même touche, lorsque qu'il a été activé par un dépassement des 90 secondes de rappel clignottant.
Je peux l'arrêter, mais par la touche Phare, ce que je ne trouve pas pratique. De plus ce vélo est prévu pour mon épouse,elle va me reprocher que c'est trop compliqué!
Je bloque donc en fin de code, ayant tout essayé, imbriquant des variables comme pour le phare, la fatigue aidant, je m'y perd totalement. Vous allez certainement rapidement me guider vers la machine à état, laquelle j'ai beaucoup de mal à interpréter. Alors , j'aurais une préférence pour un codage plus primaire. Merci à ceux qui aurons l'amabilité de me mettre sur la voie.
Preform
atted text
int ingauche = 2; // entrée clignotant gauche
int indroit = 3; // entrée clignotant droit
int outphare = 5 ; // sortie phare avant et leds blanches poignées
int outgauche = 6; // sortie clignotant vers poignée gauche
int inphare = 7; // entrée info feu central arrière Fx actif
int outdroit = 8; // sortie clignitant vers poignée droite
const byte outbuzzer = 9; // sortie buzzer en direction du phare avant
int inBfg = 11; // entrée info demande phare issue de l'afficheur Bafang
int outFx = 12; // sortie activation feu central rouge Fx arrière seulement si intensionFx est absente ou faible
int etatlumiere = 4; // entrée indication état d'activation sortie lumière phare /
servant à la remise à zéro variable phare3
unsigned long tempsBuzzer;
unsigned long topdepart = 0;
unsigned long topchrono = 0;
bool memostop2 = false;
bool memostop1 = false;
bool phare1 = false; // variable d'activation phare lorsque l'entrée Bafang est à 1
bool phare2 = false; // idem ------------------------------ inphare est LOW suite feu rouge Biker actif
bool phare3 = false; // variable de mémoire combinaison simultanée clignottement et sortie phare active
bool phare4 = false; // variable d'activation phare lorsque phare3 est vraie et le clignottement actif
bool clignotte = false;
bool multicondition1 = false; // mémoire d'entrée ingauche active pour la condition multiplr buzzer
bool multicondition2 = false; // ---------------- indroit ----------------------------------------
bool multicondition3 = false; // ---------------- phare ----------------------------------------
void setup() {
pinMode (ingauche, INPUT_PULLUP); // entrée issue du clignottant gauche Biker
pinMode (indroit, INPUT_PULLUP); // --------------------------- droit -----
pinMode (outphare, OUTPUT); // sortie vers phare Biker
pinMode (outgauche, OUTPUT); // sortie vers clignottant poignée gauche
pinMode (inphare, INPUT_PULLUP); // entrée issue du feu rouge central Biker
pinMode (outdroit, OUTPUT); // sortie vers clignottant poignée droite
pinMode (inBfg, INPUT); // entrée commande phare et feu rouge arrière issue de l'afficheur Bafang ( Secours ou Tlc HS )
pinMode (outFx, OUTPUT); // sortie vers feu rouge arrière activée uniquement par la commande Bafang
pinMode(etatlumiere, INPUT ); // entrée D4 issue de la sortie lumière D5 de contrôle de la variable phare3
tone(outbuzzer, 1000, 500); // sortie vers buzzer active uniquement par la multicondition Biker clignottant tous feux.
}
void loop() {
if (digitalRead(inBfg) == HIGH) // cde Bafang active
{ phare1 = true; // phare actif
digitalWrite(outFx, HIGH); // feu rouge arrière actif
}
else
{ phare1 = false; // phare déactivé
digitalWrite(outFx, LOW); // feu rouge arrière désactivé
}
if (digitalRead(ingauche) == LOW) // clignottant Biker gauche actif
{ digitalWrite (outgauche, HIGH); // clignottant poignée gauche rendu à son tour actif
clignotte = true; // mémoire état clignottement pour la condition maintien phare vraie
multicondition1 = true; // -------------------------------------------- buzzer vraie
}
else
{ digitalWrite(outgauche, LOW); // sortie clignottant gauche poignée désactivée
multicondition1 = false; // mémoire clignottement multicondition buzzer rendue fausse
}
if (digitalRead(indroit) == LOW) // clignottant Biker droit actif
{ digitalWrite (outdroit, HIGH) ; // clignottant poignée droite rendu à son tour actif
clignotte = true; // mémoire état clignottement pour la condition maintien phare vraie
multicondition2 = true; // mémoire clignottement multicondition buzzer rendue vraie
}
else
{ digitalWrite (outdroit , LOW); // sortie clignottant poignée droite désactivée
multicondition2 = false; // mémoire clignottement multicondition buzzer rendue fausse
}
if (digitalRead(inphare) == LOW) // entrée phare issue du feu rouge central Biker
{ phare2 = true; // variable d'activation du phare
multicondition3 = true; // mémoire multicondition buzzer rendue vraie
clignotte = false;
}
else
{ phare2 = false; // variable activation phare annulée
multicondition3 = false; // mémoire multicondition buzzer rendue fausse
}
if ((digitalRead(etatlumiere) == HIGH) && (clignotte)) // condition d'activation mémoire maintien phare, si phare allumé lors des clignottements
phare3 = true; // mémoire maintien vrai
else
phare3 = false; // mémoire maintien fausse
if ((phare3 == true) && (clignotte == true)) // condition d'activation sortie phare en présence mémoire maintien et clignottements
phare4 = true; // phare et feux blancs poignées activés
else
phare4 = false; // phare et feux blancs poignées désactivés
if ((phare1) || (phare2) || (phare4)) // condition allumage phare fonction de ses 3 variables d'activation possibles
digitalWrite(outphare, HIGH); // phare allumé
else
digitalWrite(outphare, LOW); // phare éteint
if ((multicondition1) && (multicondition2) && (multicondition3)) // multicondition activation Buzzer lorsque Biker est tous feux allumés
gererBuzzer(); // démarrage fonction buzzer, sortie buzzer activée
if (!clignotte)
topdepart = millis(); // condition de rappel cligottant actif
if (millis() - topdepart >= 90000) // si plus de 90 secondes de clignottement ( oubli)
gererBuzzer(); // le buzzer emet une alarme de rappel
// !!!!! le problème est ici, comment arrêter l'alarme rappel clignottant lorsque le clignottant est désactivé?
}
void gererBuzzer() // déclaration fonction buzzer
{
if (millis() - tempsBuzzer >= 1000) { // départ chrono largeur impulsion globale 1 seconde (1/2 on, 1/2 off)
tone(outbuzzer, 1000, 500); // sortie buzzer activée, signal carré de 1000hz durant 1/2 seconde
tempsBuzzer = millis(); // boucle du chrono
}
}te code here