Bonsoir
Ayant réalisé un petit programme de gestion d'oscillateurs à base de servomoteurs : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1293371084
J'effectue le changement de paramètres (vitesses, courses, ...) en fonction de l'heure.
Pour ce faire, j'ai créé une horloge interne à base de l'instruction millis().
Mais un problème de taille me pose problème. La valeur millis n'évolue pas au rythme souhaité. Normalement, un décalage de 1000 correspond à 1 seconde, et dans mon cas, cela va trop vite. J'ai donc recalé le comptage par une simple règle de trois, mais je me rends compte que le décalage est aléatoire.
parfois cela avance, parfois cela retarde.
J'ai tout d'abord pensé que cela provenait de la taille du programme et que l'horloge s'apparentait plus à un compteur de cycle où la longueur du programme faisait varier le rythme de la variable interne millis.
J'ai donc créé un tout petit programme allumant la LED avec une impulsion toutes les minutes pour vérifier ma théorie.
Effectivement la valeur est légèrement différente pour clignoter toutes les minutes, mais toujours pas dans la norme (je devrais en théorie avoir 600 pour incrémenter toutes les minutes).
Voici le bout de code :
// Déclaration des variables et constantes horloge
long compteur_top=0; // Initialisation des tops horloge
long ancien_millis=0; // Mémoire de l'horloge millis
int minute = 5; // Minutes de l'horloge
int heure = 19; // Heures de l'horloge (avec inscription "19h" comme heure initiale)
// Sortie LED
const int led_int = 13;
int etat_led = LOW;
void setup() {
// Adressage des sorties
pinMode (led_int, OUTPUT);
// Initialise la liaison série
Serial.begin(19200);
delay(50);
}
void loop() {
// Création d'une impulsion temporisée (top) pour déplacements oscillateurs sur la base de l'horloge interne millis()
int top;
if (millis() >= ancien_millis) { // Vérifie que le temps millis() est bien supérieur à l'ancienne valeur mémorisée
// >> risque à l'init et au retour à zéro de l'horloge interne.
if (millis() - ancien_millis >= 100){ top = 1; // création d'un top toutes les 100ms
ancien_millis = millis(); // réinitialisation ancien_millis
compteur_top = compteur_top + 1; } // Incrémente le compteur de tops
else {delay(100-(millis()-ancien_millis));}
}
// HORLOGE
if (compteur_top >= 498) {minute = minute + 1; //Incrémentation des minutes
// (498 au lieu de 600 dans ce cas pour avoir une incrémentation toutes les minutes)
compteur_top = 0;
etat_led = HIGH;
}
else etat_led = LOW;
if (minute >= 60) {heure = heure + 1; //Incrémentation des heures
minute = 0;}
if (heure >=24) {heure = 0;} // réinitialise l'horloge toutes les 24h
// LIAISON SERIE POUR TESTS
if (top = 1){
Serial.print(heure);
Serial.print(" ");
Serial.print(minute);
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
}
// Remise à zéro impulsion "Top"
top = 0;
// Serial.print(" ");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
digitalWrite(led_int, etat_led);
}
Ma carte aurait-elle un problème, ou la valeur millis est naturellement inexploitable ?
Merci pour votre aide
Franck