//===============================================================================================
//AGROWIRA SmartDrip Irrigation Control System
//MODEL: MINI Garden REV 3
//SPEC : 2 Soil Moisture Sensor, 4 Input Button ++/--/<</>>, 1 LCD I2C, 1 Output Pin Relay Pompa
//Coding By: Wira Nugraha
//Last Review: 14 Oct 2023
//===============================================================================================
#include <LiquidCrystal_I2C.h>
//initialize LCD Pin
LiquidCrystal_I2C lcd(0x27,20,4);
//initialize Pin Output
const int LED_RED=10; //LED Hijau Pin 10
const int LED_GREEN=11; //LED Merah Pin 11
const int RELAY=12; //Relay Pompa Fertigasi Pin 12
//initialize pin tombol
const int up_key=2; //tombol ++ di pin 2
const int down_key=3; //tombol -- di pin 3
const int left_key=4; //tombol << / Y di pin 4
const int right_key=5; //tombol >> / T di pin 5
//initialize pin soil moisture sensor
const int sensor1=A0; //Soil Moisture 1
const int sensor2=A1; //Soil Moisture 2
//initialize Setpoint Button
int Button=A2; //Setpoint Parameter Button
//initialize variabel setpoint
int Basah=30; //setpoint kelembaban tanah basah (Pompa OFF)
int Kering=18; //setpoint kelembaban tanah kering (Pompa ON)
//setup pin mode
void setup() {
pinMode (LED_RED,OUTPUT); //LED Indikator Merah
pinMode (LED_GREEN,OUTPUT); //LED Indikator Hijau
pinMode (RELAY,OUTPUT); //Output Relay Pompa
pinMode (up_key,INPUT); //Tombol ++
pinMode (down_key,INPUT); //Tombol --
pinMode (left_key,INPUT); //Tombol Panah Kiri <<--
pinMode (right_key,INPUT); //Tombol Panah Kanan -->>
pinMode (Button,INPUT); //Tombol Setting Parameter
//Pull Up Button
digitalWrite(up_key,HIGH);
digitalWrite(down_key,HIGH);
digitalWrite(left_key,HIGH);
digitalWrite(right_key,HIGH);
digitalWrite(Button,HIGH);
lcd.init(); //hapus layar LCD
lcd.backlight(); //set backlight LCD
lcd.setCursor(1, 0); //posisikan cursor di line 1 karakter 0
lcd.print(" AGROWIRA ");
lcd.setCursor(0,1); //posisikan cursor ke line 2 karakter 0
lcd.print(" SmartDrip Mini ");
delay(1000);
lcd.init();
setpoint(); //jalankan fungsi setpoint() untuk input nilai %Basah & %Kering
}
//Fungsi input setting point %Kering
void inputkering(){
if(digitalRead(down_key)==LOW)
{
if(Kering>0) //Setpoin %Kering kurang dari nol
{
Kering--;
}
}
if(digitalRead(up_key)==LOW)
{
if(Kering<99) //Setpoin %Kering lebih dari 100%
{
Kering++;
}
}
}
//Fungsi Input Setpoint %Basah
void inputbasah(){
if(digitalRead(down_key)==LOW)
{
if(Basah>0) //Setpoin %Basah kurang dari nol
{
Basah--;
}
}
if(digitalRead(up_key)==LOW)
{
if(Basah<99) //Setpoin %Basah lebih dari 100%
{
Basah++;
}
}
}
void setpoint() {
lcd.init();
lcd.setCursor(1,0);
lcd.print("Ubah Setpoint?");
lcd.setCursor(0,1);
lcd.print(" Y / T ");
delay(3000);
if(digitalRead(left_key)==LOW) //Tekan tombol Y (<<)
{
lcd.init();
lcd.print("Ubah Setpoint...");
delay(500);
lcd.init();
input_kering: //label
lcd.init();
inputkering(); //memanggil fungsi input setting %Kering
lcd.setCursor(1,0);
lcd.print("%Kering: ");
lcd.print(Kering);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Simpan? Y/T");
if(digitalRead(left_key)==LOW)
{
lcd.init();
lcd.print("Menyimpan...");
delay(1000);
goto input_basah; //lompat ke label input_basah (line 92)
}
else goto input_kering; //lompat ke label input_kering (line 75)
input_basah:
lcd.init();
inputbasah(); //memanggil fungsi input setting %Basah
lcd.setCursor(1,0);
lcd.print("%Basah: ");
lcd.print(Basah);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Simpan? Y/T");
if(digitalRead(left_key)==LOW)
{
goto lanjut; //lompat ke label lanjut (line 146)
}
else goto input_basah; //lompat ke label input_basah (line 131)
lanjut:
lcd.init();
lcd.print("Menyimpan.......");
delay(2000);
}
else {
lcd.init();
lcd.setCursor(1,0);
lcd.print(" Nilai Setpoint ");
lcd.setCursor(0,1);
lcd.print(" Tidak Diubah! ");
Basah=30; //Berikan nilai factory setting %Basah= 30%
Kering=18; //Berikan nilai factory setting %Kering= 18%
delay(2000);
}
}
//Fungsi Berulang
void loop() {
double WaterLevel1 = ((100.0/1024.0) * analogRead(sensor1)); //Membaca %Soil Moisture dari Sensor 1
double WaterLevel2 = ((100.0/1024.0) * analogRead(sensor2)); //Membaca %Soil Moisture dari Sensor 2
double AVGWaterLevel = (WaterLevel1 + WaterLevel2)/2; //Membuat rata-rata pembacaan %Soil Moisture Kebun
lcd.init();
lcd.setCursor(0,0);
lcd.print("Moisture: ");
lcd.print(AVGWaterLevel);
lcd.print("%");
if(AVGWaterLevel > Kering && AVGWaterLevel < Basah)
{
digitalWrite(RELAY,HIGH); //Nyalakan Pompa
digitalWrite(LED_RED,HIGH);
digitalWrite(LED_GREEN,LOW); //Nyalakan LED Hijau
lcd.setCursor(0,1);
lcd.print(" POMPA ON ");
}
else if(AVGWaterLevel < Kering)
{
digitalWrite(RELAY,HIGH); //Nyalakan Pompa
digitalWrite(LED_RED,HIGH);
digitalWrite(LED_GREEN,LOW); //Nyalakan LED Hijau
lcd.setCursor(0,1);
lcd.print(" POMPA ON ");
}
else if(AVGWaterLevel > Basah)
{
digitalWrite(RELAY,LOW); //Matikan Pompa
digitalWrite(LED_RED,LOW); //Nyalakan LED Merah
digitalWrite(LED_GREEN,HIGH);
lcd.setCursor(0,1);
lcd.print(" POMPA OFF ");
}
else
{
digitalWrite(RELAY,LOW); //Matikan Pompa
digitalWrite(LED_RED,LOW); //Nyalakan LED Merah
digitalWrite(LED_GREEN,HIGH);
lcd.setCursor(0,1);
lcd.print(" POMPA OFF ");
}
delay (1000);
lcd.init();
lcd.setCursor(0,0);
lcd.print("kering: ");
lcd.print(Kering);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("basah: ");
lcd.print(Basah);
lcd.print("%");
delay(1000);
if(digitalRead(Button)==LOW)
{
lcd.init();
setpoint();
}
}