Go Down

Topic: malfunzionamento display lcd (Read 14787 times) previous topic - next topic

Tia38

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

PaoloP


la luminosità cala e la scritta é meno definita


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


PaoloP

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.  :smiley-roll-blue:

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  :smiley-mr-green:)

Tia38

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

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>
#include <LiquidCrystal.h>

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();
}

PaoloP

#5
Jul 31, 2013, 04:40 pm Last Edit: Jul 31, 2013, 04:47 pm by PaoloP Reason: 1
L'errore è qui
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>
#include <LiquidCrystal.h>

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.  :smiley-mr-green: :smiley-mr-green:

EDIT:
Per risparmiare memoria, ne hai molto poca nell'Arduino, usa la funzione F() in questo modo:
Esempio
Code: [Select]
client.println("User-Agent: Arduino/1.0");
Serial.println("User-Agent: Arduino/1.0");

diventa
Code: [Select]
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.

Tia38

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?

PaoloP

#7
Jul 31, 2013, 05:34 pm Last Edit: Jul 31, 2013, 05:36 pm by PaoloP Reason: 1
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.


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.  ;)

Tia38

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

PaoloP


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  ;)

gpb01


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


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 !!!  ]:D

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP


Tia38


PaoloP

Prego.
Però la prossima volta studia. Altrimenti si inquieta Guglielmo.  :smiley-mr-green: :smiley-mr-green:

Go Up