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:

http://arduino.cc/en/Reference/StringObject

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 -> http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga4f6b3dd51c1f8519d5b8fce1dbf7a665

OK, obrigado pelo caminho das pedras! :)

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!

8)

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

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

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??