j'ai besoin dans un programme d'avoir deux tempos differentes. j'utilise la fct millis() mais j'ai quelques soucis.
1- j'ai l'impression que la tempo fait un peu ce qu'elle veut (meme si je n'en mets qu'une)... si je teste "lentement" j'ai bien ma tempo mais si par exemple je teste plusieurs fois dessuite le tempo n'est plus respectée (elle est tres courte voire inexistante)
2- Avec 2 tempo dans le meme programme c'est encore pire! et encore une fois les tempos ne sont pas respectés tout le temps
voila un bout de programme pour illuster mon soucis
pour prendre en compte le problème du débordement de millis au bout d'un moment
long previousMillis_1 = 0;
long previousMillis_2 = 0;
à remplacer par
unsigned long previousMillis_1 = 0;
unsigned long previousMillis_2 = 0;
car millis() retourne un unsigned long et non un long
Comme on ne sait pas vraiment quel comportement tu attends lors de l'appui sur les boutons on ne peut pas t'aider beaucoup. Un petit organigramme, une explication claire de l'attendu serait la bien venue.
Par contre on peut déjà dire que comme tu n'as aucun code qui prenne en compte le rebond des boutons tu peux avoir des transitions successives qui induisent un comportement inattendu.
Ensuite les if.. else ... imbriqués ne sont pas toujours très sûr. Une petite machine à état est souvent plus clair dans son fonctionnement.
j'ai fait ce programme simple (qui est la version extra light de mon programme final) afin d'illustrer mon soucis
ce programme (de test) devrait:
si j'appuie sur n'importe quel bouton cela ne fait rien
si bt 1 et bt2 sont activés ==> action1 activé puis action2 s'active apres 2sec. le tout s’arrête dès qu'un bouton est relâché
si bt 1 et bt3 sont activés ==> action1 activé puis action3 s'active apres 3.5sec. le tout s'arrete dès qu'un bouton est relâché
le soucis est qu'actuellement la tempo n'est pas respectée à tous les coups. Souvent les deux actions s'activent en meme temps!
sinon pour être plus précis, le "vrai" programme utilise:
la première tempo pour activer un embrayage X secondes après avoir accélérer le moteur (avec un servomoteur)
la deuxième tempo pour couper l'alimentation générale du système X secondes après la détection de coupure d'alimentation du moteur (ceci afin de remettre le servomoteur d’accélération en position initiale)
je peux mettre le programme complet mais il est assez long et ca risque de compliquer les choses pour rien. (mais je peux le poster si tu préfères)
Je ne connais pas la précision nécessaire, mais tu peux filtrer les parasites de début ou de fin de commutation en créant une base de temps de 100ms par exemple.
Ca donne un truc du genre :
if (previousMillis >= millis + 100) {
previousMillis = millis();
top100ms = HIGH; // monte un cycle toutes les 100ms
}
if (top100ms && !et_bouton1 && !et_bouton2) tps1++;
if (et_bouton1 || et_bouton2) tps1 = 0 ;
if (tps1 >= delay_1) {
digitalWrite(action2, BT_1_2); // ce que tu veux faire comme action
tps1 = 0; // RAZ de la tempo
}
//En fin de loop, tu mets
top100ms = LOW;