Convertire stringa in numero

Ciao

ho scritto questo codice, ma ho il seguente problema:

non sò come converire il valore contenuto nella stringa in un numero.

lo scopo del codice è leggere da seriale una stringa e accendere o spegnere un led ad esempio se invio da pc la stringa dd041 accendo il led, se invio dd040 lo spengo

scompongo la stringa dd041 in dd 04 1, prevedo 2 cifre per usare le uscite di arduino mega

il problema è che la funzione digital.Write accetta solo i valori numerici.

Non sò se mi sono spiegato..... Qualche suggerimento?

// leggo seriale e accendo il relativo led

String readString; String tipo; String outputpin; String stato;

void setup() {

Serial.begin(9600);

}

void loop() {

pinMode(4, OUTPUT);

while (Serial.available()) { delay(10); if (Serial.available() >0) { char c = Serial.read(); readString += c;} }

if (readString.length() >0) { // Serial.println(readString); tipo = (readString.substring(0,2)); outputpin = (readString.substring(2,4)); stato = (readString.substring(4,5));

Serial.println(tipo); Serial.println(outputpin); Serial.println(stato);

if (tipo == "dd" && stato == "0"){ digitalWrite(int('outputpin'), LOW);

Serial.println("Spengo Led..."); } else if (tipo == "dd" && stato== "1"){ digitalWrite(int('outputpin'), HIGH);

Serial.println("Accendo Led...");

}

readString=""; } }

Invece di scomporre la stringa "04" in "0" e "4" e poi ricomporla lato arduino, spedisci semplicemente il byte 4 (non dico il numero "4", che sarebbe un carattere ASCII di valore 52) ma proprio una variabile byte contente il valore 4. Lato arduino ricevi quel byte e senza fare tanti arzigogoli lo dai in pasto direttamente a digitalWrite.

digitalWrite(PIN, VALORE);

Se devi proprio, puoi usare la funzione atoi()

int valore_intero = atoi(stringa);

Scusate, non capisco.....

l'esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre....

ho provato al funzione atoi ma al momento della verifica mi restituisce l'errore error: cannot convert 'String' to 'const char*' for argument '1' to 'int atoi(const char*)'

fai la stessa cosa che ho fatto io risolta così:

dove String str2=140; //1 sta per ON .... la porta 40 String str2=040; //0 sta per OFF .... la porta 40

void commutaz_dig_port() { String Dport = str2.substring(1,3) + "0"; // trovo il numero della porta Digit .... es: prendo il 40 dalla stringa 140 char thisChar[Dport.length()]; Dport.toCharArray(thisChar, Dport.length()) ; a = atoi(thisChar); //trovo l'intero della stringa String D_on_off = str2.substring(0,1); // prendo il primo numero che sarà 0 nel caso di 040 o 1 nel caso di 140

//Serial.println("-------------incoming atoi(thisChar)------------------- " +str2 + " " + String(a) +" " + D_on_off ); //debug //Serial.println("---------------incoming atoi(thisChar)--------------- " + D_on_off + " " + String(a) +" " + Dport); //debug

if(D_on_off == "0") { digitalWrite(a,0); } if(D_on_off == "1") { digitalWrite(a,1); }

}

puoi usare anche un solo if(D_on_off == mettendo digitalWrite(a,D_on_off);

.... io avevo bisogno di separarle perchè ho altre istruzioni dentro gli if

ciao

kikko_965: Scusate, non capisco.....

l'esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre....

Un byte può andare da 0 a 255.

ho provato al funzione atoi ma al momento della verifica mi restituisce l'errore error: cannot convert 'String' to 'const char*' for argument '1' to 'int atoi(const char*)'

Dipende da che tipo di dati gli hai passato. Atoi accetta char*, non String.

kikko_965:
Scusate, non capisco…

l’esempio del 04 era solo per la prova, in realtà userò le uscite dal 20 al 40 di arduino mega quindi mi servono 2 cifre…

ho provato al funzione atoi ma al momento della verifica mi restituisce l’errore
error: cannot convert ‘String’ to ‘const char*’ for argument ‘1’ to ‘int atoi(const char*)’

Ops: hai dichiarato le stringhe come String, non come array di caratteri…
Immagino tu voglia usare String perché così hai a disposizione ‘substring’

Ti ho scritto una funzione che ti fa la stessa cosa con un array di caratteri, così puoi chiamare atoi :wink:

#include <stdio.h>
#include <stdlib.h>
char *output;

char *splitString(char start, char stop, char* string)
{
 char *output = (char *) malloc(stop-start+1);
 char a = 0;
 char i;
 for (i = start; i <= stop; i++)
 {
  output[a++] = string[i];
 }
 return output;
}

int main()
{
  char *string = "123";
  int intero = atoi(splitString(0,3, string));
  printf("%d", intero);
}

Dichiari fuori da qualsiasi funzione la stringa output.
Poi incolli la funzione splitString all’inizio del listato (subito dopo le variabili globali).
Infine la richiami: prende tre valori (da dove iniziare, dove finire, la stringa su cui operare) e restituisce una stringa con cui puoi fare quello che ti pare :wink:
È un po’ un workaround, ma funziona :wink:

ancora più facile:

atoi( stringa.toCharArray() );

lesto: ancora più facile:

atoi( stringa.toCharArray() );

Forte, non avevo mai usato il tipo String. È fantastico :D

quello che ho scritto prima non è un toCharArray() ? :fearful:

Risolto grazie mille a tutti.

pablos71: quello che ho scritto prima non è un toCharArray() ? :fearful:

woops i pezzi di codice di più di una riga li ho saltati a piè pari pensando faceste la conversione "manuale", mi sono accorto ora che era il codice originale riadattato