Pages: [1]   Go Down
Author Topic: Caratteri speciali su Stringa  (Read 1085 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Volendo stampare su lcd un carattere speciale uso la relativa tabella del display con il comando write, ad esempio per il '°' Grado
Code:
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
Code:
Serial.print ("°C");
Oppure
Code:
Serial.write ("°C")
Su serial monitor appare
Quote
°C

All'lcd se invio una stringa con il ° Grado, che equivale a fare:
Code:
lcd.print("°C");
Quote
appaiono 3 caratteri: uno cinese, un trattino, e la C
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9158
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato, ma con la tua formula mi stampa 223, sia su Serial Monitor che su Lcd  smiley-cry

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Bergamo
Offline Offline
God Member
*****
Karma: 1
Posts: 663
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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/StringPlus

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

lucadentella.it

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?  smiley-eek-blue
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Quote
\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  smiley

che bello, oggi ho ricambiato i tanti aiuti avuti dai maestri del forum spiegando una cosa io a  loro  smiley
« Last Edit: January 06, 2013, 04:33:15 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
Condivido con piacere la soluzione, trovata da chi second me e' uno scienziato sul forum internazionale
Quote
\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  smiley

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

Dovrebbe bastare mettere una doppia barra rovesciata per avere il simbolo della barra rovesciata quindi \\337 per avere stampato \337
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5784
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-wink
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Pages: [1]   Go Up
Jump to: