0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« on: January 06, 2013, 11:49:21 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7348
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #1 on: January 06, 2013, 12:22:25 pm » |
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;
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« Reply #2 on: January 06, 2013, 03:27:15 pm » |
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
|
|
|
|
« Last Edit: January 06, 2013, 03:32:21 pm by Testato »
|
Logged
|
|
|
|
|
Bergamo
Offline
God Member
Karma: 1
Posts: 585
|
 |
« Reply #3 on: January 06, 2013, 03:43:58 pm » |
Ciao temo che abbiano fatto l'overload dell'operatore + se lo usi con oggetti String e quindi ti converta in stringa i vari operandi: http://arduino.cc/en/Reference/StringPlusprova ad usare un char[] invece che un oggetto String...
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« Reply #4 on: January 06, 2013, 04:00:35 pm » |
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 ? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #5 on: January 06, 2013, 04:10:41 pm » |
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 http://arduino.cc/en/Reference/LiquidCrystalCreateChar
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« Reply #6 on: January 06, 2013, 04:24:29 pm » |
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 
|
|
|
|
« Last Edit: January 06, 2013, 04:33:15 pm by Testato »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #7 on: January 06, 2013, 04:37:46 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« Reply #8 on: January 06, 2013, 04:54:24 pm » |
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)
|
|
|
|
« Last Edit: January 06, 2013, 04:57:25 pm by Testato »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #9 on: January 06, 2013, 05:01:43 pm » |
OK. Ho seguito la discussione a pizzichi e bocconi... sorry.
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Faraday Member
Karma: 17
Posts: 3914
Arduino rocks
|
 |
« Reply #10 on: January 06, 2013, 05:05:15 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
|