Invio sms e carattere ° (gradi)

Salve ragazzi, sono alle prese con un ennesimo problema!!! Con un modulo gsm devo inviare una stringa contenente il carattere ° ( gradi) ma non riesco a capire come inserirlo. Ho "trovato" il carattere nella tabella ASCII estesa ma : 1) Arduino la supporta 2) come inserirlo nella stringa

Premetto che ho letto di tutto, ho le lacrime agli occhi e non è allergia... :-)

Intanto provo e riprovo

Grazie

Dunque, bel problema. il char di arduino è signed, quindi non puoi avere valori > 127 (niente tabella estesa) Però forse puoi fregarlo se scrivi un byte (arrivi a 255)

A questo punto però, bisogna vedere se il cellulare/la rete gsm che riceve supporta la ascii estesa... probabilmente la rete la supporta, non ho mai avuto cellulariu stra-moderni, ma ricordo che alle volte i messaggi inviati a marche diverse alcuni simboli "saltavano"

lesto:
il char di arduino è signed, quindi non puoi avere valori > 127 (niente tabella estesa)
Però forse puoi fregarlo se scrivi un byte (arrivi a 255)

Un dato di tipo char è compreso tra 127 e -128 se interpretato come numero, tra 0 e 255 se interpretato come carattere con relativa interpretazione nella tabella ASCII o altro formato di decodifica.

Il reference di Arduino riporta però sì che il char va da -128 a 127 ma che se si vuole usare il range 0-255 bisogna usare il "byte", che poi è un alias di "unsigned char". Inoltre il Playground riporta questa tabella come quella dei caratteri ASCII supportati da Arduino: http://www.arduino.cc/en/Reference/ASCIIchart ma vanno da 0 a 127, che sono l'ASCII "regolare", la tabella ASCII estesa (128-255) se non ricordo male non è standard per cui ognuno la implementa come vuole. Dico male?

leo72: Il reference di Arduino riporta però sì che il char va da -128 a 127 ma che se si vuole usare il range 0-255 bisogna usare il "byte", che poi è un alias di "unsigned char".

State facendo un sacco di confusione tra il valore numerico, che per il char effettivamente va da 127 a -128, e l'interpretazione ASCII del valore contenuto in un char che spazia da 0 a 255. Se in C definisco una variabile come char questa può contenere sia un numero, e in questo caso va da 127 a -128, oppure un carattere alfanumerico e in questo caso il valore spazia da 0 a 255, come il C interpreta il contenuto della char dipende da cosa ci si mette dentro durante l'inizializzazione della stessa. Chi ama scrivere in modo prolisso in C normalmente usa mettere il prefisso signed prima di char per facilitare l'identificazione del tipo di valore contenuto nella variabile, da notare che anche in Wiring è possibile usare la stessa notazione. Il problema con la parte estesa, da 128 a 255, della tabella ASCII è proprio che non è standard quindi rischi di vedere caratteri diversi da quelli attesi oppure di non vedere proprio nulla. La tabella nel playground è semplicemente lo standard ASCII, Arduino non sa nemmeno cosa sia, è il programmatore che deve tenere conto di queste cose.

Chiaro come al solito. Grazie delle delucidazioni.

Giusto per fare totale chiarezza sulla cosa ho modificato lo sketch di esempio che stampa la tabella ASCII per visualizzare tutti e 255 i valori e non solo fino a 126 come nell'originale. Una volta avviato il programma sul terminale seriale appaiano i vari caratteri corrispondenti al valore numerico contenuto sotto forma del carattere corrispondente alla tabella ASCII in uso sul pc (code page) per tutta l'estensione da 32 (spazio) a 255, la parte oltre 127 sono i vari simboli speciali e le accentate che non fanno parte della tabella standard. Da notare che è possibile usare la variabile char anche per il ciclo con la differenza che il confronto si fa su -1 invece che su 255 perché con uno char tale è l'interpretazione numerica, -1 = 11111111 = 255.

char caratteri=32;  // variabile char che contiene caratteri
unsigned char ciclo=32; // variabile unsigned char che conta fino a 255 per il ciclo.

void setup() 
{ 
  Serial.begin(9600); 

  // prints title with ending line break 
  Serial.println("ASCII Table ~ Character Map"); 
} 


void loop() 
{ 
  Serial.print(caratteri);//, BYTE);    

  Serial.print(", dec: "); 
  Serial.println(ciclo, DEC);  

  if(ciclo == 255) while(1);
  //  if(caratteri == -1) while(1); 

  // go on to the next character
  caratteri++;
  ciclo++;  
}

Gentilissimo astrobeed!!!
Secondo te qual è il miglior metodo per provare ad inviare dei caratteri di prova al modulo gsm.
Mi spiego la stringa accettata dalla funzione di invio sms è del tipo char ed io vorrei inviare una stringa del tipo
" la temperatura in casa è di 24 °C"
succede che se inserisco il carattere ° il messaggio, sul telefono, termina il carattere precedente al simbolo °

mimmofire: Mi spiego la stringa accettata dalla funzione di invio sms è del tipo char[] ed io vorrei inviare una stringa del tipo " la temperatura in casa è di 24 °C"

Il problema è se il telefono ha il carattere ° , se non c'è non puoi fare nulla, se c'è devi scoprire a quale valore numerico corrisponde.

Da "pragmatic programmer", io taglierei la testa al toro TOGLIENDO quel carattere. Se ricevi 24C capisci che si tratta di 24°C, non ti pare? XD XD

:) Leo sono d'accordo con te infatti per adesso il programma funziona così un bel "24 gradi" e tutto fila liscio, ma purtroppo non ci dormo la notte!!! Ci deve pur essere una soluzione. :astonished:

mimmofire: Ci deve pur essere una soluzione. :astonished:

La soluzione c'è se il tuo telefono ha il ° nel set di caratteri visualizzabile, se non è presente non c'è soluzione.

Astrobeed infatti l'avevo pensato e sto provando ad inviare sms su diverse tipologie di telefono ma fino ad adesso nulla.... Nokia fascia 30€ Samsung NGM

Ciao,

dato che stai tentando di inviare un SMS presumo tut utilizzi un modulo GSM oppure un telefonino, il "problema", oltre che la mappa caratteri dell'Arduino e' la codifica caratteri utilizzata per gli SMS.

Comando AT+CSCS

AT+CSCS=? ti dovrebbe dare la lista delle codifiche carattere supportate dal modulo.

Ad esempio un modulo GSM come il Telit con firmware 6 supportano:

"GSM" (alfabeto di defualt) “IRA” - ITU-T.50 ossia International Reference Alphabet ”8859-1” - ISO 8859 Latin 1 ”PCCP437” - PC character set Code Page 437. “UCS2” - 16-bit universal multiple-octet coded character set (ISO/IEC10646)

Pertanto devi vedere quale codifica e' supportata dal tuo GSM in invio, alla ricezione bisogna vedere poi se il set di carattaeri e' disponibile nel telefonino di destinazione (altrimenti in genere si passa alla codifica caratteri standard).

Poi devi vedere se utilizzi la codifica degli SMS di tipo PDU o testuale (presumo la modalita' testuale dato che quella PDU e' un " po' " pesante da implementare). Non ricordo se tutte i set caratteri siano disponibili nell'una o nell'altra modalita'.

Ciao, Marco.

Grazie Marco, provero' subito e postero' i risultati... Ciao, Mimmo

Mi sto un attimino incasinando, forse l’IDE1.0 ha un bug ?

mi spiego

provate a fare
Serial.println ( "Temp°µ" ), i codici li ho trovati lanciando lo sketch di Astro e sarebbero °, dec: 176 µ, dec: 181 -

il serial monitor dell’IDE1.0 mi stampa

Temp°µ

Cioe’ i due caratteri sono corretti, ma mi ci aggiunge questa A con cappello “” prima di ogni carattere
in parole spicciole aggiunge da solo un bel codice ascii 194 senza che nessuno lo richieda

Seconda questione,
ho notato che inserire o meno lo ZERO prima della numerazione fa cambiare discorso al tutto

cioe’ sul pc se si fa ALT0176 appare il grado °
ma se si toglie lo zero ALT176 appare altro ?

questo non e’ vero invece per la tabella standard ascii, perche’ scrivere la tilde lo si fa sia con zero che senza:
ALT0126 ~
ALT126 ~

Perche’ sta cosa ?
grazie ad astro per lo sketch ed a chi voglia rispondermi

Arduino ha codificato solo i codici ASCII da 0 a 127, l’ASCII ANSI per capirsi. I caratteri sopra al codice 128 non sono ANSI quindi ciò che vedi sul PC dovrebbe dipendere dal charset in uso sul tuo sistema.

certo, questo e' chiaro, ma qui parliamo di un carattere in piu' quello che leggi in questo post l'ho scritto con il mio pc win7, e come vedi non ci sono cose strane, non c'e' quel carattere aggiunto. e non e' presente nemmeno nello sketch che scrivo nell'ide, esce fuori solo dal serial monitor. fai una prova anche tu un attimo per conferma ?

resta in piedi poi la seconda questione, cosa significa e da dove viene fuori il discorso dello ZERO da aggiungere

Se usi il monitor seriale di Arduino è normale, quello converte nel charset del sistema operativo. Anche sul mio Kubuntu ha scritto la stessa cosa.
I doppi caratteri vengono fuori perché tutti i sistemi moderni usano ormai codifiche a 2 byte perché supportano una marea di caratteri strani.

Ti posso però dire che usando un “terminale” vero e proprio la cosa non succede. Qui sotto vedi uno screeshot preso da gtkTerm, un terminale per Linux basato sulle GTK.

screenshot.png

grazie della prova, molto interessante la cosa. ma secondo te e' normale cosi' ? perche' il serial monitor non dovrebbe fare da terminale ? cosi' come l'altro terminal fa il suo lavoro sarebbe giusto che anche il serial monitor facesse uguale o no ? c'e' un valido motivo per lasciare il serial monitor cosi' come e' ?

sto' giocando con l'lcd i2c del polacco, un aggeggio strano con controller strano

avendo io una funzione

lcd_print("!");

che mi stampa appunto sull'lcd il carattere ascii !

e' facile (non per me) o hai sottomano uno sketch che mi spedisca tutti i caratteri ascii all'lcd ? da 0 a 255. Questo per creare velocemnte la charset di questo coso, senza che sto li' a scrivere manualmente 256 caratteri ? tipo mettendo un delay di 1 secondo ed in 256 secondi mi scrivo la mappa.