0

Processing ve Arduino Gauge Kontrol

Arduino’nun analog pinlerinden değer okumanın ne kadar kolay olduğu internetteki tonlarca bilgiden malum. İşin bu kısmından bahsetmeyeceğim. Google’ye arduino analogRead yada arduino analog değer okuma gibi şeyler yazarsanız karşınıza bir sürü yer gelir.
Bu uygulamada biz arduinodan aldığımız bilgileri bilgisayar ekranında nasıl gauge kontrollerle ekrana yansıtırız ona bakacaz. Simüle etmek için kullanacağımız programımız “processing”. Gerçekten grafiksel işlemlerde  çok başarılı başka programlara ihtiyaç bırakmıyor :).
Tabi uzun uzadıya anlatmak lazım ama ben yazdığım kodlarımı paylaşıyorum. Sonuçta böyle bir görüntü ile karşılaşacaksınız 🙂


Arduino kodları;

// Ardino- Processing Gauge Uygulaması

const int analogInPin_0 = A0; 
const int analogInPin_1 = A1;
const int analogInPin_2 = A2;
const int analogInPin_3 = A3;


      // value read from the pot
float outputValue_0 = 0;   
float outputValue_1 = 0;  
float outputValue_2 = 0;  
float outputValue_3 = 0;  

float sensorValue_0=0;
float sensorValue_1=0;
float sensorValue_2=0;
float sensorValue_3=0;

void setup() {
  // initialize serial communications at 9600 bps:
  Serial.begin(9600);
}

void loop() {
  
  // read the analog in value:
    sensorValue_0 = analogRead(analogInPin_0);
    sensorValue_1 = analogRead(analogInPin_1);
    sensorValue_2 = analogRead(analogInPin_2);
    sensorValue_3 = analogRead(analogInPin_3);
    
  
  // map it to the range of the analog out:
   outputValue_0 = map(sensorValue_0, 0, 1023, 0, 180);
   outputValue_1 = map(sensorValue_1, 0, 1023, 0, 180);
   outputValue_2 = map(sensorValue_2, 0, 1023, 0, 180);
   outputValue_3 = map(sensorValue_3, 0, 1023, 0, 180);



  // print the results to the Serial Monitor:
 Serial.println((String)outputValue_0+","+(String)outputValue_1+","+(String)outputValue_2+","+(String)outputValue_3);


  // wait 2 milliseconds before the next loop for the analog-to-digital
  // converter to settle after the last reading:
  delay(300);
}

Şimdi Sırada gauge sınıfımız;

class gauge{
int angle=180;
float radius;
float indicatorStep=0.0;
int indicatorMax=180;
float oneDegree=0.0174532925; // 1 degree is 0.0174532925 radians
int indicatorCount=0;
int indicatorValueMax;
int indicatorValueMin;
int gaugeHandValue=0;
float lastPos=0;


  gauge(int minVal,int maxVal,float indicatorStep)
  {
  
  radius=calculateOptimizedRadius();
  indicatorValueMax=maxVal;
  indicatorValueMin=minVal;
  this.indicatorStep=indicatorStep;

  }
  
  // indicator Screen Drawing
void drawIndicator(float gaugeHandValue,String gText,color col)
{

 
  fill(33);
  strokeWeight(0.5);
  noStroke();
  rect(-radius,5,radius*2,radius/4);
  rect(-radius/2,radius/6,radius,radius/2);
  fill(255);
  textSize(13);
  textAlign(CENTER);
  text(gText,0,radius/4);
  textSize(25);
  text(map(gaugeHandValue,0,180,0,5),0,radius-radius/2);
  

    // Draw Arcs

    if(gaugeHandValue>180){gaugeHandValue=0;}
    drawGaugeHand(gaugeHandValue);

  
      noStroke();
  
      fill(col,50);
      arc(0,0,radius*2,radius*2,degreeToRadians(180),degreeToRadians(360));
      fill(0,60);
      arc(0,0,radius,radius,degreeToRadians(180),degreeToRadians(360));
      arc(0,0,radius,radius,degreeToRadians(180),degreeToRadians(360));
    // indicator Lines Drawing
   for(float i=0; i<=indicatorMax;i+=indicatorStep)
   {
    stroke(0);
    strokeWeight(1);
    if(indicatorCount % 2==0)
    {
      fill(255,0,0,100);
      line(cos(degreeToRadians(i))*(radius-30), -sin(degreeToRadians(i))*(radius-30),cos(degreeToRadians(i))*radius,-sin(degreeToRadians(i))*radius);
      fill(255);
      float mapVal=i;
      
    
      textSize(15); noStroke();text( nf(map(mapVal,0,180,indicatorValueMax,indicatorValueMin),1,1),cos(degreeToRadians(i))*(radius+25),-sin(degreeToRadians(i))*(radius+10));
    }
    else if(indicatorCount % 2==1)
    {
      line(cos(degreeToRadians(i))*(radius-60), -sin(degreeToRadians(i))*(radius-60),cos(degreeToRadians(i))*radius,-sin(degreeToRadians(i))*radius);  
    }
    indicatorCount++;
  }
     indicatorCount=0;
  // indicator lines drawing finished
  
 // draw indicator circle
    fill(0,0,255);
    noStroke();
    ellipse(0,0,radius/4,radius/4);
 // indicator circle finished
 
}

// indicator Screen Drawing finished
  void drawGaugeHand(float pos)
  {
  stroke(0);
  strokeWeight(3);
  line(0,0,-radius*(cos(degreeToRadians(lastPos))),-radius*(sin(degreeToRadians(lastPos))));
  stroke(255); 
  strokeWeight(2);
  line(0,0,-radius*(cos(degreeToRadians(pos))),-radius*(sin(degreeToRadians(pos))));
  lastPos=pos;
}

float degreeToRadians(float degree){

return degree*oneDegree;
}

float calculateOptimizedRadius(){
  
  float optRadius=(width/4)-(width/8);
  return optRadius;
}


}

Şimdide main.pde Dosyamız

import processing.serial.*;

  Serial arduinoPort;
  int lf=10; // Ascıı lineFeed
  String serialString;
  boolean firstTime=false;
  int gaugeHandValue=0;
  gauge firstGauge,secondGauge,thirdGauge,forthGauge;
  boolean start=false;
  String error;
  float in1,in2,in3,in4;

void setup(){
    fullScreen();
    background(0);
    frameRate(20);
    in1=0.0;in2=0.0;in3=0.0;in4=0.0;
  try{
    arduinoPort=new Serial(this,Serial.list()[0],9600);
    arduinoPort.bufferUntil(lf);
    start=true;

    firstGauge=new gauge(0,5,10); // Gauge indicator maxVal minVal
    secondGauge=new gauge(0,5,10);
    thirdGauge=new gauge(0,5,10);
    forthGauge=new gauge(0,5,10);
  }
  catch(Exception ex){
    error="BAĞLANTI HATASI CİHAZI BAĞLADIĞINIZI KONTROL EDİN\n Cihazınızı Bağladıktan Sonra Programı Kapatıp Tekrar Açın ";
  
  }


}

void draw(){
if(start){
  fill(0);
  stroke(255,30);

if(!firstTime){drawBackgroundLines(); firstTime=true;}
gaugeHandValue++; if(gaugeHandValue>180){gaugeHandValue=0;}
translate(0,10);

    pushMatrix();
    translate(width/4,height/4);
    firstGauge.drawIndicator(in1,"INPUT - A0",color(255,0,0));
    popMatrix();
    
    pushMatrix();
    translate( 3*(width/4),height/4);
    secondGauge.drawIndicator(in2,"INPUT - A2",color(0,255,0));
    popMatrix();
    
    pushMatrix();
    translate( (width/4),3*(height/4));
    thirdGauge.drawIndicator(in3,"INPUT - A3",color(0,0,255));
    popMatrix();
    
    
    
    pushMatrix();
    translate( 3*(width/4),3*(height/4));
    forthGauge.drawIndicator(in4,"INPUT - A4",color(255,165,0));
    popMatrix();


}
else{
    pushMatrix();
    fill(255,0,0);
    textSize(23);
    translate(width/2,height/2);
    textAlign(CENTER);
    text(error,0,0);
    fill(0,255,0);
    textSize(16);
    text("Ekranı Kapatmak İçin Tıklayın",0,textWidth(error));
    popMatrix();
}


}

void serialEvent(Serial p){
  
  serialString=p.readString();
  resolveSerialString(serialString);
  
  
}

void resolveSerialString(String serialData){

  float[] readingValues=float(split(serialData,','));
  in1=readingValues[0];
  in2=readingValues[1];
  in3=readingValues[2];
  in4=readingValues[3];
  println(in2);
  println(in3);
  println(in4);
  

}

void drawBackgroundLines()
{
  translate(0,0);
  stroke(255,20);
  for(int i=0;i<width;i+=20){

    line(i,0,i,height);
  }
  for(int j=0;j<height;j+=20){
  line(0,j,width,j);
  
  }
   fill(255);
   
   textSize(22);
   String companyText="Gauge Processing Uygulaması. ";
   textAlign(CENTER);
   pushMatrix();
   translate(width/2,height/2);
   text(companyText,0,0);
   popMatrix();
  
  fill(255,80);
  textSize(13);
  String author="Author Veysel SARI";
  pushMatrix();
  translate(width/2,(height-40));
  text(author,0,0);
  popMatrix();
  
  


}






void mousePressed(){

  if(mouseButton==LEFT){exit();}
}

kodları kopyalıp çalıştırabilirsiniz.

 

admin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir