[RISOLTO] ARDUINO - Conversione stringa in numero (Intero)

Salve a tutti

dopo tanto tempo, mi ritrovo nuovamente ad aver a che fare con Arduino, e siccome mi sono dimenticato tutto, ho trovato il primo intoppo.

Utilizzando una ethernet shield, leggo un parametro, che ovviamente leggo come stringa, mentre io ho bisogno di passarlo ad un analogWrite().

Ho letto un po' in giro nel forum, ed ho trovato solo alcuni topic che mi sembra risolvano il problema in modo MOLTO faragginoso !!!

E' realmente cosi' complicato convertire una stringa del tipo "123" in un numero 123.
In quasi tutti i linguaggi esiste la funzione val() o int() che converte una stringa "numerica" in un valore.. possibile con con arduino sia cosi' complicato ???

Ho provato anche la funzione atoi con la sintassi miovalore=atoi(miastringa) ma questa non funziona... Cosa non ho capito ?

GRAZIE MILLE

Senza il tuo codice viene difficile capire cosa hai sbagliato.

Per la conversione, senza virgole, si usa atoi() per valori interi, atol() per i long.
Bisogna vedere come ricevi il numero in stringa. Quelle funzioni lavorano con le stringhe e NON con la classe String che è tutta un'altra cosa.
Le stringhe in C sono uno standard e sono vettori/array di caratteri terminati da null ovvero dal carattere '\0'.
La classe String con quei metodi ben precisi è stata scritta per Arduino e NON è standard.
La atoi e atol vogliono una stringa e non una String che è una classe per gestire oggetti.

Ciao Nid,

innanzitutto Grazie per la risposta.

Il codice e' quello che vedi sotto....(ho epurato ..... un poco il codice per evitarti una inutile lunga lettura)

Praticamente attraverso una APP, mando ad arduino un parametro (LEDx seguito dal valore di uno Slider che va da 0 a 255, quindi ad esempio LED5123, dove LED5 sara' il piedino e 123 il valore di intensita'. Estraggo 123 con la funzione .substring, e fin qui tutto bene.
Assegno alla variabile da "brig" 123 ma poi.... non riesco a mettere il suo VALORE dentro brightness.

Nel codice trovi scritto tra //======= quel che mi servirebbe, nel senso che so bene che non esiste la funzione val() in Arduino, ma praticamente a me serve qualcosa del genere :smiley:

GRAZIE

#include <String.h>
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
byte ip[] = { 192, 168, 1, 160 }; 
byte gateway[] = { 192, 168, 1, 10 }; 
byte subnet[] = { 255, 255, 255, 0 }; 
EthernetServer server(88);
int a = 0;
String lamiastringa;
String Tk;
String brig;
char brightness[4];
int fadeAmount = 10;    // how many points to fade the LED by
int lumi5 = 0;  //Luminosita del led
int ledP5 = 5;
int ledP6 = 6; // LED pin
.........
String readString;
boolean LED5 = false;
boolean LED6 = false; 
........

void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
pinMode(ledP5, OUTPUT);
pinMode(ledP6, OUTPUT);
...........

Serial.begin(9600);
}

void loop(){
EthernetClient client = server.available();
if (client) {
 boolean currentLineIsBlank = true;
 while (client.connected()) {
 if (client.available()) {
 char c = client.read();
 readString.concat(c); 
 
 if (c == '\n' && currentLineIsBlank) {
 
lamiastringa=readString;

Serial.println(readString);
//Serial.println(readString.length());

  if (lamiastringa.startsWith("GET /?Led=5")) {
    brig = lamiastringa.substring(11,14);


[color=red]//=================== QUESTA PARTE OVVIAMENTE NON FUNZIONA MA E' DI FATTO QUELLO CHE MI SERVE =====
//=================== Convertire la variabile brig stringa in una variabile brightness int ==================     
 
             brightness = val(brig);

//==============================================================================[/color]

      //analogWrite(ledP5, brightness);}
 
//Serial.println(brightness);
Serial.println("--------");

cgs64:
Assegno alla variabile da "brig" 123 ma poi.... non riesco a mettere il suo VALORE dentro brightness.

Gli oggetti string non si possono convertire con atoi e similari, devono essere array di char, per convertire uno string in char basta usare .c_str(), esempio pratico :

String pippo;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(115200);
 pippo = "12345";
 
 Serial.print(atoi(pippo.c_str()));
}

void loop() {
  // put your main code here, to run repeatedly:
  
}

Ciao Astrobed, grazie per la risposta, ma ... non ho capito :sleeping: , so de coccio !

Come uso il codice da te indicato per avere una variabile NUMERICA con il contenuto del valore della stringa ?
Io no ho bisogno di mandarlo sulla seriale, io ho bisogno di "trattare" il valore all'interno del mio codice.

cgs64:
Ciao Astrobed, grazie per la risposta, ma ... non ho capito :sleeping: , so de coccio !

Il mio era solo un esempio per farti capire la cosa, che poi metti il valore in una variabile, "intero = atoi(pippo.c_str());", oppure la mandi sulla seriale per vederla cambia poco.

nid69ita:
La atoi e atol vogliono una stringa e non una String che è una classe per gestire oggetti.

Non basta scriverlo ? La atoi() non accetta String.
Come detto da @astro, devi convertire String in stringa.

// brightness = val(brig);
brightness = atoi( brig.c_str() );

Poi, il codice da regolamento DEVE essere racchiuso negli appositi tag code (pulsante con pergamena e <>),
sezione 7 del regolamento spiega come fare.

Perfetto... non avevo preso la piccola - ma fondamentale differenza - tra String e stringa

RISOLTO

GRAZIE

:smiley:

nid69ita:
La classe String con quei metodi ben precisi è stata scritta per Arduino e NON è standard.

Eccome se è standard in C++, semmai è l'implementazione fatta in avrgcc che è limitata :slight_smile:

astrobeed:
Eccome se è standard in C++, semmai è l'implementazione fatta in avrgcc che è limitata :slight_smile:

Beh in italiano avevo 5.
Ho scritto "La classe String con quei metodi ben precisi è stata scritta per Arduino e NON è standard."
Intendevo che ha metodi non standard