Bug pour un réveil

#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS3231.h>
#include "pitches.h"

DS3231 clock;
RTCDateTime dt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte cloche[8] = {0b00100, 0b01110, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100};
int HAlarm = 07;
int melody[] = {
  NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6
};
int duration = 500;
void setup()
{
  clock.setDateTime(2014, 4, 13, 19, 21, 00);
  clock.begin();
  lcd.begin(16, 2);
  lcd.createChar(0, cloche);

  clock.setDateTime(2017, 5, 23, 6, 2, 58);

}

void loop()
//clock.dateFormat("d m y H i s", dt);
{
  dt = clock.getDateTime();
  lcd.setCursor(0, 0);
  lcd.print(clock.dateFormat("H:i:s", dt));
  lcd.setCursor(0, 1);
  lcd.print(clock.dateFormat("D d/m/y", dt));
  lcd.setCursor(13, 0);
  lcd.write(byte(0));
  lcd.print(HAlarm);
  lcd.print("H");
  TestAlarm();
}

void TestAlarm()
{
  if (clock.dateFormat("H", dt) == 6)
  {
    if (clock.dateFormat("i", dt) > 2)
    {
      if (clock.dateFormat("i", dt) < 5)
      {
        if (clock.dateFormat("N", dt) < "6")
        {
          Alarm();
        }
      }
    }
  }
}
void Alarm()
{
  for (int thisNote = 0; thisNote < 8; thisNote++)
  {
    tone(7, melody[thisNote], duration);
    delay(1000 / 8);
  }
}

J’ai fait des test et les if du void TestAlarm() ne fonctionne pas.
Je ne trouve pas de solution …

Pourquoi vous réglez deux fois la date/heure dans le setup()? (clock.setDateTime())

Sinon pour votre problème regardez la signature de la fonction appellée:

[color=red][b]char* [/b][/color]dateFormat(const char* dateFormat, RTCDateTime dt);

Et comment vous effectuez le test.... vous voyez le problème ?

(Allez voir cet exemple pour une idée)

J’ai utiliser des Serial.print pour effectuer mon test
il ne m’affiche que des 0 donc les if ne marche pas

#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS3231.h>
#include "pitches.h"

DS3231 clock;
RTCDateTime dt;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte cloche[8] = {0b00100, 0b01110, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100};
int HAlarm = 07;
int melody[] = {
  NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6
};
int duration = 500;
void setup()
{
  clock.setDateTime(2017, 5, 24, 14, 03, 00);
  clock.begin();
  lcd.begin(16, 2);
  lcd.createChar(0, cloche);

  Serial.begin(9600);

}

void loop()
//clock.dateFormat("d m y H i s", dt);
{
  dt = clock.getDateTime();
  lcd.setCursor(0, 0);
  lcd.print(clock.dateFormat("H:i:s", dt));
  lcd.setCursor(0, 1);
  lcd.print(clock.dateFormat("D d/m/y", dt));
  lcd.setCursor(13, 0);
  lcd.write(byte(0));
  lcd.print(HAlarm);
  lcd.print("H");
  TestAlarm();
}

void TestAlarm()
{ Serial.print("0");
  if (clock.dateFormat("H", dt) == 6)
{ Serial.print("1");
  if (clock.dateFormat("i", dt) > 2)
{ Serial.print("2");
  if (clock.dateFormat("i", dt) < 5)
{ Serial.print("3");
  if (clock.dateFormat("N", dt) < "6")
{ Serial.print("4");
          Alarm();
        }
      }
    }
  }
Serial.println();
}
void Alarm()
{
  for (int thisNote = 0; thisNote < 8; thisNote++)
  {
    tone(7, melody[thisNote], duration);
    delay(1000 / 8);
  }
}

Vous n'avez pas bien compris mon point... regardez ce que j'ai mis en rouge (Le type de données retourné par l'appel à votre fonction et ensuite dans le if regardez avec quel type vous effectuez la comparaison.

Pensez vous que comparer un char * et un int va vous donner ce que vous voulez ?

Je comprend le problème,
Quels sont donc les solutions pour résoudre se problème ?

Il suffit de comparer deux entiers... allez voir l'exemple que je vous ai mentionné au post 1.... (l'avez vous fait?)

Oui je l'avais fais mais je ne trouvait pas mon erreur j’utilisais "H" ,dt au lieu de dt.hour

Aussi peux-t’on enregistrer la valeur ISO-8601 (représentation numérique des jours de la semaine
: 1 pour Lundi jusqu’à 7 pour Dimanche) dans une variable ?

Antochall:
Aussi peux-t’on enregistrer la valeur ISO-8601 (représentation numérique des jours de la semaine
: 1 pour Lundi jusqu’à 7 pour Dimanche) dans une variable ?

la structure obtenue en faisant clock.getDateTime(); contient les champs suivants:

 struct RTCDateTime
{
    uint16_t year;
    uint8_t month;
    uint8_t day;
    uint8_t hour;
    uint8_t minute;
    uint8_t second;
    uint8_t dayOfWeek;
    uint32_t unixtime;
};

je pense que ce qui vous intéresse c'est dayOfWeek. Cette variable va de 0 pour Dimanche à 6 pour Samedi donc elles sont toutes bonnes sauf dimanche qui vaut zéro et donc il suffit de faire un truc du genre

DS3231 clock;
RTCDateTime dt;
uint8_t ISO8601_jour;

...
dt = clock.getDateTime();
ISO8601_jour = dt.dayOfWeek;
if (ISO8601_jour == 0) ISO8601_jour = 7;

Notez cependant que dans de nombreux langages de programmation, les outils comptent les jours de la semaine en partant du dimanche (valeur zéro), puis 1 pour le lundi, jusqu'à 6 pour le samedi - comme le fait votre DS3231. Et dans certains pays, la semaine commence le dimanche....

En pratique, mathématiquement avec un modulo 7, que l'on ait 0 ou 7, ça revient au même dans les tests et donc on conserve bien souvent la notation non iso.

Merci beaucoup pour ton aide J-M-L :wink: .
Je met le code final de mon réveil pour ceux qui veulent l’utiliser ou s’en inspirer.

#include <LiquidCrystal.h>
#include <Wire.h>
#include <DS3231.h>
#include "pitches.h"

DS3231 clock;
RTCDateTime dt;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int HAlarm = 07;
byte cloche[8] = {0b00100, 0b01110, 0b01110, 0b01110, 0b01110, 0b11111, 0b00000, 0b00100};

int melody[] = { NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6 };
int duration = 500;

void setup()
{
  clock.begin();
  lcd.begin(16, 2);
  lcd.createChar(0, cloche);
}

void loop()
{
  dt = clock.getDateTime();
  lcd.setCursor(0, 0);
  lcd.print(clock.dateFormat("H:i:s", dt));
  lcd.setCursor(0, 1);
  lcd.print(clock.dateFormat("D d/m/y", dt));
  lcd.setCursor(13, 0);
  lcd.write(byte(0));
  lcd.print(HAlarm);
  lcd.print("H");
  if (dt.dayOfWeek > 0 and dt.dayOfWeek < 7)
  {
    if (dt.hour == 6 and dt.minute == 30 and dt.second <= 10)
    {
      Alarm();
    }
  }
}
void Alarm()
{
  for (int Note = 0; Note < 8; Note++)
  {
    tone(7, melody[Note], duration);
    delay(1000 / 8);
  }
}

Vous vous réveillez tous les jours à 6H30 sauf Le dimanche ?
(Pas besoin de tester dt.dayOfWeek < 7 c’est toujours le cas (entre 0 et 6))