Ir ao conteúdo

Posts recomendados

Postado

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

 

  • Membro VIP
Postado

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
  • 2 semanas depois...
Postado

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

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!