Go Down

Topic: Display HD44780 4x20 spariscono le scritte (Read 761 times) previous topic - next topic

simonfe

Ciao a tutti, ho recentemente realizzato un controller per il mio acquario con arduino uno, un display HD44780 4x20 green, un sensore di temperatura DS18B20 e una pcb con relè 5v autocostruita. Il controller, controlla la temperatura della vasca, accende le luci in base all'orario e accende riscaldatore e ventola in base alla temperatura.
Momentaneamente ho caricato il programma e lo sto testando a vuoto senza pcb a relè collegata e funziona tutto a meraviglia.
Ho però un piccolo problema. durante il funzionamento del programma, a volte spariscono i caratteri dal display e si presenta solamente con la retroilluminazione. Se tolgo l'alimentazione alla scheda arduino e la reinserisco tutto riprende a funzionare  e i caratteri vengono visualizzati.
Questo problema succede random cioè: a volte capita dopo 2 ore, a volte dopo 10 e altre dopo anche 20 ore.
Secondo voi a cosa può essere dovuto? Al software o all'hardware?
Preciso che arduino è alimentato solamente con un alimentatore esterno a 5v dedicato.
Potrebbe essere che il programma vada in palla quando attiva le uscite digitali che io ho collegato ma ho lasciato per il momento senza relè e cioè senza carico??
Grazie a tutti quelli che cercheranno di aiutarmi  :)

leo72

Riguardo al problema software, potrebbe aiutarti questa:
http://arduino.cc/forum/index.php/topic,139118.0.html

uwefed

Una sfera di cristallo per favore.  ;)

simonfe come pensi che Ti potremmo aiutare se non ci dai ne il circuito ne lo sketch del Tuo progetto?

Dalle informazioni che ho a disposizione non posso valutare se é piú probabile che il problema sia SW o HW.

Ciao Uwe


superzaffo

Ha ragione uwefed, però se come tu dici, alimenti l' arduino con solo 5v, allora sono troppo pochi.
Arduino deve essere alimentato con una tensione da 7 a 12. Questo per varie ragioni... poi dipende anche come alimenti tutto il resto... relè compresi.
Quindi se posti uno schema e maggiori dettagli, anche noi potremo essere più precisi.

simonfe

#4
Mar 11, 2013, 05:10 pm Last Edit: Mar 11, 2013, 05:19 pm by leo72 Reason: 1
Ciao a tutti. Grazie per le risposte. Avete ragione. Senza schema e sketch non è sicuramente possibile aiutarmi.
Purtroppo sono alle prime armi con la programmazione e non so se tutto quello che ho scritto va bene o può creare dei conflitti.
Provo a postarvelo:  :smiley-roll-sweat:
Per lo schema devo buttarlo giu ma ho collegato tutto diretto ad arduino (nessuna seriale)

Code: [Select]
#include <DallasTemperature.h>
#include <OneWire.h>
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 2
#define Luce1 10                              
#define Luce2 11                          
#define Risc 12                            
#define Vent 13                                    


const int Luce1oraacc = 13  ;
const int Luce1minutiacc = 30 ;
const int Luce2oraacc = 13  ;
const int Luce2minutiacc = 50 ;
const int Luce1oraspe = 23  ;
const int Luce1minutispe = 50 ;
const int Luce2oraspe = 23  ;
const int Luce2minutispe = 30 ;
const int Temprisc = 26 ;
const int Tempvent = 28 ;

//------------------------------------------------------------------------
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float temperatura;
char buffer[10];
RTC_DS1307 RTC;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte oldSecond =0;                  
byte richiestaTemperatura=0;        
long oldMillis;                  

void setup () {
 sensors.begin();
 Wire.begin();
 RTC.begin();
 lcd.begin(20, 4);
 
digitalWrite( Luce1,LOW );                    
digitalWrite( Luce2,LOW );                    
digitalWrite( Risc,LOW );
digitalWrite( Vent,LOW );



 if (! RTC.isrunning()) {
   RTC.adjust(DateTime(__DATE__, __TIME__));
 }
 sensors.setWaitForConversion(false);  

}

void loop () {

 DateTime now = RTC.now();
 if (oldSecond != now.second()) {
         
     if ((now.hour() >= Luce1oraacc) && (now.minute() >=Luce1minutiacc) || (now.hour() > Luce1oraacc) && (now.minute() < Luce1minutiacc)){
     lcd.setCursor(0, 2);
     lcd.print F("Luce1:");
     lcd.print F("[");
     lcd.print F("X");
     lcd.print F("]");
     digitalWrite(Luce1, HIGH);}
else
{
     lcd.setCursor(0, 2);
     lcd.print F("Luce1:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
     digitalWrite(Luce1, LOW);}

     if ((now.hour() >= Luce1oraspe) && (now.minute() >=Luce1minutispe) || (now.hour() > Luce1oraspe) && (now.minute() < Luce1minutispe)){
     lcd.setCursor(0, 2);
     lcd.print F("Luce1:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
     digitalWrite(Luce1, LOW);}

         
     if ((now.hour() >= Luce2oraacc) && (now.minute() >=Luce2minutiacc) || (now.hour() > Luce2oraacc) && (now.minute() < Luce2minutiacc)){
     lcd.setCursor(0, 3);
     lcd.print F("Luce2:");
     lcd.print F("[");
     lcd.print F("X");
     lcd.print F("]");
     digitalWrite(Luce2, HIGH);}
else
{
     lcd.setCursor(0, 3);
     lcd.print F("Luce2:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
     digitalWrite(Luce2, LOW);}

     if ((now.hour() >= Luce2oraspe) && (now.minute() >=Luce2minutispe) || (now.hour() > Luce2oraspe) && (now.minute() < Luce2minutispe)){
     lcd.setCursor(0, 3);
     lcd.print F("Luce2:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
     digitalWrite(Luce2, LOW);}
     
if (sensors.getTempCByIndex(0)<=Temprisc){
      lcd.setCursor(11, 2);
     lcd.print F("Risc.:");
     lcd.print F("[");
     lcd.print F("X");
     lcd.print F("]");
 digitalWrite(Risc, HIGH);}
else {
       lcd.setCursor(11, 2);
     lcd.print F("Risc.:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
 digitalWrite(Risc, LOW);
}

if (sensors.getTempCByIndex(0)>=Tempvent){
      lcd.setCursor(11, 3);
     lcd.print F("Vent.:");
     lcd.print F("[");
     lcd.print F("X");
     lcd.print F("]");
 digitalWrite(Vent, HIGH);}
else {
       lcd.setCursor(11, 3);
     lcd.print F("Vent.:");
     lcd.print F("[");
     lcd.print F(" ");
     lcd.print F("]");
 digitalWrite(Vent, LOW);
}

   if (richiestaTemperatura == 0) {
     sensors.requestTemperatures();
     richiestaTemperatura = 1;  
     oldMillis = millis();
   }
 }  

 long ciccio = millis();
 if (richiestaTemperatura == 1)
 {
   if (ciccio-oldMillis > 750) {
     {
       richiestaTemperatura = 0;
       lcd.setCursor(0, 1);
       lcd.print F("Temp. H2o:  ");
       lcd.print (sensors.getTempCByIndex(0));
       lcd.write (0b11011111);
       lcd.print F("C");
     }

 

   //stampa data ed ora
   sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
   lcd.setCursor(0, 0);
   lcd.print( buffer );
   char buffer[10] = "";
   sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(12, 0);
   lcd.print( buffer );


   }
     }

   }


edit by mod: per favore includi il codice negli appositi tag, grazie

PaoloP

Devi trasformare tutti i print da così:
Code: [Select]
lcd.print F("Luce1:");
a così
Code: [Select]
lcd.print(F("Luce1:"));
Hai dimenticato una coppia le parentesi.

simonfe

Scusatemi per non aver incluso il codice negli appositi tag. Sto imparando.
Grazie infinite a tutti per gli aiuti.
Grazie anche a te PaoloP. Cambierò le stringhe come da te suggerito.
Per voi il resto del codice è accettabile o esiste una maniera per renderlo più leggero?  :smiley-red:

simonfe

Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.

leo72


Ciao a tutti, sono di nuovo qui a rompre.
Ho corretto il codice come suggerito da PaoloP ma purtroppo niente.
il sistema non è stabile. dopo un ora che avevo caricato lo sketch è sparito tutto dal display.
E rimasta solo la retroilluminazione.


Fai un po' di debug sulla seriale. Metti cioè dei Serial.print e spedisci un po' di messaggi al PC per vedere se il codice continua a girare regolarmente oppure se si pianta tutto l'Arduino.

Go Up