// Pengatur pompa air otomatis berdasarkan ketinggian air pada bak
// dilengkapi timer sebagai pengaman jika suatu saat sensor mengalami kerusakan
// Ketinggian air pada bak dapat diketahui pada status LED kuning, hijau dan merah
// status pompa air dapat dilihat pada LED warna ungu
#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
#define LED_CutOff 4
#define Relay_Pompa 13
#define Sensor_Air_Kosong 8 // No Pin Uno
#define Sensor_Air_Tengah 9
#define Sensor_Air_Penuh 10
#define CutOff_Button 12
#define Pot_Pin A0
//uint8_t Level_Air;
String Level_Air;
String Status_Pompa;
//int Ketinggian_Air;
long int Timer_Pompa;
bool CutOff_State;
int PotAnalog_in;
void setup() {
// put your setup code here, to run once:
CutOff_State=false;
Timer_Pompa=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";
}
void loop() {
// put your main code here, to run repeatedly:
//-------------------------------------------------------
static bool Reset_CutOff;
int val;
Reset_CutOff |= (digitalRead(CutOff_Button) == LOW);
display.setCursor(100, 30);
display.print(Reset_CutOff);
display.display(); delay(10);
if (Reset_CutOff) {
CutOff_State = false;
digitalWrite(Relay_CutOff, LOW);
WaterFull_Tone;
Reset_CutOff=false;
}
if (CutOff_State == true) {
CutOff_Tone();
}
//-----------------------------------------------------
if (CutOff_State == false) {
PotAnalog_in = analogRead(Pot_Pin); // A0
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);
}
//------------Pompa---------------
if (digitalRead(Sensor_Air_Tengah) == LOW) {
digitalWrite(Relay_Pompa, HIGH);
Status_Pompa="POMPA HIDUP";
// PumpRun_Tone();
}
else if ((digitalRead(Sensor_Air_Penuh) == HIGH) && (digitalRead(Sensor_Air_Kosong == LOW))) {
digitalWrite(Relay_Pompa, LOW);
Status_Pompa="POMPA MATI";
Timer_Pompa=0;
}
//-----------Status Ketinggian Air--------
if (digitalRead(Sensor_Air_Penuh) == HIGH) {
Level_Air = "AIR PENUH!";
WaterFull_Tone();
}
else if (digitalRead(Sensor_Air_Tengah) == HIGH) {
Level_Air = "AIR SETENGAH";
}
else {
Level_Air = "AIR KOSONG";
//CutOff_State=false;
}
if ((Timer_Pompa == PotAnalog_in) || (CutOff_State == true)) {
Status_Pompa="POMPA MATI";
digitalWrite(Relay_CutOff, HIGH);
digitalWrite(Relay_Pompa, LOW);
CutOff_State=true;
Timer_Pompa=0;
}
if (Status_Pompa=="POMPA HIDUP") {
Timer_Pompa=++Timer_Pompa;
PumpRun_Tone();
}
//--------------Display OLED-----------
display.clearDisplay();
display.setTextColor(WHITE, BLACK);
display.setCursor(15, 10);
display.print("Timer:");
display.setCursor(55, 10);
display.print(Timer_Pompa);
display.setCursor(80, 10);
display.print("of");
//-----------
display.setCursor(98, 10);
display.print(PotAnalog_in);
display.setCursor(15, 30);
display.print(Status_Pompa);
display.setCursor(15, 50);
display.print(Level_Air);
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);
delay(750);
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
delay(50);
noTone(11);
digitalWrite(LED_CutOff, LOW); // LED CutOff
delay(400);
}
void WaterOverload_Tone()
{
tone(11, 220, 25);
delay(50);
noTone(11);
delay(40);
tone(11, 280, 25);
delay(20);
noTone(11);
}