Go Down

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

Tia38

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)

PaoloP

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.

Tia38

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

PaoloP

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?

Tia38


PaoloP

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?

Tia38

Sempre 224, in entrambi i casi

PaoloP

Bene... nel cilindro non è rimasto più nulla. Non so che altre soluzioni proporti.  =(

Tia38


PaoloP

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.

Tia38

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

PaoloP

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.

menniti


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?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

gpb01


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
Search is Your friend ... or I am Your enemy !

menniti

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...  :~
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

Go Up