Boa Noite Pessoal...
Fiz um sistema para monitorar meu nivel de cx dagua com potenciometro e está funcionando certinho, porem estou tentando agora ler estes mesmos valores do potenciometro em uma interface processing e os dados nao conferem com os dados lidos no serial monitor do arduino ... por exemplo no arduino os valores ficam entre 390 e 410 o que esta correto porem no processing mostra 48 a 57 .... alguem poderia da uma ajuda ...grato
estes são os codigos
ARDUINO
//este programa foi criado usando as condicoes de if
int potPin = 2; // selecione o pino de entrada ao potenciômetro
int LedPin2 = 2;
int LedPin3 = 3;
int LedPin4 = 4;
int LedPin5 = 5;
int LedPin8 = 8;
int LedPin9 = 9;
int LedPin10 = 10;
int LedPin11 = 11;
int LedPin12 = 12;
int LedPin13 = 13; // selecione o pino ao LED
int val = 0; // variável a guardar o valor proveniente do potenciometro
void setup() {
pinMode(LedPin2, OUTPUT);
pinMode(LedPin3, OUTPUT);
pinMode(LedPin4, OUTPUT);
pinMode(LedPin5, OUTPUT);
pinMode(LedPin8, OUTPUT); // declarar o pino ledPin como saída
pinMode(LedPin9, OUTPUT);
pinMode(LedPin10, OUTPUT);
pinMode(LedPin11, OUTPUT);
pinMode(LedPin12, OUTPUT);
pinMode(LedPin13, OUTPUT);
Serial.begin(9600);
delay(1000);
}
void loop() {
val = analogRead(potPin); // ler o valor do potenciômetro
//Serial.println(val);
// int soma=(val);
int soma=(3.57*(val-460));
// Serial.print(soma);
//Serial.println(" Litros");
//delay(200);
if(soma<35){
//Serial.println("caixa vazia");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,LOW);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,LOW);
digitalWrite(LedPin11,LOW);
digitalWrite(LedPin10,LOW);
digitalWrite(LedPin9,LOW);
delay(200);
} if((soma>50)&&(soma<120)){
//Serial.println("valor proximo 100");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,HIGH);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,LOW);
digitalWrite(LedPin11,LOW);
digitalWrite(LedPin10,LOW);
digitalWrite(LedPin9,LOW);
delay(200);
}if((soma>150)&&(soma<200)){
//caso seja 200 litros acende dois leds led
//Serial.print("valor proximo de 200 litros");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,HIGH);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,LOW);
digitalWrite(LedPin11,LOW);
digitalWrite(LedPin10,LOW);
digitalWrite(LedPin9,HIGH);
delay(200);
}if((soma>230)&&(soma<340)){
//caso seja 200 acende 3 leds
//Serial.println("valor proximo 300 litros");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,HIGH);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,LOW);
digitalWrite(LedPin11,LOW);
digitalWrite(LedPin10,HIGH);
digitalWrite(LedPin9,HIGH);
delay(200);
}if((soma>350)&&(soma<420)){
//caso seja 300 acende 4 leds
//Serial.println("valor proximo 400 litros");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,HIGH);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,LOW);
digitalWrite(LedPin11,HIGH);
digitalWrite(LedPin10,HIGH);
digitalWrite(LedPin9,HIGH);
delay(200);
}if((soma>430)&&(soma<500)){
//caso 400 acende 5 leds
//Serial.println("valor eproximo de 500 litros");
digitalWrite(LedPin2,LOW);
digitalWrite(LedPin3,LOW);
digitalWrite(LedPin4,LOW);
digitalWrite(LedPin5,LOW);
digitalWrite(LedPin8,HIGH);
digitalWrite(LedPin13,LOW);
digitalWrite(LedPin12,HIGH);
digitalWrite(LedPin11,HIGH);
digitalWrite(LedPin10,HIGH);
digitalWrite(LedPin9,HIGH);
delay(200);
}
Serial.print(soma);
delay(1000);
}
PROCESSING
import processing.serial.*; //Importa a biblioteca para abrir uma comunicação Serial
Serial myPort; //Instância a biblioteca para a comuniação Serial
int valor_recebido;
void setup() {
size(640, 400);
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600); //Abre uma comunicação Serial com baud rate de 9600
}
void draw() {
background(255);
if (myPort.available() > 0) //Se algo for recebido pela serial
{
valor_recebido = myPort.read(); //Armazena o que foi lido dentro da variável valor recebido
// if (valor_recebido<500 && valor_recebido>10){ valor_pot = valor_recebido;}
}
fill(0);
textAlign(CENTER);
text(valor_recebido,100,100);
// println(valor_pot);
}
Tags:
Oi Vanderley ,bom dia,
Acho que voce tem que ler uma string.
experimente com este exemplo.
Obs: Wanderley, aqui onde estou não tem como testar o code, e desculpe se tiver algum erro de
compilação.
Rui
/*
ARDUINO TO PROCESSING
Read Serial messages from Arduino for use in Processing.
*Even though Serial Library comes with install of Processing, upon first usage, you may be prompted to execute two sudo Terminal
commands after entering your user password*
Created by Daniel Christopher 10/27/12
Public Domain
*/
import processing.serial.*; //import the Serial library
string valor_recebido;
//String serial; // declare a new string called 'serial' . A string is a sequence of characters (data type know as "char")
Serial port; // The serial port, this is a new instance of the Serial class (an Object)
void setup() {
port = new Serial(this, Serial.list()[0], 9600); // initializing the object by assigning a port and baud rate (must match that of Arduino)
port.clear(); // function from serial library that throws out the first reading, in case we started reading in the middle of a string from Arduino
serial = port.readStringUntil(end); // function that reads the string from serial port until a println and then assigns string to our string variable (called 'serial')
serial = null; // initially, the string will be null (empty)
}
void draw() {
while (port.available() > 0) { //as long as there is data coming from serial port, read it and store it
valor_recebido = port.readStringUntil(end);
}
if (serial != null) { //if the string is not empty, print the following
/* Note: the split function used below is not necessary if sending only a single variable. However, it is useful for parsing (separating) messages when
reading from multiple inputs in Arduino. Below is example code for an Arduino sketch
*/
String[] a = split(valor_recebido, ','); //a new array (called 'a') that stores values into separate cells (separated by commas specified in your Arduino program)
println(a[0]); //print Value1 (in cell 1 of Array - remember that arrays are zero-indexed)
println(a[1]); //print Value2 value
}
}
Boa Noite Rui..... obrigado pela ajuda ....
eu usei este codigo que vc postou mais dá erro na linha abaixo , acusa erro do (end)
valor_recebido = port.readStringUntil(end);
Bom dia amigo tenta usar o meu código aqui:
Acho que ele está bem comentado, ele vai plotar o gráfico com o nível recebido. Qualquer coisa é só perguntar!
A sim detalhe eu uso a versão 2.0.3 do processing 32bits não sei se roda nas versões mais novas ou na 64bits, acho que não pois elas costumam dar problemas com alguns comandos (estou ansiosamente a versão 3.0)
import processing.serial.*;
Serial myPort; // Forma que o arduino usa para se comunicar
int xPos = 1; // posicao horizontal do grafico
void setup () {
// tamanho da janela
size(800, 500);
// Busca todas as portas seriais
println(Serial.list());
// Abre a porta que o arduino esta usando (e sempre a primeira)
myPort = new Serial(this, Serial.list()[0], 115200);
// So gera um evento serial se o arduino enviar uma informacao de nova linha
myPort.bufferUntil('\n');
// cor do fundo da tela
background(0);
}
void draw () {
// so tem desenho dinamico logo depende sempre do serial event
}
void serialEvent (Serial myPort) {
// recebe a string do arduino
String inString = myPort.readStringUntil('\n');
if (inString != null) {
// remove os espacos vazios
inString = trim(inString);
// converte para um float o valor e mapeia no tamanho da tela
float inByte = float(inString);
inByte = map(inByte, 0, 1023, 0, height);
// desenha o ponto recebido do arduino
stroke(0, 255, 0);
point(xPos, height - inByte);
// quando terminar a tela volta para o comeco
if (xPos >= width) {
xPos = 0;
background(0);
}
else {
// se nao terminar vai mais um ponto para frente
xPos++;
}
}
}
Boa Noite Carlos.... obrigado por responder.....
Eu usei o seu codigo e dá o erro UNEXPECTED TOKEN : & para a linha que tem esta instrução
myPort.bufferUntil('\n'); .....
qual versão do processing você está usando?
Eu uso a versão 2.2.1
Então existem alguns problemas de portabilidade nas versões mais recentes, tente usar a 2.0.3 que funciona.
Resolvido .... Carlos
Eu usei este exemplo retirado do site processing e funcionou beleza ...... a unica coisa é que eu uso o comando text para mostrar o valor na janela e vai ficando truncado as impressões ou seja vai sendo escrito uma em cima da outra e ficando ilegivel ...... uma outra questão agora que tenho solucionar ...vc saberia como resolver isto ?
// Example by Tom Igoe
import processing.serial.*;
String inByte="";
Serial myPort; // The serial port
void setup() {
size(600,400);
// List all the available serial ports
println(Serial.list());
// Open the port you are using at the rate you want:
myPort = new Serial(this, Serial.list()[0], 9600);
}
void draw() {
while (myPort.available() > 0) {
inByte = myPort.readString();
//println(inByte);
fill(0);
textAlign(CENTER);
text(inByte,20,20);
//funcionando corretamente
}
}
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por