Go Down

Topic: Display HD44780 4x20 spariscono le scritte (Read 858 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy