Translate

Membuat Alat Deteksi Warna TCS3200 ARDUINO

Membuat Alat Deteksi Warna TCS3200 ARDUINO


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membueat sebuah alat yang digunakan untuk mendeteksi suatu warna tertentu yang diinginkan dengan menggunakan tombol, jadi alat ini tujuan utamanya yaitu untuk mendeteksi suatu warna tertentu sesuai warna yang disimpan sebelumnya, jika warna yang dideteksi sama dengan warna yang disimpan maka akan menghidupkan relay sebagai tanda kalau warna yang deteksi sudah mencapai target, alat ini menggunakan Arduino sebagai kontroller utamanya dan sensor warna yang digunakan adalah TCS3200. selain fitur warna alat ini juga dilengkapi dengan fitur countdown timer, jadi saat waktu habis relay akan menyala, waktu kita bisa setting sesuai dengan tombol atau input yang diberikan melalui tombol, untuk lebih jelasnya berikut adalah skema dan programnya 




a. Arduino Uno





b. Sensor Warna TCS3200





c. LCD + I2C






d. Program Arduino IDE

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

#define S0 7
#define S1 5
#define S2 2
#define S3 4
#define sensorOut 3
int frequency = 0;

int btset = A0;
int btup = A1;
int btdown = A2;
int btok = A3;

int btsetx = 0;
int btupx = 0;
int btdownx = 0;
int btokx = 0;

int fmerah;
int fgreen;
int fblue;

int simfmerah;
int simfgreen;
int simfblue;

int detik = 0;
int menit = 0;
int jam = 0;
int tanda = 0;

int relay = 8;

int fmerahatas; 
int fmerahbawah; 
int fgreenatas; 
int fgreenbawah; 
int fblueatas; 
int fbluebawah;

int range; 
int simrange; 
int simjam; 
int simmenit; 
 

void setup()
{

 lcd.begin();
 lcd.clear();
 lcd.noCursor();

  pinMode(btset, INPUT_PULLUP);
  pinMode(btup, INPUT_PULLUP);
  pinMode(btdown, INPUT_PULLUP);
  pinMode(btok, INPUT_PULLUP);
 
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);

 pinMode(relay, OUTPUT);
 digitalWrite(relay,HIGH);

  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
 
}


void loop(){

  btsetx = digitalRead(btset);

  btupx = digitalRead(btup);
  btdownx = digitalRead(btdown);
 
  if(btsetx == 0){
  delay(200);
  lcd.clear();
  setrange();
  lcd.clear();
  delay(1000);
  scanning();
 
  }
 
  btokx = digitalRead(btok);
 
  if(btokx == 0){
  delay(200);
  lcd.clear();
  delay(1000);
  setjam();
  lcd.clear();
  delay(1000);
  setmenit();
  tanda = 1;
  }
 
  if(btupx == 0){
  delay(200); 
  lcd.clear();
  tanda = 0;
  }
 
  if(btdownx == 0){
  delay(200);
  lcd.clear();
  tanda = 0;
  }
 
  if(tanda == 0){ 
  lcd.setCursor(0,0);
  lcd.print("SETTING PLEASE   ");
  digitalWrite(relay,HIGH);
  }
 
  if(tanda == 1){
  
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  frequency = pulseIn(sensorOut, LOW);
  fmerah = frequency;
 
  lcd.setCursor(0,0);
  lcd.print("R=");
  lcd.print(fmerah);
  lcd.print(" ");
  delay(100);
 
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  frequency = pulseIn(sensorOut, LOW);
  fgreen = frequency;

  lcd.print("G=");
  lcd.print(fgreen);
  lcd.print(" ");
  delay(100);

  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  frequency = pulseIn(sensorOut, LOW);
  fblue = frequency;
 
  lcd.print("B=");
  lcd.print(fblue);
  lcd.print("     ");
  delay(800);
 
  fmerahatas = simfmerah + range; 
  fmerahbawah = simfmerah - range; 
  fgreenatas = simfgreen + range; 
  fgreenbawah = simfgreen - range; 
  fblueatas = simfblue + range; 
  fbluebawah = simfblue - range; 
   
  if((fmerah < fmerahatas)&&(fmerah > fmerahbawah)&&(fgreen < fgreenatas)&&(fgreen > fgreenbawah)&&(fblue < fblueatas)&&(fblue > fbluebawah)){
    digitalWrite(relay,LOW);
  } 
   
  lcd.setCursor(0,1);
  lcd.print(simjam);
  lcd.print(":");
  lcd.print(simmenit);
  lcd.print(":");
  lcd.print(detik);
  lcd.print("     ");
 
  if((simjam == 0)&&(simmenit == 0)&&(detik == 0)){
  digitalWrite(relay,LOW);
  }

  detik--;
 
  if(detik <= 0){
  if(simmenit == 0){ 
  detik = 0; 
  }
  if(simmenit > 0){ 
  detik = 59; 
  simmenit--;
  }
  }
  if(simmenit <= 0){
  if(simjam == 0){
 
  }
  if(simjam > 0){
  simjam--; 
  simmenit = 59;
  }
  }
 
  if(simjam < 0){
  simjam = 0;
  }
  if(simmenit < 0){
  simmenit = 0;
  }
  if(detik < 0){
  detik = 0;
  }
 
  }
 
 
}


void setrange(){

btupx = digitalRead(btup); 
btdownx = digitalRead(btdown); 
btokx = digitalRead(btok); 
 
  lcd.setCursor(0,0);
  lcd.print("SET RANGE=");
  lcd.print(range);
  lcd.print("  ");
 
 
if(btupx == 0){
delay(200);
range++;

if(btdownx == 0){
delay(200);
range--;


if(btokx == 0){
delay(200);
simrange = range;
return;


if(range < 0){
range = 0;

 
setrange();
}


void scanning(){

btokx = digitalRead(btok); 
 
  lcd.setCursor(0,0);
  lcd.print("SCAN MERAH=");

  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  frequency = pulseIn(sensorOut, LOW);
  fmerah = frequency;
 
  lcd.setCursor(0,1);
  lcd.print("R=");
  lcd.print(fmerah);
  lcd.print(" ");
  delay(100);
 
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  frequency = pulseIn(sensorOut, LOW);
  fgreen = frequency;

  lcd.print("G=");
  lcd.print(fgreen);
  lcd.print(" ");
  delay(100);

  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  frequency = pulseIn(sensorOut, LOW);
  fblue = frequency;
 
  lcd.print("B=");
  lcd.print(fblue);
  lcd.print("     ");
  delay(100);
 
 
if(btokx == 0){
delay(200);

simfmerah = fmerah;
simfgreen = fgreen;
simfblue = fblue;

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("R=");
  lcd.print(fmerah);
  lcd.print(" ");
  lcd.print("G=");
  lcd.print(fgreen);
  lcd.print(" ");
  lcd.print("B=");
  lcd.print(fblue);
  lcd.print("    ");
  delay(3000);
  lcd.clear();
return;
}

scanning();
}


void setjam(){
btupx = digitalRead(btup); 
btdownx = digitalRead(btdown); 
btokx = digitalRead(btok); 
 
  lcd.setCursor(0,0);
  lcd.print("SET JAM=");
  lcd.print(jam);
  lcd.print("  ");
 
 
if(btupx == 0){
delay(200);
jam++;

if(btdownx == 0){
delay(200);
jam--;


if(btokx == 0){
delay(200);
simjam = jam;
return;


if(jam < 0){
jam = 0;

 
setjam();
}




void setmenit(){
btupx = digitalRead(btup); 
btdownx = digitalRead(btdown); 
btokx = digitalRead(btok); 
 
  lcd.setCursor(0,0);
  lcd.print("SET MENIT=");
  lcd.print(menit);
  lcd.print("  ");
 
 
if(btupx == 0){
delay(200);
menit++;

if(btdownx == 0){
delay(200);
menit--;


if(btokx == 0){
delay(200);
simmenit = menit;
return;


if(menit < 0){
menit = 0;

 
setmenit();
}






e. VIDEO HASILNYA
















Membuat Alat Monitoring Kekeruhan Air (TDS) Menggunakan Turbidity Sensor ARDUINO

Membuat Alat Monitoring Kekeruhan Air (TDS) Menggunakan Turbidity Sensor ARDUINO


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk monitoring suatu kekeruhan air atau cairan menggunakan sensor turbidity dengan microcontroller Arduino, alat ini sangat cocok sekali digunakan untuk aplikasi monitoring air PDAM atau sungai sehingga dapat dimanfaatkan untuk kepentingan bersama, satuan kekeruhan yang digunakan pada alat ini yaitu NTU, jadi nanti ada penjelasan mengenai cara kalibrasinya. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Mega





b. Sensor Turbidity + Amplifier






c. LCD 16x2






d. Program Arduino IDE

#include "Wire.h"
#include <LiquidCrystal.h>

LiquidCrystal lcd(2, 3, 4, 8, 5, 9);


// Arrays to save our results in
unsigned long start_times[300];
unsigned long stop_times[300];
unsigned long values[300];


// Define various ADC prescaler
const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
 
    // set up the ADC
  ADCSRA &= ~PS_128;  // remove bits set by Arduino library

  // you can choose a prescaler from above.
  // PS_16, PS_32, PS_64 or PS_128
  ADCSRA |= PS_128;    // set our own prescaler to 64

}


void loop(){
 
  unsigned int i;
  unsigned int z;
  z = 0;
   
  // capture the values to memory
  for(i=0;i<300;i++) {
    start_times[i] = micros();
    values[i] = analogRead(A0);             
 
  if (values[i] >= z) {
  z = values[i]; 
  }
 
    stop_times[i] = micros();


  }
 
  float ntu = (z - 912.5)/-0.279;
    
  lcd.setCursor(0,0);
  lcd.print("ADC= ");
  lcd.print(z);
  lcd.print("    ");
 
  lcd.setCursor(0,1);
  lcd.print("NTU= ");
  lcd.print(ntu);
  lcd.print("    ");
 
  delay(200);
 

}





e. Hasil Kalibrasi








f. VIDEO HASILNYA













Mengakses GPS GY NEO 6M V2 ARDUINO DAN LCD I2C

Mengakses GPS GY NEO 6M V2 ARDUINO DAN LCD I2C


       Pada kesempatan kali ini saya akan membahas mengenai bagaimana cara mengakses sebuah device GPS GY NEO 6M V2 dengan menggunakan Arduino, jadi nanti nilai longitude dan latitude yang diterima oleh GPS akan langsung ditampilkan pada layar LCD i2c yang sudah disiapkan, pada contoh kali ini menggunakan Arduino Mega sebagai controllernya dan LCD 16x2 sebagai interface LCD. GPS ini sangat bagus digunakan meskipun harganya relatif murah dibanding dengan GPS lain seperti EM-411 namun GPS ini tetap powerfull. untuk skema dan program seperti berikut.  




a. Arduino Mega





b. GPS GY NEO 6MV2





c. LCD 16x2 + i2c






d. Program Arduino IDE untuk GPS kirim serial

//VCC pada GPS modul adalah 3,3 volt

/*********************
 *10 to GPS Module TX*
 *09 to GPS Module RX*
 *********************/

#include <SoftwareSerial.h>
#include <TinyGPS.h>

SoftwareSerial mySerial(10, 11);
TinyGPS gps;

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup() 
{
  // Oploen serial communications and wait for port to open:
  Serial.begin(9600);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = ");
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop() // run over and over
{
  bool newdata = false;
  unsigned long start = millis();
  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (mySerial.available())
   
    {
      char c = mySerial.read();
      //Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c))
      {
        newdata = true;
        break;  // uncomment to print new data immediately!
      }
    }
  }
 
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
 
  // On Arduino, GPS characters may be lost during lengthy Serial.print()
  // On Teensy, Serial prints to USB, which has large output buffering and
  //   runs very fast, so it's not necessary to worry about missing 4800
  //   baud GPS characters.

  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
    Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.get_datetime(&date, &time, &age);
  Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
    Serial.print(time);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
  Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/");
    Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
  Serial.print("  Time: "); Serial.print(static_cast<int>(hour+8));  Serial.print(":"); //Serial.print("UTC +08:00 Malaysia");
    Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second));
    Serial.print("."); Serial.print(static_cast<int>(hundredths)); Serial.print(" UTC +08:00 Malaysia");
  Serial.print("  Fix age: ");  Serial.print(age); Serial.println("ms.");

  Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
    Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
  Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
    printFloat(gps.f_course()); Serial.println();
  Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
    printFloat(gps.f_speed_mph());
  Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
    printFloat(gps.f_speed_kmph()); Serial.println();

  gps.stats(&chars, &sentences, &failed);
  Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
    Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
 
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}




e. Program Arduino IDE untuk GPS tampil LCD 16x2

//vcc pada GPS modul adalah 3,3 volt
/*********************
 *10 to GPS Module TX*
 *09 to GPS Module RX*
 *********************/

#include <Wire.h>  // i2C Conection Library
#include <LiquidCrystal_I2C.h>  //i2C LCD Library

#include <SoftwareSerial.h>
#include <TinyGPS.h>

SoftwareSerial mySerial(10, 11);
TinyGPS gps;

LiquidCrystal_I2C lcd(0x3F, 16, 2);

void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);

void setup() 
{
   lcd.begin();
   lcd.clear();
   lcd.noCursor();
  
  // Oploen serial communications and wait for port to open:
  Serial.begin(9600);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  delay(1000);
  Serial.println("uBlox Neo 6M");
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.print("Sizeof(gpsobject) = ");
  Serial.println(sizeof(TinyGPS));
  Serial.println();
}

void loop() // run over and over
{
  bool newdata = false;
  unsigned long start = millis();
  // Every 5 seconds we print an update
  while (millis() - start < 5000)
  {
    if (mySerial.available())
   
    {
      char c = mySerial.read();
      //Serial.print(c);  // uncomment to see raw GPS data
      if (gps.encode(c))
      {
        newdata = true;
        break;  // uncomment to print new data immediately!
      }
    }
  }
 
  if (newdata)
  {
    Serial.println("Acquired Data");
    Serial.println("-------------");
    gpsdump(gps);
    Serial.println("-------------");
    Serial.println();
  }
 
}

void gpsdump(TinyGPS &gps)
{
  long lat, lon;
  float flat, flon;
  unsigned long age, date, time, chars;
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned short sentences, failed;

  gps.get_position(&lat, &lon, &age);
  Serial.print("Lat/Long(10^-5 deg): "); Serial.print(lat); Serial.print(", "); Serial.print(lon);
  Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
 
  gps.f_get_position(&flat, &flon, &age);
  Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
    Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");

  lcd.setCursor(0,0);
  lcd.print("LAT:");
  lcd.print(flat, 5);
  
  lcd.setCursor(0,1);
  lcd.print("LONG:");
  lcd.print(flon, 5);
 
}

void printFloat(double number, int digits)
{
  // Handle negative numbers
  if (number < 0.0)
  {
     Serial.print('-');
     number = -number;
  }

  // Round correctly so that print(1.999, 2) prints as "2.00"
  double rounding = 0.5;
  for (uint8_t i=0; i<digits; ++i)
    rounding /= 10.0;
 
  number += rounding;

  // Extract the integer part of the number and print it
  unsigned long int_part = (unsigned long)number;
  double remainder = number - (double)int_part;
  Serial.print(int_part);

  // Print the decimal point, but only if there are digits beyond
  if (digits > 0)
    Serial.print(".");

  // Extract digits from the remainder one at a time
  while (digits-- > 0)
  {
    remainder *= 10.0;
    int toPrint = int(remainder);
    Serial.print(toPrint);
    remainder -= toPrint;
  }
}





f. VIDEO HASILNYA










Mengakses Joystick Playstation 2 (PS2) Menggunakan ARDUINO dan LCD I2C

Mengakses Joystick Playstation 2 (PS2) Menggunakan ARDUINO dan LCD I2C


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang menggunakan joystick PS2 sebagai kendalinya untuk ditampilkan pada LCD Arduino, jadi sistem kali ini hanya menampilkan karakter tombol yang ditekan pada joystick misalkan menekan tombol kotak joystick maka pada layar LCD Arduiho akan bertuliskan "kotak" begitu seterusnya, aplikasi untuk sistem ini sangatlah banyak antara lain kendali robot menggunakan joystick atau alat pemidah barang menggunakan joystick dan masih bayak yang lainnya. untuk program dan skemanya seperti berikut.


Library Joystick DOWNLOAD



 a. Arduino UNO






b. Joystick PS2







c. LCD + I2C






d. Wiring Diagram







e. Program Arduino IDE

#include <Wire.h>  // i2C Conection Library
#include <PS2X_lib.h>                         /* PS2 Controller Library */
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x3F, 16, 2);

PS2X ps2x;                                    /* create PS2 Controller Class*/
byte Type = 0;
byte vibrate = 0;
int RX=0,RY=0,LX=0,LY=0;

int x = 0;
int y = 0;
int z = 0;

void setup(){
   lcd.begin();
   lcd.noCursor();
   lcd.clear();
   Serial.begin(9600);
   ps2x.config_gamepad(13,11,10,12, true, true);
   /* setup pins and settings:  GamePad(clock, command, attention, data, Pressures?, Rumble?) check for error*/
   Type = ps2x.readType();                       /* Reading type of the PS2 Ccontroller */
   if(Type==1){                                  /* Type 1 is Duel shock controller */ 
   }
}
void loop(){
  
   ps2x.read_gamepad(false, vibrate);   /* read controller and set large motor to spin at 'vibrate' speed */
   LY = ps2x.Analog(PSS_LY);          /* Reading Left stick Y axis */
   LX = ps2x.Analog(PSS_LX);          /* Reading Left stick X axis */
   RY = ps2x.Analog(PSS_RY);          /* Reading Right stick Y axis */
   RX = ps2x.Analog(PSS_RX);          /* Reading Right stick X axis */
   if((LY <= 9))                      /* standardize to 3 digit by checking less than 10 */
      //Serial.print("00");                /* eg: if LY= 5 then it display as "005" in lcd */
   if((LY >= 9 &&LY <= 99))           /* standardize to 3 digit by checking between 10-99 */
      //Serial.print("0");                 /* eg: if LY= 55 then it display as "055" in lcd */    
   //Serial.println(LY,DEC);                 /* display left analog stick Y axis */
      //lcd.print(",");                    /* separate values using comma */
   if((LX <= 9))                      /* standardize to 3 digit by checking less than 10 */
      //lcd.print("00");                /* eg: if LX= 5 then it display as "005" in lcd */
   if((LX >= 9 && LX<=99))            /* standardize to 3 digit by checking between 10-99 */
      //lcd.print("0");                 /* eg: if LX= 55 then it display as "055" in lcd */ 
   //Serial.println(LX,DEC);                 /* display left analog stick X axis */
      //lcd.print(",");                    /* separate values using comma */
   if((RY <= 9))                      /* standardize to 3 digit by checking less than 10 */
      //lcd.print("00");                /* eg: if RY= 5 then it display as "005" in lcd */
   if((RY >= 9 &&RY<=99))             /* standardize to 3 digit by checking between 10-99 */
      //lcd.print("0");                 /* eg: if RY= 55 then it display as "055" in lcd */ 
   //Serial.println(RY,DEC);                 /* display Right analog stick Y axis               */
      //lcd.print(",");                    /* separate values using comma */
   if((RX <= 9))                      /* standardize to 3 digit by checking less than 10 */
      //lcd.print("00");                /* eg: if RX= 5 then it display as "005" in lcd */
   if((RX >= 9 &&RX <= 99))           /* standardize to 3 digit by checking between 10-99 */
                                      /* eg: if RX= 55 then it display as "055" in lcd */ 
   Serial.println(RX,DEC);                 /* display Right analog stick X axis          */
   if(ps2x.NewButtonState()) {        /* will be TRUE if any button changes state  */
      if(ps2x.Button(PSB_START))      /* will be TRUE as long START button is pressed */
         y = y + 1;
      if(ps2x.Button(PSB_SELECT))             /* will be TRUE as long SELECT button is pressed */
         y = y + 2;
      if(ps2x.Button(PSB_PAD_UP))             /* will be TRUE as long as UP button is pressed */
         y = y + 3;
      if(ps2x.Button(PSB_PAD_RIGHT))          /* will be TRUE as long as UP button is pressed */
         y = y + 4;
      if(ps2x.Button(PSB_PAD_LEFT))           /* will be TRUE as long as LEFT button is pressed */
         y = y + 5;
      if(ps2x.Button(PSB_PAD_DOWN))           /* will be TRUE as long as DOWN button is pressed */
         y = y + 6;
      if(ps2x.Button(PSB_L1))                 /* will be TRUE as long as L1 button is pressed */
         z = z + 1;
      if(ps2x.Button(PSB_R1))                 /* will be TRUE as long as R1 button is pressed */
         z = z + 2;
      if(ps2x.Button(PSB_L2))                 /* will be TRUE as long as L2 button is pressed */
         z = z + 3;
      if(ps2x.Button(PSB_R2))                 /* will be TRUE as long as R2 button is pressed */
         z = z + 4;
      if(ps2x.Button(PSB_L3))                 /* will be TRUE as long as L3 button is pressed */
         z = z + 5;
      if(ps2x.Button(PSB_R3))                 /* will be TRUE as long as R3 button is pressed */
         z = z + 6;
      if(ps2x.Button(PSB_GREEN))              /* will be TRUE as long as GREEN/Triangle button is pressed */
         x = x + 1;
      if(ps2x.Button(PSB_BLUE))                /* will be TRUE as long as BLUE/CROSS/X button is pressed */
         x = x + 2;
       if(ps2x.Button(PSB_RED))               /* will be TRUE as long as RED/Circle button is pressed */
         x = x + 7;
      if(ps2x.Button(PSB_PINK))               /* will be TRUE as long as PINK/Squre button is pressed */
         x = x + 4;
   
      //tombol x = 6 dan 2
      //tombol kotak = 4
      //tombol segitiga = 8 dan 1
      //tombol bulat = 7 dan 9
     
      //atas = 9 dan 5
      //kiri = 7
      //bawah = 8 dan 13
      //kanan = 12 dan 6
     
      lcd.setCursor(0,0);
      if((x == 6)||(x == 2)){
      lcd.print("Tombol X        ");
      }
      if(x == 4){
      lcd.print("KOTAK           ");
      }
      if((x == 8)||(x == 1)){
      lcd.print("SEGITIGA        ");
      }
      if((x == 7)||(x == 9)){
      lcd.print("BULAT           ");
      }
     
     
     
      lcd.setCursor(0,1);
      if((y == 9)||(y == 5)){
      lcd.print("ATAS            ");
      }
      if(y == 7){
      lcd.print("KIRI            ");
      }
      if((y == 8)||(y == 13)){
      lcd.print("BAWAH           ");
      }
      if((y == 12)||(y == 6)){
      lcd.print("KANAN           ");
      }
     
      //Serial.print("X=");
      //Serial.println(x);
      //Serial.print("Y=");
      //Serial.println(y);
      //Serial.print("Z=");
      //Serial.println(z);
     
      delay(200);
     
      x = 0;
      y = 0;
      z = 0;
     
   }
   else;
      x = 0;
      y = 0;
      z = 0;
}






f. VIDEO HASILNYA









   

Buku Panduan Mahir Membuat Robot Dengan ARDUINO

Buku Panduan Mahir Membuat Robot Dengan ARDUINO


         Pada kesempatan bahagia kali ini saya akan promosi sebuah buku menarik yang dibuat khusus untuk pecinta robotika di seluruh indonesia, buku ini ditujukan bagi pemula yang ingin belajar membuat sebuah robotnya untuk pertama kali, jadi pada buku ini dijelaskan step-by-step bagaimana cara membuat sebuah robot, robot yang disediakan pada buku ini ada 4 jenis yaitu robot line tracer / line follower, robot wall avoider, robot kendali joystick PS2 dan robot kendali handphone. pada buku ini ditampilkan pula source code dan wiring pemasangannya pada Arduino dan device yang berkaitan, yang membuat buku ini menarik yaitu wiring diagram menggunakan garis warna warni yang membuat mudah orang yang ingin memahaminya. kemudian disediakan pula library dan source codenya dalam bentuk .ino, jadi saat pembelian kami juga mengirimkan source code full dari apa yang ditulis pada buku sehingga jika yang malas menulis bisa copy-paste saja, kemudian kami juga kirimkan library terkait device yang digunakan seperti library LCD I2C dan library Joystick PS2. untuk daftar isi seperti berikut, jika ingin membeli biaya Rp.150.000,- (Seratus Limapuluh Ribu Rupiah) silahkan WA (whatsapp) ke nomer 085726496643, kami akan kirimkan ke alamat email pemesan setelah transfer diterima karena buku ini berbentuk .pdf atau softcopy terima kasih



a. Screenshoot Daftar Isi





b. Screenshoot Wiring Diagram Pada Buku (Contoh)






c. Biaya Pemesanan Buku

1. Biaya Buku Softcopy = Rp. 150.000,- (Seratus Limapuluh Ribu Rupiah)

2. Isi Paket : File Source Code .ino + File Library + File Android .apk dan .aia

3, Jika ingin memesan buku ini silahkan WA ke nomer 085726496643














Membuat Alat Deteksi Gerakan Mata (EOG) Electrooculograph Menggunakan Arduino

Membuat Alat Deteksi Gerakan Mata (EOG) Electrooculograph Menggunakan Arduino


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk mendeteksi arah gerakan mata, jadi ketika melirik kenan atau kekiri maka Arduino dapat mendeteksinya, alat ini bisa digunakan untuk kendali kursi roda menggunakan gerakan mata atau kendali yang lainnya pada orang terkena strke yang mana tidak dapat bergerak dan hanya bisa memberikan isyarat mata saja. alat ini terdiri dari beberapa buah komponen yaitu rangkaian EOG dan Arduino. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino UNO





b. Modul EOG






c. IC Power Supply 





















d. Program Arduino IDE untuk deteksi gerakan mata

//elektroda kanan pinheader atas
//elektroda kiri pinheader bawah

int dataadc;
int adcold;
int kanan;
int kiri;
int x = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {

 dataadc = analogRead(A0);
 
   kanan = dataadc + 20;
   kiri = dataadc - 20;
 
 Serial.println(dataadc);


  if(adcold > kanan){
  //Serial.println("arah kanan ");
  }
  if(adcold < kiri){
  //Serial.println("arah kiri");
  }
   
  if((adcold > kanan)&&(x == 0)){
  x = 1;   
  }
  if((adcold < kiri)&&(x == 1)){
  x = 2;
  Serial.println("kiri <=====");
  }
  if((adcold < kiri)&&(x == 2)){
  Serial.println("kiri <=====");
  x = 0;
  }
 
 
  if((adcold < kiri)&&(x == 0)){
  x = 3;
  }
  if((adcold > kanan)&&(x == 3)){
  Serial.println("kanan <=====");
  x = 4; 
  }
  if((adcold > kanan)&&(x == 4)){
  Serial.println("kanan <=====");
  x = 0; 
  }


  adcold = dataadc;

 
  delay(10);       
}






e. VIDEO HASILNYA
 












Membuat Alat Monitor Daya, Tegangan 220v ZMPT101b dan Arus AC ACS712 / KWH Meter / Token Pulsa Listrik Menggunakan ATMega CV AVR dan Interface VB 6

Membuat Alat Monitor Daya, Tegangan 220v ZMPT101b dan Arus AC ACS712  / KWH Meter / Token Pulsa Listrik Menggunakan ATMega CV AVR dan Interface VB 6


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang bisa digunakan untuk monitoring tegangan dan arus AC 220v 50Hz kemudian dicari daya-nya sehingga bisa dibuat KWH meter, alat ini menggunakan mikrokontroller ATMega32 dan bahasa CV AVR, prinsip kerja alat ini yaitu hanya mengambil data tegangan dan arus kemudian dicari nilai daya dengan mengkalikan nilai arus dan tegangan, selain itu alat ini juga terdapat fitur memasukkan nilai menggunakan keypad matrik3x4 sesuai kebutuhan daya yang dipakai, jika beban yang terdeteksi melebihi daya maka relay akan aktif dan mematikan sumber tegangan pada beban seperti halnya fuse, namun jika daya yang kita inputkan masih diatas dengan daya yang termonitoring maka output masih menyala. alat ini menggunakan interface VB 6 dan LCD sebagai penampilnya. untuk lebih jelasnya berikut adalah skema dan program keseluruhannya.




a. Minimum System ATMega32





b. Keypad matrik 3x4





c. RTC DS1307





d. LCD 16x2






e. Sensor Tegangan ZMPT101B





f. Sensor Arus ACS712





g. Modul Relay






h. Program CodeVision AVR

/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional

Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>

#include <delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x15 ;PORTC
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>

// DS1307 Real Time Clock functions
#include <ds1307.h>

// Alphanumeric LCD Module functions
#include <alcd.h>


#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here
char buf[33];
unsigned char dd;
unsigned char mm;
unsigned char yy;
unsigned char detik;
unsigned char menit;
unsigned char jam;

int biaya;
int dataadc;
char temp[10];
char temp1[10];
char temp2[10];
char temp3[10];
char temp4[10];
int z,zm,zk,zs;
int i,k,m,s;
int values[300];
float vrms;

float p;
char temp5[10];

int dataadcx;
char tempx[10];
char temp1x[10];
char temp2x[10];
char temp3x[10];
char temp4x[10];
int zx,zmx,zkx,zsx;
int ix,kx,mx,sx;
int valuesx[300];
float irms;

void simpan_dlm_1variabel();
void scanning_keypad();
void tampil_lcd();
void inputdaya();

float nilai = 0;
unsigned char tempo[12];
unsigned char array[10];
int n=0;


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB = 0XFF;
DDRB=0XF0;

// Port C initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=T State0=T
PORTC=0x00;
DDRC=0xFC;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x83;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// I2C Bus initialization
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 2
// RD - PORTD Bit 3
// EN - PORTD Bit 4
// D4 - PORTD Bit 5
// D5 - PORTD Bit 6
// D6 - PORTD Bit 7
// D7 - PORTC Bit 2
// Characters/line: 16
lcd_init(16);

//rtc_set_time(22,30,00);
//rtc_set_date(8,8,17);

while (1)
      {
          
      rtc_get_time(&jam,&menit,&detik);
      rtc_get_date(&dd,&mm,&yy);
      lcd_gotoxy(0,0);
      sprintf(buf,"%02u:%02u:%02u",jam,menit,detik);
      lcd_puts(buf);
      //printf("Tanggal: %02u:%02u:%02u \r",dd,mm,yy);
      //printf("Waktu  : %02u:%02u:%02u \r",h,m,s);  
          
              
      for(i=0;i<300;i++) {
        values[i] = read_adc(0);            

      if (values[i] >= z) {
        z = values[i];
      }        
    
      } 
    
      for(k=0;k<300;k++) {
        values[k] = read_adc(0);            

      if (values[k] >= zk) {
        zk = values[k];
      }        
    
      }
    
      for(m=0;m<300;m++) {
        values[m] = read_adc(0);            

      if (values[m] >= zm) {
        zm = values[m];
      }        
    
      }
    
      for(s=0;s<300;s++) {
        values[s] = read_adc(0);            

      if (values[s] >= zs) {
        zs = values[s];
      }        
    
      }


      if((z >= zk)&&(z >= zm)&&(z >= zs)){  
         vrms = (float)(z - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zk >= z)&&(zk >= zm)&&(zk >= zs)){  
         vrms = (float)(zk - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zm >= z)&&(zm >= zk)&&(zm >= zs)){   
         vrms = (float)(zm - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }
      if((zs >= z)&&(zs >= zk)&&(zs >= zm)){
         vrms = (float)(zs - 518.1) / 0.413;
         if(vrms < 100){
         vrms = 0;
         }
         ftoa(vrms,1,temp);
      }

       
      
   
      z = 0;
      zk = 0;
      zm = 0;
      zs = 0;
     
     
     
      //======================================================
     
      for(ix=0;ix<300;ix++) {
        valuesx[ix] = read_adc(1);            

      if (valuesx[ix] >= zx) {
        zx = valuesx[ix];
      }        
    
      }  
    
      for(kx=0;kx<300;kx++) {
        valuesx[kx] = read_adc(1);            

      if (valuesx[kx] >= zkx) {
        zkx = valuesx[kx];
      }        
    
      }
    
      for(mx=0;mx<300;mx++) {
        valuesx[mx] = read_adc(1);            

      if (valuesx[mx] >= zmx) {
        zmx = valuesx[mx];
      }        
    
      }
    
      for(sx=0;sx<300;sx++) {
        valuesx[sx] = read_adc(1);            

      if (valuesx[sx] >= zsx) {
        zsx = valuesx[sx];
      }        
    
      }


      if((zx >= zkx)&&(zx >= zmx)&&(zx >= zsx)){
         irms = (float)(zx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zkx >= zx)&&(zkx >= zmx)&&(zkx >= zsx)){
         irms = (float)(zkx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zmx >= zx)&&(zmx >= zkx)&&(zmx >= zsx)){
         irms = (float)(zmx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1; 
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
      if((zsx >= zx)&&(zsx >= zkx)&&(zsx >= zmx)){
         irms = (float)(zsx * (5.0/1023.0));
         irms = (float)(irms - 2.50) / 0.1;  
         if(irms < 0){
         irms = 0;
         }
         ftoa(irms,2,tempx);
      }
       
     
        
        PORTB = 0b11011111;
        delay_ms(20);
        if(PINB.2 == 0){
        delay_ms(200);
               
        lcd_gotoxy(0,1);
        lcd_putsf("V=");
        lcd_puts(temp);
        lcd_putsf("   ");
      
        lcd_gotoxy(8,1);
        lcd_putsf("I=");
        lcd_puts(tempx);
        lcd_putsf("   ");
       
        }
       
        if(PINB.2 == 1){
        delay_ms(200);
        lcd_gotoxy(0,1);      
        lcd_putsf("Pmax= ");
        lcd_puts(tempo);
        lcd_putsf(" watt            ");            
        }
       
       
        p = (float)(vrms * irms);
       
        ftoa(p,1,temp5);
       
        lcd_gotoxy(9,0);
        lcd_putsf("P=");
        lcd_puts(temp5);
        lcd_putsf(" ");
       
      delay_ms(200);
    
      zx = 0;
      zkx = 0;
      zmx = 0;
      zsx = 0;
     
       PORTB = 0b10111111;
       delay_ms(20);
       if(PINB.3 == 0){
       delay_ms(2000);
        i=0;
        nilai=0;
       lcd_clear();
       inputdaya();
      
       } 
      
      
       if(p > nilai){
       //off
        PORTC.7 = 0;
       }
       if(p < nilai){
       //on
        PORTC.7 = 1;
       }
      
        if((p > nilai - 20)&&(p > 0)){
       //off
        PORTC.6 = 0;
        delay_ms(200);
        PORTC.6 = 1;
        delay_ms(200);
       }
       if(p < nilai - 20){
       //on
        PORTC.6 = 0;
       }
      
       biaya = p * 450;
      
       printf("%0.1f",vrms);
       putchar('|');
       printf("%0.1f",irms);
       putchar('|');
       printf("%0.1f",p);
       putchar('|');
       printf("%i",biaya);
       putchar('|');                        
      } 
     
}


void inputdaya(){

        PORTC.6 = 0;
       
        scanning_keypad();
        tampil_lcd();
       
        PORTB = 0b11101111;
        delay_ms(20);
        if(PINB.3 == 0){
        delay_ms(200);
        lcd_clear();
        return;
        } //*

        delay_ms(200);
        inputdaya();
}

void scanning_keypad()
{

 int waktu = 300;

 PORTB = 0b10111111;
 delay_ms(20);
 if(PINB.2 == 0){n++; array[n]=9; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=6; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=3; simpan_dlm_1variabel();delay_ms(waktu);}

 PORTB = 0b11011111;
 delay_ms(20);
 if(PINB.3 == 0){n++; array[n]=0; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.2 == 0){n++; array[n]=8; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=5; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=2; simpan_dlm_1variabel();delay_ms(waktu);}

 PORTB = 0b11101111;
 delay_ms(20);
 if(PINB.2 == 0){n++; array[n]=7; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.1 == 0){n++; array[n]=4; simpan_dlm_1variabel();delay_ms(waktu);}
 if(PINB.0 == 0){n++; array[n]=1; simpan_dlm_1variabel();delay_ms(waktu);}


}

void simpan_dlm_1variabel()
{
    if ( n == 1 ){nilai = array[n];}
    if ( n >= 2 &&  n <= 8 )
    {
        nilai = (nilai*10)+array[n];
    }
   
}

void tampil_lcd()
{
 lcd_gotoxy(0,0);
 lcd_putsf("Input Daya");
 if(nilai>0)
 {
    ftoa(nilai,0,tempo);
    lcd_gotoxy(0,1);
    lcd_puts(tempo);
 }        

}






i. Program Interface VB 6


Option Explicit
Dim arrdata()
Dim TotalBaca As Integer
Dim BMI As Single
Dim Keterangan As String
Const MAKSBACA = 30
Dim sHari As String
Dim aHari



Private Sub berhenti_Click()
  start.Enabled = True
    berhenti.Enabled = False
    TimerBaca.Enabled = False
End Sub


Private Sub Command2_Click()
Unload Me
End Sub



Private Sub Form_Load()
Dim i As Byte
For i = 1 To 16
    ComboCOM.AddItem (i)
Next i
 aHari = Array("Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu")

End Sub



Private Sub MSComm2_OnComm()
Dim buffer As String
Dim temp As String
Dim pisah() As String
Dim i As Integer

If MSComm2.CommEvent = comEvReceive Then
    buffer = MSComm2.Input
    'pisah = Split(buffer, Chr$(13))
    pisah = Split(buffer, "|")

On Error Resume Next
If buffer <> " " Then
With Text1
    .SelStart = Len(.Text)
    .SelText = buffer
End With
For i = 0 To 4
    If 0 < 5 Then
        Text2(i).Text = CStr(pisah(i))
        End If
        Next i
    Else
    buffer = " "
    End If
End If
End Sub

Private Sub start_Click()
Dim u As Integer

    On Error GoTo ada_eror
   
    MSComm2.CommPort = ComboCOM.Text
    MSComm2.Settings = "9600,N,8,1"
    MSComm2.RThreshold = 20
    MSComm2.InputLen = 20
    MSComm2.InputMode = comInputModeText
    MSComm2.PortOpen = True ' buka port
   
    ReDim arrdata(1 To MAKSBACA + 1)
    For u = 1 To MAKSBACA
        arrdata(u) = 0
    Next
    TotalBaca = 0
    start.Enabled = False
    berhenti.Enabled = True
    TimerBaca.Enabled = True
ada_eror:
 If ComboCOM.ListIndex < 1 Then
    MsgBox "COM berada di Nomor : " & Err.Number & vbCrLf & Err.Description, vbCritical + vbOKOnly, "ERROR"
    start.Enabled = True
    berhenti.Enabled = True
    ComboCOM.Text = "Pilih COM"
End If
End Sub

Private Sub Timer1_Timer()
 sHari = aHari(Abs(Weekday(Date) - 1))
 Text3.Text = "" & sHari & "," & Format(Date, "dd mmmm yyyy")
 Text4.Text = Format(Time, "hh:mm:ss")
End Sub

Private Sub TimerBaca_Timer()
Dim strInput As String
Dim strPotong As String
Dim singleInput As Single
Dim u As Integer
    strInput = MSComm2.Input
        strPotong = strInput
        'Text1.Text = Text1.Text + strPotong + vbCrLf
        'singleInput = Val(strPotong)
        'Label1.Caption = singleInput
        If TotalBaca >= MAKSBACA Then
            TimerBaca.Enabled = False
            If MSComm2.PortOpen = True Then MSComm2.PortOpen = False
            Call berhenti_Click
        End If
 
End Sub






j. VIDEO HASILNYA