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.
Tags:
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;
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por