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.
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*)'
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!!!!!
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.