Translate

Membuat Alat Orbital Shaker Arduino

Membuat Alat Orbital Shaker Arduino


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat berfungsi sebagai alat pencampur 2 larutan yaitu orbital shaker, tujuan utama alat ini yaitu mencampurkan 2 larutan yang berbeda menjadi 1 wadah larutan yang kemudian dilakukan pengadukan sehingga tercampur rata. proses pengadukan juga harus berjalan secara smoot / halus agar cairan didalam wadah tidak mengalami goncangan yang serius. untuk lebih jelasnya berikut adalah koding dan komponennya. 


a. Komponen



b. Program Arduino IDE

#include <Wire.h>
#include <LiquidCrystal_I2C.h> 
#include <MsTimer2.h> 
#include <L298N.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display

//Motor DC - Driver Motor L298N
#define motor 10 //deklarasi pin 10 untuk mengatur kecepatan motor dengan mengubah nilai PWM
#define R_motor 9 //deklarasi pin 9 untuk mengatur arah putaran motor searah jarum jam
#define L_motor 8 //deklarasi pin 8 untuk mengatur arah putaran motor berlawanan arah jarum jam
//Water Pump - Driver Motor L298N
#define IN1 4 // deklarasi pin IN1 (drivermotor) terhubung ke pin 4 Arduino
#define IN2 5 // deklarasi pin IN2 (drivermotor) terhubung ke pin 5 Arduino
#define IN3 6 // deklarasi pin IN3 (drivermotor) terhubung ke pin 6 Arduino
#define IN4 7 // deklarasi pin IN4 (drivermotor) terhubung ke pin 7 Arduino

//Tombol - PullUpResistor
#define buttonUP A0 // deklarasi pin A0 sebagai tombol UP 
#define buttonDOWN A1 // deklarasi pin A1 sebagai tombol DOWN
#define buttonBACK A2 // deklarasi pin A2 sebagai tombol BACK 
#define buttonSTART A3 // deklarasi pin A3 sebagai tombol START

//Buzzer
#define buzzer 2 //deklarasi pin 13 untuk indikator buzzer

int menu=0;
int START=buttonSTART; 
int BACK=buttonBACK; 
int UP=buttonUP;
int DOWN=buttonDOWN; 
int menit;
int detik;
int vol_1,vol_2;
int nextVol_1, nextVol_2; 
int kec;
int setTimer=0;
float setpoints1;
float setpoints2;
float setpoints3;
  
void flash() {
detik--; }


void setup() {
//pengurangan detik
//deklarasi Motor DC 
pinMode(motor,OUTPUT); 
pinMode(R_motor,OUTPUT);
pinMode(L_motor,OUTPUT);
//deklarasi Tombol
pinMode(buttonUP, INPUT_PULLUP); 
pinMode(buttonDOWN, INPUT_PULLUP); 
pinMode(buttonSTART, INPUT_PULLUP); 
pinMode(buttonBACK, INPUT_PULLUP);
//deklarasi Water Pump 
pinMode(IN1, OUTPUT); 
pinMode(IN2, OUTPUT); 
pinMode(IN3, OUTPUT); 
pinMode(IN4, OUTPUT);
//deklarasi Buzzer 
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer,HIGH);
//pengurangan timer setiap 1 detik 
MsTimer2::set(1000,flash);
//inisialisasi tampilan awal 
nama();
menu=0;
}


void loop() {
switch (menu) {

case(0):
//Halaman awal menu berisi pemilihan Washing&Cleanser//
halaman1();
if (digitalRead(START)==LOW){klick();
delay(200);
lcd.clear();
menu=5;

if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=0;
  } 
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=0;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=1;
  } 
  break;
  
case(1):
//Halaman awal menu berisi pemilihan Setting Volume//
halaman2();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=9;
  } 
  
  if (digitalRead(BACK)==LOW){
    klick();
    delay(200);
    lcd.clear();
    menu=1;
    } 
    
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=0;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=2;
  } 
  break;
  
case(2):
//Halaman awal menu berisi pemilihan Setting Kecepatan//
halaman3();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=15;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=2;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=1;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=3;
  } 
  break;
  
case(3):
//Halaman awal menu berisi pemilihan Setting Timer//

halaman4();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=16;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=1;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=2;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=4;
  } 
  break;
  
case(4):
//Halaman awal menu berisi pemilihan START//
halaman5();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=17;
  } 

if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=4;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=3;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=4;
  } 
  break;
  
case(5):
//Halaman kesatu submenu Satu berisi pemilihan Washing// 
subHalaman1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=6;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=20;
  } 
  break;
  
case(6):
//Halaman kedua submenu Satu berisi proses Washing// 
subHalaman1_1();
menu=7;
break;

case(7):
//Halaman ketiga submenu Satu berisi pemilihan Cleanser// 
subHalaman1_2();
if (digitalRead(START)==LOW){
  klick();
  delay(200);lcd.clear();menu=8;} 
  break;
  
case (8):
//Halaman keempat submenu Satu berisi proses Cleanser// 
subHalaman1_3();
menu=1;
break;

case(9):
//Halaman kesatu submenu Dua berisi pemilihan Setting Volume I// 
subHalaman2_1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=10;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=1;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=12;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=12;
  } 
  break;
  
case(10):
//Halaman kedua submenu Dua berisi pemilihan jumlah Volume I// 
subHalaman2_1_1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=11;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=9;
  }
  
if (digitalRead(UP)==LOW&&vol_1<4){
  klick();
  delay(100);
  vol_1++;
  }
  
if (digitalRead(DOWN)==LOW&&vol_1>1){
  klick();
  delay(100);
  vol_1--;
  }
  break;

case(11):
//Halaman ketiga submenu Dua berisi proses Volume I// 
subHalaman2_1_2();
menu=12;
break;

case(12):
//Halaman kesatu submenu Dua berisi pemilihan Setting Volume II// 
subHalaman2_2();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=13;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=1;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=9;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=9;
  } 
  break;
  
case(13):
//Halaman kedua submenu Dua berisi pemilihan jumlah Volume II// 
subHalaman2_2_1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=14;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=12;
  } 
  
if (digitalRead(UP)==LOW&&vol_2<4){
  klick();
  delay(100);
  vol_2++;
  }
  
if (digitalRead(DOWN)==LOW&&vol_2>1){
  klick();
  delay(100);
  vol_2--;
  } 
  break;
  
case(14):
//Halaman ketiga submenu Dua berisi proses Volume II// 
subHalaman2_2_2();
menu=25;

break;

case(15):
//Halaman awal submenu Tiga berisi pemilihan Kecepatan// 
subHalaman3();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=3;
  } 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=2;
  } 
  
if (digitalRead(UP)==LOW&&kec<3){
  klick();
  delay(100);
  kec++;
  }
  
if (digitalRead(DOWN)==LOW&&kec>1){
  klick();
  delay(100);
  kec--;
  }
  break;
  
case(16):
//Halaman awal submenu Empat berisi pemilihan Timer//
subHalaman4();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=4;
  }
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=3;
  }
  
if (digitalRead(UP)==LOW&&setTimer<60){
  klick();
  delay(100);
  setTimer++;
  }
  
if (digitalRead(DOWN)==LOW&&setTimer>1){
  klick();
  delay(100);
  setTimer-- ;
  }
  
break;

case(17):
//Halaman kesatu submenu Lima berisi nilai Kecepatan dan Timer yang telah di setting//
subHalaman5();
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=4;
  }
  
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  MsTimer2::start();
  startMotor();
  menu=18;}
break;

case(18):
//Halaman kedua submenu Lima berisi proses Running Motor dan Countdown Timer//
subHalaman5_1();
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  MsTimer2::stop();
  stopMotor(); 
  }
  
if (digitalRead(START)==LOW){
  klick();
  delay(100);
  MsTimer2::start();
  startMotor() ;
  }
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(2000);
  lcd.clear();
  menu=19;
  } 
  
if (detik<=0&&setTimer<=0){
  detik=0;
  lcd.clear();
  menu=19;
  }
  
break;

case(19):
//Halaman ketiga submenu Lima berisi proses selesai Running Motor dan Countdown Timer//
subHalaman5_2(); 
menu=20;
break;

case(20):
//Halaman awal menu berisi pemilihan Washing&Cleanser tanpa Pembersihan Selang//
nextHalaman1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=5;
  }

if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=20;
  }

if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=20;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=21;
  }
  break;
  
case(21):

//Halaman awal menu berisi pemilihan Setting Volume tanpa Pembersihan Selang//
nextHalaman2();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=22;
  }

if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=21;
  }

if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=0;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=2;
  }
  break;
  
case(22):
//Halaman kesatu submenu Dua berisi pemilihan Setting Volume I tanpa Pembersihan Selang//
nextSubHalaman2_1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=23;
  }

if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=21;
  }
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=25;
  }
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=25;
  }
  break;
  
case(23):
//Halaman kedua submenu Dua berisi pemilihan jumlah Volume I tanpa Pembersihan Selang//
nextSubHalaman2_1_1();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=24;}
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=22;}

if (digitalRead(UP)==LOW&&nextVol_1<4){
  klick();
  delay(100);
  nextVol_1++;}
  
if (digitalRead(DOWN)==LOW&&nextVol_1>1){
  klick();
  delay(100);
  nextVol_1--;}
break;

case(24):
//Halaman ketiga submenu Dua berisi proses Volume I tanpa Pembersihan Selang//
nextSubHalaman2_1_2(); menu=25;
break;
case(25):
//Halaman kesatu submenu Dua berisi pemilihan Setting Volume II tanpa Pembersihan Selang//
nextSubHalaman2_2();
if (digitalRead(START)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=26;} 
  
if (digitalRead(BACK)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=21;} 
  
if (digitalRead(UP)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=22;}
  
if (digitalRead(DOWN)==LOW){
  klick();
  delay(200);
  lcd.clear();
  menu=22;}
  break;
  
case(26):
//Halaman kedua submenu Dua berisi pemilihan jumlah Volume II tanpa Pembersihan Selang//
nextSubHalaman2_2_1();
if (digitalRead(START)==LOW){klick();delay(200);lcd.clear();menu=27;}
if (digitalRead(BACK)==LOW){klick();delay(200);lcd.clear();menu=25;}
if (digitalRead(UP)==LOW&&nextVol_2<4){klick();delay(100);nextVol_2++;}
if (digitalRead(DOWN)==LOW&&nextVol_2>1){klick();delay(100);nextVol_2--;}
break; case(27):

//Halaman ketiga submenu Dua berisi proses Volume II tanpa Pembersihan Selang//
nextSubHalaman2_2_2(); menu=25;
break;
}
delay(50); }


void halaman1()
//Tampilan Pemilihan Washing & Cleanser// 
{
lcd.setCursor(0,0); lcd.print(">WASHING & CLEANSER"); lcd.setCursor(0,1);
lcd.print(" SET.VOLUME"); lcd.setCursor(0,2);
lcd.print(" SET.KECEPATAN"); lcd.setCursor(0,3);
lcd.print(" SET.TIMER");
}


void halaman2()
//Tampilan Pemilihan Setting Volume// 
{
lcd.setCursor(0,0);
lcd.print(" WASHING & CLEANSER"); lcd.setCursor(0,1); lcd.print(">SET.VOLUME");

lcd.setCursor(0,2);
lcd.print(" SET.KECEPATAN"); lcd.setCursor(0,3);
lcd.print(" SET.TIMER");
}
void halaman3()
//Tampilan Pemilihan Setting Kecepatan// 
{
lcd.setCursor(0,0);
lcd.print(" WASHING & CLEANSER"); lcd.setCursor(0,1);
lcd.print(" SET.VOLUME"); lcd.setCursor(0,2); lcd.print(">SET.KECEPATAN"); lcd.setCursor(0,3);
lcd.print(" SET.TIMER");
}


void halaman4()
//Tampilan Pemilihan Setting Timer// 
{
lcd.setCursor(0,0);
lcd.print(" WASHING & CLEANSER"); lcd.setCursor(0,1);
lcd.print(" SET.VOLUME"); lcd.setCursor(0,2);
lcd.print(" SET.KECEPATAN"); lcd.setCursor(0,3);

lcd.print(">SET.TIMER"); }


void halaman5()
//Tampilan Pemilihan Start// 
{
lcd.setCursor(0,0);
lcd.print(">START"); }


void subHalaman1()
//Tampilan Pemilihan Washing// 
{
lcd.setCursor(6,1); lcd.print("WASHING"); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}


void subHalaman1_1() //Tampilan Proses Washing// 
{
lcd.setCursor(0,0); lcd.print("-------******-------"); lcd.setCursor(7,1); lcd.print("PROSES"); lcd.setCursor(7,2);
lcd.print("WASHING"); lcd.setCursor(0,3); lcd.print("------*********-----"); washingPump();
delay(200);
lcd.clear(); }


void subHalaman1_2() //Tampilan Pemilihan Cleanser// 
{
lcd.setCursor(5,1); lcd.print("CLEANSER"); lcd.setCursor(13,3); lcd.print("[START]");
}

void subHalaman1_3() //Tampilan Proses Cleanser// 
{
lcd.setCursor(0,0); lcd.print("-------******-------");
lcd.setCursor(7,1); lcd.print("PROSES");
lcd.setCursor(6,2); lcd.print("CLEANSER"); lcd.setCursor(0,3); lcd.print("-----**********-----"); cleanserPump();

delay(200);
lcd.clear(); }

void subHalaman2_1()
//Tampilan Pemilihan Setting Volume I// 
{
lcd.setCursor(0, 0); lcd.print(">SET.VOLUME I"); lcd.setCursor(0, 1);
lcd.print(" SET.VOLUME II"); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(16,3); lcd.print("[OK]");
}

void subHalaman2_1_1()
//Tampilan Pemilihan jumlah Volume I// 
{
lcd.setCursor(4,0);
lcd.print("SET VOLUME I"); lcd.setCursor(11,1);
lcd.print("ml");
lcd.setCursor(7, 1); if(vol_1==1){lcd.print(" 25 ml ");} if(vol_1==2){lcd.print(" 50 ml ");} if(vol_1==3){lcd.print(" 75 ml ");} if(vol_1==4){lcd.print(" 100 ml ");}

lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}

void subHalaman2_1_2()
//Tampilan proses pengisian Volume I// 
{
lcd.setCursor(0,0); lcd.print("-------******-------"); lcd.setCursor(0,3); lcd.print("-------******-------"); lcd.setCursor(2, 1); lcd.print("PROSES PENGISIAN"); lcd.setCursor(10,2); lcd.print("ml");
lcd.setCursor(6, 2); if(vol_1==1){lcd.print(" 25 ml ");} if(vol_1==2){lcd.print(" 50 ml ");} if(vol_1==3){lcd.print(" 75 ml ");} if(vol_1==4){lcd.print(" 100 ml ");} waterPump1();
delay(200);
lcd.clear();
}

void subHalaman2_2()
//Tampilan Pemilihan Setting Volume II//
{
lcd.setCursor(0,0);
lcd.print(" SET.VOLUME I"); lcd.setCursor(0,1); lcd.print(">SET.VOLUME II"); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(16,3); lcd.print("[OK]");
}

void subHalaman2_2_1()
//Tampilan Pemilihan jumlah Volume II// 
{
lcd.setCursor(4,0);
lcd.print("SET VOLUME II"); lcd.setCursor(11,1);
lcd.print("ml");
lcd.setCursor(7, 1); if(vol_2==1){lcd.print(" 25 ml ");} if(vol_2==2){lcd.print(" 50 ml ");} if(vol_2==3){lcd.print(" 75 ml ");} if(vol_2==4){lcd.print(" 100 ml ");} lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}

void subHalaman2_2_2()
//Tampilan proses pengisian Volume II// 
{
lcd.setCursor(0,0); lcd.print("-------******-------"); lcd.setCursor(0,3); lcd.print("-------******-------"); lcd.setCursor(2, 1); lcd.print("PROSES PENGISIAN"); lcd.setCursor(10,2); lcd.print("ml");
lcd.setCursor(6, 2); if(vol_2==1){lcd.print(" 25 ml ");} if(vol_2==2){lcd.print(" 50 ml ");} if(vol_2==3){lcd.print(" 75 ml ");} if(vol_2==4){lcd.print(" 100 ml ");} waterPump2();
delay(200);
lcd.clear();
}

void subHalaman3()
//Tampilan Pemilihan Kecepatan// 
{
lcd.setCursor(3, 0); 
lcd.print("SET KECEPATAN"); lcd.setCursor(11, 1); lcd.print("rpm"); lcd.setCursor(6, 1);
if(kec==1){lcd.print(" 100 rpm ");} 
if(kec==2){lcd.print(" 150 rpm ");} 
if(kec==3){lcd.print(" 250 rpm ");} 
lcd.setCursor(0,3); 
lcd.print("[BACK]"); 
lcd.setCursor(16,3); 
lcd.print("[OK]");
}

void subHalaman4() //Tampilan Pemilihan Timer// 
{
lcd.setCursor(4, 0); lcd.print("SETTING TIMER"); lcd.setCursor(7, 1); lcd.print(setTimer);
lcd.print(" menit "); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(16,3); lcd.print("[OK]");
}

void subHalaman5()
//Tampilan hasil setting Kecepatan & Timer// 
{
lcd.setCursor(0, 0);
lcd.print("Kec. :"); 
if(kec==1){lcd.print(" 100 rpm ");} 
if(kec==2){lcd.print(" 150 rpm ");} 
if(kec==3){lcd.print(" 250 rpm ");}
lcd.setCursor(0, 1); lcd.print("Tim. :"); lcd.setCursor(7,1);
if(setTimer < 10) lcd.print("0"); lcd.print(setTimer); lcd.print(":");
if(detik < 10) lcd.print("0"); lcd.print(detik);
lcd.print(" "); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}

void subHalaman5_1()
//Tampilan running Kecepatan & Timer// 
{
if(detik<0)
{
 detik=59; 
 setTimer--;
}
 
lcd.setCursor(0, 1);
lcd.print("Kec. :"); 

if(kec==1){
  lcd.print(" 100 rpm ");
  } 

if(kec==2){
  lcd.print(" 150 rpm ");
  }

if(kec==3){
  lcd.print(" 250 rpm ");
  }
  
  lcd.setCursor(0, 2);
  lcd.print("Tim. :"); 
  lcd.setCursor(7,2);
  
if(setTimer < 10) lcd.print("0"); lcd.print(setTimer); lcd.print(":");

if(detik < 10) lcd.print("0"); lcd.print(detik); lcd.print(" "); //lcd.print(setpoints1); //menampilkan nilai pwm
lcd.print(" "); lcd.setCursor(0,0); lcd.print("--------------------"); lcd.setCursor(0,3); lcd.print("--------------------");
startMotor();
}

void subHalaman5_2()
//Tampilan running selesai Kecepatan & Timer// 
{
stopMotor();
MsTimer2::stop(); 
lcd.setCursor(0,0); 
lcd.print("-------******-------"); 
lcd.setCursor(7,1); 
lcd.print("PROSES"); 
lcd.setCursor(7,2); 
lcd.print("SELESAI"); 
lcd.setCursor(0,3); 
lcd.print("-----**********-----"); 
digitalWrite(buzzer, LOW); 
delay(2000);
digitalWrite(buzzer, HIGH);
lcd.clear(); }

void nextHalaman1()
//Tampilan Pemilihan Washing & Cleanser tanpa Pembersihan Selang// 
{
lcd.setCursor(0,0); lcd.print(">WASHING & CLEANSER"); lcd.setCursor(0,1);
lcd.print(" SET.VOLUME"); lcd.setCursor(0,2);
lcd.print(" SET.KECEPATAN"); lcd.setCursor(0,3);
lcd.print(" SET.TIMER");
}

void nextHalaman2()
//Tampilan Pemilihan Setting Volume tanpa Pembersihan Selang// 
{
lcd.setCursor(0,0);
lcd.print(" WASHING & CLEANSER"); lcd.setCursor(0,1); lcd.print(">SET.VOLUME"); lcd.setCursor(0,2);
lcd.print(" SET.KECEPATAN"); lcd.setCursor(0,3);
lcd.print(" SET.TIMER");
}

void nextSubHalaman2_1()
//Tampilan Pemilihan Setting Volume I tanpa Pembersihan Selang// 
{
lcd.setCursor(0, 0); lcd.print(">SET.VOLUME I"); lcd.setCursor(0, 1);
lcd.print(" SET.VOLUME II"); lcd.setCursor(0,3); lcd.print("[BACK]"); lcd.setCursor(16,3); lcd.print("[OK]");
}

void nextSubHalaman2_1_1()
//Tampilan Pemilihan jumlah Volume I tanpa Pembersihan Selang// 
{
lcd.setCursor(4,0);
lcd.print("SET VOLUME I"); lcd.setCursor(11,1);
lcd.print("ml");
lcd.setCursor(7, 1); if(nextVol_1==1){lcd.print(" 25 ml ");} if(nextVol_1==2){lcd.print(" 50 ml ");} if(nextVol_1==3){lcd.print(" 75 ml ");} if(nextVol_1==4){lcd.print(" 100 ml ");} lcd.setCursor(0,3);
lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}

void nextSubHalaman2_1_2()
//Tampilan proses pengisian Volume I tanpa Pembersihan Selang// 
{
lcd.setCursor(0,0); lcd.print("-------******-------"); lcd.setCursor(0,3); lcd.print("-------******-------"); lcd.setCursor(2, 1); lcd.print("PROSES PENGISIAN"); lcd.setCursor(10,2); lcd.print("ml");
lcd.setCursor(6, 2); if(nextVol_1==1){lcd.print(" 25 ml ");} if(nextVol_1==2){lcd.print(" 50 ml ");} if(nextVol_1==3){lcd.print(" 75 ml ");} if(nextVol_1==4){lcd.print(" 100 ml ");} NextWaterPump1();
delay(200);
lcd.clear();
}

void nextSubHalaman2_2 ()
//Tampilan Pemilihan Setting Volume II tanpa Pembersihan Selang// 
{
lcd.setCursor(0,0);
lcd.print(" SET.VOLUME I"); lcd.setCursor(0,1); lcd.print(">SET.VOLUME II"); lcd.setCursor(0,3); lcd.print("[BACK]");
lcd.setCursor(16,3);
lcd.print("[OK]"); }

void nextSubHalaman2_2_1 ()
//Tampilan Pemilihan jumlah Volume II tanpa Pembersihan Selang// 
{
lcd.setCursor(4,0);
lcd.print("SET VOLUME II"); lcd.setCursor(11,1);
lcd.print("ml");
lcd.setCursor(7, 1); if(nextVol_2==1){lcd.print(" 25 ml ");} if(nextVol_2==2){lcd.print(" 50 ml ");} if(nextVol_2==3){lcd.print(" 75 ml ");} if(nextVol_2==4){lcd.print(" 100 ml ");} lcd.setCursor(0,3);
lcd.print("[BACK]"); lcd.setCursor(13,3); lcd.print("[START]");
}

void nextSubHalaman2_2_2 ()
//Tampilan proses pengisian Volume II tanpa Pembersihan Selang// 
{
lcd.setCursor(0,0); lcd.print("-------******-------"); lcd.setCursor(0,3); lcd.print("-------******-------");
lcd.setCursor(2, 1);
lcd.print("PROSES PENGISIAN"); lcd.setCursor(10,2);
lcd.print("ml");
lcd.setCursor(6, 2); if(nextVol_2==1){lcd.print(" 25 ml ");} if(nextVol_2==2){lcd.print(" 50 ml ");} if(nextVol_2==3){lcd.print(" 75 ml ");} if(nextVol_2==4){lcd.print(" 100 ml ");} NextWaterPump2();
delay(200);
lcd.clear();
}

void nama()
{
lcd.clear();
lcd.begin();
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("ORBITAL SHAKER"); 
delay(2000);
lcd.clear();
}

void klick() 
{
digitalWrite(buzzer, LOW); delay(200); digitalWrite(buzzer, HIGH);
}

//pengaturan kondisi Buzzer saat tombol ditekan
void washingPump() // dengan air
{ startWaterPump(); delay(5200);
//pengaturan pembersihan selang I dan selang
stopWaterPump(); }

void cleanserPump() // tanpa air
{ startWaterPump(); 
delay(8000); 
stopWaterPump();
}

void waterPump1() 
{
//pengaturan pengosongan selang cairan I dan
//pengaturan volume cairan I
if(vol_1==1){startWaterPump1();delay(2200);stopWaterPump();} if(vol_1==2){startWaterPump1();delay(3200);stopWaterPump();} if(vol_1==3){startWaterPump1();delay(4200);stopWaterPump();} if(vol_1==4){startWaterPump1();delay(5200);stopWaterPump();}
}

void waterPump2() //pengaturan volume cairan II 
{
if(vol_2==1){startWaterPump2();delay(2200);stopWaterPump();} if(vol_2==2){startWaterPump2();delay(3200);stopWaterPump();} if(vol_2==3){startWaterPump2();delay(4200);stopWaterPump();} if(vol_2==4){startWaterPump2();delay(5200);stopWaterPump();}
}

void NextWaterPump1() //pengaturan volume cairan I tanpa pembersihan selang
{
if(nextVol_1==1){startWaterPump1();delay(1000);stopWaterPump();} if(nextVol_1==2){startWaterPump1();delay(2000);stopWaterPump();} if(nextVol_1==3){startWaterPump1();delay(3000);stopWaterPump();} if(nextVol_1==4){startWaterPump1();delay(4000);stopWaterPump();}
}

void NextWaterPump2() //pengaturan volume cairan II tanpa pembersihan selang
{ if(nextVol_2==1){startWaterPump2();delay(1000);stopWaterPump();} if(nextVol_2==2){startWaterPump2();delay(2000);stopWaterPump();} if(nextVol_2==3){startWaterPump2();delay(3000);stopWaterPump();} if(nextVol_2==4){startWaterPump2();delay(4000);stopWaterPump();}
}

void startWaterPump() //secara bersamaan
{
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); }

void startWaterPump1() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); }
//pengaturan mulai water pump 1 dan water pump 2
//pengaturan mulai water pump 1

void startWaterPump2() {
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); }
void stopWaterPump() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}



void startMotor() {
//pengaturan kecepatan motor dc
digitalWrite(R_motor, HIGH);
digitalWrite(L_motor, LOW);

if(kec==1){
  if(setpoints1 < 127.5){
    setpoints1 = setpoints1 + 5.0;
  }
  if(setpoints1 >= 127.5){
    setpoints1 = 127.5;
  }
  analogWrite(motor, setpoints1); //nilai PWM untuk kecepatan 100 RPM
  } 
  
if(kec==2){
  if(setpoints2 < 191.25){
    setpoints2 = setpoints2 + 5.0;
  }
  if(setpoints2 >= 191.25){
    setpoints2 = 191.25;
  }
  analogWrite(motor, setpoints2); //nilai PWM untuk kecepatan 150 RPM
  } 
  
if(kec==3){
  if(setpoints3 < 231.25){
    setpoints3 = setpoints3 + 5.0;
  }
  if(setpoints3 >= 231.25){
    setpoints3 = 231.25;
  }
  analogWrite(motor, setpoints3); //nilai PWM untuk kecepatan 250 RPM
  } 
 
}



void stopMotor() //pengaturan berhenti kerja motor dc 
{
  

if(kec==1){ 
  if(setpoints1 > 0){
    setpoints1 = setpoints1 - 1.0;
    digitalWrite(R_motor, HIGH);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints1);
  }   
  if(setpoints1 <= 0){
    setpoints1 = 0;
    digitalWrite(R_motor, LOW);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints1); //nilai PWM untuk kecepatan 100 RPM
    return;
  }   
}
 
if(kec==2){ 
  if(setpoints2 > 0){
    setpoints2 = setpoints2 - 1.0;
    digitalWrite(R_motor, HIGH);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints2);
  }    
  if(setpoints2 <= 0){
    setpoints2 = 0;
    digitalWrite(R_motor, LOW);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints2); //nilai PWM untuk kecepatan 100 RPM
    return; 
  } 
}
  
if(kec==3){ 
  if(setpoints3 > 0){
    setpoints3 = setpoints3 - 1.0;
    digitalWrite(R_motor, HIGH);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints3);
  } 
  if(setpoints3 <= 0){
    setpoints3 = 0;
    digitalWrite(R_motor, LOW);
    digitalWrite(L_motor, LOW);
    analogWrite(motor, setpoints3); //nilai PWM untuk kecepatan 100 RPM
    return;  
  } 
}

stopMotor();  
}


c. VIDEO HASILNYA



Kendali Suhu Menggunakan FUZZY LOGIC MAMDANI dengan Library eFLL

Kendali Suhu Menggunakan FUZZY LOGIC MAMDANI dengan Library eFLL


          Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk mengendalikan suhu pemanas sehingga suhunya sesuai setpoint atau fuzzy rule yang telah dibuat / diinginkan. alat ini menggunakan pemanas berupa peltier 5v dan sensor suhu Ds18b20 sebanyak 2 buah serta untuk pemprosesan datanya menggunakan Arduino Uno. untuk lebih jelasnya berikut adalah koding dan komponennya. untuk library eFLL bisa didownload pada link berikut.



1. Komponenya dan Skema

    a. Arduino Uno
    b. Sensor Suhu Ds18b20
    c. Transistor TIP3055
    d. Peltier 5v
    e. Resistor 330 ohm dan 4k7 ohm




2. Fuzzy Logic Mamdani

a. Membership Function





b. Fuzzy Rule



c. Defuzzyfikasi




d. Program Arduino IDE

#include <Fuzzy.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#define ONE_WIRE_BUS 2  

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float tempobject;
float temppeltier;

Fuzzy *fuzzy = new Fuzzy();

// FuzzyInput
FuzzySet *dingin = new FuzzySet(0, 0, 35, 36);
FuzzySet *normal = new FuzzySet(35, 36, 36, 37);
FuzzySet *panas = new FuzzySet(36, 37, 100, 100);

// FuzzyInput
FuzzySet *rendah = new FuzzySet(0, 0, 30, 40);
FuzzySet *sedang = new FuzzySet(30, 40, 40, 50);
FuzzySet *tinggi = new FuzzySet(40, 50, 100, 100);

// FuzzyOutput
FuzzySet *minimum = new FuzzySet(0, 0, 1, 2);
FuzzySet *average = new FuzzySet(2, 50, 50, 100);
FuzzySet *maximum = new FuzzySet(100, 200, 255, 255);

void setup()
{

  Serial.begin(9600);
  pinMode(9,OUTPUT);
  
  // FuzzyInput suhuobject
  FuzzyInput *suhuobject = new FuzzyInput(1);

  suhuobject->addFuzzySet(dingin);
  suhuobject->addFuzzySet(normal);
  suhuobject->addFuzzySet(panas);
  fuzzy->addFuzzyInput(suhuobject);

  // FuzzyInput suhupeltier
  FuzzyInput *suhupeltier = new FuzzyInput(2);

  suhupeltier->addFuzzySet(rendah);
  suhupeltier->addFuzzySet(sedang);
  suhupeltier->addFuzzySet(tinggi);
  fuzzy->addFuzzyInput(suhupeltier);

  // FuzzyOutput pwm
  FuzzyOutput *pwmout = new FuzzyOutput(1);

  pwmout->addFuzzySet(minimum);
  pwmout->addFuzzySet(average);
  pwmout->addFuzzySet(maximum);
  fuzzy->addFuzzyOutput(pwmout);

  // Building FuzzyRule 1
  FuzzyRuleAntecedent *ifsuhuobjectDinginAndsuhupeltierRendah = new FuzzyRuleAntecedent();
  ifsuhuobjectDinginAndsuhupeltierRendah->joinWithAND(dingin, rendah); 
  FuzzyRuleConsequent *thenPwmoutMaximum= new FuzzyRuleConsequent();
  thenPwmoutMaximum->addOutput(maximum);
  FuzzyRule *fuzzyRule1 = new FuzzyRule(1, ifsuhuobjectDinginAndsuhupeltierRendah, thenPwmoutMaximum);
  fuzzy->addFuzzyRule(fuzzyRule1);

  // Building FuzzyRule 2
  FuzzyRuleAntecedent *ifsuhuobjectDinginAndsuhupeltierSedang = new FuzzyRuleAntecedent();
  ifsuhuobjectDinginAndsuhupeltierSedang->joinWithAND(dingin, sedang); 
  //FuzzyRuleConsequent *thenPwmoutMaximum= new FuzzyRuleConsequent();
  thenPwmoutMaximum->addOutput(maximum);
  FuzzyRule *fuzzyRule2 = new FuzzyRule(2, ifsuhuobjectDinginAndsuhupeltierSedang, thenPwmoutMaximum);
  fuzzy->addFuzzyRule(fuzzyRule2);

  // Building FuzzyRule 3
  FuzzyRuleAntecedent *ifsuhuobjectDinginAndsuhupeltierTinggi = new FuzzyRuleAntecedent();
  ifsuhuobjectDinginAndsuhupeltierTinggi->joinWithAND(dingin, tinggi); 
  //FuzzyRuleConsequent *thenPwmoutMaximum= new FuzzyRuleConsequent();
  thenPwmoutMaximum->addOutput(maximum);
  FuzzyRule *fuzzyRule3 = new FuzzyRule(3, ifsuhuobjectDinginAndsuhupeltierTinggi, thenPwmoutMaximum);
  fuzzy->addFuzzyRule(fuzzyRule3);

  // Building FuzzyRule 4
  FuzzyRuleAntecedent *ifsuhuobjectNormalAndsuhupeltierRendah= new FuzzyRuleAntecedent();
  ifsuhuobjectNormalAndsuhupeltierRendah->joinWithAND(normal, rendah); 
  FuzzyRuleConsequent *thenPwmoutAverage= new FuzzyRuleConsequent();
  thenPwmoutAverage->addOutput(average);
  FuzzyRule *fuzzyRule4 = new FuzzyRule(4, ifsuhuobjectNormalAndsuhupeltierRendah, thenPwmoutAverage);
  fuzzy->addFuzzyRule(fuzzyRule4);

  // Building FuzzyRule 5
  FuzzyRuleAntecedent *ifsuhuobjectNormalAndsuhupeltierSedang= new FuzzyRuleAntecedent();
  ifsuhuobjectNormalAndsuhupeltierSedang->joinWithAND(normal, sedang); 
  //FuzzyRuleConsequent *thenPwmoutAverage= new FuzzyRuleConsequent();
  thenPwmoutAverage->addOutput(average);
  FuzzyRule *fuzzyRule5 = new FuzzyRule(5, ifsuhuobjectNormalAndsuhupeltierSedang, thenPwmoutAverage);
  fuzzy->addFuzzyRule(fuzzyRule5);

  // Building FuzzyRule 6
  FuzzyRuleAntecedent *ifsuhuobjectNormalAndsuhupeltierTinggi= new FuzzyRuleAntecedent();
  ifsuhuobjectNormalAndsuhupeltierTinggi->joinWithAND(normal, tinggi); 
  //FuzzyRuleConsequent *thenPwmoutAverage= new FuzzyRuleConsequent();
  thenPwmoutAverage->addOutput(average);
  FuzzyRule *fuzzyRule6 = new FuzzyRule(6, ifsuhuobjectNormalAndsuhupeltierTinggi, thenPwmoutAverage);
  fuzzy->addFuzzyRule(fuzzyRule6);

  // Building FuzzyRule 7
  FuzzyRuleAntecedent *ifsuhuobjectPanasAndsuhupeltierRendah= new FuzzyRuleAntecedent();
  ifsuhuobjectPanasAndsuhupeltierRendah->joinWithAND(panas, rendah); 
  FuzzyRuleConsequent *thenPwmoutMinimum= new FuzzyRuleConsequent();
  thenPwmoutMinimum->addOutput(minimum);
  FuzzyRule *fuzzyRule7 = new FuzzyRule(7, ifsuhuobjectPanasAndsuhupeltierRendah, thenPwmoutMinimum);
  fuzzy->addFuzzyRule(fuzzyRule7);

  // Building FuzzyRule 8
  FuzzyRuleAntecedent *ifsuhuobjectPanasAndsuhupeltierSedang= new FuzzyRuleAntecedent();
  ifsuhuobjectPanasAndsuhupeltierSedang->joinWithAND(panas, sedang); 
  //FuzzyRuleConsequent *thenPwmoutMinimum= new FuzzyRuleConsequent();
  thenPwmoutMinimum->addOutput(minimum);
  FuzzyRule *fuzzyRule8 = new FuzzyRule(8, ifsuhuobjectPanasAndsuhupeltierSedang, thenPwmoutMinimum);
  fuzzy->addFuzzyRule(fuzzyRule8);

  // Building FuzzyRule 9
  FuzzyRuleAntecedent *ifsuhuobjectPanasAndsuhupeltierTinggi= new FuzzyRuleAntecedent();
  ifsuhuobjectPanasAndsuhupeltierTinggi->joinWithAND(panas, tinggi); 
  //FuzzyRuleConsequent *thenPwmoutMinimum= new FuzzyRuleConsequent();
  thenPwmoutMinimum->addOutput(minimum);
  FuzzyRule *fuzzyRule9 = new FuzzyRule(9, ifsuhuobjectPanasAndsuhupeltierTinggi, thenPwmoutMinimum);
  fuzzy->addFuzzyRule(fuzzyRule9);
  
}

void loop()
{

  sensors.requestTemperatures();
  tempobject = sensors.getTempCByIndex(0);
  temppeltier = sensors.getTempCByIndex(1);

  Serial.print("Suhu Object: ");
  Serial.print(tempobject);
  Serial.print("|| Suhu Peltier: ");
  Serial.println(temppeltier);

  fuzzy->setInput(1, tempobject);
  fuzzy->setInput(2, temppeltier);

  fuzzy->fuzzify();

  Serial.print("Suhu Object: Dingin-> ");
  Serial.print(dingin->getPertinence());
  Serial.print(", Normal-> ");
  Serial.print(normal->getPertinence());
  Serial.print(", Panas-> ");
  Serial.println(panas->getPertinence());

  Serial.print("Suhu Peltier: Rendah-> ");
  Serial.print(rendah->getPertinence());
  Serial.print(",  Sedang-> ");
  Serial.print(sedang->getPertinence());
  Serial.print(",  Tinggi-> ");
  Serial.print(tinggi->getPertinence());

  float output1 = fuzzy->defuzzify(1);

  Serial.println("Output: ");
  Serial.print("PWMOUT: Minimum-> ");
  Serial.print(minimum->getPertinence());
  Serial.print(", Average-> ");
  Serial.print(average->getPertinence());
  Serial.print(", Maximum-> ");
  Serial.println(maximum->getPertinence());

  Serial.print("HASIL: ");
  Serial.print("PWM: ");
  Serial.println(output1);
  analogWrite(9,output1);
  
  delay(1000);
}





e. VIDEO HASILNYA








Alat Pakan Ikan Otomatis dan Monitor PH, Turbidity, Amoniak, Suhu Air Kolam Ikan dan Setting Batas Setpoint

Alat Pakan Ikan Otomatis dan Monitor PH, Turbidity, Amoniak, Suhu Air Kolam Ikan dan Setting Batas Setpoint


        Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor PH,TDS/NTU,Amoniak,Suhu dan juga dapat memberikan pakan ikan otomatis pada jam-jam tertentu tergantung dari setting waktu pakannya. alat ini juga dilengkapi dengan EEPROM sehingga ketika lampu padam maka setting batasnya tidaklah menjadi 0 namun sesuai setting yang kita inputkan. untuk lebih jelasnya berikut adalah koding dan komponennya.


1. Komponennya:

    a. Arduino Uno
    b. Sensor PH
    c. Turbidity Sensor
    d. Sensor Ds18b20
    e. Sensor HC-SRF04
    f. Nodemcu ESP8266
    g. Modul Relay 3 Channel
    h. Mini Servo
    i. LCD 20x4 + I2C
    j. Push Button




2. Program Arduino IDE 

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <EEPROM.h>
#define ONE_WIRE_BUS 8  
#include <Servo.h>

#define trigPin1 6
#define echoPin1 5
#define trigPin2 4
#define echoPin2 3

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal_I2C lcd(0x27,20,4);
DS3231  rtc(SDA, SCL);
Servo myservo;

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;

Time  t;
int jampagi,jamsiang,jamsore;
float TempC;
float pHValue;
int tds;
int adctds;
int adcPH;
int TempCx;
int pHValuex;
int ntux;
float ntufix;
long duration1, distance1;
long duration2, distance2;  
int btset = 2;
int btup = 10;
int btdown = 11;
int btok = 12;
int btsetx;
int btupx;
int btdownx;
int btokx;
float batasamo;
float batasph;
float amoniak;
int relayout = A3;
int relayin = A2;
int relayaerator = 7;
int tanda = 0;
int kolam;
int tinggipakan;


void setup(){  
  
jampagi = EEPROM.read(addr1);
jamsiang = EEPROM.read(addr2);
jamsore = EEPROM.read(addr3);
batasamo = EEPROM.read(addr4);
batasph = EEPROM.read(addr5);

pinMode(relayout,OUTPUT);
pinMode(relayin,OUTPUT);
pinMode(relayaerator,OUTPUT);
digitalWrite(relayout,LOW);
digitalWrite(relayin,LOW);
digitalWrite(relayaerator,LOW);

pinMode(btset,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);

pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);  

Wire.begin();  
sensors.begin();
Serial.begin(9600);
lcd.begin();  
lcd.clear(); 

rtc.begin();
//rtc.setDOW(WEDNESDAY);     // Set Day-of-Week to SUNDAmy
//rtc.setTime(13, 15, 0);     // Set the time to 12:00:00 (24hr format)
//rtc.setDate(1, 1, 2014);   // Set the date to January 1st, 2014

myservo.attach(9);
myservo.write(100);
}

void loop(){

btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);

if(btsetx == 0){
delay(1000);
lcd.clear();
setjampagi();
setjamsiang();
setjamsore();
setbatasamo();
setbatasph();
}
  
 t = rtc.getTime();

  //ketinggian air kolam 
  digitalWrite(trigPin1, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin1, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin1, LOW);
  duration1 = pulseIn(echoPin1, HIGH);
  distance1 = (duration1/2) / 29.1;

  //ketinggian pakan ikan
  digitalWrite(trigPin2, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin2, HIGH);
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin2, LOW);
  duration2 = pulseIn(echoPin2, HIGH);
  distance2 = (duration2/2) / 29.1;
  
  if(distance1 > 35){
    distance1 = 35;
  }

  if(distance2 > 30){
    distance2 = 30;
  }
  
  kolam = 35 - distance1; 
  tinggipakan = map(distance2, 5,30,100,0);

if((kolam >= 29)&&(kolam <= 31)){
  digitalWrite(relayin,LOW);
  digitalWrite(relayout,LOW);  
  }

if(kolam < 29){
  digitalWrite(relayin,HIGH);
  digitalWrite(relayout,LOW);
  }

if(kolam > 31){
  digitalWrite(relayin,LOW);
  digitalWrite(relayout,HIGH);
  }
     
 adcPH = analogRead(A0); //menggunakan pin A0 untuk membaca output sensor pH
 pHValue = (adcPH - 906.84) / -37.283;

 adctds = analogRead(A1);             
 tds = map(adctds, 855, 1, 0, 100);
 
 pHValuex = pHValue * 100.0;
 
  sensors.requestTemperatures();
  TempC = sensors.getTempCByIndex(0); // Celcius
  TempCx =  TempC * 100.0;

if(pHValue < 6.5){
  amoniak = (pHValue / TempC) * 0.202; 
}

if(pHValue == 7.0){
  amoniak = (pHValue / TempC) * 1.131; 
}

if(pHValue > 7.0){
  amoniak = (pHValue / TempC) * 3.306; 
}


if(amoniak > batasamo){
  digitalWrite(relayaerator,HIGH);
  }

if(amoniak <= batasamo){
  digitalWrite(relayaerator,LOW);
  }

  
if((t.hour == jampagi)&&(jampagi > 0)&&(tanda == 0)){
  myservo.write(150);
  delay(5000);
  myservo.write(100);
  tanda = 1;
}

if((t.hour == jamsiang)&&(jamsiang > 0)&&(tanda == 1)){
  myservo.write(150);
  delay(5000);
  myservo.write(100);
  tanda = 2;
}

if((t.hour == jamsore)&&(jamsore > 0)&&(tanda == 2)){
  myservo.write(150);
  delay(5000);
  myservo.write(100);
  tanda = 0;
}

  
  lcd.setCursor(0,0);
  lcd.print("TDS:");
  lcd.print(tds);
  lcd.print("% ");
 
  lcd.print("PH:");
  lcd.print(pHValue);
  lcd.print("  ");

  lcd.setCursor(0,1);
  lcd.print("T:");
  lcd.print(TempC,1);
  lcd.print("c ");
  
  lcd.print(batasamo);
  lcd.print("/");
  lcd.print(batasph);
  lcd.print(" ");

  lcd.setCursor(0,2);
  lcd.print(t.hour, DEC);
  lcd.print(":");
  lcd.print(t.min, DEC);
  lcd.print(":");
  lcd.print(t.sec, DEC);
  lcd.print("  ");
  lcd.print(jampagi);
  lcd.print("/");
  lcd.print(jamsiang);
  lcd.print("/");
  lcd.print(jamsore);
  lcd.print("  ");

  lcd.setCursor(0,3);
  lcd.print("S=");
  lcd.print(kolam);
  lcd.print("/");
  lcd.print(tinggipakan);
  lcd.print("  ");

  lcd.setCursor(10,3);
  lcd.print("Mg/l:");
  lcd.print(amoniak);
  lcd.print(" ");

  Serial.print("*");
  Serial.print(pHValue * 100.0);
  Serial.print(",");
  Serial.print(tds);
  Serial.print(",");
  Serial.print(amoniak * 100.0);
  Serial.print(",");
  Serial.print(TempC * 100.0);
  Serial.println("#");
  
  delay(1000);
}


void setjampagi(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Pagi");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jampagi);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jampagi++; 
}

if(btdownx == 0){
  delay(200);
  jampagi--; 
}

if(jampagi > 23){
jampagi = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr1, jampagi);
  return; 
}

setjampagi();  
}


void setjamsiang(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Siang  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsiang);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsiang++; 
}

if(btdownx == 0){
  delay(200);
  jamsiang--; 
}

if(jamsiang > 23){
jamsiang = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr2, jamsiang);
  return; 
}

setjamsiang();  
}


void setjamsore(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("Waktu Pakan Sore  ");
  lcd.setCursor(0,1);
  lcd.print("Jam: ");
  lcd.print(jamsore);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  jamsore++; 
}

if(btdownx == 0){
  delay(200);
  jamsore--; 
}

if(jamsore > 23){
jamsore = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr3, jamsore);
  return; 
}

setjamsore();  
}


void setbatasamo(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS AMONIAK  ");
  lcd.setCursor(0,1);
  lcd.print("mg/l: ");
  lcd.print(batasamo);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  batasamo = batasamo + 0.1; 
}

if(btdownx == 0){
  delay(200);
  batasamo = batasamo - 0.1; 
}

if(batasamo > 100.0){
batasamo = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr4, batasamo);
  return; 
}

setbatasamo();  
}



void setbatasph(){
  
btsetx = digitalRead(btset);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);
btokx = digitalRead(btok);  

  lcd.setCursor(0,0);
  lcd.print("BATAS PH  ");
  lcd.setCursor(0,1);
  lcd.print("PH: ");
  lcd.print(batasph);
  lcd.print("   ");

if(btupx == 0){
  delay(200);
  batasph = batasph + 0.1; 
}

if(btdownx == 0){
  delay(200);
  batasph = batasph - 0.1; 
}

if(batasph > 100.0){
batasph = 0;  
}

if(btokx == 0){
  lcd.clear();
  delay(2000);
  EEPROM.write(addr5, batasph);
  return; 
}

setbatasph();  
}



3. Program Nodemcu ESP8266

#include <ESP8266WiFi.h>
#include <ThingSpeak.h>
#include <WiFiClient.h>

int temp;
int x = 5;
int y;

int value1;
int value2;
int value3;
int value4;

float ph;
int tds;
float amoniak;
float suhu;

int datain1;
int datain2;
int datain3;
int datain4;

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

String apiKey = "UYGFUY87JKJGJ6HKS";     //  Enter your Write API key from ThingSpeak
const char* resource = "/update?api_key=";

const char* ssid =  "hotspothpku";     // replace with your wifi ssid and wpa2 key
const char* pass =  "123456789";
const char* server = "api.thingspeak.com";

WiFiClient  client;

void setup()
{
 
  dataIn="";
  Serial.begin(9600);
  delay(10);

  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

      while (WiFi.status() != WL_CONNECTED)
     {
            delay(500);
            Serial.print(".");
     }
      Serial.println("");
      Serial.println("WiFi connected");

}

void loop()
{

while(Serial.available()>0) {
//   dataIn="";
    char inChar = (char)Serial.read();
    dataIn += inChar;
    if (inChar == '\n') {
    parsing = true;
  }
}

if(parsing){
    parsingData();
       
  if (client.connect(server,80))   //   "184.106.153.149" or api.thingspeak.com
                      {
                           
                             String postStr = apiKey;
                             postStr +="&field1=";
                             postStr += String(ph);
                             postStr += "\r\n\r\n";

                             client.print(String("GET ") + resource + apiKey + "&field1=" + ph + "&field2=" + tds + "&field3=" + amoniak + "&field4=" + suhu + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n");
                                       
                             client.print("Host: api.thingspeak.com\n");
                             client.print("Connection: close\n");
                             client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
                             client.print("Content-Type: application/x-www-form-urlencoded\n");
                             client.print("Content-Length: ");
                             client.print(postStr.length());
                             client.print("\n\n");
                             client.print(postStr);
                           
                          
                             Serial.println(". Send to Thingspeak.");
                        }
                       
          client.stop();

          //Serial.println("Waiting...");

  delay(10000);
 
 }
}

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();
 datain3 = dt[2].toInt();
 datain4 = dt[3].toInt();

//kirim data hasil parsing
Serial.print("data 1 : ");
Serial.print(datain1);
Serial.print("\n");
Serial.print("data 2 : ");
Serial.print(datain2);
Serial.print("\n");
Serial.print("data 3 : ");
Serial.print(datain3);

 ph = datain1 / 100.0;
 tds = datain2 / 1;
 amoniak = datain3 / 100.0;
 suhu = datain4 / 100.0;
 
}



4. VIDEO HASILNYA




PELATIHAN ROBOT UNTUK PEMULA (BISA KURSUS ONLINE / OFFLINE)


PELATIHAN ROBOT UNTUK PEMULA 

        Kabar gembira untuk pelajar wilayah kediri jawa timur dan sekitarnya karena kami telah membuka jasa pelatihan robotika untuk pemula yaitu untuk level SD - SMP - SMA, materi pelatihan robotika dari kami sangat sederhana namun bisa diaplikasikan langsung ke robot karena kami menyediakan beberapa item untuk peserta pelatihan seperti keterangan diawah ini dan juga materi pelatihan yang memudahkan siswa untuk mempelajari robot secara mendalam. berikut adalah materi pelatihan dan item yang didapat peserta. 


1. Item yang didapat peserta
    a. Modul Pembelajaran (Hardcopy)
    b. Robot Pelatihan
    c. Komponen dan Sensor yang dipakai
 
 
2. Materi pelatihan
    a. Cara memasang komponen dan sensor pada robot
    b. Cara memprogram robot agar sesuai yang diinginkan
    c. Cara menjalankan robot sesuai skema dan koding yang dibuat
    d. Improvisasi robot oleh peserta didik / siswa
 
 
3. Level pelatihan:
    a. Dasar : SD - SMP - SMA
    b. Menengah : Mahasiwa / Pekerja (Segala Usia)
    c. Lanjut (Advance) : Mahasiwa / Pekerja (Segala Usia)


4. Waktu Pelatihan dan Biaya:
    a. Waktu pelatihan 1-2 jam tergantung tingkat pemahaman peserta
    b. Jumlah pertemuan maksimal 3 atau 4 kali pertemuan 
    c. Biaya pelatihan tergantung pada levelnya.
    d. Biaya level dasar : Rp. 800.000,-  
    e. Biaya level menengah : Rp. 1.000.000,-
    f. Biaya Level Lanjut (Advance) : Rp. 1.500.000,- (Tergantung tingkat kesulitan)


5, Materi Pelatihan Ada 6 Jenis Robot (Peserta memilih salah satu) yaitu:
    a. Robot Line Follower
    b. Robot Wall Avoider
    c. Robot Lengan
    d. Robot Remot Control
    e. Robot Kendali Joystick
    f. Robot Kendali HP


6. VIDEO REVIEW ROBOT