Go Down

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

gpb01


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


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

Guglielmo

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

PaoloP

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

leo72

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.

PaoloP

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:

leo72

Perché noi siamo l'assistenza 2.0. Per la 1.0 c'è altra gente preposta  ]:D

paulus1969

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 è".

Tia38

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

PaoloP


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:

Tia38

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

PaoloP

#54
Aug 02, 2013, 11:45 am Last Edit: Aug 02, 2013, 11:48 am by PaoloP Reason: 1
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?

Tia38

Ora non ricordo, ma mi sembra da qui.. comunque il buzzer funziona e il display anche, nonostante i li abbia settati sullo stesso pin

Tia38

Da qui, scusa mi ero dimenticato di postarlo prima http://playground.arduino.cc/Main/RTC-PCF8563

PaoloP

#57
Aug 02, 2013, 12:09 pm Last Edit: Aug 02, 2013, 12:14 pm by PaoloP Reason: 1
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.

Tia38

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?

PaoloP

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?

Go Up