Réveil matin, levé de soleil (led) + RTC.

bonjour a tous,

voici donc mon premier post et donc la première fois que je demande de l’aide.
Considérez que je suis un débutant dans le monde de l’arduino donc ma demande va surement vous paraître simple mais la je patauge un peu…
C’est surtout en programmation que je débute.

Le projet:
Je souhaite faire un genre de réveil matin, mais façon levé de soleil avec une lumiere (ici une led) qui va commencer à s’allumer a une heure précise et progressivement jusqu’à atteindre son maxi d’intensité a une heure précise également, puis s’éteindre après un moment.

Matériel:
Arduino uno (bien entendu :slight_smile: )
Un module RTC ZS-042
Une led.

Un peu de blabla:
J’ai pas encore commencé a le coder, pour l’instant je réunis des informations.
A priori je ne rencontrerai pas de problème pour ce qui est de la mise a l’heure du RTC, internet est bourré de tutos a ce sujet…
Allumer une led, je vous rassure… :slight_smile:

Mon problème:
En fait, ce qui me pose problème c’est la commande pour allumer la led en PWM sur plage horaire précise mais sans utiliser le “delay()”.

Je ne sais pas comment le coder mais je cherche un truc du genre
“A 6h40 pin13 0, pin13 <= 255, pin13++, jusqu’a 7h00, puis éteindre a 7h30”. (oui je sais… vous moquez pas…).
N’y a t-il pas un autre moyen que de déclencher un allumage+delay a une heure donnée?
Je ne sais pas suis je suis assez claire en fait…

Jusqu’à présent mes recherches on été infructueuses et je continu, mais toute aide que vous pourrez m’apporter sera précieuse.
je vous remercie d’avance.

Ce n’est pas très compliqué:

Pour une progression lumineuse entre deux points dans le temps:

Vous définissez deux constantes pour

const unsigned int debut = 6 x 60 + 40; // c’est 6h40 du matin - Nb de minutes depuis minuit.
const unsigned int fin = 7 x 60 + 30; // c’est 7h30 du matin - Nb de minutes depuis minuit.

dans la loop() :

unsigned int T,H,M; // unsigned int car on sait que le temps est toujours positif
Demandez à votre RTC l’heure H et les minutes M
Vous calculez T = 60 x H + M; // Nb de minutes depuis minuit.

Il ne reste plus qu’à comparer T à début et fin

Si (T < début) ou (T > fin) alors tout est éteint // le ou logique c’est l’opérateur ||
Sinon // T est alors entre début et fin on allume la LED progressivement
// on veut une valeur qui progresse linéairement en fonction du temps
// Soit résoudre l’équation Luminosité = a x Durée + b
// Durée c’est T-debut, et on connaît 2 points, en effet
// Si T==début on veut être encore une luminosité 0
// si T == fin on veut une luminosité à 255
// je vous laisse résoudre cela pour trouver a et b
// On peut aussi utiliser la fonction map() https://www.arduino.cc/en/Reference/Map
luminosite= map(T-debut, 0, fin-debut,0,255); // arrondi en entier parfois pas assez précis
analogWrite(led, luminosite); // on a notre PWM, bien sûr led est une pin qui supporte le PWM
Fin si

Si vous voulez qu’elle soit son max à 7h et reste allumée jusqu’à 7H30 alors il vous faut une constante de temps supplémentaire

const unsigned int maxL = 7 * 60 + 0; // c’est 7h00du matin - Nb de minutes depuis minuit.

Et faire
Lumière éteinte si T avant début ou après fin
le progression de la lumière si T est entre début et maxL au lieu de début et fin, sur le même principe que ci dessus
Lumière max si T entre maxL et fin

Et voilà à vous de jouer. N’oubliez pas la résistance de limitation de courant dans votre led!!

Exercice supplémentaire: au lieu d’utiliser une équation linéaire y=ax+b pour la luminosité vous pouvez utiliser un polynôme du second degrés y=ax2+bx+c il vous faudra alors 3 valeurs pour trouver à,b,c en résolvante un système de 3 équations à 3 inconnues. Pour cela vous connaissez toujours les points de départ et d’arrivée (x=Début, y=0) et (x=maxL, y=255) il vous suffit de définir quand vous voulez par exemple être à mi-luminosité, par exemple vous pouvez vouloir avoir un allumage lent au départ et qui s’accélère, donc à 75% de (maxL-debut) seulement y=127 (moitié de luminosité au trois quart de la durée d’allumage) ou inversement y=127 pour 25% de (maxL-debut) donc moitié de la luminosité après seulement un quart de la durée d’allumage;

À mon avis avec cette approche vous aurez un meilleur résultat qu’un truc purement linéaire - surtout si vous utilisez non pas juste une led mais une RGB, les 3 pattes ne devant pas alors progresser la même vitesse si vous voulez maintenir une température de couleur sympa;