Salut ! Merci de ta réponse. Je me penche sur l'électro avant d'acheter l'arduino et de commencer à bidouiller
Pour ton problème de programmation, effectivement la fonction delay peut poser problème dans ce cas là.
Il faut que tu vois le problème dans un autre sens. Là, ton code boucle (via la fonction loop) et ne peut pas checker l'état des entrées constamment puisque tu utilises la fonction delay.
Si au lieu de penser ton code comme ceci, tu le penses en te disant: je veux qu'à chaque tour de boucle, la fonction loop check l'état de mon circuit.
Je m'explique:
1) l'idée est de créer une variable d'état logiciel int pour chaque entrée (cligno droit, cligno gauche, etc...) :
int cli_droit = 0; -> signifie que le clignotant droit est éteint
int cli_droit = 1; -> signifie que le clignotant droit est en clignotement et allumé
int cli_droit = 2; -> signifie que le clignotant droit est en clignotement et éteint
2) une variable d'état electronique : int cli_droit_etat;
3) une variable de temps original pour chaque entrée (qui va stocker l'heure de la pression du bouton) : int cli_droit_tps_ori;
4) Et enfin, pour le clignotement par exemple, une constante pour indiquer la durée d'un clignotement (en millisecondes) : const int cli_droit_show = 1000;
Lorsque tu vas appuyer sur le poussoir du clignotant droit pour le mettre en fonction, ta loop va détecter un changement d'état et va modifier la variable d'état int cli_droit mais va aussi modifier la variable int cli_droit_tps_ori pour y stocker l'heure à laquelle le bouton a été pressé, précision au millième de seconde (on appelle ca un timestamp).
Ensuite à chaque tour de loop, tu vas tester le temps depuis le dernier changement d'état: si temps actuel - cli_droit_tps_ori >= cli_droit_show alors le cligntotant droit est allumé depuis assez longtemps et on le change d'état. Un bout de code veut mieux que des explications:
Code : Tout sélectionner
const int cli_droit_show = 1000; // Duree d'un clignotement (lampe allumee)
int cli_droit = 0; // Clignotant droit (0: eteint / 1: cligntant et allume / 2 : clignotant et eteint)
int cli_droit_etat = digitalRead(CLI_DROIT); // variable d'etat electronique
unsigned long cli_droit_tps_ori = 0; // Stockage du temps lors de la pression sur le bouton
void loop() {
changeEtat(); // Fonction qui va tester tous les changement d'état de tous les boutons
}
// Fonction qui va tester tous les changement d'état de tous les boutons
void changeEtat() {
changeCliDroit(); // Fonction qui va tester le changement d'état du bouton du clignotant gauche
// Autre fonctions de changement d'état
}
// Fonction qui va tester le changement d'état du bouton du clignotant gauche
void changeCliDroit() {
if (cli_droit_etat !== digitalRead(CLI_DROIT)) { // On teste si le bouton a été pressé et si la valeur enregistrée du bouton clignotant droit change
cli_droit_etat = digitalRead(CLI_DROIT); // Si oui, on stocke cette nouvelle valeur.
cli_droit_tps_ori = DateTime.now(); // Et on stocke le timestamp actuel
if (cli_droit === 0) { // Ensuite, on inverse l'état logiciel. Si elle était égale à 0, on la passe à 1 et inversement
cli_droit = 1;
// Ici, à la place de ce commentaire, on allume physiquement le clignotant droit
} else {
cli_droit = 0;
// Ici, à la place de ce commentaire, on éteint physiquement le clignotant droit
}
} else { // Si le bouton n'a pas été pressé
if (cli_droit !== 0) { // Si le clignotant n'est pas éteint
if (DateTime.now() - cli_droit_tps_ori >= cli_droit_show) { // On teste la différence entre le temps actuel et le dernier changement d'état du bouton. Si cette différence est supérieure au temps d'allumage définit par la constante cli_droit_show, on inverse son état clignotant.
if (cli_droit === 1) { // S'il était cligntotant et allumé, on le passe en clignotant et éteint
cli_droit = 2;
// Ici, à la place de ce commentaire, on éteint physiquement le clignotant droit
} else { // S'il était clignotent et éteint, on le passe en clignotant et allumé
cli_droit = 1;
// Ici, à la place de ce commentaire, on allume physiquement le clignotant droit
}
cli_droit_tps_ori = DateTime.now(); //Comme on a changé d'état, on stock à nouveau le temps actuel.
}
}
}
}
Tel que c'est fait la, je doute que le code soit utilisable. Mais dans le principe c'est ca.
Désolé si j'en ai noyé certain :)
Voilà, n'hésites pas si tu as des questions