Bonjour à toutes et tous
J'ai un problème ! (Vous me direz, si je n'en avais pas, je ne serais pas sur ce forum
Je voudrai allumer 3 leds, de manière progressive, à une heure précise et les éteindre, toujours progressivement, à une autre heure, et cela tous les jours.
Je ne vois vraiment pas pourquoi mon programme ne fonctionne pas. Dans l'exemple, je télécharge le programme, par exemple à 17h00 et, immédiatement les 3 leds s'allument, sans progression, alors que le programme indique qu'elles doivent s'allumer à 18h00. Pour l'extinction, il ne semble pas y avoir de problème. J'ai essayé avec une Arduino Uno et une Méga2560. Pour l'heure, j'utilise un DS3231. Quand je télécharge l'heure, sur le port série, elle est normalement prise en compte et affichée.
Si l'un(e) de vous peut m'aider... Car là, je ne comprends plus rien.
Cependant, ça eut marché il y a quelques années !
Merci pour votre aide
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 RTC;
int ledR=8;
int ledV=9;
int ledB=10;
int i = 255 ; //intensité lumineuse (de 0 à 255 pour le maxi)
void setup()
{
Wire.begin();
RTC.begin();
delay(10);
pinMode (ledR, OUTPUT);
pinMode (ledV, OUTPUT);
pinMode (ledB, OUTPUT);
}
void loop()
{
DateTime now = RTC.now();
// 1 ALLUMAGE MATIN
// -----------------------------------------------------------------------------------------------------------------
if (now.hour() >= 18 && now.minute() >= 0 && now.second() >= 0)
{
for (i = 0; i <= 255; i++)
{
analogWrite (ledR,i);
analogWrite (ledV,i);
analogWrite (ledB,i);
delay (155); // 1150 cycles pour atteindre i = 255 ==> +/- = 5" 115 cycles pour +/- 1"
}
while (i=255) // i maximum
{
analogWrite (ledR,i);
analogWrite (ledV,i);
analogWrite (ledB,i);
} }
// 1 EXTINCTION SOIR
// -----------------------------------------------------------------------------------------------------------------
if (now.hour() >= 19 && now.minute() >= 0 && now.second() >= 0)
{
for (i = 255; i >= 0; i--)
{
analogWrite (ledR,i);
analogWrite (ledV,i);
analogWrite (ledB,i);
delay (155); // 1150 cycles pour atteindre i = 255 ==> +/- = 5" 115 cycles pour +/- 1"
}
while (i=255)
{
analogWrite (ledR,i);
analogWrite (ledV,i);
analogWrite (ledB,i);
} } }
Cette rubrique est réservée aux "Réalisations et Projets Finis".
STP utilise le lien "Report to moderator" pour demander au modo de déplacer ton message dans le forum principal.
Merci de vos conseils et réponses. J'ai fait hier immédiatement la demande au modérateur.
Pour la condition ==, si l'heure est plus grande ou plus petite, il ne se passera rien, car la condition veut dire "égal à ". C'est pour cela que j'ai utilisé >=, soit "plus grand ou égal à ".
J'ai supprimer while, mais rien n'y fait.
En relisant ma réponse numéro 4, je dois ajouter qu'il faut utiliser une variable (booléenne a priori) pour garder en mémoire l'état d'allumage des leds et la tester. Si les leds sont déjà allumées, il est inutile de refaire l'allumage. De même pour l'extinction.
Plutôt que de comparer des heures minutes secondes ce qui est source de complexité et d'erreurs, il vaut mieux manipuler des nombres de minutes ou encore mieux des heures sous forme HHMM obtenu par 100*heures+minutes.
Ensuite pour éviter d'almumer ou éteindre progressivement continuellement, il faut mémoriser l'état allumage/extinction.
Ca donne quelquechose comme ça:
const unsigned h100Allumage = 1800;
const unsigned h100Extinction = 1900;
void loop()
{
static enum {ALLUME, ETEINT,INCONNU} etat = INCONNU;
DateTime now = RTC.now();
unsigned h100 = 100 * now.hour() + now.minute();
// 1 ALLUMAGE MATIN
// -----------------------------------------------------------------------------------------------------------------
if (h100 >= h100Allumage && h100 < h100Extinction)
{
if (etat!=ALLUME)
{
for (int i = 0; i <= 255; i++)
{
analogWrite (ledR, i);
analogWrite (ledV, i);
analogWrite (ledB, i);
delay (155); // 1150 cycles pour atteindre i = 255 ==> +/- = 5" 115 cycles pour +/- 1"
}
etat=ALLUME;
}
}
// 1 EXTINCTION SOIR
// -----------------------------------------------------------------------------------------------------------------
else
{
if (etat!=ETEINT)
{
for (int i = 255; i >= 0; i--)
{
analogWrite (ledR, i);
analogWrite (ledV, i);
analogWrite (ledB, i);
delay (155); // 1150 cycles pour atteindre i = 255 ==> +/- = 5" 115 cycles pour +/- 1"
}
etat=ETEINT;
}
}
}