Amigos esta eh pra quem ta a algum tempo mexendo q ao eh o meu caso!! Eu preciso receber um valor numerico de 8 digitos pela serial tentei receber em um array de char e depois converter para um valor numerico so q o valor convertido nao eh o mesmo por exemplo eu recebo 12345678 na varialvel char[9] so q quando eu converto int = int(char[9]) o valor recebido e so 52 um exemplo claro mas a ideia e q os valores se alteram na conversao e isso eh um problema pra mim !! quem puder ajudar agradeço!!! :'( :'( :'( :'(
O programa abaixo vai tentar converter para inteiro a string numérica enviada via serial. Quando for enviado um caracter CR, o programa imprime o valor armazenado.
getInt.cpp
/**
* getInt.cpp
* Converts numerical string into an integer
*
* Author: Marcelo Shiniti Uchimura
* When: Jan '09
*/
byte incomingByte = 0; // for incoming serial data
int value = 0; // for storing the input decimal value
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
if(incomingByte == 13) {
Serial.println();
Serial.println(value, DEC);
value = 0;
}
else
value = value * 10 + incomingByte - 0x30;
}
}
Pode ser usado a funcao atoi() tbm.
#include <WString.h>
#include <Servo.h>
Servo myservo;
int pos = 0; // variable to store the servo position
String str = String(5);
boolean first_time=true;
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
}
void loop()
{
while(Serial.available()){
//recebe dados da serial e armazena em uma string
char c = Serial.read();
str.append(c);
first_time=true;
}
if(first_time){
Serial.println(str);
//converte a string para inteiro
pos = atoi(str);
myservo.write(pos);
delay(15);
first_time=false;
str="";
}
}
Segundo a tabela ascii (padrão de caracteres utilizado), o valor correspondente aos numeros começam a partir de 0x30 = 0; 0x31 = 1; até 9.
Sendo assim, quando você recebe o caractér ‘9’, está recebendo 0x39.
Para converter para decimal, é só subtrair 0x30, como no exemplo citado pelo neuron. Porém, você deve fazer isso a cada posição da string em que estão os dados.
string[0], string[1], string[2], string[3] …
int i=0;
char dados[8];
for (i=0;i<8;i++)
{
dados[i]=dados[i] - 0x30; //Converte da posição 0 até 7
}
Não estou familiarizado com a função atoi(), mas parece que consegue conveter uma string. Caso não consiga converter uma string completa:
int i=0;
char dados[8];
for (i=0;i<8;i++)
{
dados[i]=atoi(dados[i]);//Converte da posição 0 até 7
}
Lembrando que se você tentar lar dados[7], estará lendo apenas a posição 7 da string. Quando você tentou ler char[9], recebeu o valor 0x34 = 52 em decimal.
Obs: se declarar um vetor ou string com 9 posições, elas serão de 0 a 8. Caso leia a posição 9, pode ter erro, ou ler um caracter aleatório.
Pessoal eu gostaria de saber como é que eu consigo fazer um programa em arduino com a finalidade em que eu carregue num switch e o servo rode 95 graus. É para eu fazer uma cancela automatica agradecia que me ajudasem que eu tou a começar a entrar em desespero. Cumprimentos