Projet " boite a heures"

Bonjour a tous.

Deja une petite présentation : je suis Steve 33 ans et j'aime bien bidouiller dans le domaine electrique et electronique.

Je vous explique mon projet:
Ma fille de 5ans ne sais pas encore lire l'heure et avant la V1 de mon projet la petite se levais parfois a 6h30/7h et nous demandais si c'etait l'heure de se lever.
J'ai alors fabriquer la V1 de sa boite a heure , en gros avec mon imprimante 3D j'ai fabriquer un boitier avec 3 symbole ( dodo , jeu et lever ) avec une LED pour chaque symbole.

Le projet fini a été un vrai succès et nous avons retrouver un cycle de sommeil correct.

Mais voila , je voudrais pousser le projet plus loin afin de pouvoir régler chaque LED grâce a des boutons et un afficheur , car la problématique est que j'ai juste utiliser des delays pour le led et si nous rentrons de soirée tard et bien la petite va continuer a se lever quand la led lever s'allume et du coup elle manque de sommeil ( et nous aussi )

Donc si vous avez eu le courage de lire jusque la ( déjà bravo ) j'ai besoin de votre aide.
Je veux procéder par étape vue mon niveau en code:

  • récupérer l'heure actuel avec un module RTC ( déjà fait )
  • réussir a allumer une led selon l'heure ( pas réussi )
  • réussir a changer l'heure de chaque led avec des boutons ( pas encore essayer )
  • réussir a afficher et intéragir avec les boutons sur l'ecran ( pas encore essayer )

Pour le moment ma problématique est de reussir a allumer une led a l'heure voulu avec je pense une fonction IF mais malheureusement je bloque malgré le nombre incalculable de sujet que j'ai lu.

Voici le debut de mon code:

#include "RTClib.h"
#include "Wire.h"


RTC_DS1307 RTC;




void setup () {
  pinMode (7, OUTPUT);
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
digitalWrite (7, HIGH);
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}


void loop () {


    
   
    DateTime now = RTC.now();


   


    digitalWrite(13,LOW);
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
   
    delay(1000);
}

 [Code/]
De plus je ne suis pas sur que mon RTC soit vraiment a l'heure parce que lorsque j'ouvre le moniteur j'ai ceci qui s'affiche : 17:12:43.528 -> 2016/12/3 8:33:59
Alors il est bien 17:12 mais la date est fausse ainsi que la deuxième heure afficher ( 8:33 ).

Par avance merci de votre retour , je ne veux pas un code tout fait cela n'a aucun intérêt juste des pistes pour que je comprenne moi meme.

Pour tester une heure il est plus facile de transformer l'heure en un chiffre plus facile à manipuler. Par exemple pour 9 heures 27 tu prends 927, pour 15 heures 56 tu prends 1556. Ça permet de faire des comparaisons plus facilement.

Pour mettre ta RTC à l'heure, il y a souvent un sketch dans les exemples de la bibliothèque que tu utilises. La pile bouton est là pour que la RTC conserve ce réglage par la suite.

Maintenant, tu dois éditer ton message et mettre ton code entre balises CODE, comme expliqué dans les messages épinglés en haut du forum.

Merci beaucoup pour ta réponse.
J'ai modifier mon 1er message afin que se soit lisible.

Pour en revenir au heure j'avais vue cette technique mais je comprend pas encore assez le langue C pour savoir comment l'intégrer a mon projet.

un simple IF RTC.now < 8h ==13 LOW ? ou c'est plus complexe que ca ?

Oui, visiblement tu ne connais pas la syntaxe de programmation en C. Il faut que tu commences par l'apprendre, tu peux trouver des tutos sur le net.

sharkou:
un simple IF RTC.now < 8h ==13 LOW ? ou c'est plus complexe que ca ?

Bonjour,

Non ce n'est pas plus complexe que ça si tu suis le conseil de lesept et que tu suis la syntaxe du C++

 unsigned int h100=100*now.hour()+now.minute();
  // allume la led entre 8h13 et 8h15
  if (h100>=813 && h100<=815)
    digitalWrite(7,HIGH);
  else
    digitalWrite(7,LOW);

Bonjour a tous,

superbe idee et tu as l'air de vouloir mettre la main a la pate. Bravo.

Si je devais le faire, j'utiliserais 4 encodeurs BCD pour afficher l'heure d'un evenement puis 2 boutons poussoirs en serie pour encoder cette heure. 2 poussoirs en serie pour eviter toute fausse manoeuvre de ta petite fille.

Pour le moment pas besoin de t'occuper du jour de la semaine, de la date etc.

C'est facile a coder mais il te faudra un Mega sinon tu vas manquer rapidement de pins I/O.

Quand tu seras bien familiarise avec la programmation, tu remplaces tes 3 leds par un petit affichage matriciel qui te permettra de voir tous tes parametres. A ce moment tu pourras programmer un lever plus tardif le dimanche etc. A la place des leds, ta petite verra un rectangle colore. Tu peux varier la luminosite en fonction de la lumiere ambiante etc etc.

Tu as juste besoin :

  • un Mega
  • 4 encodeurs (sur Aliexpress chercher "bcd interrupteur"
  • une poignee de poussoirs (il en faut 2 par fonction a encoder)
  • une alimentation 5V.

Bon courage et bon dimanche.

Jacques

Salut.

J'ai fait le même type de veilleuse pour mon fils (et ma fille par la suite).
Un cube imprimé 3D avec un panneau de led adressable type WS2812B équipé d'un capteur de son : mon fils nous réveillait la nuit pour trouver son doudou "perdu" à 10cm de sa tête :). Et pareil trop tôt le matin !

La 1ere fonction servait à détecter un claquement de main et d'allumer le panneau pdt 30 sec en s'éteignent progressivement . Pour lui permettre de retrouver doudou.

La 2ième il y a un minuteur lumineux fait par le tour du panneau : en gros tous les 15min j'éteins une led et quand elles sont toutes éteintes ils peuvent se lever! Avec un changement de couleur du rouge au vert en passant par le bleu..Ca lui a permis d'apprendre les couleurs.

Faudrait que je partage ce projet
:wink:

Vos idées son vraiment bonne mais encore trop compliqué pour moi et je pourrais envisager des projets similaire quand je serai un peu plus a l'aise.

Voici mon code actuel :

#include "RTClib.h"
#include "Wire.h"

RTC_DS1307 RTC;


void setup () {

    

  pinMode (7, OUTPUT);
  pinMode (6,OUTPUT);
  pinMode (5, OUTPUT);
  
    Serial.begin(57600);
    Wire.begin();
    RTC.begin();
digitalWrite (7, HIGH);
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {

    

    
    
    
    DateTime now = RTC.now();

   

   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
   
    delay(1000);

       unsigned int h100=100*now.hour()+now.minute();
  
  if (h100>=500 && h100<=510)
    digitalWrite(7,HIGH);
  else
    digitalWrite(7,LOW);
     if (h100>=510 && h100<=520)
    digitalWrite(6,HIGH);
  else
    digitalWrite(6,LOW);
     if (h100>=520 && h100<=5300)
    digitalWrite(5,HIGH);
  else
    digitalWrite(5,LOW);
}

Mais le problème est bien le RTC qui ne fonctionne pas comme je le voudrais.

   Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));

J'avais cru comprendre que cette fonction permettait de récupérer l'heure de la compilation pour mettre a jour le RTC , mais cela ne fonctionne pas, pourtant dans le moniteur j'ai marquer ceci : 13:53:42.594 -> 2016/12/4 5:14:52

Il y a surement quelque chose que je comprend pas mais quoi :o :confused:

Essaye de remplacer ces lignes :

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }

par

    RTC.adjust(DateTime(__DATE__, __TIME__));

Merci , mais j'ai toujours le même soucis : 15:03:02.850 -> 2016/12/4 6:24:13

Essaye :

    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Sinon, en mettant les valeurs en dur :

    rtc.adjust(DateTime(2020, 10, 18, 15, 23, 0));

Au passage tu as mis 5300 au lieu de 530 dans ton dernier test

Avec le 1er code j'ai se message d'erreur :

D:\arduino\sketch_oct15c\sketch_oct15c.ino: In function 'void setup()':
sketch_oct15c:22:4: error: 'rtc' was not declared in this scope
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    ^~~
D:\arduino\sketch_oct15c\sketch_oct15c.ino:22:4: note: suggested alternative: 'getc'
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    ^~~
    getc
exit status 1
'rtc' was not declared in this scope

Et avec le deuxième code :

D:\arduino\sketch_oct15c\sketch_oct15c.ino: In function 'void setup()':
sketch_oct15c:22:3: error: 'rtc' was not declared in this scope
   rtc.adjust(DateTime(2020, 10, 18, 15, 43, 0));
   ^~~
D:\arduino\sketch_oct15c\sketch_oct15c.ino:22:3: note: suggested alternative: 'getc'
   rtc.adjust(DateTime(2020, 10, 18, 15, 43, 0));
   ^~~
   getc
exit status 1
'rtc' was not declared in this scope

Bien vue pour l'erreur de tempo , c'etait pour faire des essaies avec des leds a la va-vite , je vais quand même pas faire lever ma fille a 5h30 du mat :smiley:

Désolé, c'est RTC en majuscules

Oui , j'etait entrain de répondre justement.
Malheureusement toujours le même problème dans le moniteur.

Même si tu mets les valeurs en dur ?

RTC.adjust(DateTime(2020, 10, 18, 16, 1, 0));

Qu'est-ce qui s'affiche dans la console ?

As-tu testé la pile bouton ?

Essaye de remplacer

RTC.begin();

par

  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

Avec le code

RTC.adjust(DateTime(2020, 10, 18, 16, 1, 0));

16:46:58.676 -> 2016/12/4 8:8:8
16:46:59.660 -> 2016/12/4 8:8:9
16:47:00.694 -> 2016/12/4 8:8:10
16:47:01.675 -> 2016/12/4 8:8:11
16:47:02.707 -> 2016/12/4 8:8:12
16:47:03.699 -> 2016/12/4 8:8:13
16:47:04.680 -> 2016/12/4 8:8:14
16:47:05.668 -> 2016/12/4 8:8:15
16:47:06.705 -> 2016/12/4 8:8:16
16:47:07.704 -> 2016/12/4 8:8:17

avec le code

[ltr][color=#222222][code]  if (! RTC.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    abort();
  }

[/color][/ltr]
[/code]

16:48:22.635 -> 2016/12/4 8:9:32
16:48:23.666 -> 2016/12/4 8:9:33
16:48:24.651 -> 2016/12/4 8:9:34
16:48:25.645 -> 2016/12/4 8:9:35
16:48:26.677 -> 2016/12/4 8:9:36
16:48:27.657 -> 2016/12/4 8:9:37
16:48:28.646 -> 2016/12/4 8:9:38
16:48:29.680 -> 2016/12/4 8:9:39
16:48:30.664 -> 2016/12/4 8:9:40

La pile est neuve

Etonnant ! As-tu essayé les exemples de la bibliothèque, par exemple celui-ci?

Alors avec le code brute j'ai ça dans le moniteur :

18:39:34.563 -> 2016/12/4 (Sunday) 10:0:44
18:39:34.563 ->  since midnight 1/1/1970 = 1480845644s = 17139d
18:39:34.563 ->  now + 7d + 12h + 30m + 6s: 2016/12/11 22:30:50
18:39:34.563 ->

et ci je change les valeurs par :

rtc.adjust(DateTime(F(2020, 10, 18, 18, 40, 00));

j'ai ça comme erreur :

sketch_oct18a:24:51: error: macro "F" passed 6 arguments, but takes just 1
     rtc.adjust(DateTime(F(2020, 10, 18, 18, 40, 00));
                                                   ^
exit status 1
macro "F" passed 6 arguments, but takes just 1

RTC en majuscule et pas de F

Ta RTC semble bloquée au 4 décembre 2016. C'est bizarre.

j'ai essayer ça

   RTC.adjust(DateTime((2020, 10, 18 ,19, 37, 00));

et erreur :

C:\Users\steve\AppData\Local\Temp\arduino_modified_sketch_368356\sketch_oct18a.ino: In function 'void setup()':
sketch_oct18a:24:4: error: 'RTC' was not declared in this scope
    RTC.adjust(DateTime((2020, 10, 18 ,19, 37, 00));
    ^~~
sketch_oct18a:24:51: error: expected ')' before ';' token
    RTC.adjust(DateTime((2020, 10, 18 ,19, 37, 00));
                                                   ^
exit status 1
'RTC' was not declared in this scope

Après j'avoue que j'ai acheter mon RTC chez un revendeur ou j'ai de moins en moins confiance ( arduino de contre facon , prix exorbitant, etc...)