Actionner une sortie apres un delais avec module RTC 1307

Bonjour à tous,

Je débute en programmation et en arduino,

J'utilise un arduino UNO et un module RTC1307 avec la librairie d'adafruit RTClib

Le module fonctionne bien, je recupere mon heure actuelle avec la fonction now.

Je souhaiterais maintenant lorsqu'une entrée est activée, activer une sortie mais plusieurs jour après et là cela se complique ! :confused:

J'ai fait un bout de code ou je souhaite simplement actionner la sortie 10s après l'action sur mon entrée (on verra plus tard pour les jours, chaque choses en son temps)

J'aurais pu utiliser la fonction milli() mais l'objectif final est d'actionner certaines sorties au dela de 60jours d'ou le module RTC.

Cela peut paraitre simple mais je bloque depuis plusieurs jours et je trouve des explications pour actionner à une certaine heure ou date mais pas après un certain temps :frowning:

Merci de cotre aide

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include <RTClib.h>

int entree=8;
int sortie=13;
RTC_DS1307 rtc;
DateTime now;
long temps;
int h;
int m;
int s;
int sapres;

void setup () 
{
  Serial.begin(57600);
   pinMode(sortie,OUTPUT);
  pinMode(entree,INPUT);
  digitalWrite(sortie,LOW);
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning())
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
     rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}

void loop () 
{ 
  if (digitalRead(entree)==HIGH)  //verifie si info sur entrée 8
 {now = rtc.now();
   h = now.hour();      //met l'heure actuelle dans h, m et s
   m = now.minute();
   s = now.second();
    Serial.println("heure");  // verification sur le moniteur serie
   Serial.println(h);
     Serial.println("minute");
   Serial.println(m, DEC);
     Serial.println("seconde");
   Serial.println(s, DEC);
   
    delay(3000);

     sapres = s+10;       // temporisation = temps actuel + 10s
    Serial.println(sapres, DEC);
       if (s = sapres)       // si le temps actuel est egal temporisation
    {digitalWrite(sortie,HIGH);  // actionne sortie 13
   delay(1000);
   }
   else 
   {
    Serial.print("Rien sur l'entrée 8");   // sinon indiquer rien
   }
   }
   }

Il vaut mieux utiliser une horloge RTC de type DS3234 ou DR3231 qui disposent de sorties d'alarmes programmables (qu'on branche ensuite sur une pin d'interruption).

Sinon il faut stocker l'heure courante, calculer l'heure de l'alarme et comparer à chaque itération de loop l'heure donnée par l'horloge RTC à l'heure de l'alarme calculée.

Là où ça se complique c'est que pour un délai de plusieurs jours il faut prévoir que l'alimentation peut être coupée. Bref il est bien plus simple d'utiliser une horloge RTC adaptée au besoin :slight_smile:

Bonjour,

Ça tombe bien j'ai aussi commander une carte DS3231, je viens d'installer la librairie et les exemples mais alors la c'est encore plus floue...pour moi en tout cas !

Quelqu'un connait-il un tuto ou une page qui explique un peu les différentes fonction car quand on débute comme moi pas facile, facile...j' ai cherché mais je trouve pas gd chose !!

Merci encore

Je complète mon message pour plus d'information, au finale je souhaiterai lorsque mon bouton en entrée est activé, enclencher une sortie 8 jours après, puis 20 jours après une autre sortie puis ensuite 90 jours après une dernière sortie. (le bouton reste toujours activés pendant tout ce temps)

Du coup je suis perdu, 1307 ou 3231, cela est-il meme possible ??

Merci encore

oui c'est tout à fait possible avec un DS3231

Il faut d'abord détecter les fronts de ton bouton (mémoriser ses changement d'états).
Sur un front montant (passage de 0 à 1) tu déclenches la programmation de l'alarme (ensuite si le bouton est à 1 tu ne fais rien car tu sais que tu as déjà programmé l'alarme lors du front montant).

niveau programmation alarme je ne connais pas l'API du DS3231 pour faire ça mais en gros tu dois calculer la date de la prochaine alarme (J+8 Jours) et tu la programmes.

Ensuite il faut activer les interruptions sur la PIN qui va bien de l'Arduino (reliée à la pin INT du DS3231).
A la date donnée tu vas avoir une interruption que tu devras traiter pour déclencher les actions qui conviennent.

Parmi ces actions tu devras programmer une nouvelle alarme dans 20J, etc..

Hope this helps :slight_smile:

Merci pour ces infos, je vais continuer à creuser...

Si d'aventure certains d'entre vous ont un petit bout de code je suis preneur !!

Je ne manquerais pas de mettre mon code si j'arrive a qq chose :slight_smile: mais c'est pas facile de trouver de l'information pour un non specialiste comme moi :confused:

Bonjour,

pour rester avec le DS1307 et programmer facilement en fonction de durées
vas voir cette page

http://mchobby.be/wiki/index.php?title=ADF-RTC-DS1307-UTILISER

à la fin...

En utilisant " now.get" qui te donne le nombre de secondes écoulées à l'instant t ,depuis 1/1/2000
(ou "now.secondstime()" dans la librairie d'Adafruit )

ex: si t1-t0 > 5 184 000 ---->60 jours sont passés depuis t0