Bonjour à tous,
Je programme un petit contrôleur pour aquarium avec un Arduino mega1280.
Mon problème est qu'après un moment (8-15h je ne sais pas exactement) l'affichage se met à afficher des caractères bizarres, après un redémarrage tout reviens à la normal...
Lorsque je change de menu je vois que les caractères bizarres changent, le lcd est donc encore bien commandé par le arduino. Le lcd est compatible HD44780 et est 16x2lignes.
A savoir que toutes les autres fonctions fonctionnent sans problème (contrôle des relais pour lumière, chauffage, capteur température, stockage des températures minimal/maximal...)
Voila une petite vidéo du problème:
Le code complet est joint à ce post et voilà quelques bout de mon code, j'ai retiré les parties ne concernant pas l'affichage:
void setup(){
lcd.begin(16, 2); // start the lcdlibrary
lcd.setCursor(0,0);
lcd.print("Aqua++"); // print a simple message
delay(1000);
lcd.clear();
}
void loop(){
lcd_key = read_LCD_buttons(); // read the buttons from the LCD board
switch (lcd_key) // depending on which button was pushed, we perform an action
{
case btnLEFT:
{
reset_min_max_temp();
affichage_reset_minmax();
break;
}
case btnSELECT:
{
affichage_minmax();
break;
}
case btnNONE:
{
affichage_accueil();
break;
}
}
}
void affichage_accueil()
{
affichage_temperature();
affichage_heure();
}
void affichage_heure()
{
/********************************************************************************
Cette fonction permet d'afficher l'heure sur l'écrans LCD
********************************************************************************/
lcd.setCursor(0,1);
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
if(hour<10)
lcd.print("0");
lcd.print(hour);
lcd.print(":");
if(minute<10)
lcd.print("0");
lcd.print(minute);
lcd.print(":");
if(second<10)
lcd.print("0");
lcd.print(second);
}
void affichage_reset_minmax()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Resetting min");
lcd.setCursor(0,1);
lcd.print("max value");
delay(1000);
lcd.print(".");
delay(1000);
lcd.print(".");
delay(1000);
lcd.print(".");
delay(1000);
lcd.clear();
}
void affichage_minmax()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T1: ");
lcd.print(tempmM.fTank1TempMin); // Valeur en degré
lcd.print("-");
lcd.print(tempmM.fTank1TempMax);
lcd.setCursor(0,1);
lcd.print("T2: ");
lcd.print(tempmM.fTank2TempMin);
lcd.print("-");
lcd.print(tempmM.fTank2TempMax);
delay(2500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("T2: ");
lcd.print(tempmM.fTank2TempMin);
lcd.print("-");
lcd.print(tempmM.fTank2TempMax);
lcd.setCursor(0,1);
lcd.print("Rm: ");
lcd.print(tempmM.fRoomTempMin);
lcd.print("-");
lcd.print(tempmM.fRoomTempMax);
delay(2500);
lcd.clear();
}
void affichage_temperature()
{
/********************************************************************************
Cette fonction permet d'interroger les deux capteurs de temperature
OneWire et d'afficher la temperature sur le LCD
********************************************************************************/
if(affichageStamp>=0&&affichageStamp<15)
{
temperature[0].valeur =getStuff(temperature[0].addr,temperature[0].pin); //getStuff implique un delay de 100
temperature[1].valeur =getStuff(temperature[1].addr,temperature[1].pin);
lcd.setCursor(0,0);
lcd.print("Tank1: ");
lcd.print(temperature[0].valeur);
lcd.print("c");
Serial.println(" C ");
if(tempmM.fTank1TempMax<temperature[0].valeur)
{
TemperatureChangeFlag=1;
tempmM.fTank1TempMax=temperature[0].valeur;
}
if(tempmM.fTank1TempMin>temperature[0].valeur)
{
TemperatureChangeFlag=1;
tempmM.fTank1TempMin=temperature[0].valeur;
}
}
if(affichageStamp>=15&&affichageStamp<30)
{
temperature[0].valeur =getStuff(temperature[0].addr,temperature[0].pin);
temperature[1].valeur =getStuff(temperature[1].addr,temperature[1].pin); //getStuff implique un delay de 100
lcd.setCursor(0,0);
lcd.print("Tank2: ");
lcd.print(temperature[1].valeur);
lcd.print("c");
Serial.println(" C ");
if(tempmM.fTank2TempMax<temperature[1].valeur)
{
TemperatureChangeFlag=1;
tempmM.fTank2TempMax=temperature[1].valeur;
}
if(tempmM.fTank2TempMin>temperature[1].valeur)
{
TemperatureChangeFlag=1;
tempmM.fTank2TempMin=temperature[1].valeur;
}
}
if(affichageStamp==30||affichageStamp==37)
{
temperature[0].valeur = getStuff(temperature[0].addr,temperature[0].pin);
tempRoom = getLM35value();
lcd.setCursor(0,0);
lcd.print("Room: ");
lcd.print(tempRoom);//tempRoom);
lcd.print("c");
lcd.print(" "); //efface la fin de ligne
if(tempmM.fRoomTempMax<tempRoom)
{
TemperatureChangeFlag=1;
tempmM.fRoomTempMax=tempRoom;
}
if(tempmM.fRoomTempMin>tempRoom)
{
TemperatureChangeFlag=1;
tempmM.fRoomTempMin=tempRoom;
}
}
if(affichageStamp>=30&&affichageStamp<45)
{
delay(100); //egalise le delai avec les capteur DS18B20
}
delay(20);
affichageStamp++;
if(affichageStamp==45)
affichageStamp=0;
}
ProjetAqua.ino (16.5 KB)