problema conversione stringa

buonasera,

premetto che non sono un programmatore e quindi non conosco molto il linguaggio di programmazione di arduino, da 1 a 10 il mio livello è 2.

Sto provando a far comunicare due arduino mega tramite i moduli RS485, nel primo arduino sono collegati ad ogni pin digitale un pulsante che se commutato porterà la suddetta porta in uno stato alto. Ad ogni porta viene assegnato un numero che dovrà essere inviato al secondo arduino tramite la porta seriale, per immagazzinare questo numero uso il codice "String" dato che i numeri a più cifre sono composti da più caratteri. Ho notato che la stringa non può essere usata con il comando Switch case e quindi ho provato ad estrapolare i numeri della stringae metterli in una variabile come "int" ma non ci sono riuscito. Ho cercato su internet ma non ho trovato alcuna soluzione al mio problema.

In parole povere ho dei numeri in una stringa di tipo String ma non li posso usare nel comando Switch fino a quando non li converto in una variabile. Uso Switch perché ogni pulsante commutato nella prima scheda dovrà alimentare delle uscite della seconda scheda.

Non voglio inviato un programma già fatto ma, da autodidatta che sono vorrei una mano a capire come trovare una soluzione anche con esempi così da poter capire e sfruttare al meglio le mie conoscenze.

Spero di essere stato chiaro nella spiegazione del mio problema.

Se qualcuno può aiutarmi ne sarei molto grato e ringrazio tantissimo chiunque spenderà del suo tempo a rispondermi.

int n = atoi (stringa.c_str());

Volendo la classe string mette a disposizione il metodo toInt(), che converte la stringa in un long valutabile in uno switch.

long numero=stringa.toInt();

switch(numero){
}

Altro metodo, spesso sconsigliato, per avere direttamente un int in ricezione è usare il serial parseint.

Ma, guarda
il tuo problema mi pare così banale che non capisco dove tu possa avere intoppi.
di solito non rispondo alle domande degli studenti, per esperienza so che o spariscono dopo aver copiato oppure sono dei "carrelli" pesanti da spingere
comunque oggi faccio eccezione
alcuni punti da chiarire:

  1. quanti sono i "dispositivi" che devi accendere? dici che 26 lettere non ti bastano, ma non dici quanti sono
    una 50ina ti bastano? se sì stai correttamente usando 2 mega, che hanno abbastanza pin
    2 quali sono gli stati che devi comandare: ovvero, in forma differente: schiaccio accendo mollo spengo oppure schiaccio una volta accendo seconda volta spengo terza volta accendo? visto che studi ingegneria monostabile o bistabile?
  2. a me, sarà che penso diverso, ma una serie di pin numerati fa venire in mente una serie di numeri scritti di volta in volta in un byte
    e una serie di numeri in un byte fa venire in mente l'indice di un array di piedini, non userei mai uno switch per enumerare una serie, è indice di poca fantasia
    quindi, cosa ne deriva:
    tu rispondi alle prime domande, e pensa come scandire una serie di piedini invece di fare una caterva di if
    trasmetti l'indice e non il risultato di una cascata di if
    usa l'indice per accendere/spegenere o "cosare come devi cosare la cosa" e hai finito con una manciata di righe invece che con una (no, due, in TX e in RX) enumerazione lunga, triste, banale e priva di sapore
    comunque una bella sfida sarebbe stato usare comunque due UNO e "inventare" anche come far bastare i piedini

lelecuci:
per immagazzinare questo numero uso il codice "String" dato che i numeri a più cifre sono composti da più caratteri. Ho notato che la stringa non può essere usata con il comando Switch case e quindi ho provato ad estrapolare i numeri della stringae metterli in una variabile come "int" ma non ci sono riuscito. Ho cercato su internet ma non ho trovato alcuna soluzione al mio problema.

Allora, ho due punti "generali" ed uno specifico.

Primo punto: non usare mai la classe String. Mai.
Anche se "comoda da usare" per il programmatore, per una piccola MCU come Arduino, che non ha alcun processo "garbage collector", non è in grado di recuperare la memoria utilizzata ad ogni modifica del valore di una variabile String, quindi alla fine ti si blocca Arduino e fine del programmino.

Secondo, si, la "switch" come da reference richiede un valore int o char. Niente stringhe.

Tutto questo è la teoria, ossia norme generali.

Passiamo al tuo caso specifico. Quando si parla di comunicazione tra processi, quindi che non coinvolgono un "umano", è sempre bene evitare di usare stringhe per inviare dati numerici.
Nel tuo caso ti basta un identificativo (l'"indice") di un pulsante, quindi diciamo da 0 in poi, esatto?
E allora perché non mandi un byte senza stare tanto a dannarti con stringhe, numeri da più di una cifra, e conversioni per lo swith?? Ti bastano 256 pulsanti, si? :wink:

Se la comunicazione si limita a dire "è stato premuto il pulsante 21" mandi un byte con valore 21 e basta questo. Se ti serve di poter dire anche quando viene rilasciato, puoi cambiare la codifica, se ti bastano 128 pulsanti puoi mandare il byte 21 per dire che il tasto 21 è on, e sommare 128 per dire che è off (quindi 21+128=149 significa "tasto 21 spento").

Se infine nello stesso canale vuoi prevedere anche altri tipi di informazione, puoi prevedere DUE byte, uno che indica l'operazione (es. 1= tasto on, o 0= tasto off)ed il byte successivo indica il relativo valore (per i comandi "tasto on" e "tasto off" sarà il codice del tasto, a questo punto non serve più sommare 128).Se ad esempio vorrai indicare un valore letto da un sensore potrai inventare un codice 3 (es. "Sensore di temperatura") seguito dal valore (da 0 a 255 ovviamente).
Per fare questo, leggerai dalla seriale prima un byte, ed in base a questo, sempre con switch, leggere il relativo valore dal successivo byte.

Spero che questa descrizione sia chiara, ma nel caso chiedi pure :wink:

Io mi sa che docdoc pensiamo uguale
Questo è il pensiero allo stato puro
Credo che comunque allo stato "commercial grade" lo abbiate inteso senza traduzione

Per iscrizione

Grazie a tutti coloro che mi hanno risposto, sono riuscito a risolvere eliminando la stringa e sostituendola direttamente con una variabile int tramite il comando Serial.parseInt. Per quanto riguarda la risposta del Sig. docdoc è stata molto utile ma ancora non ho bel capito come inviare Byte ed è per questo non sto usando questo metodo, dovrei prima esercitarmi.

Per chi ha richiesto chiarimenti sul mio progetto, praticamente devo creare una specie di console composta da circa una 90 di tasti che dovrà azionare altrettanti attuatori (Led, serrature, solenoidi ecc.). Molti tasti devono essere premuti contemporaneamente e dato che la console dovrà essere posizionata ad una certa distanza dagli attuatori vorrei usare 4 arduino mega o arduino due (due per trasmettere e due per ricevere) che comunicano tramite 4 schede rs485 usando solo due cavi per la comunicazione.

Ringrazio ancora tutti per il tempo speso per rispondere ed auguro una buona giornata a tutti.

lelecuci:
Grazie a tutti coloro che mi hanno risposto, sono riuscito a risolvere eliminando la stringa e sostituendola direttamente con una variabile int tramite il comando Serial.parseInt.

Beh si, la parseInt() però converte una stringa in ingresso in un intero, quindi stai di fatto mandando ancora valori in formato stringa (ossia se mandi il valore numerico 132 di fatto mandi 3 byte "1" "3" e "2", poi il parseInt te li ricompone nel valore numerico 132).

Per quanto riguarda la risposta del Sig. docdoc è stata molto utile ma ancora non ho bel capito come inviare Byte ed è per questo non sto usando questo metodo, dovrei prima esercitarmi.

Per inviare un byte sulla seriale non devi usare Serial.print() ma Serial.write() passando un byte. Ad esempio:

byte valore=132;
Serial.write(valore);

Come dico sempre, quando si pensa ad una comunicazione "tra macchine" è opportuno dimenticarsi di essere un umano e ragionare in modo più vicino alla macchina possibile. Se devi mandare un valore numerico intero minore di 256, usa la write() con un singolo byte. Se ti serve un valore più grande usa gli int, eventualmente unsigned, che sono 2 byte per valori da 0 a 65535. E così via. Se chi trasmette e chi riceve usano la stessa codifica, si "capiscono" molto più facilmente rispetto alle stringhe...

PS: lascia perdere il "Sign.", non siamo così formali, diamoci del "tu"... :wink:

Silente:
Per iscrizione

"Per iscrizione"?... Basta fare clic su "RECEIVE EMAILS"! :slight_smile: