Programmer en mois ds3231

Bonjour à tous,

Je cherche a programmer des actions en fonctions des saisons. J'ai écrit un premier programme dans lequel j'ai mis la condition if() pour chaque mois. Ce programme ne fonctionne pas selon les horaires programmées. J'ai modifié le programme en deux parties hiver/été. Pensez vous que ce code soit fiable dans la durée ?

    #include <Wire.h>
    #include <ds3231.h>
     
    struct ts t; //déclaration variable t 
    unsigned long secDepuisMinuit;
     
    void setup() {
      
    Wire.begin();
    //DS3231_init(DS3231_INTCN);
     
    //t.hour=9; // données pour mettre à l'heure l'horloge
    //t.min=55;
    //t.sec=0;
    //t.mday=14;
    //t.mon=12;
    //t.year=2023;
     
    //DS3231_set(t); // mise à l'heure de l'horloge
      
      //ouvrir la porte du poulailler au demarrage, le verin sort
      
      digitalWrite(4, HIGH); 
      digitalWrite(3, LOW);   
    
      delay(20000);

      digitalWrite(4, LOW);
      digitalWrite(3, LOW);
    }
     
void loop() {
      // put your main code here, to run repeatedly:
    DS3231_get(&t);
    secDepuisMinuit = t.hour * 3600ul + t.min * 60ul + t.sec;


  if (t.mon >= 5 && t.mon <= 9 ){
       
       if (secDepuisMinuit > 21600 && secDepuisMinuit < 21660) { //06h00 / ouvrir - le verin sort
            digitalWrite(4, HIGH); 
            digitalWrite(3, LOW);   
    
            delay(20000);

            digitalWrite(4, LOW);
            digitalWrite(3, LOW);
            }
      
      
       if (secDepuisMinuit > 75600 && secDepuisMinuit < 75660) { //21h00 / fermer - le verin rentre
            
            digitalWrite(4, LOW); 
            digitalWrite(3, HIGH);   
    
            delay(20000);

            digitalWrite(3, LOW);
            digitalWrite(4, LOW);
            }
      
 }
  
      else {
           
        if (secDepuisMinuit > 25200 && secDepuisMinuit < 25260) { //07h00 / ouvrir - le verin sort
            
            digitalWrite(4, HIGH); 
            digitalWrite(3, LOW);   
    
            delay(20000);

            digitalWrite(4, LOW);
            digitalWrite(3, LOW);
         }
      
      
        if (secDepuisMinuit > 68400 && secDepuisMinuit < 68460) { //19h00 / fermer - le verin rentre
            
            digitalWrite(4, LOW); 
            digitalWrite(3, HIGH);   
    
            delay(20000);

            digitalWrite(3, LOW);
            digitalWrite(4, LOW);
            }
    
      }
  
    
 }

Il est toujours au programme de l'UE de supprimer le double horaire.

Le covid est passé par là
La guerre en Ukraine
La guerre en Palestine
Que des problèmes bien plus importants à tenter de régler.

Quel horaire garder :
hiver,
été,
plusieurs horaires en UE ou un seul ?

Quand cela aura-t-il lieu ?

Sachant que la décision doit être prise deux années avant son application (horaires des avions, des trains, etc) je pense que ton programme a quelques années de fonctionnement devant lui.

Ton if teste une tranche de temps de 60 secondes.
Tu mets une temporisation de 20 secondes dans la partie de code que tu fais exécuter si la condition est remplis.
Donc:

  1. tu entres dans le if
  2. tu actives le vérin pendant 20 secondes
  3. tu sors du if
  4. loop() est exécutée quelques centièmes de seconde plus tard la condition dans le if est toujours vraie, tu ré exécutes les pas 2 et 3 et cela va se produire 2 ou 3 fois suivant la précision du delay().
    J'espère que ton vérin a un fin de course!!
    Travailler en secondes alors que la RTC te donnes heures, minutes et secondes c'est un peu masochiste mais bon ce n'est pas un problème.
    Pour ce qui est de la précision, la DS3231 est précise elle ne devrait pas beaucoup dériver (quleques secondes par an si ma mémoire est bonne). Donc pas de soucis de ce coté.

Bonjour,
Je ne comprends pas ce qu'il se passe.. J'ai reprogrammé l'horloge en changeant le mois de novembre pour celui de juin. Le programme loop est resté identique. Le vérin a fonctionné aux horaires d'hiver (la boucle else aux horaires 7h - 19h) entre novembre et avril mais ne fonctionne plus dans la boucle if (horaires 6h - 21h) entre mai et septembre. Y a t-il un défaut qui ne permet pas au programme de s’exécuter ?
<void setup() {

Wire.begin();
DS3231_init(DS3231_INTCN);
 
t.hour=19; // données pour mettre à l'heure l'horloge
t.min=8;
t.sec=0;
t.mday=14;
t.mon=6;
t.year=2023;
 
DS3231_set(t); // mise à l'heure de l'horloge
  
  //ouvrir la porte du poulailler au demarrage, le verin sort
  
  digitalWrite(4, HIGH); 
  digitalWrite(3, LOW);   

  delay(20000);

  digitalWrite(4, LOW);
  digitalWrite(3, LOW);
}/>

Vous n'avez pas une petite idée ? le code me semble correct.. s'agit-il de l'horloge ? de la structure du programme ?
Joyeux noël !

pour tester ton prog, tu peux mettre en commentaire la ligne
DS3231_get(&t);
En tête tu auras pris soin de préparer la variable t à ce que tu veux.
Ainsi tu t'affranchis de l'horloge RTC.

mon est bien un membre de la structure ts. Ce ne serait pas month par hasard.
Quelle librairie as-tu utilisée. Il y a pas mal d'homonymes. Donne un lien vers cette librairie.

Je dois écrire
//DS3231_get(&t);
Je ne sais pas comment préparer la variable (je suis au niveau débutant)



J'ai ces deux librairies installés.
J'ai fait un essai avec month au lieu de mon
Le code ne reconnait pas cette appellation
https://github.com/NorthernWidget/DS3231

t.hour=19; 
t.min=8;
t.sec=0;
t.mday=14;
t.mon=6;
t.year=2023;

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