// Kontrol Pompa Otomatis dilengkapi Timer analog
// Timer berfungsi sebagai pengaman jika sensor tidak berfungsi / error
// sehingga pompa tidak hidup terus menerus.
// Sebelum perangkat bekerja pastikan set timer terlebih dahulu.
// Jika waktu Timer tercapai, maka alarm akan berbunyi dan LED merah menyala
// Tombol Reset (push button merah) berfungsi untuk mematikan alarm
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire);
#define LED_Air_Kosong 0 // No pin pada Uno
#define LED_Air_Tengah 1
#define LED_Air_Penuh 2
#define Relay_CutOff 3 // untuk mematikan pompa jika waktu timer tercapai
#define LED_CutOff 4
#define Relay_Pompa 13 // untuk menghidupkan pompa air
#define Sensor_Air_Kosong 8 // No Pin Uno
#define Sensor_Air_Tengah 9
#define Sensor_Air_Penuh 10
#define CutOff_Button 12 // untuk mematikan alarm
#define Pot_Pin A0
//uint8_t Level_Air;
String Level_Air;
String Status_Pompa;
String Info_Warning;
long int Timer_Pompa;
bool CutOff_State, Buzzer_Sound;
int PotAnalog_in,i;
char Info_CutOff[] ="TEKAN TOMBOL RESET!";
char Info_Ready[] ="-------READY-------!";
char Info_Standbye[] ="------STANDBY------!";
void setup() {
// put your setup code here, to run once:
CutOff_State=false;
Buzzer_Sound=true;
Timer_Pompa=0;
i=0;
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
// Display the logo Adafruit
// display.display();
unsigned long start = millis();
display.clearDisplay();
// drawCourt();
while(millis() - start < 1500);
display.display();
//--------------------------------
pinMode(Sensor_Air_Kosong, INPUT);
pinMode(Sensor_Air_Tengah, INPUT);
pinMode(Sensor_Air_Penuh, INPUT);
pinMode(LED_Air_Kosong, OUTPUT);
pinMode(LED_Air_Tengah, OUTPUT);
pinMode(LED_Air_Penuh, OUTPUT);
pinMode(Relay_Pompa, OUTPUT);
pinMode(Relay_CutOff, OUTPUT);
pinMode(LED_CutOff, OUTPUT);
pinMode(CutOff_Button, INPUT_PULLUP);
pinMode(4, OUTPUT);
Status_Pompa="POMPA MATI";
//Info_Warning="------------------";
}
void loop() {
// put your main code here, to run repeatedly:
//-------------------------------------------------------
static bool Reset_CutOff;
Reset_CutOff |= (digitalRead(CutOff_Button) == LOW);
display.setCursor(100, 20);
display.print(Reset_CutOff);
if (Status_Pompa=="POMPA MATI") {
display.setCursor(4, 20);
display.print("POMPA MATI");
}
display.display(); delay(10);
if (Reset_CutOff) {
CutOff_State = false;
digitalWrite(Relay_CutOff, LOW);
Reset_CutOff=false;
Buzzer_Sound=false;
Info_Warning="-------------------";
//display.setCursor(4, 20);
// display.print("POMPA MATI");
//display.display();
delay(20);
}
if (CutOff_State == true) {
CutOff_Tone();
}
//-----------------------------------------------------
if (CutOff_State == false) {
//-------------Monitor ketinggian air dengan LED-------------
if (digitalRead(Sensor_Air_Kosong) == HIGH) {
digitalWrite(LED_Air_Kosong, HIGH);
} else {
digitalWrite(LED_Air_Kosong, LOW);
}
if (digitalRead(Sensor_Air_Tengah) == HIGH) {
digitalWrite(LED_Air_Tengah, HIGH);
} else {
digitalWrite(LED_Air_Tengah, LOW);
}
if (digitalRead(Sensor_Air_Penuh) == HIGH) {
digitalWrite(LED_Air_Penuh, HIGH);
} else {
digitalWrite(LED_Air_Penuh, LOW);
}
//-----------Status Ketinggian Air--------
if (digitalRead(Sensor_Air_Penuh) == HIGH) {
Level_Air = "AIR PENUH!";
if (Buzzer_Sound) {
display.setCursor(4, 20);
display.print("POMPA MATI");
display.display();
WaterFull_Tone();
}
}
else if (digitalRead(Sensor_Air_Tengah) == HIGH) {
Level_Air = "AIR SETENGAH";
Buzzer_Sound=true;
}
else if (digitalRead(Sensor_Air_Kosong) == LOW) {
Level_Air = "AIR KOSONG";
}
else {Level_Air="AIR SEDIKIT";
}
//------------Pompa Mati, jika air penuh-----------
if (digitalRead(Sensor_Air_Penuh) == HIGH) {
digitalWrite(Relay_Pompa, LOW);
Status_Pompa="POMPA MATI";
display.setCursor(4, 20);
display.print(Status_Pompa);
display.display();
Timer_Pompa=0;
}
//------------Pompa Hidup, jika air kosong atau tidak penuh-----------
if ((digitalRead(Sensor_Air_Tengah) == LOW) && (digitalRead(Sensor_Air_Penuh) == LOW)) {
digitalWrite(Relay_Pompa, HIGH);
Status_Pompa="POMPA HIDUP";
}
//else if ((digitalRead(Sensor_Air_Penuh) == HIGH) && (digitalRead(Sensor_Air_Kosong) == HIGH)) {
// digitalWrite(Relay_Pompa, LOW);
// Status_Pompa="POMPA MATI";
// Timer_Pompa=0;
// }
//-----Cek jika waktu Timer tercapai, relay CutOff aktif dan pompa mati-----
PotAnalog_in = analogRead(Pot_Pin); // A0
if ((Timer_Pompa == PotAnalog_in)) {//|| (CutOff_State == true)) {
digitalWrite(Relay_CutOff, HIGH);
CutOff_State=true;
digitalWrite(Relay_Pompa, LOW);
Status_Pompa="POMPA MATI";
display.setCursor(4, 20);
display.print(Status_Pompa);
display.display();
Timer_Pompa=0;
delay(20);
}
if (Status_Pompa=="POMPA HIDUP") {
Timer_Pompa=++Timer_Pompa;
PumpRun_Tone();
}
// else {
// Status_Pompa="POMPA MATI";
// display.setCursor(4, 20);
// display.print(Status_Pompa);
// display.display(); delay(300);
//}
//--------------Display OLED-----------
display.clearDisplay();
display.setTextColor(WHITE, BLACK);
display.setCursor(4, 5);
display.print("TIMER:");
display.setCursor(45, 5);
display.print(Timer_Pompa);
display.setCursor(75, 5);
display.print("OF");
display.setCursor(95, 5);
display.print(PotAnalog_in);
//-------------------------
//display.setCursor(4, 20);
//display.print(Status_Pompa);
//------------------------
display.setCursor(4, 35);
display.print(Level_Air);
//-------Info Warning-----
display.setCursor(4, 50);
display.print(Info_Warning);
display.display();
delay(100);
// display.clearDisplay();
// drawCourt();
}
}
void drawCourt()
{
display.drawRect(0, 0, 128, 54, WHITE);
}
void PumpRun_Tone()
{
tone(11, 2000, 30);
delay(100);
noTone(11);
tone(11, 2000, 30);
display.setCursor(4, 20);
display.print("POMPA HIDUP");
display.display();
delay(680);
noTone(11);
}
void WaterFull_Tone()
{
tone(11, 200, 25);
delay(50);
noTone(11);
delay(25);
tone(11, 250, 25);
delay(25);
noTone(11);
}
void CutOff_Tone()
{
tone(11, 2200, 50); // Pin, Frequency, duration
digitalWrite(LED_CutOff, HIGH); // LED CutOff
display.setCursor(4,50);
display.print(" ");
display.display();
delay(50);
noTone(11);
digitalWrite(LED_CutOff, LOW); // LED CutOff
display.setCursor(4, 20);
display.print("POMPA MATI");
display.setCursor(4,50);
display.print(Info_CutOff); //"TEKAN TOMBOL RESET!"
display.display();
delay(400);
}
void WaterOverload_Tone()
{
tone(11, 220, 25);
delay(50);
noTone(11);
delay(40);
tone(11, 280, 25);
delay(20);
noTone(11);
}