Heure - module RTC DS1302 - actions à heure précise

Bonjour à tous !

Je viens solliciter votre aide dans le cadre d'un projet de fin d'études.
Je suis débutant en programmation Arduino et en électronique.
J'ai un Arduino Uno et un circuit RTC basé sur le DS1302.

J'ai déjà réussi à suivre ce tuto : Arduino Playground - DS1302
La mise à l'heure ne m'a pas posé de problèmes, mais :

J'aimerais maintenant pouvoir allumer une led quand les secondes sont à 30 par exemple.
Après avoir étudié un peu le code en lui même, je crois comprendre qu'il utilise des registres?!

Pouvez-vous m'indiquer comment récupérer la valeur des secondes et m'expliquer cette histoire de registres s'il vous plaît?

J'ai essayé en bidouillant avec des valeurs présentes dans la loop sans succès, je ne sais pas trop quoi manipuler.

Merci et bonne soirée ! =)

Salut,

Il existe une librairie qui facilite l'utilisation du DS1302, comme ça tu récupère les secondes, puis avec un petit test qui allume la LED quand la variable secondes = 30.

Par contre si cela revient toute les 30 s , sans tenir compte de l'heure ou des min, le plus simple est de passer par l'utilisation de millis().

@+

Même s'il existe des bibliothèques très utiles la lecture de leur code ne sera réellement utile que si tu lis aussi la datasheet du DS1302.

Je ne préjuge pas de la qualité des bibliothèques existantes, je ne les connais pas, mais ce ne serait pas la première fois qu'une bibliothèque sous utilise les capacités d'un composant tout simplement parce que l'auteur de la bibliothèque n'a eu besoin de certaines fonctions qu'il a jugé inutiles pour ses besoins.

Une bibliothèque c'est souvent au départ une réalisation pour des besoins personnels.
L'auteur est bien serviable de la rendre publique.

D'accord, et dans le code du lien que j'ai mis, quel élément dois-je utiliser pour récupérer la valeur des secondes par exemple?

Dans mon cas, l'action doit être déclenchée à heures et minutes précises.

void loop()
{
  ds1302_struct rtc;
  char buffer[80];     // the code uses 70 characters.

  // Read all clock data at once (burst mode).
  DS1302_clock_burst_read( (uint8_t *) &rtc);

  sprintf( buffer, "Time = %02d:%02d:%02d, ", \
    bcd2bin( rtc.h24.Hour10, rtc.h24.Hour), \
    bcd2bin( rtc.Minutes10, rtc.Minutes), \
    bcd2bin( rtc.Seconds10, rtc.Seconds));
  Serial.print(buffer);

  sprintf(buffer, "Date(day of month) = %d, Month = %d, " \
    "Day(day of week) = %d, Year = %d", \
    bcd2bin( rtc.Date10, rtc.Date), \
    bcd2bin( rtc.Month10, rtc.Month), \
    rtc.Day, \
    2000 + bcd2bin( rtc.Year10, rtc.Year));
  Serial.println( buffer);
 
 
 delay(5000);
  }

Chris2206:
D'accord, et dans le code du lien que j'ai mis, quel élément dois-je utiliser pour récupérer la valeur des secondes par exemple?

Dans mon cas, l'action doit être déclenchée à heures et minutes précises.

void loop()

{
 ds1302_struct rtc;
 char buffer[80];     // the code uses 70 characters.

// Read all clock data at once (burst mode).
 DS1302_clock_burst_read( (uint8_t *) &rtc);

sprintf( buffer, "Time = %02d:%02d:%02d, ",
   bcd2bin( rtc.h24.Hour10, rtc.h24.Hour),
   bcd2bin( rtc.Minutes10, rtc.Minutes),
   bcd2bin( rtc.Seconds10, rtc.Seconds));
 Serial.print(buffer);

sprintf(buffer, "Date(day of month) = %d, Month = %d, "
   "Day(day of week) = %d, Year = %d",
   bcd2bin( rtc.Date10, rtc.Date),
   bcd2bin( rtc.Month10, rtc.Month),
   rtc.Day,
   2000 + bcd2bin( rtc.Year10, rtc.Year));
 Serial.println( buffer);

delay(5000);
 }

bonsoir
Tu ne peux pas esperer recuperer et donc traiter toutes les secondes en introduisant un delay(5000)

Ah oui en effet.
En fait, mon projet et de faire tourner un moteur jusqu'à ce qu'à ce que la lecture d'un capteur soit à 150 par exemple.

Je voudrais lancer cette opération à 9h30 et à 18:30.
Donc le delay doit forcément être de 1000ms?
Car l'opération dure forcément plus dans mon cas.

Chris2206:
Ah oui en effet.
En fait, mon projet et de faire tourner un moteur jusqu'à ce qu'à ce que la lecture d'un capteur soit à 150 par exemple.

Je voudrais lancer cette opération à 9h30 et à 18:30.
Donc le delay doit forcément être de 1000ms?
Car l'opération dure forcément plus dans mon cas.

déjà utiliser la fonction delay() , c'est bloquant
ensuite il faut lire au moins une fois par seconde la RTC pour etre sur de ne pas "sauter" une seconde
donc la routine de lecture doit se faire imperativement à une frequence plus elevée .

Ok donc techniquement, est-ce que je peux lancer un cycle de rotation d'un moteur qui dure 10 secondes à 9:30 et à 18:30?

Chris2206:
Ok donc techniquement, est-ce que je peux lancer un cycle de rotation d'un moteur qui dure 10 secondes à 9:30 et à 18:30?

oui , dans la mesure où tu es sur et certain de lire 9h30m00s et 9h30m11s (idem pour 18h30)

Ok sinon j'imagine qu'on peut encadrer le RTC, si on est entre 9h30m00s et 9h30m59s, alors on lance le cycle.

La fonction millis() permet d'éffectuer une action pendant un certain temps alors que le delay sert à attendre une autre action, c'est ça?

Chris2206:
Ok sinon j'imagine qu'on peut encadrer le RTC, si on est entre 9h30m00s et 9h30m59s, alors on lance le cycle.

La fonction millis() permet d'éffectuer une action pendant un certain temps alors que le delay sert à attendre une autre action, c'est ça?

voilà , c'est ça

D'accord, merci =)

J'ai réussi à utiliser les éléments du programme pour bidouiller des actions à des heures précises.
Par contre, je n'arrive pas à utiliser la fonction millis.

Par contre, j'ai des problèmes avec la fonction millis.
L'heure du RTC doit tourner avec un delay ou millis?
Car dans le programme cité plus haut, il y a un delay de 1s dans la loop qui sert à afficher l'heure dans la voie série.
Est-ce qu'il faut le virer pour pouvoir allumer une led pendant 10 secondes quand il est 12h00min par exemple?

Dans quelle mesure je dois utiliser millis? Pour remplacer le delay de la loop ou pour temporiser le clignotement de la led?

Pouvez-vous m'aider avec un croquis de programme s'il vous plaît?