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);
}

Exibições: 1629

Responder esta

Respostas a este tópico

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(&apos;\n&apos;);

  // 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(&apos;\n&apos;);

 

  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(&apos;\n&apos;); .....

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
}

}

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço