Boa tarde pessoal.

Como todos aqui, logo quando aprendemos algo, ou terminamos algum projetinho, ficamos com anseio para o próximo.

Nesse tópico, vou tentar detalhar de forma simples minhas duvidas, para que outros possam usa-lo de referencia para sanar as suas. Inclusive a programação, pois eu tinha um pouco de dificuldade quando pessoal mais experiente escrevia (tentei mastigar ao máximo)

 

 Depois de brincar um pouco com Arduino e depois um pouco com o Processing, agora é hora de faze-los conversar.

 

Pesquisei bastante a respeito (aqui no fórum e em outras fontes) porém, a grande maioria explica o uso do Firmata, e os que abrangem o que quero são muito superficiais, não me fazendo entender.

 

Vou explicar melhor.

Quero fazer o arduino ler sensores de 3 caixas d'água, jogar por bluetooh para o Processing. Primeiro vou tentar rodar usando cabo, só depois preocupo com o bluetooth.

Acredito (não conheço muito do assunto e posso estar completamente errado) que caso use o Firmata e ao abrir o programa, o bluetooth não tiver conectado, vai gerar erro (rodando no Processing gera, já que depende da ligação entre eles pra rodar).

 

Minha ideia é fazer o Arduino jogar sequencialmente na serial uma string, e o programa ler e implementar ela.

 

Programa Arduino (tentei fazer de forma mais simples para o melhor entendimento).

Posteriormente vou converte-los pra uma faixa x de valores ou ate converte-los para hexa, assim padronizo os valores a enviar em 3 digitos e sem virgulas. Assim fica mais organizado na hora de "destrinchar" a string no Processing. Não fiz agora para o programa ficar simples de entender.

int valores[4];//string a ser enviada

 

void setup() {

 Serial.begin(9600);

 valores[0]=222; //valor fixo para indicar inicio

 valores[4]=333; //valor fixo pra indicar fim

 }

 

void loop() {

 

 valores[1] = analogRead(A0);//leitura de sensor

 valores[2] = analogRead(A1);//leitura de sensor

 valores[3] = analogRead(A2);//leitura de sensor

   

  Serial.print(valores[0]);//enviando dados

  Serial.print(valores[1]);//enviando dados

  Serial.print(valores[2]);//enviando dados

  Serial.print(valores[3]);//enviando dados

  Serial.print(valores[4]);//enviando dados

  delay(1000);

  }

 

Processing:

A referencia para serial:

https://www.processing.org/reference/libraries/serial/

 

Código Processing

 

import processing.serial.*;//importa a bibliotece serial

Serial myPort; //forma de comunicacao com o arduino

int a=0;

int b=0;

int c=0;

 

void setup() {

myPort = new Serial(this, Serial.list()[0], 9600);//selecao da porta

 size(640, 360); //tamanho da tela que quer desenhar

 background(0); //cor do fundo

}

 

void draw() {

  while (myPort.available() > 0) {

    String inBuffer = myPort.readString();  

    if (inBuffer != null) {

      println(inBuffer);

    }

  }

  textSize(48);

  stroke(255);

  text("Sensor 01: "+a,100,100);

  text("Sensor 02: "+b,100,140);

  text("Sensor 03: "+c,100,180);

}

Rodando desse jeito, consegui receber na parte inferior do IDE um numero grande (gerado da juncao dos valores).

222xxxyyyzzzlixo. Onde o 222 e o numero iniciador, o XYZ sao os valores lidos no sensor e o restante sao numeros que nao consegui identificar a origem.

As duvidas são:

Como jogar esses valores em uma variável pra depois destrincha-la em uma string?

Estou correto jogando valores fixos de inicio e fim?

Pensei em usar esses valores fixos, para depois que encaixar os valores em uma string no Processing, testar o tamanho e esses pontos de inicio e fim. Caso não tenha o tamanho e esses valores, descartaria a string e partiria para outra leitura antes de colocar os valores errados na tela.

Exibições: 1163

Responder esta

Respostas a este tópico

Corrigi os primeiros erros.

Ignorei que o final da string é sempre /0.

Foi só aumentar a string e não jogar na serial esse final.

Correção do programa no Arduino:

int valores[5];//string a ser enviada

void setup() {
 Serial.begin(9600);
 valores[0]=222; //valor fixo para indicar inicio
 valores[4]=333; //valor fixo pra indicar fim
 }

void loop() {
 
 valores[1] = analogRead(A0);//leitura de sensor
 valores[2] = analogRead(A1);//leitura de sensor
 valores[3] = analogRead(A2);//leitura de sensor
   
  Serial.print(valores[0]);//enviando dados
  Serial.print(valores[1]);//enviando dados
  Serial.print(valores[2]);//enviando dados
  Serial.print(valores[3]);//enviando dados
  Serial.print(valores[4]);//enviando dados
  delay(1000);
  }

Correção no Processing:

import processing.serial.*;//importa a bibliotece serial
Serial myPort; //forma de comunicacao com o arduino
int a=0;
int b=0;
int c=0;
int receb_serial=0;
void setup() {
myPort = new Serial(this, Serial.list()[0], 9600);//selecao da porta
 size(640, 360); //tamanho da tela que quer desenhar
 background(0); //cor do fundo
}

void draw() {
 background(0);
  if (myPort.available() > 0) //Confere se tem algo na serial
  {
    receb_serial = myPort.read(); //Armazena na variavel os valores na serial
  }
  textSize(48);
  stroke(255);
  text("Sensor 01: "+a,100,100);
  text("Sensor 02: "+b,100,140);
  text("Sensor 03: "+c,100,180);
  text("Leitura na Serial: "+receb_serial,100,220);

delay(1000)
}

Agora ele esta enviando: 222XXXYYYZZZ333 (visto na parte inferior da IDE do Processing).

222 - valor que indica o inicio da String

XXX - Valor lido no primeiro sensor

YYY - Valor lido no segundo sensor

ZZZ - valor lido no terceiro sensor

333- Valor que indica o final da string

Do jeito que quero.

Porém, nesse codigo do Processing, coloquei pra imprimir o valor dessa variavel (receb_serial) e esta colocando na tela valores de 48 a 55 ao inves do 222XXXYYYZZZ333.

Sera que estou colocando de forma errada na variável receb_serial? Até tentei mudar de int para long e não fez diferença.

Estou correto jogando valores fixos de inicio e fim?

Tive avanços usando a função charAt(). Porém, veio outro problema. Cada caracter ficou em uma variável. Tem como unir?

Ex:

 char a1;

 char a2;

 char a3;

...

No draw:

  a1=receb_serial.charAt(0);
  a2=receb_serial.charAt(1);
  a3=receb_serial.charAt(2);

Nesse caso, fica assim:

a1 = 2

a2 = 2

a3 = 2

Tem como fazer uma variavel juntando esses numeros?

Ex: int valor = 222;

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço