Translate

Monitor Daya (Arus & Tegangan) Blynk 2.0 Fitur Kendali dan Notifikasi Blynk 2.0 PZEM-004t

Monitor Daya (Arus & Tegangan) Blynk 2.0 Fitur Kendali dan Notifikasi Blynk 2.0 PZEM-004t


         Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana cara membuat sebuah alat yang dapat memonitor arus, tegangan dan daya melalui aplikasi Blynk 2.0. alat ini memiliki fitur kendali dan notifikasi melalui Blynk 2.0, jadi alat ini bisa melakukan on off beban melalui aplikasi dan ada notif juga jika terjadi sesuatu sesuai kodingnya. untuk lebih jelasnya berikut adalah program dan skemanya.


a. Skema Alat




b. Program Arduino IDE

#define BLYNK_PRINT Serial

#define BLYNK_TEMPLATE_ID "TMPL6wOC--xIt"
#define BLYNK_TEMPLATE_NAME "monitor daya"
#define BLYNK_AUTH_TOKEN "q9HmPp9dHXPjalYVO9cymW30_imbh4Px"

#include <SPI.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
#include <PZEM004Tv30.h>
#include <LiquidCrystal_I2C.h> 

LiquidCrystal_I2C lcd(0x27,16,2); 
 
PZEM004Tv30 pzem(D7,D8); 

float voltage;
float current;
float power;
int pinValue;

BlynkTimer timer;

char ssid[] = "hotspothpku";
char pass[] = "123456789";


BLYNK_WRITE(V3)
{
  pinValue = param.asInt();   

  if(pinValue == 1){
    digitalWrite(D6, LOW);
  }
  
  if(pinValue == 0) {
    digitalWrite(D6, HIGH);
    Blynk.logEvent("listrik_padam");
    Serial.print("LISTRIK PADAM"); 
  }
  
//  Serial.print("button value is: "); 
//  Serial.println(pinValue);

}


void kirimdata()
{
  Blynk.virtualWrite(V0,voltage);
  Blynk.virtualWrite(V1,current);
  Blynk.virtualWrite(V2,power);
}


void setup() {
  Serial.begin(9600);
  lcd.begin();  
  lcd.clear();
  lcd.noCursor(); 
  pinMode(D6,OUTPUT);
  
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
  timer.setInterval(1000L, kirimdata);

}


void loop() {
 
voltage = pzem.voltage();
current = pzem.current();
power = pzem.power();
   
lcd.setCursor(0,0);
lcd.print("V/I:");
lcd.print(voltage);
lcd.print("/");   
lcd.print(current);
lcd.print("  ");

lcd.setCursor(0,1);
lcd.print("P:");   
lcd.print(power);
lcd.print("  ");

Blynk.run();
timer.run(); // Initiates BlynkTimer

if(power  >= 20.0){ //jika daya lebih dari 20 watt
    digitalWrite(D6, HIGH); //off listrik
    Blynk.logEvent("listrik_padam");
    Serial.print("LISTRIK PADAM");   
}

delay(1000);
}



c. Interface Blynk 2.0







d. VIDEO HASILNYA




Alat Pendeteksi Arus Bocor (Deteksi Arus Bocor) ESP32 Sensor PZEM-004t dan IOT Thingspeak

Alat Pendeteksi Arus Bocor (Deteksi Arus Bocor) ESP32 Sensor PZEM-004t dan IOT Thingspeak


       Pada kesempatan kali ini saya akan menjelaskan mengenai bagimana cara membuat sebuah alat yang dapat digunakan untuk mendeteksi kebocoran arus, dikarenakan kebocoran arus sangat berbahaya dan merugikan, salah satunya yaitu dapat mengakibatkan biaya jadi besar dan jika arus bocornya lumayan besar maka akan mengakibatkan kesetrum jika terkena aliran arus tersebut, untuk itu perlu dipakaikan alat untuk memonitornya. untuk lebih jelasnya berikut adalah koding dan skemanya.


a. Komponen dan Skema

1. ESP32
2. PZEM-004t
3. LCD 2x4 I2C
4. Buzzer
5. Led
6. SSR DC AC
7. Push Button




b. Program Arduino IDE

#include <Wire.h>
#include <HardwareSerial.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PZEM004Tv30.h>
#include <LiquidCrystal_I2C.h> 
#define RXD2 16
#define TXD2 17

LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display
 
PZEM004Tv30 pzem(&Serial);  //(RX,TX) connect to TX,RX of PZEM
PZEM004Tv30 pzem2(&Serial2);  //(RX,TX) connect to TX,RX of PZEM

float voltage;
float current1;
float power;
float energy;
float biaya; 
float voltage2;
float current2;
float energy2;
int buzzer = 19;
int btreset = 35;
int ledmerah = 26;
int ledhijau = 25;
int ssr = 27;
float selisih;
int btresetx;

WiFiClient client;
// ThingSpeak Settings
String apiKey = "GHJ754DGHBN87GJ7";
const char *ssid = "hotspothpku";
const char *pass = "123456789";
const char* server = "api.thingspeak.com";
const char* resource = "/update?api_key=";

void setup() {

 //setting ke online
  Serial.println("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED){\
    delay(200);
    Serial.println(".");
    }
  Serial.println("");
  Serial.println("WiFi connected");

  Serial.begin(9600); 
  Serial2.begin(9600);
  lcd.begin();  
  lcd.clear();
  lcd.noCursor();  
  pinMode(buzzer,OUTPUT);
  pinMode(btreset,INPUT);
  pinMode(ledmerah,OUTPUT);
  pinMode(ledhijau,OUTPUT);
  pinMode(ssr,OUTPUT);
  digitalWrite(ssr,HIGH); //LITRIK AC NYALA
}

void loop() {

btresetx = digitalRead(btreset);

if(btresetx == 0){
  digitalWrite(ssr,HIGH); //LITRIK AC NYALA
  delay(1000);  
}
 
voltage = pzem.voltage();
current1 = pzem.current();
energy = pzem.energy();
power = pzem.power();
biaya = energy * 1350;
current2 = pzem2.current();

if(current1 == current2){
  digitalWrite(buzzer,HIGH);
  digitalWrite(ledmerah,LOW);
  digitalWrite(ledhijau,HIGH); 
  digitalWrite(ssr,HIGH);  
}

if(current1 > current2){
  selisih = current1 - current2;

/*
if((selisih > 0.00)&&(selisih < 0.01 )){
  digitalWrite(buzzer,HIGH);
  digitalWrite(ledmerah,HIGH);
  digitalWrite(ledhijau,LOW);
  digitalWrite(ssr,HIGH);     
}
*/

if(selisih >= 0){
  digitalWrite(buzzer,LOW);
  digitalWrite(ledmerah,HIGH);
  digitalWrite(ledhijau,LOW);  
  digitalWrite(ssr,LOW);  
  lcd.clear();
  padam();
}

}


if(current1 < current2){
  selisih = current2 - current1;  

/*
if((selisih > 0.00)&&(selisih < 0.01 )){
  digitalWrite(buzzer,HIGH);
  digitalWrite(ledmerah,HIGH);
  digitalWrite(ledhijau,LOW);
  digitalWrite(ssr,HIGH);     
}
*/

if(selisih >= 0){
  digitalWrite(buzzer,LOW);
  digitalWrite(ledmerah,HIGH);
  digitalWrite(ledhijau,LOW);  
  digitalWrite(ssr,LOW);  
  lcd.clear();
  padam();
}

}

lcd.setCursor(0,0);
lcd.print("V:");
lcd.print(voltage);
lcd.print("  ");

lcd.setCursor(0,1);
lcd.print("I1:");   
lcd.print(current1);
lcd.print(" I2:");
lcd.print(current2);
lcd.print("     ");

lcd.setCursor(0,2);
lcd.print("Kwh:");
lcd.print(energy);
lcd.print(" Rp.");   
lcd.print(biaya);
lcd.print("  ");

lcd.setCursor(0,3);
lcd.print("B:");
lcd.print(selisih);
lcd.print(" ");   
lcd.print("P: ");
lcd.print(power);
lcd.print(" ");   

kirim();
delay(1000);
}

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

                             client.print(String("GET ") + resource + apiKey + "&field1=" + voltage + "&field2=" + current1 + "&field3=" + current2 + "&field4=" + energy + "&field5=" + biaya + "&field6=" + selisih + "&field7=" + power +" 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...");
 
  // thingspeak needs minimum 15 sec delay between updates, i've set it to 30 seconds
  delay(10000);
    
}

void padam(){
lcd.setCursor(0,1);
lcd.print("TERJADI ARUS BOCOR");
digitalWrite(buzzer,LOW);

  digitalWrite(buzzer,LOW);
  digitalWrite(ledmerah,HIGH);
  digitalWrite(ledhijau,LOW);  
  digitalWrite(ssr,LOW);  

btresetx = digitalRead(btreset);

if(btresetx == 0){
  lcd.clear();
  delay(1000);
  digitalWrite(ssr,HIGH); //LITRIK AC NYALA
  digitalWrite(buzzer,HIGH);
  delay(1000);
  return;  
}
  
padam();  
}



c. VIDEO HASILNYA



Deteksi Tegangan AC 220v dan Listrik Padam / Nyala NOTIF SMS

Deteksi Tegangan AC 220v dan Listrik Padam / Nyala NOTIF SMS
 

          Pada kesempatan kali ini saya akan menjeaskan mengenai bagaimana memuat sebuah alat yang dapat mendeteksi tegangan PLN 220v, jadi alat ini akan memberikan notif sms jika terjadi listrik padam dan ketika listrik nyala maka akan memberikan notif sms juga sehingga user atau pemilik bisa mengetahui bahwa telah terjadi listrik padam. untuk lebih jelasnya berikut adalah koding dan skemanya.
 
 
a. Komponen dan skemanya



 
b. Program Arduino IDE

#include "Wire.h"
#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
SMSGSM sms;

int vin = 0;
int iin = 0;
int vout;
float kal;

int a = 0;
int zero = 1;
int kondisi = 0;
int dataadc;

char string[160];
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];
unsigned long values[100];
int vin1;
int vin2;
int vin3;
int vin4;
unsigned int i1;
unsigned int z1;
unsigned int i2;
unsigned int z2;
unsigned int i3;
unsigned int z3;
unsigned int i4;
unsigned int z4;

void setup() {
  Serial.begin(9600);
 
  Serial.println("GSM Shield testing.");
     if (gsm.begin(2400)) {
          Serial.println("\nstatus=READY");
          started=true;
     } else Serial.println("\nstatus=IDLE");

     if(started) {
          if (sms.SendSMS("081234567890", "Alat Ready"))
          Serial.println("\nSMS sent OK");
     }
     
}

void loop() {
 
z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

for(i1=0;i1<100;i1++) {
  values[i1] = analogRead(A0);            
  if (values[i1] >= z1) {
  z1 = values[i1];
  }
}

for(i2=0;i2<100;i2++) {
  values[i2] = analogRead(A0);            
  if (values[i2] >= z2) {
  z2 = values[i2];
  }
}
 
for(i3=0;i3<100;i3++) {
  values[i3] = analogRead(A0);            
  if (values[i3] >= z3) {
  z3 = values[i3];
  }
}
 
 for(i4=0;i4<100;i4++) {
  values[i4] = analogRead(A0);            
  if (values[i4] >= z4) {
  z4 = values[i4];
  }
}
 
vin1 = z1 ;
vin2 = z2 ;
vin3 = z3 ;
vin4 = z4 ;

z1 = 0;
z2 = 0;
z3 = 0;
z4 = 0;

if((vin1 > vin2)&&(vin1 > vin3)&&(vin1 > vin4)){
  vout = vin1;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin2 > vin1)&&(vin2 > vin3)&&(vin2 > vin4)){
  vout = vin2;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin3 > vin1)&&(vin3 > vin2)&&(vin3 > vin4)){
  vout = vin3;
  kal = (vout - 515.9) / 0.413 ;
}
else if((vin4 > vin1)&&(vin4 > vin2)&&(vin4 > vin3)){
  vout = vin4;
  kal = (vout - 515.9) / 0.413 ;
}

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

Serial.println(kal);

 if((kal > 200)&&(kondisi == 1)){
  if (sms.SendSMS("081234567890", "Listrik Nyala"))
      Serial.println("\nSMS sent OK");
      kondisi = 0;
      delay(3000);
   }
 
 if((kal < 200)&&(kondisi == 0)){
   if (sms.SendSMS("081234567890", "Listrik Padam"))
      Serial.println("\nSMS sent OK");
      kondisi = 1;
      delay(3000);
   }
      
delay(200);
}
 
 
 
c, VIDEO HASILNYA
 

 
 
 

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