Ciao a tutti, sono nuovo del forum anche se lo leggo da un po.
Sto cercando di programmare una keypad dalla quale pilotare una radio trasmittente.
Il problema che sto trovando è come passare da una serie di numeri (array) a un gruppo di numeri.
Mi spiego meglio:
se io immetto da tastiera e/o da keypad 14550000 per settare 145.500.00 MHz prima di poterla mandare alla radio devo scomporla in 14 55 00 00,
perchè la radio accetta istruzioni a 5 byte (aggiungo il comando alla fine).
Al momento ho creato questo scketc ma non ne vengo fuori...
Please help me =(
se immetto il dato l'array mi restituisce quello che inserisco ma come faccio a dividerlo come serve a me?
beh, forse mi esprimo non correttamente e per questo chiedo scusa, ma mi avvicino da poco al mondo arduino e sicuramente commetto degli errori o omissis:
con il codice che ho postato succede che dal monitor seriale io scrivo 14550000# e quei serial print mi restituiscono la forma che io voglio xxx.xxx.xx
uno per ogni valore che assume "valore
", vorrei sapere come porter raggruppare valore[1] e valore [2] etc etc
a me in realtà serve che i valori che io immetto come12345678# diventino 12 34 56 78 per poterli poi inviare tramite seriale alla radio.
Un esempio di come invio alla radio è questo:
[code]
void PLL_W() {
int val[5];
val[0]= 14; // valore della frequenza
val[1]= 55; //
val[2]= 00; //
val[3]= 00; //
val[4]= 01; // codice di comando per la scrittura della frequaenza
Serial.write(val[0]);
delayMicroseconds (200);
Serial.write(val[1]);
delayMicroseconds (200);
Serial.write(val[2]);
delayMicroseconds (200);
Serial.write(val[3]);
delayMicroseconds (200);
Serial.write(val[4]);
}
[/code]
Che sia char o int non credo sia molto differente... o almeno credo...
per ottenere ciò che vuoi puoi fare una cosa simile:
Serial.println("MMM.kkk.hh");
Serial.print(valore[0]);
Serial.print(valore[1]);
Serial.print(valore[2]);
Serial.print(".");
Serial.print(valore[3]);
Serial.print(valore[4]);
Serial.print(valore[5]);
Serial.print(".");
Serial.print(valore[6]);
Serial.print(valore[7]);
Serial.println(" MHz");
// Lo trasformiamo in 3 numeri
val[0]= atoi(valore[0]+valore[1]+valore[2]); // valore della frequenza
val[1]= atoi(valore[3]+valore[4]+valore[5]); //
val[2]= atoi(valore[6]+valore[7]); //
val[3]= 00; //
val[4]= 01; // codice di comando per la scrittura della frequaenza
// li inviamo al tuo apparecchio
Serial.write(val[0]);
delayMicroseconds (200);
Serial.write(val[1]);
delayMicroseconds (200);
Serial.write(val[2]);
delayMicroseconds (200);
Serial.write(val[3]);
delayMicroseconds (200);
Serial.write(val[4]);
dovrebbe funzionare...
l'altro metodo che intendevo era quello per cui ad ogni numero compreso tra 0 e 255 corrisponde un carattere (secondo una tabella chiamata ascii) e siccome il valore viene salvato come numero nella variabile e poi convertito in carattere (non è esattamente così ok ma è per capire) e sapendo che secondo le tabelle ascii i numeri sono divisi così:
(n° ascii) 48 -> 0 (carattere)
(n° ascii) 49 -> 1 (carattere)
(n° ascii) 50 -> 2 (carattere)
(n° ascii) 51 -> 3 (carattere)
(n° ascii) 52 -> 4 (carattere)
(n° ascii) 53 -> 5 (carattere)
(n° ascii) 54 -> 6 (carattere)
(n° ascii) 55 -> 7 (carattere)
(n° ascii) 56 -> 8 (carattere)
(n° ascii) 57 -> 9 (carattere)
in teoria atoi() dovrebbe già restituirti il valore del carattere (insomma scrivi 1 lo trasformi con atoi e rimane 1) però non vorrei che 1 lo convertisse in ascii e quindi nella variabile vi sarebbe il valore 50.
in caso fosse così devi convertire ogni singola cifra e sottrarre 48 per avere l'effettivo valore che ti serve.
val[0] = atoi(valore[0] + valore [1]); // serve così la divisione.
val[1] = atoi(valore[2] + valore [3]);
val[2] = atoi(valore[4] + valore [5]);
val[3] = atoi(valore[6] + valore [7]);
se provo a compilare mi restituisce questo errore:
testarrayfreq.cpp: In function 'void loop()': testarrayfreq:39: error: invalid conversion from 'int' to 'const char*' testarrayfreq:39: error: initializing argument 1 of 'int atoi(const char*)'
se inizializzo val come: char val[4];
l'errore è lo stesso.
cmq confermo che con atoi mi restituiva 50, mentre con atof mi restituisce il valore corretto, ossia 1.
mrboss:
allora, ho inizializzato val così:
int val[4];
poi ho aggiunto
val[0] = atoi(valore[0] + valore [1]); // serve così la divisione.
val[1] = atoi(valore[2] + valore [3]);
val[2] = atoi(valore[4] + valore [5]);
val[3] = atoi(valore[6] + valore [7]);
se provo a compilare mi restituisce questo errore:
testarrayfreq.cpp: In function 'void loop()': testarrayfreq:39: error: invalid conversion from 'int' to 'const char*' testarrayfreq:39: error: initializing argument 1 of 'int atoi(const char*)'
se inizializzo val come: char val[4];
l'errore è lo stesso.
cmq confermo che con atoi mi restituiva 50, mentre con atof mi restituisce il valore corretto, ossia 1.
vuol dire passare un valore intero alla funzione quando lei si aspetta un array di caratteri (una stringa)! Inoltre usare l'operatore + vuol dire sommare i due numeri contenuti in valore[0] e valore[1] e non concatenarli.
L'errore di cast che ti riporta è proprio per questi motivi, ti conviene usare un approccio diverso, come quello già consigliato di usare la tabella ascii
Grazie, in effetti la funzione atoi con i valori sommati non mi portava a nulla, l'avevo già provata.
Invece ho risolto in parte con le stringhe.
Ora il problema è trasformare una stringa in un int per passarla al Serial.write
così ottengo la divisione che mi serve ma se provo a scrivere f1, ad esempio Serial.write(f1);
l'errore è: string_freq.cpp: In function 'void loop()': string_freq:35: error: no matching function for call to 'HardwareSerial::write(String&)'
sto cercando di capire come trasformare la stringa in int ma purtroppo non riesco a capire come gestirla.
E' lo scotto del novellino...
dancol90:
Il codice postato non è corretto! Fare questo:
val[0] = atoi(valore[0] + valore [1]);
vuol dire passare un valore intero alla funzione quando lei si aspetta un array di caratteri (una stringa)! Inoltre usare l'operatore + vuol dire sommare i due numeri contenuti in valore[0] e valore[1] e non concatenarli.
L'errore di cast che ti riporta è proprio per questi motivi, ti conviene usare un approccio diverso, come quello già consigliato di usare la tabella ascii
no aspetta in teoria essendo 2 char vado a sommare non il valore ma a concatenare i caratteri un questo caso no?
comunque aspetta un minuto che cerco un mio vecchio codice e vedo come avevo risolto XD
no io dovevo fare il contrario..
allora non ho modo di provarlo ma in teoria il codice dovrebbe essere una cosa così:
questo è quello che dicevo anch'io! è il metodo migliore senza dover usare la classe String...
@mrboss:
Per capire meglio il codice sopra dai un'occhiata qui ASCII - Wikipedia, nota che i "glifi" da '0' a '9' sono contigui e hanno valore fra 48 e 57. Dentro valore troverai proprio un numero fra 48 e 57, basta sottrarre 48 o '0' (per il C un carattere dentro apici singoli corrisponde al suo codice ASCII) per ottenere la cifra che interessa a te!
Magari controlla prima che tutti i caratteri dentro valore siano compresi fra '0' e '9' (notare gli apici, sono caratteri non cifre!!)
Per risparmiare un po' di spazio in ram ti conviene dichiarare valore come un array di char o di byte (occupano la metà di un int, che può tenere numeri molto più grandi ma che in questo caso non ci servono )
Grazie a tutti per l'aiuto.
Ieri poi ho provato con String.substring e sono riuscito nel mio intento.
Poi ho convertito la CHAR in INT e da li è stato facile.
Oggi, con l'aiuto di un amico, ho riscritto tutta la funzione e l'ho resa "universale" nel senso che posso utilizzarla come call per altri comandi.
Appena posso posto il codice, magari può tornare utile a qualcuno...