Je cherche à mettre au point un système avec un servo moteur qui bouge à heure fixe.
Le servo moteur tourne sur 180° à x heure puis reviens à 0 à y heure. J'ai écrit ce code mais cela ne fonctionne pas comme souhaité... J'ai rassemblé des lignes de code à partir d'exemple et de conseils, là je suis coincé. Que me proposez vous ?
#include <Wire.h>
#include <ds3231.h> //charger la bibliothèque de l'horloge ds3231
#include <Servo.h>
Servo myservo; // create servo object to control a servo
struct ts t; //déclaration variable t
unsigned long secDepuisMinuit;
int pos = 0; // variable to store the servo position
void setup() { // put your setup code here, to run once:
Wire.begin();
DS3231_init(DS3231_INTCN);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
t.hour=13; // données pour mettre à l'heure l'horloge
t.min=30;
t.sec=00;
t.mday=30;
t.mon=8;
t.year=2023;
DS3231_set(t); // mise à l'heure de l'horloge
}
void loop() { // put your main code here, to run repeatedly:
DS3231_get(&t);
secDepuisMinuit = t.hour * 3600ul + t.min * 60ul + t.sec;
if (secDepuisMinuit > 48700 && secDepuisMinuit < 48760) {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
if (secDepuisMinuit > 48850 && secDepuisMinuit < 48910) {
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
Entre 48700 à 48760, le servo moteur tourne de 0 à 180°, puis de 48850 à 48910 il tourne de 180° à 0.
J'ai observé qui effectuait ce mouvement en continu
Je ne suis pas sûr, de bien comprendre ta réponse.
Ton code correspond bien à faire tourner le servo entre de 0 à 180 en "continu" entre 48700 et 48760.
si on reprendre ce que tu as codé.
-Il est 48700, tu rentre dans le if secDepuisMinuit > 48700 && secDepuisMinuit < 48760
-ton for va faire tourner le servo de 0 à 180° par pas de 1° toutes les 15ms.
A la fin du for il doit être dans les 48700+180*0.015 = 48702.2 (en faite un peu plus car tu ne fait pas que attendre et la fonction write prend un certain temps.)
ta fonction loop, prend fin et elle est rappeler par l'environnement Arduino on va arrondir à 48703.
donc comme tu demande de faire tourner ton servo entre 48700 et 48760, cela va bien être exécuté en boucle.
Si tu veux le faire une seul fois, il faudrait avoir un booléen qui indique que tu l'a déjà fait et qu'il ne faut pas le faire.
il faudra que tu réinitialise le booléen des que tu sera sortie de la plage horaire.
Tu devrais avoir quelque chose comme ça dans loop():
On a 2 booléens en variables globales nommées : tourne = False 1ereFois = True
si on est supérieur à l'heure de fin et que (tourne == True ou 1ereFois == True)
positionner le booléen tourne à False
positionner le booléen 1ereFois à False
faire tourner le servo dans un sens
si on est supérieur à l'heure de début et tourne == False
positionner le booléen tourne à True
positionner le booléen 1ereFois à False
faire tourner le servo dans l'autre sens
Le booléen 1ereFois permet de forcer le cycle si le programme démarre et que l'heure est supérieure à l'heure de fin.
L'état des 2 booléen et l'ordre des tests permet, il me semble, de couvrir tous les cas de figure quelque soit l'heure de démarrage.
A noter: Il ne faut pas laisser la mise à l'heure dans le setup() sinon tu vas repartir avec une mauvaise heure à chaque mise sous tension.
En principe on ne fait la mise à l'heure qu'une seule fois, ensuite la batterie de sauvegarde (ou la pile) va permettre au DS3231 de continuer à maintenir l'heure à jour même si l'Arduino est hors tension.
Je vous remercie pour vos réponses. A bien y réfléchir je n'ai pas besoin de la boucle for pour faire tourner le servo moteur. J'utilise l'instruction myservo.write(0) et myservo.write(180) et ça règle le problème de la répétition avec la boucle for