[résolu] suite de IF

Bonjour, je rencontre des soucis avec une suite de conditionsdans cette partie de code :

    case 4: //avril
    if ((hour>=6) && (minute >0))
    {
      if (dayOfMonth < 16 )
      {
        Serial.print("ok date<16");
        if (hour<21)
          { HeureOuverture= 1;
          }
     ;}
    else if ((hour<21) && (minute<30))
      {
        Serial.print("ok date >16");
        HeureOuverture=1; 
      }
    else HeureOuverture=0;
    ;}
    break;

je souhaite gérer la fermeture de mon poulailler à différents horaire en fonction du mois et la quinzaine du mois en cours pour compenser la durée de la journée, surtout qu'en ce moment les jours rallongent fort et ca se ressent fort pour les poules, hier si je n'avais pas surveillé j'en avais une qui dormait dehors :slight_smile: , bref le numéro de jour est bon, on est bien le 24 mais je ne recois aucun message Ok date sur le moniteur série et le bool HeureOuverture qui servira a terme à ouvrir ou fermer la porte ne change pas d'état :frowning:

PS: Il y à un soucis avec les minutes visiblement, il est entre 18h et 18h30 et la variable est passée à 1 ... so strange :slight_smile:

Merci de vos éclaircissement :slight_smile:

bonjour
je ne comprends pas que vous ne donniez que des bouts de code

de ce que l'on peut comprendre des ce bout de code:
la 1ere quinzaine la porte doit etre ouverte à partir de 6h et 1 mn le matin
la deuxième quinzaine, la porte doit etre fermée après 20h et 31 minutes
mais rien ne précise en 1erer quinzaine, l'heure à laquelle la porte doit être fermée
ni en 2 ème quinzaine à quelle heure la porte doit être ouverte.

mais n'avoir que des bouts de code...........................

je viens de reprendre mon équation en fonction de ce que tu m'as donné, en y indiquant du mieux possible, toutes les équations possible, mais je ne comprend pas, il met plein d'erreur. J'ai décidément beaucoup de mal à mettre par écrit ce que j'ai dans la tête :).

code complet :

/****************************************
************** DS3231 DEBUT ************
****************************************/
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

/****************************************
************** DS3231 FIN **************
****************************************/
#include  <Servo.h> //bibliothèque gestion servomoteur
#include <JeeLib.h>

// init chien de garde
ISR(WDT_vect) { Sleepy::watchdogEvent(); }


//variable pour utiliser le test au lieu des horaires programmés(réglage=1)
boolean test = 0;
// définition des positions de la porte.
const int Porte_Ouverte = 160 ; // valeur du servo porte ouverte
const int Porte_Fermee = 10 ; // valeur du servo porte ouverte
boolean HeureOuverture = false ;
byte Heure_nuit = 0;
byte Minute_nuit = 0;
byte Heure_jour = 0;
byte Minute_jour = 0;
//création d'un nouveau servomoteur
Servo monServo;

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void setup(){
    
  //on déclare l'entrée du servo connectée sur la broche 3 (D3 (PWM))
  monServo.attach(3);

  /****************************************
  ************** DS3231 DEBUT ************
  ****************************************/
  
   Wire.begin();
  Serial.begin(9600);
  
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

/****************************************
************** DS3231 FIN **************
****************************************/

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

// programme de positionnement du servo en fonction de l'heure
void AutoServo() {

/****************************************
************** DS3231 DEBUT ************
****************************************/
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);

  /****************************************
  ************** DS3231 FIN **************
  ****************************************/
  Serial.println("***");
  Serial.print(" mois: ");
  Serial.println(month);
  Serial.print("heure = ");
  Serial.print(hour);
  Serial.print(" : ");
  Serial.println(minute);
  Serial.print("porte ouverte : ");
  Serial.println(HeureOuverture);
  switch (month){
    case 1: // Janvier
    if ((hour>=8) &&( hour <18)) { 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 2: //février
    if ((hour>=7) && (hour <19)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 3: //mars
    if ((hour>=7) && (hour <20)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 4: //avril
    if (dayOfMonth < 16 )
      { 
        if (hour>=6) && (hour<=21)
          {
           HeureOuverture=1; 
          }
        else HeureOuverture=0;        
      
    else if (dayOfMonth >= 16 )
      {
        if (hour>=6) && ((hour<=21) && (minute < 30))
          {
           HeureOuverture=1; 
          }
        else HeureOuverture=0;
      };}
     break;
    /*$$$$$$$$$$$$$$$*/
    case 5: //mai
    if ((hour>=6) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 6: //juin
    if ((hour>=6) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 7: //juillet
    if ((hour>=6) && (hour <22)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 8: //aout
    if ((hour>=6) && (hour <22)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 9: //septembre
    if ((hour>=6 ) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 10: //octobre
    if ((hour>=7) && (hour <20)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 11: //novembre
    if ((hour>=7) && (hour <19 )) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    /*$$$$$$$$$$$$$$$*/
    case 12: //decembre
    if ((hour>=7 ) && (hour <19)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee); 
    break;
    
  }
if (HeureOuverture) {
  monServo.write(Porte_Ouverte); }
  else monServo.write(Porte_Fermee);
}
  
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void TestServo()
{
        monServo.write(Porte_Ouverte);   
        delay(3000);
        monServo.write(Porte_Fermee); 
        delay(3000);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void loop(){
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  //setDS3231time(30,03,18,2,04,04,16);
  if(test==1) {
    TestServo();}
  else AutoServo();
 Sleepy::loseSomeTime(2000);
 delay(1000);
}

et la partie incriminée :

    case 4: //avril
    if (dayOfMonth < 16 )
      { 
        if (hour>=6) && (hour<=21)
          {
           HeureOuverture=1; 
          }
        else HeureOuverture=0;        
      
    else if (dayOfMonth >= 16 )
      {
        if (hour>=6) && ((hour<=21) && (minute < 30))
          {
           HeureOuverture=1; 
          }
        else HeureOuverture=0;
      };}
     break;

hello

pas testé

/****************************************
************** DS3231 DEBUT ************
****************************************/
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

/****************************************
************** DS3231 FIN **************
****************************************/
#include  <Servo.h> //bibliothèque gestion servomoteur
#include <JeeLib.h>

// init chien de garde
ISR(WDT_vect) { Sleepy::watchdogEvent(); }


//variable pour utiliser le test au lieu des horaires programmés(réglage=1)
boolean test = 0;
// définition des positions de la porte.
const int Porte_Ouverte = 160 ; // valeur du servo porte ouverte
const int Porte_Fermee = 10 ; // valeur du servo porte ouverte
boolean HeureOuverture = false ;
byte Heure_nuit = 0;
byte Minute_nuit = 0;
byte Heure_jour = 0;
byte Minute_jour = 0;
//création d'un nouveau servomoteur
Servo monServo;

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void setup(){
   
  //on déclare l'entrée du servo connectée sur la broche 3 (D3 (PWM))
  monServo.attach(3);

  /****************************************
  ************** DS3231 DEBUT ************
  ****************************************/
 
   Wire.begin();
  Serial.begin(9600);
 
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

/****************************************
************** DS3231 FIN **************
****************************************/

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

// programme de positionnement du servo en fonction de l'heure
void AutoServo() {

/****************************************
************** DS3231 DEBUT ************
****************************************/
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);

  /****************************************
  ************** DS3231 FIN **************
  ****************************************/
  Serial.println("***");
  Serial.print(" mois: ");
  Serial.println(month);
  Serial.print("heure = ");
  Serial.print(hour);
  Serial.print(" : ");
  Serial.println(minute);
  Serial.print("porte ouverte : ");
  Serial.println(HeureOuverture);
  switch (month){
    case 1: // Janvier
    if ((hour>=8) &&( hour <18)) {
    break;
    /*$$$$$$$$$$$$$$$*/
    case 2: //février
    if ((hour>=7) && (hour <19)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 3: //mars
    if ((hour>=7) && (hour <20)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 4: //avril
    if (dayOfMonth < 16 )
      {
        if ((hour>=6) && (hour<=21))
          {
           HeureOuverture=1;
          }
        else {HeureOuverture=0;}       
     }
    else if (dayOfMonth >= 16 )
      {
        if ((hour>=6) && ((hour<=21) && (minute < 30)))
          {
           HeureOuverture=1;
          }
        else HeureOuverture=0;
      }
     break;
    /*$$$$$$$$$$$$$$$*/
    case 5: //mai
    if ((hour>=6) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 6: //juin
    if ((hour>=6) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 7: //juillet
    if ((hour>=6) && (hour <22)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 8: //aout
    if ((hour>=6) && (hour <22)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 9: //septembre
    if ((hour>=6 ) && (hour <21)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 10: //octobre
    if ((hour>=7) && (hour <20)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 11: //novembre
    if ((hour>=7) && (hour <19 )) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
    /*$$$$$$$$$$$$$$$*/
    case 12: //decembre
    if ((hour>=7 ) && (hour <19)) {
      monServo.write(Porte_Ouverte);   
    }
    else monServo.write(Porte_Fermee);
    break;
   
  }
if (HeureOuverture) {
  monServo.write(Porte_Ouverte); }
  else monServo.write(Porte_Fermee);
}
 
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void TestServo()
{
        monServo.write(Porte_Ouverte);   
        delay(3000);
        monServo.write(Porte_Fermee);
        delay(3000);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void loop(){
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  //setDS3231time(30,03,18,2,04,04,16);
  if(test==1) {
    TestServo();}
  else AutoServo();
 Sleepy::loseSomeTime(2000);
 delay(1000);
}

c'est mieux mais j'ai toujours ce soucis qu'il ne prend en compte que les minutes pour l'heure de fin, que je mette 20h ou 21h (pour tester avec l'heure actuelle) ca fait pareil, il ne prend en compte que les minutes :frowning:

j'essaierai demain, mais je pense que ca doit être quelquechose comme ca l'équation, en fait :slight_smile:

if ((hour>=6) && ((hour<21) || (hour=21 && minute < 30)))

hour==21 pas hour=21

ah oui ! je vais avoir du mal à m'y faire à ca :frowning:

sinon je pensais en me levant ce matin (ben oui moi c'est comme ca lol) on doit pouvoir créer un nombre flotant à partir des deux données non ?

genre

float heure = 0.0;

heure = (heure).(minute)

if (heure>6.0) && (heure<21.30)) {....}

pour la comparaison, ca poserait moins de problèmes.

Me trompes je ? :wink:

Très mauvaise idée.
La manière de coder les flottants entraîne des erreurs d'arrondis.
Si tu fais heure = 21.30 tu peut très bien te retrouver avec 21.299999999999 et tu ne trouveras jamais l'égalité avec 21.30 dans un test.
Par contre tu peux très bien faire
heure = 21 * 100 + 30;
En utilisant que des unsigned int cela fonctionnerait.
Mais ton problème actuel n'est pas causé par ça. C'est plutôt lié à la logique des tests.
Je pense que tu devrais commencer par poser clairement en bon français ce que tu veux obtenir et vérifier que la logique des tests est pertinente avant de coder.

Hello,

Cela risque de vite devenir compliqué à maintenir, tous ces tests imbriqués...

Tu pourrais peut-être te simplifier la vie en utilisant un tableau.
Imagine un tableau à 3 colonnes :

N° de jour dans l'année, heure d'ouverture, heure de fermeture.

Chaque ligne correspond à un changement
Exemple : (J'ai repris la formulation des heurs de fdunews)

1er janvier 8h ->18h
001, 0800, 1800

1er février : 7h -> 19h
032, 0700, 1900

1er mars : 7h -> 20h
060, 0700, 2000

1er avril : 6h -> 21h
092, 0600, 2100

16 avril : 6h -> 21h30
107, 0600, 2130

....

Ton tableau ressemblerait à
001, 0800, 1800
032, 0700, 1900
060, 0700, 2000
092, 0600, 2100
107, 0600, 2130
...

Pour retrouver les heures du jour il "suffit" de calculer le numéro du jour dans l'année.
Ensuite, tu parcours ton tableau en remontant (de la dernière ligne vers la première) jusqu'à trouver la ligne dont le N° est inférieur ou égal au N° de jour actuel.
Tu as alors trouvé les heures qui s'appliquent ce jour là...

C'est une solution... il y en a d'autres...
:slight_smile:

Coyotte

Autrement il y a la solution de calculer les heures de lever et de coucher du soleil pour déterminer précisément les moment de fermeture/ouverture.
Là un éphéméride : Calcul éphéméride précis : lever et coucher de soleil - Tutoriels et cours - Arduino Forum
et là la gestion heure d'été/ heure d'hiver: Heure d'été / heure d'hiver automatique avec DS1307 - Français - Arduino Forum
C'est tout automatique après.....

bonsoir, et merci pour toutes ces infos ! pour l'éphéméride et la gestion été/hiver je verrai plus tard, beaucoup de choses à lire et je préfère être en forme pour m'attaquer à ca lol.

J'ai finalement gardé mes équations comme je le pensais, même si j'aime particulièrement la méthode h*100+min , mais j'ai d'autres projets en cours :wink: et j'attend mon imprimante 3D surtout :stuck_out_tongue:

je pensais aussi, dans un autre genre utilisé un API couplé à des modules rf pour la mise à jour de l'heure depuis chez moi :slight_smile: je pense que ca sera intéréssant à dévelloper.

en tout cas encore merci à vous tous !!

Hello

Effectivement le lien donné par fdufnews sur la gestion des heures contient tout ce qu'il y a à savoir, même s'il est un peu ancien (le lien, pas fdufnews :smiley: ).

Pour la gestion de ton DS3231 avec heure d'été / hiver, tu peux sans risque switcher dès à présent sur cette bibliothèque.

Si plus tard tu veux ajouter une mise à l'heure automatique, la synchro DCF77 pourra être une solution (voir ICI)

Pour l'anecdote, je suis justement en phase de rodage d'un automate à base d'arduino, qui tourne en 24/7 avec un DS3231 et un récepteur DCF77.

Et à l'instant, je viens de m'amuser à téléphoner à l'horloge parlante, tout en regardant l'heure HH:MM:SS affichée sur l'écran LCD relié à l'arduino : les deux sont synchronisés pile poil. Le bip de l'horloge parlante est très précisément à l'instant où le chiffre des unités des secondes passe à zéro.
S'il y a un écart, il doit être de moins d'un quart de seconde.

Trop content !

merci pour la librairie, j'ai mis en lien, je regarderai plus tard parceque la carte est chiante à aller démonter lol donc je vais pas me précipiter dessus :stuck_out_tongue:

bonne nuit