Translate

Membuat Rangkaian Electrocardiography ( ECG / EKG ) Penyadap Sinyal Jantung

Membuat Rangkaian Electrocardiography ( ECG / EKG ) Penyadap Sinyal Jantung


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang mampu menyadap sinyal jantung atau biasa disebut dengan electrocardiography. alat ini sangat sederhana sekali hanya menggunakan beberapa buah op-amp sebagai amplifier atau penguat dan juga sebagai filter aktif, tak lupa filter pasif pun juga turut terlibat didalamnya, yang penting frekuensi ECG adalah 0.05 Hz sampai 100 Hz dan filter notch 50 Hz harus sangat diperhatikan. untuk lebih jelasnya berikut adalah skemanya.


1.  Untuk rangkaian ECG Lead 1, penempatan elektroda yaitu pada elektrode negatif di lengan kanan (1),elektrode positif  di lengan kiri (2) dan ground di kaki kanan.

2.  Untuk rangkaian ECG Lead 2, penempatan elektroda yaitu pada elektrode negatif (1) di lengan kanan dan elektrode positif (2) di kaki kiri dan ground di kaki kanan.

3.  Untuk rangkaian ECG Lead 3, penempatan elektroda yaitu pada elektrode negatif (1) di lengan kiri dan elektrode positif (2) di kaki kiri dan ground di kaki kanan.





a. Rangkaian ECG / EKG





b. Layout PCB






c. Gambar Alat








d. Skematik Power Supply 5v || GND || -5v
  
*NOTE :
1. PIN 6 Connect to GND
2. PIN 8 Connect to 5v         





e. Gambar Sinyal Output






f. Video Hasilnya















Membuat Alat Kendali via Bluetooth dan Pelacak Posisi Benda via SMS menggunakan Arduino dan GPS berbasis SMS GATEWAY

Membuat Alat Kendali via Bluetooth dan Pelacak Posisi Benda via SMS menggunakan Arduino dan GPS berbasis SMS GATEWAY


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat alat yang digunakan untuk melacak posisi benda dimana ia berada sekarang dengan menggunakan perantara sms, jadi pada alat telah terpasang sebuah GPS EM411 untuk mengetahui letak koordinatnya kemudian pemilik bisa monitoring posisinya dengan cara melakukan sms dengan text "Monitor" maka akan dibalas dengan koordinat pada alat tersebut, pada saat yang bersamaan Relay ON. kemudian jika dibalas dengan pesan text "Ok" maka Relay akan OFF. alat ini juga terdapat bluetooth yang mana untuk melakukan ON / OFF Relay langsung menggunakan aplikasi android jadi tidak perlu menggunakan sms pun bisa. untuk lebih jelasnya berikut adalah program dan skemanya.


LINK LIBRARY GPS



a. Arduino Mega 





b. Minimum System ATMega8535





c. LCD 16x2





d. GPS EM411





e. Modul sms SIM800L





f. Bluetooth HC-05





g. Modul Relay






h. Program Android







i. Program Arduino IDE

#include <TinyGPS++.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "Wire.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);

static const uint32_t GPSBaud = 4800;

// The TinyGPS++ object
TinyGPSPlus gps;
#include "sms.h"
SMSGSM sms;


char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char strsms[5];
char latstr[20];
char lonstr[20];
char latlonstr[20];

void setup()
{
 pinMode(13,OUTPUT);
 digitalWrite(13,LOW);
  Serial1.begin(GPSBaud);

     if (gsm.begin(2400)) {
          started=true;
     } else {
     }
     if(started) {

         // if (sms.SendSMS("085726496643", "ALAT READY ok"));
        
     }

  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();

}

void loop()
{

  while (Serial1.available() > 0)
    if (gps.encode(Serial1.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    while(true);
  }
}

void displayInfo()
{

  if (gps.location.isValid())
  {
   
  lcd.setCursor(0, 0);
  lcd.print("LAT= ");
  lcd.print(gps.location.lat(), 6);
  lcd.setCursor(0, 1);
  lcd.print("LNG= ");
  lcd.print(gps.location.lng(), 6);
 
  dtostrf(gps.location.lat(),10,6,latstr);
  dtostrf(gps.location.lng(),10,6,lonstr);
  sprintf(string,"LAT= %s, LONG= %s", latstr, lonstr);
 
 if(gsm.begin(9600)){
  started=true;
 }
 int pos=0;
 if(started){
  pos=sms.IsSMSPresent(SMS_ALL);
  if(pos){
    sms.GetSMS(pos,n,smsbuffer,100);
  
    if(!strcmp(smsbuffer,"monitor")){
      digitalWrite(13,HIGH);
      sms.SendSMS(n,string);
    }
    if(!strcmp(smsbuffer,"Monitor")){
      digitalWrite(13,HIGH);
      sms.SendSMS(n,string);
    }
     if(!strcmp(smsbuffer,"Ok")){
      digitalWrite(13,LOW);
    }
    if(!strcmp(smsbuffer,"ok")){
      digitalWrite(13,LOW);
    }
 
    delsms();
  }
 }
  delay(100);
 
 
  }
  else
  {


  }

}



void delsms()
{
  for (int i=0; i<10; i++)
  {
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0)
      {
        if (sms.DeleteSMS(pos)==1){}else{}
      }
  }
}





j. Program Bascom AVR

$regfile = "m8535.dat"
$crystal = 11059200
$baud = 9600

On Urxc Getchar

Ddrd.7 = 1
Ddrd.6 = 0

Ddrb.1 = 1
Ddrb.2 = 1

Dim Perintah As String * 10
Dim X As Integer
Dim Y As Integer

Portb.1 = 1
Portb.2 = 1

Wait 1

X = 0
Y = 0

Enable Interrupts
Enable Urxc


Do

If Pind.6 = 0 Then
Y = 0
End If

If Pind.6 = 1 Then
Y = 1
End If


If X = 0 And Y = 0 Then
Portd.7 = 0

Portb.1 = 0
Portb.2 = 1

End If

If X = 0 And Y = 1 Then
Portd.7 = 1

Portb.1 = 1
Portb.2 = 0

End If

If X = 1 And Y = 0 Then
Portd.7 = 1

Portb.1 = 1
Portb.2 = 0

End If

If X = 1 And Y = 1 Then
Portd.7 = 1

Portb.1 = 1
Portb.2 = 0

End If

Loop



Getchar:

Perintah = Inkey()

Select Case Perintah

    Case "a" :
    'relay off
    X = 0
    Wait 1

    Case "b" :
    'relay on
    X = 1
    Wait 1


  End Select

Return

End






k. VIDEO HASILNYA












Membuat Alat Pelacak Posisi Menggunakan GPS EM411 dan SMS GATEWAY ARDUINO

Membuat Alat Pelacak Posisi Menggunakan GPS EM411 dan SMS GATEWAY ARDUINO


         Pada kesempatan yang berbahagia kali ini saya akan menjelaskan mengenai bagaimana cara membuat alat yang dapat melacak posisi keberadaan suatu benda misalnya sepeda motor atau mobil dengan menggunakan GPS dan SMS. jadi prinsip kerja alat ini yaitu dapat mengirimkan posisi dimana sekarang berada dengan mengirimkan sms "Monitor" maka akan dibalas dengan balasan berupa posisi sekarang yaitu koordinat latitude dan longitude-nya. alat ini menggunakan Arduino sebagai processornya dan modul sms menggunakan SIM800l. untuk GPS menggunakan TinyGPS EM411. untuk lebih jelasnya berikut adalah program dan skemanya.


Link Library GPS




a. Arduino Mega





b. LCD 16x2





c. GPS EM411





d. Modul SMS SIM800L





e. Buck Converter






f. Program Arduino IDE

#include <TinyGPS++.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "Wire.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(A5, A4, A3, A2, A1, A0);

static const uint32_t GPSBaud = 4800;

// The TinyGPS++ object
TinyGPSPlus gps;
#include "sms.h"
SMSGSM sms;


char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
char strsms[5];
char latstr[20];
char lonstr[20];
char latlonstr[20];

void setup()
{

  Serial1.begin(GPSBaud);

     if (gsm.begin(2400)) {
          started=true;
     } else {
     }
     if(started) {

         // if (sms.SendSMS("085726496643", "ALAT READY ok"));
        
     }

  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();

}

void loop()
{

  while (Serial1.available() > 0)
    if (gps.encode(Serial1.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    while(true);
  }
}

void displayInfo()
{

  if (gps.location.isValid())
  {
   
  lcd.setCursor(0, 0);
  lcd.print("LAT= ");
  lcd.print(gps.location.lat(), 6);
  lcd.setCursor(0, 1);
  lcd.print("LNG= ");
  lcd.print(gps.location.lng(), 6);
 
  dtostrf(gps.location.lat(),10,6,latstr);
  dtostrf(gps.location.lng(),10,6,lonstr);
  sprintf(string,"LAT= %s, LONG= %s", latstr, lonstr);
 
 if(gsm.begin(9600)){
  started=true;
 }
 int pos=0;
 if(started){
  pos=sms.IsSMSPresent(SMS_ALL);
  if(pos){
    sms.GetSMS(pos,n,smsbuffer,100);
  
    if(!strcmp(smsbuffer,"monitor")){
      sms.SendSMS(n,string);
    }
    if(!strcmp(smsbuffer,"Monitor")){
      sms.SendSMS(n,string);
    }
 
    delsms();
  }
 }
  delay(100);
 
 
  }
  else
  {


  }

}



void delsms()
{
  for (int i=0; i<10; i++)
  {
      int pos=sms.IsSMSPresent(SMS_ALL);
      if (pos!=0)
      {
        if (sms.DeleteSMS(pos)==1){}else{}
      }
  }
}





g. Gambar Hasilnya







h. VIDEO HASILNYA











Membuat Servo Controller Menggunakan Arduino dan Driver Servo I2C Shield

Membuat Servo Controller Menggunakan Arduino dan Driver Servo I2C Shield


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah servo controller dengan menggunakan arduino dan servo driver i2c shield buatan adafruit industries. prinsip kerja alat ini adalah mengendalikan posisi horn servo sesuai dari nilai yang diinputkan melalui tombol. alat ini menggunakan lcd dan tombol untuk mengetahui nilai yang diset oleh user dan juga jika ingin mengembalikan posisi servo pada titik awal juga bisa. alat ini menggunakan arduino sebagai kontrollernya. untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Mega 





b. Driver Servo i2c Shield





c. Motor Servo





d. Program Arduino IDE

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 2, 7, 6, 5, 4);

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

//setting pin 47
//up pin 53
//down pin 51
//ok pin 49

int btset = 47;
int btup = 53;
int btdown = 51;
int btok = 49;
int xz = 0;
int setx = 0;
int upx = 0;
int downx = 0;
int okx = 0;

int posisi1 = 200;
int posisi2 = 200;

int posisi1x = 200;
int posisi2x = 200;


//#define SERVOMIN  200
//#define SERVOMAX  600

// our servo # counter
uint8_t servonum;

void setup() {
//  Serial.begin(9600);
//  Serial.println("16 channel Servo test!");
  pinMode(btset,INPUT);
  pinMode(btok,INPUT);
  pinMode(btup,INPUT);
  pinMode(btdown,INPUT);

  digitalWrite(btset,HIGH);
  digitalWrite(btok,HIGH);
  digitalWrite(btup,HIGH);
  digitalWrite(btdown,HIGH);
 
  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
 
  pwm.begin();
 
  pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates

  yield();
}

// you can use this function if you'd like to set the pulse length in seconds
// e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise!
void setServoPulse(uint8_t n, double pulse) {
  double pulselength;
 
  pulselength = 1000000;   // 1,000,000 us per second
  pulselength /= 60;   // 60 Hz
//  Serial.print(pulselength); Serial.println(" us per period");
  pulselength /= 4096;  // 12 bits of resolution
//  Serial.print(pulselength); Serial.println(" us per bit");
  pulse *= 1000;
  pulse /= pulselength;
//  Serial.println(pulse);
  pwm.setPWM(n, 0, pulse);
}

void loop() {

setx = digitalRead(btset);
okx = digitalRead(btok);
downx = digitalRead(btdown);

  lcd.setCursor(0, 0);
  lcd.print("PILIH MENU");
  lcd.setCursor(0, 1);
  lcd.print(posisi1x);
  lcd.print(" ");
  lcd.print(posisi2x);
 
if(setx == 0){
  lcd.clear();
  delay(200);
  pilih();
  delay(1000);
  pilih2();
  delay(1000);
  }

pwm.setPWM(0, 0, posisi1x);
delay(500);
pwm.setPWM(1, 0, posisi2x);
delay(500);


if(downx == 0){

posisi1x = 200;
posisi2x = 200;

  }



}



void pilih(){

upx = digitalRead(btup);
downx = digitalRead(btdown);
okx = digitalRead(btok);
setx = digitalRead(btset);
  
  lcd.setCursor(0, 0);
  lcd.print("SET SERVO 1  ");
  lcd.print(xz);
  lcd.setCursor(0, 1);
  lcd.print("Posisi= ");
  lcd.print(posisi1);


if(setx == 0){
delay(200);
xz++;
}


if(xz > 1){
xz = 0; 
}


if(upx == 0){
  delay(200);
  if(xz == 0){
  posisi1 = posisi1 + 1;
  }
  if(xz == 1){
  posisi1 = posisi1 + 10;
  }
}

if(downx == 0){
  delay(200);
  if(xz == 0){
  posisi1 = posisi1 - 1;
  }
  if(xz == 1){
  posisi1 = posisi1 - 10;
  }
 
}

if(okx == 0){
  delay(200);
  posisi1x = posisi1;
  lcd.clear();
  return;
}


  pilih(); 
}





void pilih2(){

upx = digitalRead(btup);
downx = digitalRead(btdown);
okx = digitalRead(btok);
setx = digitalRead(btset);
   
  lcd.setCursor(0, 0);
  lcd.print("SET SERVO 2  ");
  lcd.print(xz);
  lcd.setCursor(0, 1);
  lcd.print("Posisi= ");
  lcd.print(posisi2);


if(setx == 0){
delay(200);
xz++;
}


if(xz > 1){
xz = 0; 
}

if(upx == 0){
  delay(200);
  if(xz == 0){
  posisi2 = posisi2 + 1;
  }
  if(xz == 1){
  posisi2 = posisi2 + 10;
  }
}

if(downx == 0){
  delay(200);
  if(xz == 0){
  posisi2 = posisi2 - 1;
  }
  if(xz == 1){
  posisi2 = posisi2 - 10;
  }
 
}

if(okx == 0){
  delay(200);
  posisi2x = posisi2;
  lcd.clear();
  return;
}


  pilih2(); 
}





e. VIDEO HASILNYA











Komunikasi 2 Mikrokontroller dengan 433 MHz RF LINK Kit Bascom AVR

Komunikasi 2 Mikrokontroller dengan 433 MHz RF LINK Kit Bascom AVR


       Pada pembahasan kali ini akan dijelaskan bagaimana cara berkomunikasi antar mikrokontroller, hanya sebatas master dan slave yang jumlahnya 1 master dan 1 slave tidak lebih karena modul 433Mhz RF Link Kit hanya bisa menerima 1 macam data dari transmitter yang terdeteksi oleh receiver, jadi kalau ada dua transmitter dengan frekuensi 433Mhz akan mengakibatkan kerancuan data yang diterima oleh receiver, itulah kelemahan yang ada di modul wireless ini, untuk bentuk alatnya seperti Gambar 6.42a berikut.


       Seperti halnya komunikasi antar mikrokontroller, pada alat ini akan menampilkan data yang dikirimkan oleh transmitter / master kemudian data tersebut ditampilkan ke LCD 16x2 yang terdapat pada bagian receiver / slave, menurut datasheet modul 433Mhz RF Link Kit bisa berkomunikasi maksimal 90 meter di area terbuka tanpa halangan, pada minimum sistem transmitter terdapat satu buah tombol yang mana akan mengirimkan data lain jika di tekan tombol tersebut sehingga total ada 2 data berbeda yang akan dikirimkan, yaitu saat tombol ditekan misal akan mengirimkan huruf “Y” dan saat tombol dilepas akan mengirimkan huruf “X”, seperti itu gambaran kerja alat ini. Fungsi dari alat ini yaitu bisa dikembangkan untuk pengendali gerak robot secara wireless atau yang lainnya. Tujuan dibuatnya alat ini yaitu untuk mengetahui bagaimana berkomunikasi antar mikrokontroller secara wireless menggunakan 433Mhz RF Link Kit.


- Prinsip Kerja Alat

     Alat ini menggunakan 2 buah mikrokontroller bisa bertipe sama atau tidak, tapi yang lebih baik menggunakan mikrokontroller setipe keduanya misal ATMega16 dengan crystal 11.059200 pada bagian master kemudian bagian slave pun seperti itu, jadi setipe lebih bagus, terdapat sebuah tombol push button pada bagian transmitter dan pada bagian receiver terdapat lcd 16x2. Pertama data dikirimkan oleh transmitter melalui port serial TX, kemudian data dilewatkan ke frekuensi 433Mhz yang akan diterima oleh rangkaian receiver, saat data telah diterima maka data tersebut langsung ditampilkan ke layar LCD 16x2, penerimaan data menggunakan port RX serial, jadi bisa disebut komunikasi secara serial dengan media udara / frekuensi 433Mhz, untuk lebih jelasnya perhatikan bagan berikut.      



- Rangkaian Hardware

       Untuk membuat alat ini memerlukan beberapa kompunen yaitu 2 buah minimum sistem ATMega16 dengan LCD display 16x2 dan push button serta modul 433Mhz RF Link Kit wireless.berikut penjelasan masing-masing komponen
a. 433Mhz RF Link Kit Module
       Modul 433Mhz RF Link Kit digunakan untuk mengirimkan data yang berupa angka atau huruf dari master ke receiver, jadi modul ini saat pembelian terdapat 2 buah modul yaitu master dan slave satu paketnya, untuk spsifikasi modul ini seperti berikut

1. Menggunakan media frekuensi 433Mhz
2. Tegangan kerja 5 volt dc
3. Jarak transfer maksimal 90 meter di area terbuka
4. Receiver Data Output: High - 1/2 Vcc, Low - 0.7v 
5. Transmitter Input Voltage: 3-12V 

Untuk menghubungkan ke mikrokontroller, hubungkan modul master ke bagian TX / PortD.1 mikrokontroller kemudian bagian slave dihubungkan ke RX / PortD.0 untuk penerimaan data, berikut gambar dan penjelasannya seperti Gambar






- Rangkaian Minimum Sistem ATMega16




Bahan – bahan :
1. Crystal 12 MHz x 1 buah
2. ATMega16 + Socket 40 pin x 1 buah
3. Capasitor 22p x 2 buah
4. LCD Display x 1 buah
5. Resistor 4K7 x 3 buah
6. Capasitor 104p x 4 buah
7. IC7805T x 1 buah
8. Capasitor polar 100uF x 1 buah
9. Capasitor polar 10uF x 1 buah
10. Capasitor 103p x 1 buah
11. Pinheader Male Secukupnya
12. Pinheader Female Secukupnya
13. Push Button x 1 Buah




- Program untuk master
$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
Ddrb.0 = 0
Set Portb.0
Do
If Pinb.0 = 0 Then
Print "Y"
Else
Print "X"
End If
Loop




- Program untuk slave
$regfile = "m16def.dat"
$crystal = 11059200
$baud = 9600
Config Lcdpin = Pin , Rs = Portc.0 , E = Portc.1 , Db4 = Portc.2
Config Lcdpin = Pin , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5
Config Lcd = 16 * 2
Dim Teks As String * 16
Cls
Cursor Off
Do
Cls
Input Teks
Upperline
Lcd Teks
Waitms 100
Loop




- Cara Penggunaan Alat
       Untuk menggunakan alat ini pertama aktifkan kedua minimum sistem dengan memberikan tegangan 12 volt atau 9 volt dc kemudian lihat apa yang tertulis pada layar LCD 16x2 bagian slave, jika tombol ditekan akan mengirimkan huruf  “Y” namun jika dilepas atau tidak ditekan maka akan mengirimkan huruf “X”.



- VIDEO HASILNYA










Membuat Genset Switch Otomatis Pengganti Aki dan Inverter

Membuat Genset Switch Otomatis Pengganti Aki dan Inverter


        Pada kesempatan kali ini saya akan membahas mengenai bagaimana cara membuat sebuah alat yang memadukan antara sumber dari aki dan sumber dari genset, prinsip kerja alat ini yaitu terdapat solat panel atau PV (photovoltaic) yang akan mengisi battery aki, tegangan DC aki kemudian dikonversikan ke AC menggunakan inverter untuk menghidupkan lampu AC dan lainnya, jika aki sudah habis maka akan switch otomatis ke genset, jadi genset akan menyala dengan sendirinya tanpa bantuan petugas jaga, sehingga akan lebih cepat dan efisien. yang perlu diperhatikan yaitu mekanisme dalam menghidupkan genset, karena akan ada step CHOOKE dan RUN saat Knob Stater On. Untuk lebih jelasnya berikut adalah skema dan programnya.




a. Arduino Mega





b. Sensor Arus ACS712





c. Sensor Tegangan AC ZMPT101b






d. Mekanisme Genset









e. Program Arduino IDE

#include "Wire.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

int vin = 0;
int iin = 0;

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

int a = 0;
int zero = 1;

int switchmr = 17;
int switchck = 16;
int switchmrx = 0;
int switchckx = 0;
int mark = 0;



void setup() {
pinMode(switchmr,INPUT);
pinMode(switchck,INPUT);

pinMode(13,OUTPUT);
pinMode(22,OUTPUT);
pinMode(24,OUTPUT);

pinMode(46,OUTPUT);
pinMode(48,OUTPUT);
pinMode(50,OUTPUT);
pinMode(52,OUTPUT);

digitalWrite(16,HIGH);
digitalWrite(17,HIGH);

  lcd.begin(16, 2);
  lcd.clear();
  lcd.noCursor();
  pinMode(14,OUTPUT);
  pinMode(15,OUTPUT);

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

   int vin = z ;

  z = 0;
 
  //================================
  // capture the values to memory
  for(i=0;i<300;i++) {
    start_times[i] = micros();
    values[i] = analogRead(A1);             
 
  if (values[i] >= z) {
  z = values[i]; 
  }
    stop_times[i] = micros();
  }
     float v1 = z * (5.0/1023.0);
     float iin = (v1-2.5)/0.1 ;

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

 z = 0;

//INVEERTER NYALA
if((vin >= 700)&&(mark == 0)){

  //MATIKAN SAKLAR GENSET
  digitalWrite(22,LOW);
  digitalWrite(24,LOW);
  delay(2000); 

  //PUTAR KE CHOOKE
  //kiri
  //mtrkanan
  digitalWrite(46,LOW);
  digitalWrite(48,HIGH);
  delay(200);
  digitalWrite(46,LOW);
  digitalWrite(48,LOW);
  lcd.clear();
 
  cuke();
 
  delay(5000);
 
//HIDUPKAN RELAY INVERTER
  digitalWrite(14,HIGH);
  digitalWrite(15,HIGH);
  delay(1000);


/*
//PUTAR KE RUN
//kanan 
//mtrkiri
  digitalWrite(50,HIGH);
  digitalWrite(52,LOW);
  delay(200);
  digitalWrite(50,LOW);
  digitalWrite(52,LOW);
  lcd.clear();

  run();
*/

  mark = 1;
 
}



// KONDISI INVERTER OFF
if((vin < 700)&&(mark == 1)){

//RELAY INVERTER OFF
  digitalWrite(14,LOW);
  digitalWrite(15,LOW);
  delay(3000);

//HIDUPKAN SAKLAR GENSET
  digitalWrite(22,HIGH);
  digitalWrite(24,LOW); 
  delay(3000);

/*
//PUTAR KE CHOOKE
  //kiri
  //mtrkanan
  digitalWrite(46,LOW);
  digitalWrite(48,HIGH);
delay(200);
  digitalWrite(46,LOW);
  digitalWrite(48,LOW);
  lcd.clear();
 
  cuke();
 
  delay(5000);
*/

//PUTAR KE RUN
//kanan 
//mtrkiri
  digitalWrite(50,HIGH);
  digitalWrite(52,LOW);
  delay(200);
  digitalWrite(50,LOW);
  digitalWrite(52,LOW);
  lcd.clear();

  run();

  delay(2000);

//MATIKAN SAKLAR GENSET
  digitalWrite(22,LOW);
  digitalWrite(24,LOW);
  delay(10000);
 
  digitalWrite(24,HIGH);

  mark = 0;
 
}

lcd.clear();
delay(1000);

if(vin > 700){
vin = 220;
}else if(vin < 700){
vin = 0;
}

  lcd.setCursor(0, 0);
  lcd.print("v= ");
  lcd.print(vin);
 
  lcd.setCursor(0, 1);
  lcd.print("I= ");
  lcd.print(iin);
 

delay(2000);
lcd.clear();


}


void run(){

  lcd.setCursor(0, 0);
  lcd.print("RUN");

 
  //kanan
//mtrkanan
  digitalWrite(46,HIGH);
  digitalWrite(48,LOW);
 
switchmrx = digitalRead(17);
 
if(switchmrx == 0){
  digitalWrite(46,LOW);
  digitalWrite(48,LOW);

  return;

    
run();
}



void cuke(){

  lcd.setCursor(0, 0);
  lcd.print("choke");

//kiri 
//mrtkiri
  digitalWrite(50,LOW);
  digitalWrite(52,HIGH);

 switchckx = digitalRead(16);

 if(switchckx == 0){
 digitalWrite(50,LOW);
 digitalWrite(52,LOW);

 mark = 0;
 return;
 }

cuke();
}






f. VIDEO HASILNYA