quarta-feira, 28 de setembro de 2016

Lendo sensores com o processing:

Bom dia pessoal, aqui vai meu tutorial versão 2.0 de um programa que já andou ciscando terrero aqui no fórum, estou falando nada mais nada menos que o processing:


Bem povo vou presumir que você ja é um pouco familiarizado com o processing e sabe linkar ele com o arduino. Ahh não sabe? então reveja meu tutorial aqui

Bom povo, antes de tudo queria dizer que, quando eu começei eu copiava projetos de sites e outros fóruns, acho que quase todo principiante faz isso.Estudando um pouco mais aprendi a adaptar projetos parecidos para as minhas necessidades e , por fim, a criar projetos, de modo que este projeto, assim como alguns aqui no blog, é 100% de minha autoria, escrevi o código linha por linha^^.
Outra coisa que gostaria de falar é que, pra quem quiser sair das fronteiras do monitor serial, o processing acaba sendo bastante atrativo, pois ele é quase uma ide Arduino para java, aqui reina o mundo java, se voce já programou ou sabe fazer algumas paradas, vai se sentir em casa com ele.
Antes de tudo devo dizer que o código no arduino e relativamente simples, vamos a ele:
-----------------------
char valor;
int sensor1=A0;
int sensor2=A1;
int ledcinza = 4;
int ledVerde = 5;
int ledAmarelo = 6;
int ledVermelho = 7;
int converte1;
int converte2;


void setup() {
  // Definir LEDs como OUTPUTs
  pinMode(ledVerde, OUTPUT);
  pinMode(ledAmarelo, OUTPUT);
  pinMode(ledVermelho, OUTPUT);
  pinMode(ledcinza,OUTPUT);
  pinMode(sensor1,INPUT);
  pinMode(sensor2,INPUT);
  
  // Iniciar comunicacao serie
  Serial.begin(9600);
}

void loop() {
  converte1=analogRead(sensor1);
    converte2=analogRead(sensor2);
    converte1=map(converte1,0,1023,0,9);
    converte2=map(converte2,0,1023,0,9);
   
    
    Serial.println(converte1);
  
   
   Serial.print(converte2);
   


  
    delay(40);
    
    
  
    
    
    // Guardar valor lido e recebido do Processing
    valor = Serial.read();
  

  // Se o valor recebido for igual a 1, acender o LED verde
  if (valor == '1')
  {
    digitalWrite(ledVerde, HIGH);
  }

  // Se o valor recebido for igual a 2, desligar o LED verde
  else if (valor == '2')
  {
    digitalWrite(ledVerde, LOW);
  }

  // Se o valor recebido for igual a 3, acender o LED amarelo
  else if (valor == '3')
  {
    digitalWrite(ledAmarelo, HIGH);
  }

  // Se o valor recebido for igual a 4, desligar o LED amarelo
  else if (valor == '4')
  {
    digitalWrite(ledAmarelo, LOW);
  }

  // Se o valor recebido for igual a 5, ligar o LED vermelho
  else if (valor == '5')
  {
    digitalWrite(ledVermelho, HIGH);
  }

  // Se o valor recebido for igual a 6, desligar o LED vermelho
  else if (valor == '6')
  {
    digitalWrite(ledVermelho, LOW);
  }
  else if(valor=='7')
  {
digitalWrite(ledcinza,HIGH);
  }
  else if (valor== '8')
  {
  digitalWrite(ledcinza,LOW);
  
  
}
}
-------------------
Esse codigo pessoal se comunica como se fosse falar com o monitor serial, recebe os dados dos sensores em variaveis, os converte usando a função map("que nada mais eh que uma regra de 3") e os joga na serial. E também criamos um char numa váriavel qualquer, incubida de ler o que acontece na serial e dependendo do valor aciona os comandos.

Agora vem o processing^^. Antes de tudo baixem este arquivo zipado e o descompactemna mesma pasta que forem salvar o arquivo do processing:

ficando assim

ótimo agora copie no processing o seguinte código:
----------------
import processing.serial.*;
Serial port;
PImage LAMP;
PImage LAMP1;
PImage LAMP2;
PImage LAMP3;
int x=0;
int co=0;
int coi=0;
int coa=0;
int cou=0;

String leitura;
String dados;
String divisao;
String conversao1;
String conversao2;
int sensor1;
int sensor2;

void setup(){
  size(600,600);
background(0);
   

fill(124,45,65);
rect(100,20,400,50);

   

LAMP=loadImage("LAMP.png");
LAMP1=loadImage("LAMP1.png");
LAMP2=loadImage("LAMP2.png");
LAMP3=loadImage("LAMP3.png");

textSize(24);
textAlign(CENTER);
fill(255);
text("Eletronica e utilidades",280,52);


 port = new Serial(this,"com5", 9600);

}
void draw(){
  


   while (port.available() > 0){
   leitura=port.readString();
  
   dados=leitura.substring(0,leitura.length());
 String index1=dados.substring(0,1);
 String index2=dados.substring(1);
  
  index2=trim(index2);
  
   sensor1= int(index1);
  sensor2=int(index2);
  print(sensor1);
  print("  ");
println(sensor2);
sensor1 +=1;
sensor2 +=1;
int x=sensor1;
int y=sensor2;

fill(0);
arc(300, 200, 150,140,  PI, TWO_PI);

fill(30,200,130);

arc(300, 200, 150,140,  PI, TWO_PI-(y*TWO_PI/18));

fill(255);
textSize(20);
text("0",200,200);
text("15",215,160);
text("30",245,135);
text("50",295,120);
text("65",355,135);
text("80",385,160);
text("100",400,200);
fill(0);
arc(300, 400, 150,140,  PI, TWO_PI);

fill(110,98,230);
arc(300, 400, 150,140,  PI, (TWO_PI- (x*TWO_PI/18)));


fill(255);
textSize(20);
text("0",200,400);
text("15",215,360);
text("30",245,335);
text("50",295,320);
text("65",355,335);
text("80",385,360);
text("100",400,400);
fill(0,coa,0);
strokeWeight(3);
stroke(98,245,31);

rect(30,430,100,130);
fill(255);
textSize(24);
textAlign(CENTER);
image(LAMP,45,470);
text("SALA",85,460);
fill(0,cou,0);
strokeWeight(3);
stroke(98,245,31);

rect(150,430,100,130);
fill(255);
textSize(24);
textAlign(CENTER);
image(LAMP1,165,470);
text("QUART",205,460);
fill(0,coi,0);
strokeWeight(3);
stroke(98,245,31);

rect(270,430,100,130);
fill(255);
textSize(24);
textAlign(CENTER);
image(LAMP2,285,470);
text("BANH",325,460);
fill(0,co,0);
strokeWeight(3);
stroke(98,245,31);

rect(390,430,100,130);
fill(255);
textSize(24);
textAlign(CENTER);
image(LAMP3,405,470);
text("CORR",445,460);

   }

 if (mousePressed && mouseX > 30 && mouseX < 130 && mouseY >430 && mouseY < 560)
  {
    // Desligar LED roxo
    if (coa == 80)
    {
      port.write("2");
    }
    // Ligar cinza verde
    else
    {
     port.write("1");
    }
  }
  if (mousePressed && mouseX > 150 && mouseX < 250 && mouseY >430 && mouseY < 560)
  {
    // Desligar LED roxo
    if (cou == 80)
    {
      port.write("4");
    }
    // Ligar cinza verde
    else
    {
     port.write("3");
    }
  }
   if (mousePressed && mouseX > 390 && mouseX < 490 && mouseY >430 && mouseY < 560)
  {
    // Desligar LED roxo
    if (co == 80)
    {
      port.write("6");
    }
    // Ligar cinza verde
    else
    {
     port.write("5");
    }
  }
   if (mousePressed && mouseX > 270 && mouseX < 370 && mouseY >430 && mouseY < 560)
  {
    // Desligar LED roxo
    if (coi == 80)
    {
      port.write("8");
    }
    // Ligar cinza verde
    else
    {
     port.write("7");
    }
  }
}

void mouseClicked(){
  
      if(mouseX>270&& mouseX<370 &&mouseY>430 && mouseY<560)
      {
  if(coi==0)
  {
    coi=80;
  }
    else{
      coi=0;
    }
      }
   if(mouseX>390&& mouseX<490 &&mouseY>430 && mouseY<560){
  if(co==0)
  {
    co=80;
  }
    else{
      co=0;
    }
   }
     if(mouseX>150&& mouseX<250 &&mouseY>430 && mouseY<560){
  if(cou==0)
  {
    cou=80;
  }
    else{
      cou=0;
    }
  }
  
     if(mouseX>30&& mouseX<130 &&mouseY>430 && mouseY<560){
  if(coa==0)
  {
    coa=80;
  }
    else{
      coa=0;
    }
  }
}
-------------
Depois 1° compile o do arduino, quando ele tiver ok com a serial compile posteriormente o do processing. Se tudo der certo voce estará vendo uma tela assim:
Essa é a versão 1.0. Na que eu fiz e adaptei ele le 2 sensores e faz 4 acionamentos.

Bem pessoal comentando o código no processing: Antes do void setup voce declara as variáveis que irá precisar, no void setup voce declara o tamanho da tela e a cor de fundo, e a comunicação com o serial do arduino, setando a porta e os bla bla blas.
No void loop voce configura para receber a string do arduino e converter ela para inteiro, pos ela vem na tabela ASCII e faz uma ligeira conversão. Como vem 2 sensores, dividimos a string em 2 com a fórmula de substring, ja implementada em processing e determinados o começo dela e seu tamanho(substring.(0,1)).
apos essa divisão da String é que convertemos a mesma.

int x= int(trim(nomedastring));

E depois a inserimos numa imagem qualquer feito no processing.

Para se fazer um grafico devemos espelha-lo no processing.Assim se formos fazer um retangulo, devemos fazer 1° um com a cor de fundo:
x+=1;
fill(fundo);
 rect(distanciax,distanciay,comprimento,altura);
e outro com uma cor que se destaca:
fill(destaca);
rect(distanciax,distanciay,comprimento,altura-x)
Em que x seria o valor recebido pela serial.
Se seu gráfico precisa de uma "encorpada", antes de jogar no gráfico voce pode fazer uma conversão:x=x*10 ou algo que melhor se adeque ao seu projeto.
E de resto pra acender leds foi usado a função void MouseClicked(){
if(mousex<começodex&& finaldex>mousex &&mouseY<começodey && finaldey>mouseY){

if(cor==0){
cor=80;
}
else{
cor=0;
}
}
--------------
para implementar isso basta criar um retangulo com uma cor linkada a uma variável:
fill(0,cor,0);
rect(coordenadax,coordenaday,valorx,valory);
e assim voce faz tentativa e erro até conseguir fazer o retangulo mudar de cor.

E é isso ahé pessoal, em breve postarei o vídeo.
E como prometido eis o vídeo

Nenhum comentário: