Translate

Monitoring Kecepatan Angin (Anemometer) dan Arah Mata Angin Wireless Hc-12 Penampil DMD P10 + Fitur Pilih Mode Output

Monitoring Kecepatan Angin (Anemometer) dan Arah Mata Angin Wireless Hc-12 Penampil DMD P10 + Fitur Pilih Mode Output


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitoring keceatan angin dan arah mata angin dengan penampil dmd p10. alat ini memiliki 2 bagian yaitu bagian transmitter dan receiver, untuk transmitter dipasangakan 2 buah sensor, kemudian pada bagian receiver dipasangkan panel dmd p10 dengan komunikasi secara wireless. untuk lebih jelasnya berikut adalah koding dan skemanya.



1. Skema



2. Program Transmitter

#include <Wire.h>  // i2C Conection Library
#include <SoftwareSerial.h>
SoftwareSerial dataserial(7, 6); // D7,D6
String data, arah_angin, s_angin;
int a, b;
int arahnya;
int kecepatanangin;

// anemometer parameters
volatile byte rpmcount; // count signals
volatile unsigned long last_micros;
unsigned long timeold;
unsigned long timemeasure = 2.00; // seconds
int timetoSleep = 1;               // minutes
unsigned long sleepTime = 15;      // minutes
unsigned long timeNow;
int countThing = 0;
int GPIO_pulse = 2; // Arduino = D2
float rpm, rps;     // frequencies
float radius = 0.1; // meters - measure of the lenght of each the anemometer wing
float velocity_kmh; // km/h
float velocity_ms;  //m/s
float omega = 0;    // rad/s
float calibration_value = 2.0;

void setup() {

  Serial.begin(9600);
  dataserial.begin(9600);
   
  pinMode(GPIO_pulse, INPUT_PULLUP);
  digitalWrite(GPIO_pulse, LOW);

  detachInterrupt(digitalPinToInterrupt(GPIO_pulse));                         // force to initiate Interrupt on zero
  attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); //Initialize the intterrupt pin
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
  timeNow = 0;
 
}

void loop()
{
  bacaarahangin();
  
  //Measure RPM
  if ((millis() - timeold) >= timemeasure * 1000)
  {
    //countThing++;
    detachInterrupt(digitalPinToInterrupt(GPIO_pulse)); // Disable interrupt when calculating
    rps = float(rpmcount) / float(timemeasure);         // rotations per second
    rpm = 60 * rps;                                     // rotations per minute
    omega = 2 * PI * rps;                               // rad/s
    velocity_ms = omega * radius * calibration_value;   // m/s
    velocity_kmh = velocity_ms * 3.6;                   // km/h
    kecepatanangin = velocity_ms * 100;    
    timeold = millis();
    rpmcount = 0;
    attachInterrupt(digitalPinToInterrupt(GPIO_pulse), rpm_anemometer, RISING); // enable interrupt
  }

Serial.print("*");
Serial.print(kecepatanangin);
Serial.print(",");
Serial.print(arahnya);
Serial.println("#");

/*
Serial.print(velocity_ms);
Serial.print(",");
Serial.println(arahnya);
*/
 
 delay(100); 
}

void rpm_anemometer()
{
  if (long(micros() - last_micros) >= 5000)
  { // time to debounce measures
    rpmcount++;
    last_micros = micros();
  }
}

void bacaarahangin(){

 if (dataserial.available()) // Jika ada data yang diterima dari sensor
  {
    data = dataserial.readString(); // data yang diterima dari sensor berawalan tanda * dan diakhiri tanda #, contoh *1#
    a = data.indexOf("*"); // a adalah index tanda *
    b = data.indexOf("#"); // b adalah index tanda #
    s_angin = data.substring(a + 1, b); // membuang tanda * dan # sehingga di dapat nilai dari arah angin
    if (s_angin.equals("1")) { // jika nilai dari sensor 1 maka arah angin utara
      arah_angin = "utara     ";
      arahnya = 1;
    }
    if (s_angin.equals("2")) {
      arah_angin = "timur laut";
      arahnya = 2;
    }
    if (s_angin.equals("3")) {
      arah_angin = "timur     ";
      arahnya = 3;
    }
    if (s_angin.equals("4")) {
      arah_angin = "tenggara  ";
      arahnya = 4;
    }
    if (s_angin.equals("5")) {
      arah_angin = "selatan   ";
      arahnya = 5;
    }
    if (s_angin.equals("6")) {
      arah_angin = "barat daya";
      arahnya = 6;
    }
    if (s_angin.equals("7")) {
      arah_angin = "barat     ";
      arahnya = 7;
    }
    if (s_angin.equals("8")) {
      arah_angin = "barat laut";
      arahnya = 8;
    }

  }
}


3. Program Receiver

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x27, 16, 2);

#include <SPI.h>        //SPI.h must be included as DMD is written by SPI (the IDE complains otherwise)
#include <DMD.h>        //Library DMD yang menyediakan fungsi penampilan teks, gambar dsb
#include <TimerOne.h>   //Library peripheral Timer1 untuk menjalankan prosedur pindai panel DMD
#include <Time.h>     //Library waktu yang menyediakan tipe data, struktur, dan obyek waktu
#include "Arial_black_16.h"
#include "Arial_Black_16_ISO_8859_1.h"
#include "Arial14.h"
#include "DejaVuSans9.h"
#include "Droid_Sans_12.h"
#include "Droid_Sans_16.h"
#include "DejaVuSansItalic9.h"
#include "Mono5x7.h"
#include "SystemFont5x7.h"

#define WAKTU_TAMPIL_JAM      10    //detik
#define WAKTU_TAMPIL_KALENDAR 5     //detik

#define DISPLAY_COLUMN_COUNT  2
#define DISPLAY_ROW_COUNT     1

#define PIXELS_PER_COLUMN  32
#define PIXELS_PER_ROW    16

DMD dmd(DISPLAY_COLUMN_COUNT, DISPLAY_ROW_COUNT);
unsigned char show = 0;

char lineBuff[20];
char lineBuff2[20];
char strsms[5];

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int tbup = 4;
int tbdown = 5;
int tbset = A0;
int tbok = A1;

int tbupx;
int tbdownx;
int tbsetx;
int tbokx;
int alarm;
unsigned int mode;
int relay = A2;

float speednya;
int arah;

int datain1;
int datain2;
int datain3;

String dataIn;
String dt[10];
int i;
boolean parsing = false;

void ScanDMD()
{
  dmd.scanDisplayBySPI();
}

void setup()
{
  Serial.begin(9600);
  lcd.begin();
  lcd.clear();
  lcd.noCursor();
  pinMode(tbup,INPUT_PULLUP);
  pinMode(tbdown,INPUT_PULLUP);
  pinMode(tbok,INPUT_PULLUP);
  pinMode(tbset,INPUT_PULLUP);
  pinMode(relay,OUTPUT);
   
  dataIn="";

  dmd.clearScreen( true );   //true is normal (all pixels off), false is negative (all pixels on)
   //initialize TimerOne's interrupt/CPU usage used to scan and refresh the display
  Timer1.initialize( 1000 );           //period in microseconds to call ScanDMD. Anything longer than 5000 (5ms) and you can see flicker.
  Timer1.attachInterrupt( ScanDMD );   //attach the Timer1 interrupt to ScanDMD which goes to dmd.scanDisplayBySPI() 
  //clear/init the DMD pixels held in RAM
  dmd.clearScreen( true );

}

void loop()
{

  tbupx = digitalRead(tbup);
  tbdownx = digitalRead(tbdown);
  tbsetx = digitalRead(tbset);
  tbokx = digitalRead(tbok);

 sprintf(lineBuff, "%s    ", dtostrf(speednya, 5, 2, strsms));
 dmd.selectFont(Droid_Sans_12);
 dmd.drawString( 33,  3, lineBuff, strlen(lineBuff), GRAPHICS_NORMAL);  

 if(mode == 0){
 if(arah == 1){
 sprintf(lineBuff2, "UTARA      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
 
 if(arah == 2){
 sprintf(lineBuff2, "TMRLT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 3){
 sprintf(lineBuff2, "TIMUR      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 4){
 sprintf(lineBuff2, "TNGGR ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

  if(arah == 5){
 sprintf(lineBuff2, "SELTN ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 6){
 sprintf(lineBuff2, "BRTDY ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 7){
 sprintf(lineBuff2, "BARAT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 8){
 sprintf(lineBuff2, "BRTLT ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 0,  0, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
   
 }

 if(mode == 1){
 if(arah == 1){
 sprintf(lineBuff2, "N 0     ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
 
 if(arah == 2){
 sprintf(lineBuff2, "NE 45     ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 3){
 sprintf(lineBuff2, "E 90      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 4){
 sprintf(lineBuff2, "SE135      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

  if(arah == 5){
 sprintf(lineBuff2, "S 180      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 6){
 sprintf(lineBuff2, "W 225      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 7){
 sprintf(lineBuff2, "w 270      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }

 if(arah == 8){
 sprintf(lineBuff2, "WN 310      ", arah);
 dmd.selectFont(DejaVuSans9);
 dmd.drawString( 3,  3, lineBuff2, strlen(lineBuff2), GRAPHICS_NORMAL); 
 }
   
 }
 
  if(tbupx == 0){
    delay(200);
    alarm++;
  }

  if(tbdownx == 0){
    delay(200);
    alarm--;
  }

if(alarm < 0){
  alarm = 0;
  }

  if(tbsetx == 0){
    delay(200);
    dmd.clearScreen( true ); 
    mode++;
  }

  if(tbokx == 0){
    delay(200);
    dmd.clearScreen( true ); 
    mode--;
  }

  if(speednya > alarm){
    digitalWrite(relay,HIGH);
  }

  if(speednya <= alarm){
    digitalWrite(relay,LOW);
  }

  if(mode > 1){
   mode = 1; 
  }

  if(mode < 0){
   mode = 0; 
  }

  lcd.setCursor(0, 0);
  lcd.print("AL:");
  lcd.print(alarm);
  lcd.print(" ");

  lcd.setCursor(0, 1);
  lcd.print("MODE:");
  lcd.print(mode);
  lcd.print(" ");
  
while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
   
 parsingData();

 }
}

void parsingData(){
int j=0;

//kirim data yang telah diterima sebelumnya
//Serial.print("data masuk : ");
//Serial.print(dataIn);
//Serial.print("\n");

//inisialisasi variabel, (reset isi variabel)
dt[j]="";
//proses parsing data
for(i=1;i<dataIn.length();i++){
//pengecekan tiap karakter dengan karakter (#) dan (,)
if ((dataIn[i] == '#') || (dataIn[i] == ','))
{
//increment variabel j, digunakan untuk merubah index array penampung
j++;
dt[j]="";       //inisialisasi variabel array dt[j]
}
else
{
//proses tampung data saat pengecekan karakter selesai.
dt[j] = dt[j] + dataIn[i];
}
}

 datain1 = dt[0].toInt();
 datain2 = dt[1].toInt();

 speednya = datain1 / 100.0;
 arah = datain2 / 1;
 
 Serial.print(speednya);
 Serial.print(":"); 
 Serial.println(arah); 
 
}


4. VIDEO HASILNYA




No comments:

Post a Comment