Caratteri speciali su Stringa

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.

string pippo;
pippo = "Temperatura :" + "25" + 0xDF;

ho provato, ma con la tua formula mi stampa 223, sia su Serial Monitor che su Lcd =(

Secondo me perche' la Stringa e' in base 10 e quindi converte in decimale il DF
Infatti si riceve 223 anche se uso 0b11011111

Ciao

temo che abbiano fatto l'overload dell'operatore + se lo usi con oggetti String e quindi ti converta in stringa i vari operandi:

prova ad usare un char[] invece che un oggetto String...

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 ? :fearful:

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 :slight_smile:

che bello, oggi ho ricambiato i tanti aiuti avuti dai maestri del forum spiegando una cosa io a loro :slight_smile:

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 :slight_smile:

che bello, oggi ho ricambiato i tanti aiuti avuti dai maestri del forum spiegando una cosa io a loro :slight_smile:

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)

OK. Ho seguito la discussione a pizzichi e bocconi... sorry.

:wink:

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

Ciao,
Vincenzo

Ammesso che il carattere ° sia 0xDF, prova con

String Gradi = char(0xDF) + "C";
Serial.print (Gradi);

no cyber non funziona.

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.

Hai il tuo rpimo Karma XD