malfunzionamento display lcd

Ho sviluppato un controllo accessi con Arduino1 e il programma svolge ciò che effettivamente volevo; il problema sta nel fatto che non stampa a display! (il mio obiettivo sarebbe ottenere a display nome cognome data/ora in cui viene effettuato l’accesso)
Il display é un 16x2, precisamente questo https://www.sparkfun.com/products/709.
I collegamenti effettuati sono stati presi da questo sito http://www.maffucci.it/2012/02/17/appunti-su-arduino-pilotare-un-display-lcd/ ; il display nel momento in cui carichiamo un semplice programma tipo “hello world” funziona (già difettosamente però perché nel momento in cui abbiamo nella seconda riga stampati i secondi che passano quando passiamo dal 9 al 10 secondo - quindi da 1 a 2 cifre - la luminosità cala e la scritta é meno definita), se però inserisco i comandi di stampa sul display all’interno del mio programma non funziona nulla.
I pin sono corretti perché se carico “hello world” funziona, l’inizializzazione la facciano nel setup, pulisco lo schermo e setto la posizione del cursore prima di dirgli di caricare la scritta richiesta e non stampa nulla; anche nel momento in cui non deve stampare una stringa come dovrebbe ma gli dico io di stampare un parola (es. “ciao”) non stampa nulla. Mille grazie per chi riuscisse a risolvere il problema

Tia38: la luminosità cala e la scritta é meno definita

Come stai alimentando l'Arduino? Da USB o con un alimentatore esterno?

Da USB

Come hai effettuato i collegamenti del LCD. Hai saldato i cavetti o li avete semplicemente incastrati. Nel secondo caso sei stato fortunato che funzionasse anche se in modo anomalo, di solito non funziona. :roll_eyes:

Puoi incollare il tuo sketch nel forum? Ci potrebbe essere anche un problema software. Per incollare il codice segui le istruzioni del punto 7 --> http://forum.arduino.cc/index.php?topic=149082.0 (Non sarebbe male se leggessi anche il resto :grin:)

I collegamenti sono effettuati su breadboard, non saldati ovviamente. Ho saldato una strip da 16 sul display altrimenti era pressoché impossibile fare dei collegamenti che facessero contatto. Ma il problema non é quello perché nel momento in cui carico un semplice programma es. "hello world" funziona tutto perfettamente a parte il calo di cui parlavo precendemente, ma i contatti non vengono toccati mentre il programma é in esecuzione. Lo sketch é questo

#include 
#include 
#include 
#include 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xB2, 0x27 }; // MAC address

EthernetClient client;

void setup() {
 Serial.begin(9600);   
 lcd.begin (16,2);
 lcd.clear();

  if(Ethernet.begin(mac) == 0) 
  {
    Serial.println("Errore nel configurare Ethernet usando DHCP");
    while(true) // non ha senso continuare, percio' entriamo in loop
    ;
  }

  delay(1000); 

  Serial.print("Indirizzo IP: ");
  IPAddress myIPAddress = Ethernet.localIP();
  Serial.println(myIPAddress);
  

}

void loop () {
 byte i = 0;
 byte val = 0;
 byte code[6];
 byte checksum = 0;
 byte bytesread = 0;
 byte tempbyte = 0;
 char aaa[2];
 if(Serial.available() > 0) {
   if((val = Serial.read()) == 2) {               
     bytesread = 0;
     while (bytesread < 12) {                     
       if( Serial.available() > 0) {
         val = Serial.read();
         if((val == 0x0D)||(val == 0x0A)||(val == 0x03)||(val == 0x02)) {
           break;                                   
         }

         if ((val >= '0') && (val <= '9')) {
           val = val - '0';
         } else if ((val >= 'A') && (val <= 'F')) {
           val = 10 + val - 'A';
         }

       
         if (bytesread & 1 == 1) {
          
           code[bytesread >> 1] = (val | (tempbyte << 4));

           if (bytesread >> 1 != 5) {               
             checksum ^= code[bytesread >> 1];       
           };
         } else {
           tempbyte = val;                         
         };

         bytesread++;                            
       }
     }


     if (bytesread == 12) {                         
       String pippo ="";
       Serial.print("5-byte code: ");
       for (i=0; i<5; i++) {
         if (code[i] < 16) Serial.print("0");
         Serial.print(code[i], HEX);
         sprintf(aaa, "%02X" , code[i]);
         pippo = pippo + aaa;
         
       }
       Serial.println();
       Serial.println("Pippo:" + pippo);
       Serial.print("Checksum: ");
       Serial.print(code[5], HEX);
       Serial.println(code[5] == checksum ? " -- passed." : " -- error.");
       Serial.println();
       google_send(pippo); 
     }

     bytesread = 0;
   }
 }
}

void google_send(String tagcode){
  char c;
  int i;
  String submit = "&submit=Submit";
  String data = "tagcode=";
  IPAddress ip(192,168,2,50);
  unsigned int u;
  u=80;  


  if (client.connect(ip, u)) {
    data = "tagcode=" + tagcode;
  

    client.println("POST /arduino/read.aspx HTTP/1.1"); 
    Serial.println("POST /arduino/read.aspx HTTP/1.1");
    client.println("Host: 192.168.2.50");
    Serial.println("Host: 192.168.2.50");
    client.println("Content-Type: application/x-www-form-urlencoded");
    Serial.println("Content-Type: application/x-www-form-urlencoded");
    client.println("Connection: close");
    Serial.println("Connection: close");
    client.println("User-Agent: Arduino/1.0");
    Serial.println("User-Agent: Arduino/1.0");
    client.print("Content-Length: ");
    Serial.print("Content-Length: ");
    client.println(data.length());
    Serial.println(data.length());
    client.println();
     
    client.println(data);
    Serial.println(data);
    Serial.println();
    
     String risposta = "";
     String RESULT = "";
     String TAGID = "";
     String FULLNAME = "";
     String TIMESTAMP = "";
     
     for (i=0; i<2000; i++) {
         char c = client.read();
         
         int abc= (int)c;
         if (abc == -1)
            break;
         risposta = risposta + c;
      
         }
     
         Serial.print(risposta);
         Serial.println ("");
      
         int index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         
         RESULT = risposta.substring(0, risposta.indexOf('<'));
         
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         
         TAGID = risposta.substring(0, risposta.indexOf ('<'));
         
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         FULLNAME = risposta.substring (0, risposta.indexOf ('<'));
         
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         index = risposta.indexOf('>');
         risposta = risposta.substring(index + 1);
         TIMESTAMP = risposta.substring (0, risposta.indexOf ('<'));
     
         Serial.println("Result = " + RESULT);
         Serial.println("Tagid = " + TAGID);
         Serial.println ("Fullname = " + FULLNAME);
         Serial.println ("Timestamp = " + TIMESTAMP);
         
         const int ledPin =  6;
         const int ledPin1 =  8;
         
         pinMode(ledPin, OUTPUT);  
         pinMode(ledPin1, OUTPUT);        
         
           if (RESULT == "OK")
           
            {
              digitalWrite(ledPin, LOW);
              digitalWrite(ledPin1, HIGH);
              delay (500);
              digitalWrite(ledPin1, LOW);
              delay (200);
              digitalWrite(ledPin1, HIGH);
              delay (200);
              digitalWrite(ledPin1, LOW);
              delay (200);
              digitalWrite(ledPin1, HIGH);
              delay (20);
              digitalWrite(ledPin1,LOW);
              
            lcd.clear();
            lcd.setCursor (0,0);  
            
              lcd.print (FULLNAME);
              lcd.setCursor (0,1);
              lcd.print (TIMESTAMP);
          }
            
           else 
              
            {
               digitalWrite(ledPin1, LOW);
              digitalWrite(ledPin, HIGH);
              delay (500);
              digitalWrite(ledPin, LOW);
              delay (200);
              digitalWrite(ledPin, HIGH);
              delay (200);
              digitalWrite(ledPin, LOW);
              delay (200);
              digitalWrite(ledPin, HIGH);
              delay (200);
              digitalWrite(ledPin,LOW);           
            
            }
            
    
     } else {
    Serial.println("connection failed");
  }
  delay(100);
  client.stop();
}

L'errore è qui

#include 
#include 
#include 
#include 

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

Usi la Ethernet e colleghi LCD ai pin 11 e 12. Sono incompatibili. Non puoi usare i pin 10, 11, 12 e 13 per altri scopi se non per la Ethernet. Sposta i pin 12 e 11 dell'LCD in altri disponibili e modifica l'inizializzazione di conseguenza. Se usi anche la SD non usare neanche il pin 4.

Purtroppo molti produttori e molti utenti conoscono solo il pin 13 di Arduino e attaccano tutto li. :grin: :grin:

EDIT: Per risparmiare memoria, ne hai molto poca nell'Arduino, usa la funzione F() in questo modo: Esempio

client.println("User-Agent: Arduino/1.0");
Serial.println("User-Agent: Arduino/1.0");

diventa

client.println(F("User-Agent: Arduino/1.0"));
Serial.println(F("User-Agent: Arduino/1.0"));

Occhio alle parentesi e ripetilo in tutto il codice dove invii del testo invariabile.

EDIT2: Usa il meno possibile la funzione string, mangia molta memoria e crea spazzatura (garbage). Usa un vettore al suo posto se conosci la lunghezza dei dati che ti restituisce il client.

Come si spiega il funzionamento del display nel momento in cui carico un semplice programma? In tutti gli esempi che ho trovato su internet i collegamenti del display erano effettuati utilizzando i pin 11 e 12, sono tutti errati dunque?

Si spiega dal fatto che la sola presenza della Ethernet shield non interferisce con il normale funzionamento, ma interferisce quando la shield dialoga con Arduino e viceversa proprio con i pin in comune con il display. La Eth shield dialoga infatti attraverso i segnali MISO, MOSI, SCKL e SS, che sono presenti sia nel connettore ICSP che duplicati nella UNO ne pin 10, 11, 12 e 13. Tanto che se avessi avuto una Leonardo non avresti riscontrato il problema.

Tia38: In tutti gli esempi che ho trovato su internet i collegamenti del display erano effettuati utilizzando i pin 11 e 12, sono tutti errati dunque?

Non sono errati di per se, ma sono errati quando portano l'utente a pensare che siano l'unica soluzione possibile per il collegamento del display. Ecco perché prima dicevo, con una battuta, che i produttori conoscono solo il pin 13. ;)

Quindi se io "sposto" i pin e sostituisco i pin 11-12 con 8-9 dovrebbbe funzionare?

Si.

Questa cosa dei pin 10/11/12/13 della Ethernet Shield dovrebbe essere inserita in quella famosa FAQ di cui si parlò tempo fa ;)

leo72:
Questa cosa dei pin 10/11/12/13 della Ethernet Shield dovrebbe essere inserita in quella famosa FAQ di cui si parlò tempo fa :wink:

Veramente basterebbe che la gente andasse nella sezione “Prodotti” http://arduino.cc/en/Main/Products e si STUDIASSE il prodotto che intende usare … visto che i piedini usati sono tutti descritti !!! ]:smiley:

Guglielmo

Gu, oggi sei polemico. :sweat_smile: :blush:

Ora funziona grazie mille:)

Prego. Però la prossima volta studia. Altrimenti si inquieta Guglielmo. :grin: :grin:

PaoloP: Gu, oggi sei polemico. :sweat_smile: :blush:

No Paolo, io NON faccio MAI polemica, io, purtroppo, [u]dico quello che penso[/u] e ... penso che sia assurdo che la gente compri prodotti come questi e speri di usarli senza neanche prendersi la briga di spendere 5 minuti a leggersi le specifiche ! E' veramente cattiva volontà !!!

Guglielmo

Si, ma se tutti fossero diligenti, il forum non avrebbe senso di esistere ed io nel tempo libero non saprei che fare. Pensa anche a Leo. Che farebbe? :blush: :sweat_smile:

@Tia Non ti preoccupare, qui ci conosciamo e si ride e si scherza insieme. Oltre a risolvere problemucci altrui.

PaoloP: Si, ma se tutti fossero diligenti, il forum non avrebbe senso di esistere ed io nel tempo libero non saprei che fare. Pensa anche a Leo. Che farebbe? :blush: :sweat_smile:

Vero, non saprei come arrivare a fine turno lavorativo ]:D

PaoloP:
… Pensa anche a Leo. Che farebbe? :blush: :sweat_smile:

Potrebbe impiegare meglio il tempo sviluppando tante altre belle librerie ]:smiley: ]:smiley: ]:smiley:

Guglielmo

Col caldo ho il cervello in pantofole ;) Fino a sabato ero sulle dolomiti ed il max che ho avuto sono stati 24° ;) Anzi, sul Sassolungo ho trovato 1 metro e mezzo di neve e 9°, per non parlare di quando sono stato sulla Marmolada :astonished: Poi sono tornato a casa e c'erano domenica 39°C.... fate voi... =(