Schermo LCD: come visualizzare il simbolo ° ?

Ciao a tutti
sono incappato in uno stupido problema che non riesco a risolvere..
ho montato lo schermo LCD classico HD44... e ho inviato tramite arduino una scritta qualsiasi tipo "Cotone 40°".
In realtà il simbolo dei gradi non mi viene visualizzato, ma viene emesso un altro simbolo.
Come posso risolvere?

grazie mille :frowning:

smartgatto:
ho montato lo schermo LCD classico HD44... e ho inviato tramite arduino una scritta qualsiasi tipo "Cotone 40°".
In realtà il simbolo dei gradi non mi viene visualizzato, ma viene emesso un altro simbolo.

Potresti definirlo come uno degli otto simboli custom (funzione createChar) e scrivendolo a schermo con un write(), passandogli l'indice (da 0 a 7) dove hai definito il simbolo!

Puoi dare un'occhiata qui http://arduino.cc/forum/index.php/topic,99890.0.html per disegnare dei caratteri custom senza fatica (si lo so, mi faccio pubblicità :stuck_out_tongue: )

prova con questo:

lcd.print((char)223);

(cambia lcd con quello che hai dichiarato)

Il mio problema è che il progetto finale prevede un sketch con dentro un array tipo questo:

char* lavo[]={"Cotone 60   140'",
              "Cotone 40   125'",
              "Sint.  60    90'",
              "Sint.  40    80'",
              "Misti  40    60'",
              "Rapido 30    30'",
              "Delic. 40    45'",
              "Lana   30    40'"};

Dove ad esempio Cotone 60 140' dovrebbe diventare Cotone 60° 140'

Pensavo fosse più facile! :frowning:

mauroz:
prova con questo:

lcd.print((char)223);

(cambia lcd con quello che hai dichiarato)

seguendo la tabella dei codici ascii dunque dovrei mettere:
lcd.print((char)248);

è giusto?

non ho possibilità di provare, ho solo fatto una breve ricerca nel forum..
ho trovato anche questo, guarda se ti è utile..

e

Ho fatto delle prove...
se metto lcd.print((char)248); mi esce un simbolo tipo una R grossa..

Credo che il problema sia da ricercare nel set di caratteri gestito dal controller HD44780; se fai qualche prova vedrai che hai anche problemi con le vocali accentate.

Ho capito...mannaggia...
il problema è che il mio display non è proprio l'originale ma è uno equivalente (tale162b-d rev a) per cui avrà una tabella diversa dall'originale hitachi..
più tardi ci studio un pò su...

Prova un pò sta roba...

// definizione del carattere °
byte gradi[8] = {
	B01110,
	B01010,
	B01110,
	B00000,
	B00000,
	B00000,
	B00000,
	B00000
};

// Al momento di usarlo vai sulla posizione del display:
lcd.setCursor(x,y);
lcd.print(gradi);

Non è proprio elegante ma funziona
Ciao

smartgatto:

mauroz:
prova con questo:

lcd.print((char)223);

(cambia lcd con quello che hai dichiarato)

seguendo la tabella dei codici ascii dunque dovrei mettere:
lcd.print((char)248);

è giusto?

Il display non usa i codici ashii ma il suo set di caratteri. Esistono 2 versioni principali dei set dei caratteri. La versione HD44780A00: Japanese standard font e il HD44780A02:European standard font oltre a quello personalizzato per il cliente HD44780Bxx.
guarda le specifiche del HD44780:
http://www.adafruit.com/datasheets/HD44780.pdf pagina 17 e 18
il ° corrisponde al 223 se hai la versione A00 del HD44780
Se hai la versione A02 (che suggerisce il R rovesciato) il ° é piú tozzo e corrisponde al 176.

Ciao Uwe

Pelletta:
Prova un pò sta roba...

// definizione del carattere °

byte gradi[8] = {
B01110,
B01010,
B01110,
B00000,
B00000,
B00000,
B00000,
B00000
};

// Al momento di usarlo vai sulla posizione del display:
lcd.setCursor(x,y);
lcd.print(gradi);




Non è proprio elegante ma funziona
Ciao

Sei sicuro che funziona cosi? e non come descritto nella libreria?

Ciao Uwe

Giusto Uwe, errore mio... andavo a memoria.
Fortuna che ci sei tu a vigilare :slight_smile:

Oltre a quanto detto da Uwe, c'è da specificare la questione sollevata da Menniti, e cioè il set di caratteri. Gli LCD HD44780 usano il set ASCII standard solo fino al 128° carattere (ASCII da 0 a 127). Oltre il 128° carattere è un po' una giungla.
Quindi segui il consiglio di Pelletta: ridefinisci un carattere e poi usa il suo codice per stamparti il simbolo dei gradi.

Grazie a tutti,
domani, quando arriverò a casa, proverò la soluzione di Pelletta..

leo72:
fino al 128° carattere (ASCII da 0 a 127). Oltre il 128° carattere è un po' una giungla.

E' così perché lo standard ASCII definisce i caratteri solo da 0 a 127, i primi 32 (0-31) sono valori riservati per i vari comandi, p.e. new line o carriage return, dal trentaduesimo (32-127) in poi c'è l'alfabeto occidentale con tutti i simboli di uso comune, i caratteri dal 128 in poi servono per localizzazioni, alfabeti diversi, caratteri speciali, etc, e non sono definiti dallo standard.

Eccomi..ho fatto una semplicissima prova con uno sketch d'esempio:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,13,11,10,9,8);
// definizione del carattere °
byte gradi[8] = {
    B01110,
    B01010,
    B01110,
    B00000,
    B00000,
    B00000,
    B00000,
    B00000
};

void setup() {
   lcd.begin(16, 2);
  
}

void loop() {
  lcd.print("Ci sono 24");
  lcd.print(gradi);
}

ma sulla riga lcd.print(gradi); mi restituisce l'errore "call of overloaded 'print(byte[8])' is ambiguous...

come mai? :frowning:

smartgatto:
ma sulla riga lcd.print(gradi); mi restituisce l'errore "call of overloaded 'print(byte[8])' is ambiguous...
come mai? :frowning:

Ovvio, non puoi stampare direttamente un array sotto forma di carattere utente, cosa che aveva già fatto notare Uwe.
Leggiti come usare i caratteri utente sul reference della liquid crystal.

Me l'ero perso..che scemo...comunque ho risolto in un altro modo ancora più semplice:
ho fatto questo sketch:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,13,11,10,9,8);

void setup() {
  lcd.begin(16, 2);
  
}

void loop() {
  for(int x = 127; x < 255; x++) {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Il simbolo: ");
  lcd.print((char)x);
  lcd.setCursor(0,1);
  lcd.print("Il codice: "); 
  lcd.print(x);
  delay(1000);
  }
}

In modo da farmi visualizzare tutti i caratteri con il corrispondente codice e ho scoperto che il simbolo del grado corrisponde al numero 178

EVVIVA :slight_smile:

io lo trovai nel datasheet del mio display! segnato come B11111111. bastò scriverlo e lui spuntò! :smiley: