Horloge et servo moteur

Bonjour,

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
  }
}

C'est-à-dire?

Ton programme semble passer en boucle de 0 à 180° de 48700 à 48760
cela est-il vraiment ce que tu veux?

Et de même de 180 à 0°

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.

Bonjour,

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

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.