Bon, j'ai tout repris à la base en copiant le programme d'un très bon tuto sur un autre forum.
#include
#include
#include
#define DS1307_I2C_ADDRESS 0x68
#define LCD_WIDTH 20
#define LCD_HEIGHT 4
#define ARRAYSTEP 15
#define WHITE_LED 11
char lcdbuf;
int DsHour ,DsMin ,DsSec;
//LiquidCrystal lcd(30, 31, 32, 36, 37, 38, 39);
LiquidCrystal lcd(30, 31, 32, 26, 27, 22, 23);
RTC_DS1307 rtc;
int lcdw;
static unsigned long LastTimer ;
byte whiteled = {
0, 0, 0, 0, 0, 0, 0, 0, //0 - 1h45
0, 0, 0, 0, 0, 0, 0, 0, //2 - 3h45
0, 0, 0, 0, 0, 0, 0, 0, //4 - 5h45
0, 0, 0, 0, 0, 0, 0, 0, //6 - 7h45
1, 16, 32, 55, 80, 110, 140, 255, //8 - 9h45
255, 255, 255, 255, 255, 255, 255, 255, //10 - 11h45
255, 255, 255, 255, 255, 255, 255, 255, //12 - 13h45
255, 255, 255, 255, 255, 255, 255, 255, //14 - 15h45
255, 255, 255, 255, 255, 255, 255, 255, //16 - 17h45
255, 255, 255, 255, 255, 255, 255, 255, //18 - 19h45
110, 90, 70, 55, 40 , 20, 10, 8, //20 - 21h45
6 , 3 , 3, 1, 1, 1, 0, 0 //22 - 23h45
};
void setup(void)
{
pinMode(WHITE_LED,OUTPUT);
Serial.begin(9600);
Serial.println("Entrée dans Setup()");
Wire.begin();
rtc.begin();
lcd.begin(LCD_WIDTH, LCD_HEIGHT,1);
if (! rtc.isrunning()) {
Serial.println("Module RTC non initialisé !");
//Si le DS1307 ne tourne pas (changement de pile et pas d'alim, montage tout neuf, on le règle avec la date/l'heure de la compilation
rtc.adjust(DateTime(__DATE__, __TIME__));
}
lcd.clear();
LastTimer = 0;
}
void SetPWMForLed()
{
int indice, sstep, t1, t2,min_cnt,pwmmod ;
Serial.println("Entrée SetPWMForLed");
min_cnt= (DsHour*60)+ DsMin;
// on calcule l'indice ((heure * 60) + minute) divisé par le pas du tableau
indice = min_cnt/ARRAYSTEP;
// Fonction modulo qui donne la partie décimale du calcul ci dessus (donc valeur entre 0 et le pas soit entre 0 et 15) .
sstep = min_cnt%ARRAYSTEP;
t1 =indice;
// cas où l'indice est le dernier du tableau, le suivant est donc le premier !
if (t1==95) {t2=0;}
// sinon indice suivant
else {t2 = t1+1;}
// on est tombé sur un indice entier (multiple de 1/4h), donc on envoie directement la valeur
if (sstep==0)
{
pwmmod = whiteled;
}
else
{
pwmmod = average(&whiteled, &whiteled, sstep);
}
Serial.print("pwmmod:");
Serial.println(pwmmod);
analogWrite(WHITE_LED, pwmmod);
lcdw=pwmmod;
}
// renvoie la valeur intermédiaire
byte average( byte *pt1, byte *pt2, int lstep)
{
byte result;
float fresult;
// Les 2 valeurs des indices sont égales donc on ne change rien
if (*pt1==*pt2) {result = *pt1;} // Pas de changement
// Cas 1 on augmente la luminosité
else if (*pt1<*pt2)
// Calcul de la valeur intermédiaire (cf Tuto)
{ fresult = ((float(*pt2-*pt1)/15.0) * float(lstep))+float(*pt1);
result = byte(fresult);
}
else
// Cas 2 on diminue la luminosité
{
fresult = -((float(*pt1-*pt2)/15.0) * float(lstep))+float(*pt1);
result = byte(fresult);
}
return result;
}
void GetTimeFromRTC()
{
DateTime now = rtc.now();
DsHour = now.hour();
DsMin = now.minute();
DsSec = now.second();
}
void FlushLCD()
{
lcd.setCursor(0,1);
// Ex: Blanc : 32%
sprintf(lcdbuf, "Blanc : %d%%",lcdw*100/255);
lcd.print(lcdbuf);
lcd.setCursor(0,0);
sprintf(lcdbuf, "%.2d:%.2d:%.2d",DsHour,DsMin,DsSec);
lcd.print(lcdbuf);
}
void loop(void)
{
GetTimeFromRTC();
if( (long)( millis() - LastTimer ) >= 0)
{
SetPWMForLed();
LastTimer+= 60000;
}
Serial.print("Heure RTC : ");
Serial.println(lcdbuf);
FlushLCD();
delay(900);
}
Ca compile nickel avec prise en charge de l'écran LDC, la mise à l'heure....
Il est fait pour gérer les LED's blanches.
Je souhaite maintenant y insérer la gestion des LED's Bleues sur le même principe.
Si j'ai bien compris le système il me faut donc rajouter
#define BLUE_LED 10 // commande des LED's bleues sur la broche 10 par exemple
Ensuite le tableau des % d'éclairage en fonction de l'heure
uint8_t DsHour ,DsMin ,DsSec;
LiquidCrystal lcd(30, 31, 32, 36, 37, 38, 39);
RTC_DS1307 rtc;
int lcdw;
byte blueled = {
0, 0, 0, 0, 0, 0, 0, 0, //0 - 1
0, 0, 0, 0, 0, 0, 0, 0, //2 - 3
0, 0, 0, 0, 0, 0, 0, 0, //4 - 5
0, 0, 0, 0, 0, 0, 0, 0, //6 - 7
1, 16, 32, 55, 80, 110, 140, 255, //8 - 9
255, 255, 255, 255, 255, 255, 255, 255, //10 - 11
255, 255, 255, 255, 255, 255, 255, 255, //12 - 13
255, 255, 255, 255, 255, 255, 255, 255, //14 - 15
255, 255, 255, 255, 255, 255, 255, 255, //16 - 17
255, 255, 255, 255, 255, 255, 255, 255, //18 - 19
110, 90, 70, 55, 40 , 20, 10, 8, //20 - 21
6 , 3 , 3, 1, 1, 1, 0, 0 //22 - 23
};
Après c'est dans la partie "*setup()* que je suis un peu largué