Volendo stampare su lcd un carattere speciale uso la relativa tabella del display con il comando write, ad esempio per il '°' Grado
lcd.write (0xdf);
Ora mi chiedo, ma come si fa invece a stampare questi caratteri passando per una stringa, la quale poi in secondo momento viene inviata al display ?
Credo sia lo stesso problema del serial monitor, come si fa a stampare su serial monitor questi caratteri ?
Se invio
Serial.print ("°C");
Oppure
Serial.write ("°C")
Su serial monitor appare
°C
All'lcd se invio una stringa con il ° Grado, che equivale a fare:
lcd.print("°C");
appaiono 3 caratteri: uno cinese, un trattino, e la C
Testato:
Ora mi chiedo, ma come si fa invece a stampare questi caratteri passando per una stringa, la quale poi in secondo momento viene inviata al display ?
Purtroppo devi fare i conti con la codifica dei caratteri non standard che non è uguale per tutti i display e sul pc dipende dalla codepage in uso, ovvero non è detto che lo stesso valore binario faccia apparire lo stesso carattere su tutti i display e tanto meno sul serial monitor.
In linea di massima devi comporre una stringa di cui una parte è puramente ASCII e una è in formato binario per inserire i caratteri non standard, p.e.
grazie per il tuo parere, purtroppo ho bisogno di operare sulle stringhe, perche' con due righe riesco a calcolarne la lunghezza, visto che sono variabili in lunghezza.
Non saprei come farlo con i char, non si deve per forza dichiarare la dimensione dell'array ?
E poi onestamente ricambiare tutto quando ora tutto funge, solo per fare apparire un misero simbolo, mi sembra assurdo.
Davvero non c'e' modo di stampare su serial monitor il carattere ° Grado ?
Ti do un suggerimento veramente banale ma credo a te funzionale.
I display HD44780 e compatibili mettono a disposizione alcuni caratteri extra, da 120 a 127 di posizione, se non ricordo male, che l'utente può configurare per i propri gusti. Prendine uno, crealo con il tuo simbolo "°" e sei a posto
Leo il carattere grado fa gia' parte del hd44780, in posizione 0xdf, quindi ricrearlo e spostarlo di posizione non cambierebbe nulla, la locazione passata tramite una concatenazione abbiamo capito che converte tutto in decimale.
Condivido con piacere la soluzione, trovata da chi second me e' uno scienziato sul forum internazionale
\nnn
Is an octal character value that can be used inside literal strings.
The nnn is an octal value between 0 and 377
in pratica questi valori ottali, anche se messi in una stringa non vengono convertiti in decimale.
mi viene in mente quindi il problema contrario, quando qualcuno vorrebbe scrivere via stringa \337, ed invece si ritrova il grado, va al manicomio
che bello, oggi ho ricambiato i tanti aiuti avuti dai maestri del forum spiegando una cosa io a loro
Testato:
Leo il carattere grado fa gia' parte del hd44780, in posizione 0xdf, quindi ricrearlo e spostarlo di posizione non cambierebbe nulla, la locazione passata tramite una concatenazione abbiamo capito che converte tutto in decimale.
I caratteri ASCII sono standardizzati fino al valore 127, oltre ognuno fa un po' come vuole e dipende dalla codifica adottata. Ma $DF vale 223, per cui siamo nel campo dei caratteri extra. Ecco perché alle volte ti appare un carattere strano, altre una coppia di geroglifici (quest'ultimo caso è sintomo di codifica UFT, generalmente, che adotta 2 byte per rappresentare più caratteri). Quindi, per la seriale tutto dipende dalla codifica adottata dal PC su cui la visualizzi.
Su LCD la cosa più semplice è proprio usare un carattere custom che, come detto, hanno un codice che va da 120 a 127, quindi all'interno della tabella ASCII standard. In questo modo almeno sull'LCD non avrai problemi.
Condivido con piacere la soluzione, trovata da chi second me e' uno scienziato sul forum internazionale
\nnn
Is an octal character value that can be used inside literal strings.
The nnn is an octal value between 0 and 377
in pratica questi valori ottali, anche se messi in una stringa non vengono convertiti in decimale.
mi viene in mente quindi il problema contrario, quando qualcuno vorrebbe scrivere via stringa \337, ed invece si ritrova il grado, va al manicomio
che bello, oggi ho ricambiato i tanti aiuti avuti dai maestri del forum spiegando una cosa io a loro
Dovrebbe bastare mettere una doppia barra rovesciata per avere il simbolo della barra rovesciata quindi \337 per avere stampato \337
leo non ci capiamo, il problema non deriva dall'essere dentro o fuori dalla tabella standard ascii, ma dal fatto che concatenando in una stringa un valore esadecimale, sia esso 0xdf che 0x7f, viene convertito in decimale, e quindi viene stampato 223, nel primo caso e 127 nel secondo.
i valori ottali non sono stati presi in considerazione dall'arduino team e questo permette di poter passare comandi all'lcd anche dall'interno di una stringa.
Credo riguardi il discorso che faceva luca, hanno fatto overload dell'operatore + solo per esadecimale e binario (permettetemi i termini, sono cose che vanno oltre le mie conoscenze)
Carissimi,
sono incappato in questo problema proprio oggi. Volevo stampare sulla seriale il carattere grado ( ° ). Leggendo i thread era chiaro che bisognasse utilizzare la codifica ottale \XXX, ma non con il set di caratteri ASCII, bensì UNICODE (probabilmente di default tale è la codifica caratteri usata dal Monitor Seriale di Arduino?!?).
Pertanto sono riuscito a stampare sul Monitor Seriale il carattere Grado utilizzando la stringa "\260".
Grazie vincenzo, con il tuo consiglio abbiamo chiuso il cerchio, effettivamente mi ero fermato al discorso LCD perche' a me serviva su quello, ma nel serial monitor continuava ad essere sbagliato.