Bonjour à tous.
Je suis entrain de code une gestion de volets sur UlM et j'ai besoin de faire clignoter une LeD 3 couleurs à différentes vitesses suivants que:
Le volet est en mouvement:
Allume 200 mS à 300 mS toutes les 1.5s une des couleurs.
Le volet n'a pas atteint sa position dans un délai prévu:
Allume 200 mS toutes les 1s mais avec une intensité plus grande. sur une autre couleurs ( résistance plus faible que sur la 1ere Led)
Le volet n'est pas rentré à la mise sous tension de l'avion:
Allume les 3 Led l'une après l'autre avec un cadencement de 333 mS....
J'ai bien trouvé un exemple sur le net que j'ai adapté avec mes entrées prises dans le programme source:
// --- Inclusion des librairies utilisées ---
#include <MsTimer2.h> // inclusion de la librairie Timer2
const int LED=13; //declaration constante de broche
int buttonStateSURZERO = 0; // variable etat du Boutonvoletsurzero.
const int Boutonvoletsurzero = 2; //commande volet sur "0" sur la broche 2.
void setup() { // debut de la fonction setup()
pinMode(LED, OUTPUT); //met la broche en sortie
pinMode(Boutonvoletsurzero, INPUT_PULLUP); // on déclare le "bouton de volet sur zéro" en entrée (2)
// initialisation interruption Timer 2
MsTimer2::set(1500, InterruptTimer2); // période 1000ms
MsTimer2::start(); // active Timer 2
}
void loop(){ // debut de la fonction loop()
buttonStateSURZERO = digitalRead(Boutonvoletsurzero);
}
void InterruptTimer2() { // debut de la fonction d'interruption Timer2
if (buttonStateSURZERO == LOW )
{
digitalWrite(LED, HIGH);
delayMicroseconds(500000); // la fonction delayMicroseconds ne bloque pas les interruptions
digitalWrite(LED, LOW);
}
}
// --- Fin programme ---
Pour changer la cadence je modifie" MsTimer2::set(1500, InterruptTimer2)"" en MsTimer2::set(1000, InterruptTimer2)"
et "delayMicroseconds(500000)" en 100000
cela fonctionne bien en ce qui concerne l'interval mais pour ce qui est du temps d'allumage de la LeD je ne vois pas la différence.
Maintenant pour changer la variable du MsTimer2::set(1500 etc.. il faudrait déplacer cette séquence qui est en void setup() dans void loop() et là ca ne marche plus...
Pourquoi..
Comment faire.
Si quelqu'un connait un croquis simple qui utilise le timer () et avec lequel on peux changer les valeurs pour faire varier les périodes je suis preneur.
Merci de votre aide.
Bon, je commence par ce qui me surprend: coder une gestion de volets sur ULM avec Arduino me parait être une idée étrange. Si c'est pour piloter le volet, ça me parait être une mauvaise idée, et si c'est simplement pour afficher son état, le mal est moindre mais le risque est grand. A l'époque où je faisais du vol à voile je pense que je n'aurais pas pris le risque de faire dépendre de ce genre de projets ma vie en l'air.
Cette considération mise à part, je pense que puisque nous parlons d'un sujet sérieux, il faut faire les choses sérieusement. Pour ma part je partirais sur une lecture des boutons dans la boucle principale. En fonction de la lecture des boutons je renseignerais un état dans une variable (tel que état = 0, = 1, etc. Ou mieux et plus lisible, avec des #define, FLAPS_UP, FLAPS_DOWN, FLAP_GOING_DOWN, etc.)
A partir de cet état défini en fonction de la lecture des boutons et de l'état des volets, une structure conditionnelle permettrait de choisir la led sur laquelle il faut agir, sa temporisation, et le temps qu'elle reste allumée.
Les fonctions delay sont à prescrire, car elles sont bloquantes. Elles ne bloqueront pas les interruptions (comme le dit le commentaire) puisque les interruptions sont prioritaires sur le code, mais si une interruption arrive pendant que la boucle delay se fait, elle sera traitée et la boucle reprendra son cours là où elle en était.
Une solution plus fiable et plus élégante serait d'utiliser une deuxième fonction d'interruption sur timer2. En fonction du test d'état dans la boucle principale, tu paramètres la temporisation que tu veux pour la première fonction, qui est activée en permanence, et dont le but est d'allumer la led voulue. Puis tu paramètres pour la deuxième fonction le temps pendant lequel tu veux que la led reste allumée. Et dans le code de cette deuxième fonction tu fais s'éteindre la led que tu veux.
La première fonction (led allumée) est activée en permanence. Par contre la seconde (led éteinte), tu ne l'actives que dans la boucle d'allumage de la led. Ainsi une fois la led allumée, tu reviens immédiatement dans ta boucle principale, et la led s'éteint automatiquement.