CONVERSÃO

Nao consigo entender e nao consigo converter, por favor uma ajuda!

//declaro a variavel
String dados="a";
int servo=56;

//CONVERTO SERVO QUE É UM INTEGER PARA DADOS QUE É UMA STRING
servo = atoi(dados);

//CONVERTO DADOS QUE É UMA STRING PARA SERVO QUE É UM INTEGER
dados = itoa(servo);

qual o problema? :disappointed_relieved:

O teu problema é a definicão de String.
Ora vê aqui:

como o URL indica, a String é um objecto, não um vector de caracteres.

Uma string, é isto: http://arduino.cc/en/Reference/String e se fores ver à libc para AVR, o atoi() lida com vectores de caracteres, não com Strings do Arduino.

Conselho, esquece a String e usa vectores. Lembra-te que o Arduino é um micro de 8 bits. Andar com implementacões de alto nível para algo desnecessário (como a String) só torna as coisas piores.

Para o teu exemplo:

char dados [3]={'a', '\0'};
int servo=56;

//CONVERTO SERVO QUE É UM INTEGER PARA DADOS QUE É UMA STRING
servo = atoi(dados);

//CONVERTO DADOS QUE É UMA STRING PARA SERVO QUE É UM INTEGER
itoa(servo, dados, 10);//em vez de 10, podes colocar 2, ou 8 ou 16 para veres o resultado em base binária, octal ou hexadecimal.

manual do itoa -> avr-libc: <stdlib.h>: General utilities

OK, obrigado pelo caminho das pedras!
:slight_smile:

Faz um mes que tento resolver esta M#R#A, e não consigo, ja li tudo que tem na internet sobre atoi e simplesmente não rola!
Formato do dados vindos pela serial:
17xx21yyy1317xx21yyy1317xx21yyy13...
xx= 00 ate 90
yyy= 000 ate 360
13=fim de dados e o ciclo recomeça.

O objetivo do programa é ler a serial se for 17, os proximos 2 caracteres devem ser enviados pra um servo
depois vem o 21, indicando que os proximos 3 caracteres devem ser enviados pra outro servo
ai vem o 13 indicando que acabaram os dados e o ciclo recomeça.

parte do programa:
int serialIn = 0;
int value = 0;

char valor;
String funcao="";

char dados[]="0";

String Elevacao="";
String Azimute="";
int servoAzimute=0;
int servoElevacao=0;

void loop() {
if (Serial.available() > 0) {
serialIn = Serial.read(); //serialIn == integer
if(serialIn == 13) {
value = 0; //value == integer
}
else
value = value * 10 + serialIn - 0x30;
String valor = String(value);
String funcao = valor.substring(0,2);
String dados = valor.substring(2,5);

if (funcao == "17") {
int servoAzimute = atoi (dados);
myservo.write(servoAzimute);
}

if (funcao == "21") {
int servoElevacao = atoi (dados);
myservo.write(servoElevacao);
}
delay(100);
}
}

ERRO:
cannot convert 'String' to 'const char*' for argument '1' to 'int atoi(const char*)'

Obrigado!

Espero que tenhas lido isto...

bubulindo:
Conselho, esquece a String e usa vectores. Lembra-te que o Arduino é um micro de 8 bits. Andar com implementacões de alto nível para algo desnecessário (como a String) só torna as coisas piores.

int serialIn = 0;
int value = 0; 

char valor;
String funcao="";

char dados[]="0";

String Elevacao="";
String Azimute="";
int servoAzimute=0;
int servoElevacao=0;

void loop() {
if (Serial.available() > 0) {
    serialIn = Serial.read();  //serialIn == integer
          if(serialIn == 13) { //tens a certeza disto? 
             value = 0;  //value == integer
          }
else
value = value * 10 + serialIn - 0x30;
String valor = String(value);
String funcao = valor.substring(0,2);
String dados = valor.substring(2,5);

if (funcao == "17") {                     //isto não funciona strcmp() é o que precisas
    int servoAzimute = atoi (dados);
    myservo.write(servoAzimute);
}

if (funcao == "21") {                     //isto não funciona strcmp() é o que precisas
    int servoElevacao = atoi (dados);
    myservo.write(servoElevacao); 
}
delay(100);
}
}

Depois não sabes exactamente onde comecam os dados... logo antes de mais tens de testar quando comecam os dados e ir descartando o que não importa.

if (Serial.read() == '1') {
   if (Serial.read() == '3') {
      if (Serial.read() == '1') {
         if (Serial.read() == '7') { //próximos dados serão XX
              vect[0] = Serial.read();
              vect[1] = Serial.read();
              vect[2] = '\0';
              azimute = atoi(vect);
              Serial.read(); //2
              Serial.read(); //1
              vect[0] = Serial.read();
              vect[1] = Serial.read();
              vect[2] = Serial.read();
              vect[3] = '\0';
              elevacao = atoi(vect);
}}}}

Sem compilar, isto deve funcionar... 
Mais uma vez NUNCA USES O OBJECTO STRING!!!!!

Ok Bubulindo, chega de string mesmo, mudei o codigo e agora ta "rodando" legal, obrigado pela ajuda!

Hummm... faltou um comentário, voce é o CARA !
:smiley:

Kotch:
Hummm... faltou um comentário, voce é o CARA !
:smiley:

LOL

Boa galera estou tendo um problema na conversão do um float para char para pode enviar do meu Arduíno que esta como escravo para o meu nodeMCU que esta como mestre, porem a fazer a conversão ele esta pegando um valor na tabela ASCII ou dica o valor NULL e não o real valor da variável.

//converter um float para char.
pmestre[0] = char(pox.getHeartRate());
pmestre[1] = char(pox.getSpO2());
//indica o final da arrey de char.
pmestre[3] = ';';

No monitor Serial aparece apenas o valor do pmestre[3] o resto estando como vazio.

E se colocares aqui o resto do código??