Arduino Forum

International => Italiano => Software => Topic started by: Tia38 on Jul 31, 2013, 11:08 am

Title: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 11:08 am
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
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 11:26 am

la luminosità cala e la scritta é meno definita


Come stai alimentando l'Arduino? Da USB o con un alimentatore esterno?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 11:38 am
Da USB
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 11:45 am
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:)
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 04:26 pm
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();
}
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 04:40 pm
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.
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 05:24 pm
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?
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 05:34 pm
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.  ;)
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 05:42 pm
Quindi se io "sposto" i pin e sostituisco i pin 11-12 con 8-9 dovrebbbe funzionare?
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 05:44 pm
Si.
Title: Re: malfunzionamento display lcd
Post by: leo72 on Jul 31, 2013, 05:46 pm
Questa cosa dei pin 10/11/12/13 della Ethernet Shield dovrebbe essere inserita in quella famosa FAQ di cui si parlò tempo fa  ;)
Title: Re: malfunzionamento display lcd
Post by: gpb01 on Jul 31, 2013, 05:51 pm

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 (http://arduino.cc/en/Main/Products) e si STUDIASSE il prodotto che intende usare ... visto che i piedini usati sono tutti descritti !!!  ]:D

Guglielmo
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 05:54 pm
Gu, oggi sei polemico.  :smiley-sweat: :smiley-red:
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Jul 31, 2013, 05:55 pm
Ora funziona grazie mille:)
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 05:57 pm
Prego.
Però la prossima volta studia. Altrimenti si inquieta Guglielmo.  :smiley-mr-green: :smiley-mr-green:
Title: Re: malfunzionamento display lcd
Post by: gpb01 on Jul 31, 2013, 05:57 pm

Gu, oggi sei polemico.  :smiley-sweat: :smiley-red:


No Paolo, io NON faccio MAI polemica, io, purtroppo, dico quello che penso 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
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Jul 31, 2013, 06:00 pm
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?  :smiley-red: :smiley-sweat:

@Tia
Non ti preoccupare, qui ci conosciamo e si ride e si scherza insieme. Oltre a risolvere problemucci altrui.
Title: Re: malfunzionamento display lcd
Post by: leo72 on Jul 31, 2013, 06:06 pm

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?  :smiley-red: :smiley-sweat:

Vero, non saprei come arrivare a fine turno lavorativo  ]:D
Title: Re: malfunzionamento display lcd
Post by: gpb01 on Jul 31, 2013, 06:07 pm

... Pensa anche a Leo. Che farebbe?  :smiley-red: :smiley-sweat:
...


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

Guglielmo
Title: Re: malfunzionamento display lcd
Post by: leo72 on Jul 31, 2013, 06:13 pm
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  :smiley-eek:
Poi sono tornato a casa e c'erano domenica 39°C.... fate voi...  =(
Title: Re: malfunzionamento display lcd
Post by: Etemenanki on Jul 31, 2013, 06:39 pm

...
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  :smiley-eek:
...


Ah, ma allora infierisci di proposito ... quasi quasi lo mordo :P XD XD XD
Title: Re: malfunzionamento display lcd
Post by: leo72 on Jul 31, 2013, 11:08 pm
Sì ma ora mi faccio tutto agosto a lavoro con temperature minime di 35° con afa a livelli di palude  :smiley-sweat:
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 09:42 am
Scusatemi, ma ora ho un altro problema :(
Il display nel momento in cui riesco a regolare il contrasto e mi stampa in uscita ciò che voglio o non si aggiorna e nonostante io passi un altra tessera la scritta rimane la medesima, o semplicemente quando passo un'altra tessera scompare la stampa e il display rimane vuoto.
Potete nuovamente darmi una mano? :)
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 09:46 am
Lo sketch è il medesimo o l'hai modificato?
Di quali tessere stai parlando?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 09:58 am
E' un controllo accessi, quindi sto parlando delle tessere che passo sopra il lettore RFID. In base alla tessera passata (ognuna con un codice assegnata ad un soggetto) appare stampato a display il nome del soggetto a cui é associata la tessera.
Si, lo sketch é il medesimo :)
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 10:05 am
Quindi i dati delle tessere vengono passate tramite URL?

Tu stampi a display qui
Code: [Select]
lcd.clear();
lcd.setCursor (0,0);  
lcd.print (FULLNAME);
lcd.setCursor (0,1);
lcd.print (TIMESTAMP);


ma cosa ti stampa qui
Code: [Select]
Serial.println("Result = " + RESULT);
Serial.println("Tagid = " + TAGID);
Serial.println ("Fullname = " + FULLNAME);
Serial.println ("Timestamp = " + TIMESTAMP);


Le risposte corrette o delle stringhe vuote?

Poi dovresti controllare il quantitativo di memoria libera. Con string ne utilizzi parecchia.
--> http://playground.arduino.cc/Code/AvailableMemory

Quote
Another method that seems to be even simpler is the following:
Declare this function:
Code: [Select]
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}


and call it anywhere in your program like that:
Code: [Select]
Serial.println(freeRam());
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 10:16 am
Dove c'é scritto Serial.print ecc, stampo separatamente i "blocchi" di cui é composta la stringa che mi viene data in risposta; non é indispensabile ma é giusto per vedere anche sul monitor seriale se ciò che stampa é corretto
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 10:17 am
Ok, ma io ti chiedevo cosa stampa, nel senso... ti arriva la risposta corretta su seriale e poi LCD non stampa niente o anche su seriale non ti arriva niente e quindi LCD non stampa niente.
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 10:21 am
Il seriale é SEMPRE corretto, quindi il problema sta nel passaggio dei dati sul display..
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 10:26 am
Prima di stampare a display accendi dei LED. Non è che li hai collegati o dichiarati insieme al LCD?
Code: [Select]
const int ledPin =  6;
const int ledPin1 =  8;
pinMode(ledPin, OUTPUT); 
pinMode(ledPin1, OUTPUT);


Come inizializzi il display LCD adesso?
Code: [Select]
LiquidCrystal lcd(..., ..., ..., ..., ..., ...);
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 10:37 am
I led si accendono in base alla tessera passata. Se é "corretta" (già presente nel database) si accende il led verde, altrimenti quello rosso. Non sono dichiarati all'inizio.. all'inizio ho LiquidCrystal lcd (9,7,5,4,3,2)
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 10:43 am
Non vedo, ad occhi, nessun motivo software perché non debba funzionare, se non l'esaurimento della memoria. Ma ti dovrebbe dare anche errori sulla seriale o comunque comportamenti anomali.
Prova ad sostituire con questo
Code: [Select]
lcd.clear();
lcd.setCursor (0,0); 
lcd.print ("N: ");
lcd.print (FULLNAME);
lcd.setCursor (0,1);
lcd.print ("T: ");
lcd.print (TIMESTAMP);

e dimmi se almeno stampa la N e la T.
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 10:57 am
Non li stampa, da segnali strani sul disply tipo rettangoli tutti illuminati, frecce, punti di domanda ecc.. quelli li da sempre a parte rari casi in cui appare la scritta corretta, es.

Mario Rossi
12/4/2002  16:46
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:00 am
Ultimo test.
Aggiungi questa funzione in fondo allo sketch
Code: [Select]
int freeRam () {
 extern int __heap_start, *__brkval;
 int v;
 return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}


Dopo questo blocco
Code: [Select]
Serial.println("Result = " + RESULT);
Serial.println("Tagid = " + TAGID);
Serial.println ("Fullname = " + FULLNAME);
Serial.println ("Timestamp = " + TIMESTAMP);

aggiungi
Code: [Select]
Serial.print("Ram: ");
Serial.println(freeRam());


Che valore viene stampato?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 11:13 am
Stampa il valore 224
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:16 am
E se lo inserisci anche dopo il blocco di stampa su LCD?
Code: [Select]
lcd.clear();
lcd.setCursor (0,0);  
lcd.print ("N: ");
lcd.print (FULLNAME);
lcd.setCursor (0,1);
lcd.print ("T: ");
lcd.print (TIMESTAMP);
Serial.print("Ram: ");
Serial.println(freeRam());


Che valore restituisce?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 11:28 am
Sempre 224, in entrambi i casi
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:32 am
Bene... nel cilindro non è rimasto più nulla. Non so che altre soluzioni proporti.  =(
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 11:36 am
ok.. grazie mille lo stesso :(
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:40 am
Comunque, mi rimane il dubbio sul quantitativo di memoria.
Hai sostituito tutti i comandi Serial.print("xxxxx"); e lcd.print("xxxxx"); con Serial.print(F("xxxxx")); e lcd.print(F("xxxxx")); ?

Se alleghi lo sketch attuale te lo converto in un attimo.
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 01, 2013, 03:23 pm
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 7, 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)
    ;
  }

  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);
  //                                Serial.print("Ram: ");
  //                                Serial.println(freeRam());
         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 ("N: ");
            lcd.print (FULLNAME);
            lcd.setCursor (0,1);
//            lcd.print ("T: ");
            lcd.print (TIMESTAMP);
           // Serial.print("Ram: ");
           // Serial.println(freeRam());
          }
           
           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();
}

//int freeRam () {
//  extern int __heap_start, *__brkval;
//  int v;
//  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 06:09 pm
Ho fatto qualche modifica
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
// #include <WString.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 7, 5, 4, 3, 2);

const byte ledPin =  6;
const byte ledPin1 =  8;

byte mac[] = {
 0x90, 0xA2, 0xDA, 0x0E, 0xB2, 0x27 }; // MAC address
IPAddress ip(192,168,2,50);
unsigned int port = 80;

EthernetClient client;

void setup() {
 pinMode(ledPin, OUTPUT);  
 pinMode(ledPin1, OUTPUT);

 Serial.begin(9600);  

 lcd.begin (16,2);
 lcd.clear();

 if(Ethernet.begin(mac) == 0)
 {
   Serial.println(F("Errore nel configurare Ethernet usando DHCP"));
   while(true)
     ;
 }
 delay(1000);

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

void loop () {
 byte val = 0;
 byte code[6];
 byte checksum = 0;
 byte bytesread = 0;
 byte tempbyte = 0;

 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++;                            
       }
     } // End while

     if (bytesread == 12) {                        
       char aaa[2];
       String pippo = "";
       Serial.print(F("5-byte code: "));
       for (byte i=0; i<5; i++) {
         if (code[i] < 16) Serial.print(F("0"));
         Serial.print(code[i], HEX);
         sprintf(aaa, "%02X" , code[i]);
         pippo += aaa;
       }
       // Attenzione, se bytesread non è uguale a 12, pippo non viene inizializzato perchè all'interno dell'if

       Serial.println();
       Serial.print(F("Pippo:"));
       Serial.println(pippo);
       Serial.print(F("Checksum: "));
       Serial.print(code[5], HEX);
       code[5] == checksum ? Serial.println(F(" -- passed.")) : Serial.println(F(" -- error."));
       Serial.println();
       google_send(pippo);
     }

     bytesread = 0;
   }
 }
}

void google_send(String tagcode){
 String submit = "&submit=Submit";
 String data = "tagcode=";

 if (client.connect(ip, port)) {
   data = "tagcode=" + tagcode;
   client.println(F("POST /arduino/read.aspx HTTP/1.1"));
   Serial.println(F("POST /arduino/read.aspx HTTP/1.1"));
   client.println(F("Host: 192.168.2.50"));
   Serial.println(F("Host: 192.168.2.50"));
   client.println(F("Content-Type: application/x-www-form-urlencoded"));
   Serial.println(F("Content-Type: application/x-www-form-urlencoded"));
   client.println(F("Connection: close"));
   Serial.println(F("Connection: close"));
   client.println(F("User-Agent: Arduino/1.0"));
   Serial.println(F("User-Agent: Arduino/1.0"));
   client.print(F("Content-Length: "));
   Serial.print(F("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 (int i=0; i<2000; i++) {
     char c = client.read();
     int abc= (int)c;
     if (abc == -1) break;
     risposta += c;
   }

   Serial.print(risposta);
   Serial.println (F(""));

   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.print(F("Result = "));
   Serial.println(RESULT);
   Serial.print(F("Tagid = "));
   Serial.println(TAGID);
   Serial.print(F("Fullname = "));
   Serial.print (FULLNAME);
   Serial.print(F("Timestamp = "));
   Serial.println (TIMESTAMP);

   //                                Serial.print(F("Ram: "));
   //                                Serial.println(freeRam());

   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 (F("N: "));
     lcd.print (FULLNAME);
     lcd.setCursor (0,1);
     //            lcd.print (F("T: "));
     lcd.print (TIMESTAMP);
     // Serial.print(F("Ram: "));
     // Serial.println(freeRam());
   }
   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(F("connection failed"));
 }
 delay(100);
 client.stop();
}

//int freeRam () {
//  extern int __heap_start, *__brkval;
//  int v;
//  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}


Vedi come va.
Comunque secondo me l'inizializzazione di pippo è errata, forse va messa prima dell'if e non al suo interno.
Title: Re: malfunzionamento display lcd
Post by: menniti on Aug 01, 2013, 10:04 pm

Comunque, mi rimane il dubbio sul quantitativo di memoria.
Hai sostituito tutti i comandi Serial.print("xxxxx"); e lcd.print("xxxxx"); con Serial.print(F("xxxxx")); e lcd.print(F("xxxxx")); ?

Se alleghi lo sketch attuale te lo converto in un attimo.

Scusa Paolo, non ho seguito la discussione ma mi intrometto per un dubbio banale, la modifica che suggerisci è legata a qualcos'altro o è utile in generale con l'IDE 1.0.x? Cioè nel mio firmware, che contiene alcuni lcd.print devo modificarli con "F" per una qualche convenienza o la cosa è legata ad un passaggio che mi è sfuggito qui?
Title: Re: malfunzionamento display lcd
Post by: gpb01 on Aug 01, 2013, 10:10 pm

Scusa Paolo, non ho seguito la discussione ma mi intrometto per un dubbio banale, la modifica che suggerisci è legata a qualcos'altro o è utile in generale con l'IDE 1.0.x? Cioè nel mio firmware, che contiene alcuni lcd.print devo modificarli con "F" per una qualche convenienza o la cosa è legata ad un passaggio che mi è sfuggito qui?


La funzione F() ti permette di mettere stringhe COSTANTI (quindi nessuna variabile) nella "memoria programma" (Flash Memory) invece che nella SRAM (dove normalmente verrebbero messe) lasciando quindi quest'ultima più libera. ;)

Guglielmo
Title: Re: malfunzionamento display lcd
Post by: menniti on Aug 01, 2013, 10:47 pm
Grazie Guglielmo, ho capito che me la devo studiare, mi sono venute istantanee almeno tre domande, quindi è giusto che prima mi faccia un'idea e poi chieda con cognizione di causa...  :~
Title: Re: malfunzionamento display lcd
Post by: gpb01 on Aug 01, 2013, 10:54 pm

Grazie Guglielmo, ho capito che me la devo studiare ...


Scoprirai, purtroppo, che ... la "documentazione" in merito non può certo definirsi eccellente e completa  :( :( :(

Guglielmo

Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:30 pm
Si Michele, la convenienza è che non passi dalla RAM per stampare. E' applicabile solo a del testo costante o con alcuni giri anche al testo variabile (vedi ad esempio l'uso nell'ArduTester).
La funzione F è definita solo a partire dall'IDE 1.0 e si trova in WString.h
Code: [Select]

class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
Title: Re: malfunzionamento display lcd
Post by: leo72 on Aug 01, 2013, 11:42 pm
E la funzione F, come ti ha detto Guglie, funziona solo con le costanti per cui
Code: [Select]
lcd.print(F("Ciao mondo"));
va bene
Code: [Select]
lcd.print(F(var));
non va bene perché gli passi una variabile, che la F() non vuole.
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 01, 2013, 11:45 pm
Perchè non vi ho visto prima quando c'era da risolvere i problemi e spuntate tutti adesso che si parla di F.  :smiley-mr-green:
Title: Re: malfunzionamento display lcd
Post by: leo72 on Aug 01, 2013, 11:47 pm
Perché noi siamo l'assistenza 2.0. Per la 1.0 c'è altra gente preposta  ]:D
Title: Re: malfunzionamento display lcd
Post by: paulus1969 on Aug 02, 2013, 09:39 am
Ritornerei ai primi tre messaggi.
Come lo alimenti? Rispondi : USB.
Sei sempre con l'USB o hai un alimentatore esterno?
Come lo hai collegato? Rispondi indicando un tutorial in cui inizialmente la retroilluminazione è lasciata spenta e poi viene collegata a +5 V.
Come hai collegato la retroilluminazione?

Spesso i caratteri strani sugli LCD dipendono dall'alimentazione.

Usa un alimentatore da 9 V da cui ricavi due linee, alla prima metti lo spinotto di alimentazione, la seconda la fai passare attraverso un 7805 ottenendo così 5 V che userai per alimentare l'LCD ed anche la retroilluminazione mediante un potenziometro così potrai regolare la luminosità.
Se vuoi semplificare, puoi prendere un alimentatore da 9 V con lo spinotto e ricavare la seconda linea (quella che passerà dal 7805) dal PIN Vin. Personalmente preferisco la prima, secondo la filosofia del "meno corrente ci faccio passare dentro, meglio è".
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 10:01 am
Ho risolto il problema, finalmente.
Ora però il controllo accesso prevede che il display oltre a stampare il nome del possessore della tessera stampi anche la data e l'ora dell'avvenuto acceso.
Inizialmente il programma prevedere che il timestamp mi venga dato dalla pagine che mi risponde anche col nome del possessore della tessera, ora però vorrei integrare il tutto con una RTC shield. Come fare?
Io ho un programma singolo che riguarda l'RTC shield e il display ed esso funziona.
Nel momento in cui "unisco" i programmi non mi torna più nulla dalla pagina dandomi un errore e non stampando nulla; l'errore sembra nella libreria wire.h perché nel momento in cui inserisco l'include e carico il programma non funziona, se lo tolgo va.
Come faccio? Vi posto lo sketch sotto dei due programmi (completo senza la parte dell'RTC e quello riguardante l'RTC) grazie milla già ora

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

LiquidCrystal lcd(9, 7, 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)
    ;
  }

  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);
  //                                Serial.print("Ram: ");
  //                                Serial.println(freeRam());
         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 ("N: ");
            lcd.print (FULLNAME);
            lcd.setCursor (0,1);
//            lcd.print ("T: ");
            lcd.print (TIMESTAMP);
           // Serial.print("Ram: ");
           // Serial.println(freeRam());
          }
           
           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();
}

//int freeRam () {
//  extern int __heap_start, *__brkval;
//  int v;
//  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}


Quello singolo riguardante l'RTC
Code: [Select]

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
//#define BACKLIGHT 9
//#define CONTRAST  6
char buffer[10];
RTC_DS1307 RTC;
LiquidCrystal lcd(9, 7, 5, 4, 3, 2);
void setup () {
    //pinMode( BACKLIGHT, OUTPUT );
    //pinMode( CONTRAST, OUTPUT );
    //digitalWrite( BACKLIGHT, HIGH );
    //analogWrite( CONTRAST, 40 );
    Wire.begin();
    RTC.begin();
    lcd.begin(16, 2);
    RTC.sqw(1);
    if (! RTC.isrunning()) {
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}
void loop () {
   
    DateTime now = RTC.now();
    lcd.clear();
    sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
    lcd.setCursor(0,0);
    lcd.print( buffer );
    Serial.print ( buffer );
    char buffer[10] = "";
    sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
    lcd.setCursor(11,0);
    lcd.print( buffer );
    Serial.print ( buffer );
    delay(1000);
}
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 02, 2013, 10:26 am

Ho risolto il problema, finalmente.


Mi piacerebbe sapere quale fosse il problema.  ;)
Per quanto riguarda l'RTC visto che hai la Ethernet potresti pensare di sincronizzarlo con un server NTC.

Se unisci i programmi così come sono è normale ti dia errore. Non puoi duplicare le funzioni e quindi neanche loop() e setup().
Li devi integrare.

Unisci il tutto e poi, se vuoi, posta lo sketch. Così, nel caso, lo si corregge.  :smiley-mr-green:
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 11:31 am
No beh si ovviamente non ho fatto copia incolla di uno sketch sull'altro;)
Comunque il problema stava nel fatto che i contatti su breadboard non erano stabili, é bastato saldarli su una basetta per risolvere il problema. Comunque il programma é il seguente:

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

LiquidCrystal lcd(9, 7, 5, 4, 3, 2);

#define LA3 440
const short buzzer=3;

RTC_DS1307 RTC;

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

EthernetClient client;

void setup() {
Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  lcd.begin (16,2);
  lcd.clear();
     Wire.begin();
     RTC.begin();
     RTC.sqw(1);
          if (! RTC.isrunning()) {
          RTC.adjust(DateTime(__DATE__, __TIME__));
    }
  if(Ethernet.begin(mac) == 0)
  {
    Serial.println("Errore nel configurare Ethernet usando DHCP");
    while(true)
    ;
  }

  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;
         
       }
          {tone(buzzer, LA3);
  delay(300); //Suona il la per 300 millisecondi
  noTone(buzzer);
       lcd.clear();
 
       }
       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;
  char buffer[10];
  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;
    Serial.print ("--");
    Serial.print (data);
    Serial.print ("--");

    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 ("--");
         Serial.print(risposta);
          Serial.print ("--");
         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);
         
         
             DateTime now = RTC.now();
                lcd.clear();
                sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
                lcd.setCursor(0,1);
                lcd.print( buffer );
                Serial.println ( buffer );
                char buffer[10] = "";
                sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
                lcd.setCursor(11,1);
                lcd.print( buffer );
                Serial.println ( buffer );
                delay(1000);
  //                                Serial.print("Ram: ");
  //                                Serial.println(freeRam());
         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.setCursor (0,0); 
//            lcd.print ("N: ");
            lcd.print (FULLNAME);
         //   lcd.setCursor (0,1);
//            lcd.print ("T: ");
         //   lcd.print (TIMESTAMP);
           // Serial.print("Ram: ");
           // Serial.println(freeRam());
          }
           
           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");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("Scheda assente");
  }
  delay(100);
  client.stop();
}

//int freeRam () {
//  extern int __heap_start, *__brkval;
//  int v;
//  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 02, 2013, 11:45 am
Non puoi usare un pin per 2 cose diverse.  Il 3 lo usi già per il display.
Code: [Select]
LiquidCrystal lcd(9, 7, 5, 4, 3, 2);

#define LA3 440
const short buzzer=3;


Devi collegare il Buzzer da un'altra parte.
Puoi usare anche i pin Analogici come ingressi e uscite digitali. (Tranne A4 e A5 perche usi l'RTC che usa quei 2 pin per l'I2C).
Esempio:
Code: [Select]
#define LA3 440
const short buzzer = A0;


Mi da errore in compilazione perché non riconosce
Code: [Select]
RTC.sqw(1);
Dove hai preso la libreria RTC? Link?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 11:57 am
Ora non ricordo, ma mi sembra da qui.. comunque il buzzer funziona e il display anche, nonostante i li abbia settati sullo stesso pin
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 11:59 am
Da qui, scusa mi ero dimenticato di postarlo prima http://playground.arduino.cc/Main/RTC-PCF8563
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 02, 2013, 12:09 pm
Ma come RTC usi l'8563 o il 1307?

Se funziona con il pin condiviso è buona cosa, ma potrebbe portare a dei malfunzionamenti difficili da individuare.

EDIT:
Come libreria RTC io di solito uso questa --> https://github.com/adafruit/RTClib
Ma non ha più il comando per l'sqw. Che in questo caso devi omettere.
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 12:16 pm
Uso 1307..comunque si funziona, io il programma l'ho ultimato con le ultime piccole modifiche che ritenevo necessarie, ora manca solo da concludere il tutto inserendo l'ora passata dalla RTC shield e non presa dalla pagine internet, ma non può essere che la libreria wire.h crei dei problemi con le altre?
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 02, 2013, 12:20 pm
No, posso con una certa sicurezza escludere l'incompatibilità della wire con le altre librerie ufficiali.
L'unica libreria esterna in uso e la RTC che comunque si poggia sulla Wire.
Gli errori sono in fase di compilazione o di esecuzione?
Se sono in fase di compilazione li puoi ricopiare qui?
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 12:25 pm
No nessuno errore di compilazione, solo in fase di esecuzione, lo sketch è questo

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

LiquidCrystal lcd(9, 7, 5, 4, 3, 2);

#define LA3 440
const short buzzer=3;

RTC_DS1307 RTC;

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

EthernetClient client;

void setup() {
Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  lcd.begin (16,2);
  lcd.clear();
     Wire.begin();
     RTC.begin();
     RTC.sqw(1);
          if (! RTC.isrunning()) {
          RTC.adjust(DateTime(__DATE__, __TIME__));
    }
  if(Ethernet.begin(mac) == 0)
  {
    Serial.println("Errore nel configurare Ethernet usando DHCP");
    while(true)
    ;
  }

  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;
         
       }
          {tone(buzzer, LA3);
  delay(300); //Suona il la per 300 millisecondi
  noTone(buzzer);
       lcd.clear();
 
       }
       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;
  char buffer[10];
  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;
    Serial.print ("--");
    Serial.print (data);
    Serial.print ("--");

    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 ("--");
         Serial.print(risposta);
          Serial.print ("--");
         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);
         
         
             DateTime now = RTC.now();
                lcd.clear();
                sprintf(buffer,  "%02d/%02d/%d", now.day(), now.month(), now.year());
                lcd.setCursor(0,1);
                lcd.print( buffer );
                Serial.println ( buffer );
                char buffer[10] = "";
                sprintf(buffer,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
                lcd.setCursor(11,1);
                lcd.print( buffer );
                Serial.println ( buffer );
                delay(1000);
  //                                Serial.print("Ram: ");
  //                                Serial.println(freeRam());
         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.setCursor (0,0); 
//            lcd.print ("N: ");
            lcd.print (FULLNAME);
         //   lcd.setCursor (0,1);
//            lcd.print ("T: ");
         //   lcd.print (TIMESTAMP);
           // Serial.print("Ram: ");
           // Serial.println(freeRam());
          }
           
           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");
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("Scheda assente");
  }
  delay(100);
  client.stop();
}
Title: Re: malfunzionamento display lcd
Post by: PaoloP on Aug 02, 2013, 02:29 pm
A me lo sketch sembra a posto.
Non ho le componenti necessarie per poterlo testare in esecuzione quindi trovo moto difficile aiutarti.  :smiley-sweat:
Title: Re: malfunzionamento display lcd
Post by: Tia38 on Aug 02, 2013, 03:14 pm
Eh infatti é quello che mi sembra molto strano, anche a me sembra ok, grazie mille comunque:)