Ir ao conteúdo
  • Cadastre-se

Arduino Como utilizar o parseInt() - Arduino


Posts recomendados

Olá.

 

Estou com o seguinte problema, fiz um app que envia dados pro arduino através da comunicações bluetooth. Estou conseguindo receber e ler sem problemas os caracteres, porém, preciso ler números inteiros, quando envio algum número inteiro ele apresenta bugs, como: envio 1000 e recebe 1, ou algo aleatório. Ou seja, meu problema está somente na variável "temporizador" que deveria receber um número inteiro, mas não estou conseguindo utilizar o parseInt corretamente.

 

Obs.: Usei "Serial" no Loop e não "bluetooth" só para teste, mas está ocorrendo o mesmo com o bluetooth, lê e recebe os caracteres, mas não os inteiros.

 

// Definindo as portas RX e TX do ARDUINO
#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11); // RX, TX.
// Fim

// Variáveis 
int k1 = 9;
int k2 = 6; 
int k3 = 5; 
int k4 = 3;
int temporizador;  
String comando;
// Fim

// Desliga tudo
void reset() {

    digitalWrite(k1, LOW);
    digitalWrite(k2, LOW);
    digitalWrite(k3, LOW);
    digitalWrite(k4, LOW);
    
}
// Fim

// Sentido horário
void ligar() {
  
    digitalWrite(k1, HIGH);
    digitalWrite(k2, HIGH); 
    delay(temporizador);
    digitalWrite(k2, LOW);
    digitalWrite(k3, HIGH);

}
// Fim

// Sentido anti-horário
void esquerda() {
  
    digitalWrite(k4, HIGH);
    digitalWrite(k2, HIGH);
    delay(temporizador);
    digitalWrite(k2, LOW);
    digitalWrite(k3, HIGH);
    
}
// Fim


// Configurações Iniciais
void setup() {
  
  bluetooth.begin(9600); // Serial definido por mim.
  Serial.begin(9600);   // Serial do prog. do arduino.

  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(k4, OUTPUT);
  
}
// Fim

// Laço que será executado
void loop() {
  
// Ler informação recebida
while (Serial.available()) 
{
    
     char mode = Serial.read();
     comando += mode; 
     Serial.write(mode);
     temporizador = Serial.parseInt();
     Serial.write(temporizador);
   

// Fim

  if(mode == 'L' || mode == 'R')
  {
    reset();
    ligar();
  }

  else if(mode == 'E')
  {
    reset();
    esquerda();
  }  

  else if(mode == 'S' || mode == 'D')
  {
    reset();   
  }
  break;
}
}
// Fim

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Isso me confirma mais um pouco que esta linguagem arduína dá uma travadinha básica no cérebro...

O que a função faz? Converte binário pra número inteiro em asc-ii? Se for só isso, uma maneira mais direta de se converter um byte numérico de 0  a 9 pra asc-ii sem usar lib é simples: basta somar ou 0x30.

Pra enviar os asc de 12345 p.ex. você deve separar ou decompor o dado e enviar um a um... algo como (em c o primo pobre)

void printf_decimal(unsigned int dado)
{
while(dado)
	{
	serialwrite((dado%10)+0x30)); //envia em asc-ii 
	dado/=10;
	}
}

Se algum dia for implementar isso, deve perceber algo ... 'ohnartse' 😜

 

 

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

boa madrugada!!

 

o que acontece é que a serial do arduino recebe um byte de cada vez (um byte é um dígito),  logo esse seu comando só converte um digito de cada vez e atribui a variável temporizador

temporizador = Serial.parseInt();

e a cada digito recebido ele atualiza o valor da variável temporizador.

eu recomendo que você atribua os valores em uma String e depois faça a conversão, com o comando string.toInt()

 

esse aqui é um exemplo que eu acabei de fazer, ele recebe um valor no monitor serial e pisca o led a quantidade de vezes do valor

/*
code by Matheus Costa
Manaus 23 de março de 2019   01:04
*/
int Byte_recebido;
int valor_inteiro;
String valor_string;
#define led 13


void setup() {
  pinMode(led, OUTPUT);
  Serial.begin(9600);

}
void loop() {
  if(Serial.available()>0){
    Byte_recebido = Serial.read() - 48; //diminui 48 por causa da tabela ascii
    //ele só adiciona os valores na string se for diferentes de 18 (B em maiusculo)
    if(Byte_recebido != 18){
      valor_string = valor_string + Byte_recebido;
    }
  }
  //se ele receber B confirma o final da string
  if(Byte_recebido == 18){
    Serial.println(valor_string);
    Byte_recebido = 0;
    valor_inteiro = valor_string.toInt();
    for(int i = 0; i<valor_inteiro; i++){
    digitalWrite(led,HIGH);
    delay(500);
    digitalWrite(led,LOW);
    delay(500);
    }
    //reseta  o valor da string
    valor_string = "";
  }
}

mas existe um problema no código, enquanto ele não receber B na serial ele continua somando ao valor da string, então pra piscar o led 25 vezes, o comando na seria deve ser "25B"

qualquer dúvida ou dica só comentar 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!