Bonjour à tous.
J'ai un petit programme permettant de gérer l'allumage et l'extinction progressive d'une rampe LED fonctionnant grâce à un Arduino Nano et une RTC DS1307.
Le programme fonctionne nickel, pas de souci de ce coté là seulement quand je compile puis téléverse sur la carte, l'heure affichée sur mon écran marque un décalage entre 50 min et 1h par rapport à l'heure normale.
Bien que fondamentalement ça ne nuise pas au bon fonctionnement du programme, j'aimerai corriger ce petit problème.
Au passage, dites-moi si vous voyez des erreurs ou des choses pouvant être améliorées/simplifiées.
En vous remerciant.
Voici mon programme :
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <Wire.h>
#define LiquidCrystal_I2c_ADRESS 0x3F
#define DS1307_I2C_ADDRESS 0x68
#define LCD_WIDTH 16
#define LCD_HEIGHT 2
#define ARRAYSTEP 15
#define WHITE_LED 11
#define BLUE_LED 5
char lcdbuf[LCD_WIDTH];
char lcdbufb[LCD_WIDTH];
int DsHour , DsMin , DsSec;
//LiquidCrystal_I2C lcd(0x3F,LCD_WIDTH, LCD_HEIGHT);
LiquidCrystal_I2C lcd(0x3F,LCD_WIDTH, LCD_HEIGHT);
RTC_DS1307 rtc;
int lcdw, lcdwb;
static unsigned long LastTimer ;
byte whiteled[96] = {
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
0, 0, 0, 0, 0, 0, 0, 0, //8 - 9h45
13, 13, 26, 26, 38, 38, 51, 51, //10 - 11h45
64, 64, 77, 77, 89, 89, 102, 102, //12 - 13h45
115, 115, 115, 115, 115, 115, 115, 115, //14 - 15h45
115, 115, 115, 115, 115, 115, 102, 102, //16 - 17h45
89, 89, 89, 89, 89, 77, 77, 64, //18 - 19h45
64, 51, 51, 38, 38 , 26, 26, 13, //20 - 21h45
13, 0, 0, 0, 0, 0, 0, 0 //22 - 23h45
};
byte blueled[96] = {
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
0, 0, 3, 7, 13, 13, 15, 20, //8 - 9h45
26, 51, 77, 102, 128, 153, 179, 210, //10 - 11h45
217, 217, 217, 230, 230, 230, 230, 230, //12 - 13h45
230, 230, 230, 230, 230, 230, 230, 230, //14 - 15h45
230, 230, 230, 230, 230, 230, 230, 230, //16 - 17h45
230, 217, 217, 217, 210, 191, 179, 153, //18 - 19h45
128, 102, 77, 64, 51 , 38, 26, 26, //20 - 21h45
26, 26, 13, 7, 3, 0, 0, 0 //22 - 23h45
};
void setup(void)
{
pinMode(WHITE_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
Serial.begin(9600);
Serial.println("Entrée dans Setup()");
Wire.begin();
rtc.begin();
lcd.init(); // initialize the lcd
lcd.backlight();
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;
}
// 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 SetPWMForLed()
{
int indice, sstep, t1, t2, min_cnt, pwmmod, pwmmodb;
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[t1];
pwmmodb = blueled[t1];
}
else
{
pwmmod = average(&whiteled[t1], &whiteled[t2], sstep);
pwmmodb = average(&blueled[t1], &blueled[t2], sstep);
}
Serial.print("pwmmod:");
Serial.println(pwmmod);
Serial.print("pwmmodb:");
Serial.println(pwmmodb);
analogWrite(WHITE_LED, pwmmod);
analogWrite(BLUE_LED, pwmmodb);
lcdw = pwmmod;
lcdwb = pwmmodb;
}
void GetTimeFromRTC()
{
DateTime now = rtc.now();
DsHour = now.hour();
DsMin = now.minute();
DsSec = now.second();
}
void FlushLCD()
{
lcd.setCursor(0, 0);
sprintf(lcdbuf, "%.2d:%.2d:%.2d", DsHour, DsMin, DsSec);
lcd.print(lcdbuf);
lcd.setCursor(0, 1);
// Ex: Blanc : 32%
sprintf(lcdbuf, "Wh: %d%%", lcdw * 100 / 255);
lcd.print(lcdbuf);
// BLEU
sprintf(lcdbufb, " Bl: %d%%", lcdwb * 100 / 255);
lcd.print(lcdbufb);
lcd.setCursor(1, 0);
}
void loop(void)
{
GetTimeFromRTC();
if ( (long)( millis() - LastTimer ) >= 0)
{
SetPWMForLed();
LastTimer += 60000;
}
Serial.print("Heure RTC : ");
Serial.println(lcdbuf);
Serial.println(lcdbufb);
FlushLCD();
}