// Inisialisasi BLYNK ===============================================================================
#define BLYNK_PRINT Serial
// #ifdef ESP8266
// #include <BlynkSimpleEsp8266.h>
// #endif
// #ifdef ESP32
// #include <BlynkSimpleEsp32.h>
// #endif
// #define BLYNK_TEMPLATE_ID "TMPL0UY25nG7"
// #define BLYNK_TEMPLATE_NAME "Quickstart Template"
// #define BLYNK_AUTH_TOKEN "DaHx-I6xJ7i08LQzEAysFKqrZapVYnL3"
// ===================================================================================================
// Inisialisasi WiFiManager ==========================================================================
#include <FS.h> // this needs to be first, or it all crashes and burns...
#include <WiFiManager.h> // https://github.com/tzapu/WiFiManager
WiFiManager wifiManager;
// ===================================================================================================
// Inisialiasi LCD ===================================================================================
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
uint8_t costomChars[6][8]{
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
},
{
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
0b10000,
},
{
0b11000,
0b11000,
0b11000,
0b11000,
0b11000,
0b11000,
0b11000,
0b11000,
},
{
0b11100,
0b11100,
0b11100,
0b11100,
0b11100,
0b11100,
0b11100,
0b11100,
},
{
0b11110,
0b11110,
0b11110,
0b11110,
0b11110,
0b11110,
0b11110,
0b11110,
},
{
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
},
};
// ===============================================================================================
// Inisialisasi NewPing ==========================================================================
#include <NewPing.h>
#define numberSonar 4
NewPing sonar[numberSonar] = {
NewPing(13, 14, 400), // RO -> LCD
NewPing(26, 27, 400), // RO -> Proses
NewPing(23, 25, 400), // Buangan -> LCD
NewPing(18, 19, 400) // Buangan -> Proses
};
int distance[numberSonar] = { 0, 0, 0, 0 };
// ===============================================================================================
// Inisialisasi Pin dan Variabel lain ============================================================
// RO, P.RO, PBu
int relayPin[3] = { 4, 32, 33 };
int relayState[3] = { 0, 0, 0 };
int buzz = 16;
bool buzzState = 0;
int button = 5;
bool buttonState = HIGH; // Variabel untuk menyimpan status tombol
unsigned long pressStartTime = 0; // Variabel untuk menyimpan waktu saat tombol ditekan
const unsigned long longPressTime = 2000; // Konstanta untuk menentukan waktu yang dianggap sebagai long press (dalam milidetik)
#define RO_min 100
#define RO_max 10
#define Bu_min 100
#define Bu_max 10
// ===============================================================================================
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
for (int i = 0; i < 6; i++) {
lcd.createChar(i, costomChars[i]);
};
// wifiManager.setConfigPortalTimeout(120);
// setupWiFi();
// Blynk.config(BLYNK_AUTH_TOKEN);
for (int i : relayPin) {
pinMode(i, OUTPUT);
}
pinMode(buzz, OUTPUT);
}
void loop() {
// Blynk.run();
lcd.clear();
resetWiFi1();
for (int i = 0; i < 3; i++) {
digitalWrite(relayPin[i], relayState[i]);
}
digitalWrite(buzz, buzzState);
if (!buzzState) {
lcd.backlight();
} else {
lcd.noBacklight();
}
for (int i = 0; i < numberSonar; i++) {
distance[i] = sonar[i].ping_cm();
// distance[i] = random(10, 100);
}
distance[0] = 100 - round(100 * (distance[0] - RO_max) / (RO_min - RO_max));
distance[1] = 100 - round(100 * (distance[1] - RO_max) / (RO_min - RO_max));
distance[2] = 100 - round(100 * (distance[2] - Bu_max) / (Bu_min - Bu_max));
distance[3] = 100 - round(100 * (distance[3] - Bu_max) / (Bu_min - Bu_max));
lcd_print(distance[1], 0);
lcd_print(distance[3], 1);
// Blynk.virtualWrite(V9, distance[0]);
// Blynk.virtualWrite(V5, distance[2]);
// jika ketinggian air maksimum, maka stop produksi RO
if (distance[1] >= 100 || distance[3] >= 100) {
relayState[0] = false;
} else {
relayState[0] = true;
}
// ketika penampungan RO kosong dan penampuangan Bu hampir penuh, maka nyalakan alarm
if (distance[1] <= 10 && distance[3] >= 80) {
buzzState = !buzzState;
} else if (distance[1] > 10 || distance[3] < 80) {
buzzState = 0;
}
if (distance[1] <= 0) {
relayState[1] = false;
} else {
relayState[1] = true;
}
if (distance[3] <= 0) {
relayState[2] = false;
} else {
relayState[2] = true;
}
delay(500);
}
// fungsi untuk memunculkan string ke LCD
void lcd_print(int col, int row, String text) {
lcd.setCursor(col, row); // set cursor locations on lcd
lcd.print(text); // print text to lcd
}
// fungsi untuk menampilkan gauges ke LCD
void lcd_print(int number, int row) {
int even = (number % 2 == 0) ? number : number + 1;
lcd.setCursor(0, row);
lcd.print((!row) ? "RO:" : "Bu:");
lcd.setCursor(3, row);
// Serial.println(number);
for (float j = 0; j < floor(even / 10); j++) {
lcd.write(5);
}
lcd.write(fmod(even, 10) / 2);
lcd.setCursor(13, row);
lcd.print(number);
lcd.print("%");
}
// fungsi untuk melakukan koneksi ke wifi melalui wifimanager
void setupWiFi() {
Serial.printf("\r\n[Wifi]: Connecting");
lcd_print(0, 0, "CONNECTING WiFi!");
if (!wifiManager.autoConnect("AutoConnectAP", "password")) { // buka portal wifi dengan nama AutoConnectAP dan pass password
// jika tidak terkoneksi maka restart ESP
// Serial.println("failed to connect, we should reset as see if it connects");
lcd.clear();
lcd_print(0, 0, "Connection Fail!");
// ESP.restart();
delay(1000);
}
}
// fungsi untuk mereset settingan WiFi
void resetWiFi1() {
// berikut adalah fungsi yang dikhususkan untuk membuat button ketika dilakukan long press maka akan mereset setingan WiFi
bool currentState = digitalRead(button); // Membaca status tombol
if (currentState != buttonState) { // Memeriksa perubahan status tombol
delay(50); // Menunggu bouncing tombol stabil
currentState = digitalRead(button); // Membaca status tombol setelah debounce
if (currentState == LOW) { // Memeriksa apakah tombol ditekan
pressStartTime = millis(); // Mengambil waktu tombol ditekan
} else {
unsigned long pressDuration = millis() - pressStartTime; // Memeriksa durasi penekanan tombol setelah tombol dilepaskan
if (pressDuration >= longPressTime) { // Memeriksa apakah tombol dianggap sebagai long press
Serial.println("Long Press Detected");
lcd.clear();
wifiManager.resetSettings(); // reset setingan WiFI
lcd_print(3, 0, "WiFi Reset");
// digitalWrite(led, 1); // nyalakan LED sebagai indikator sistem tidak terkoneksi internet
setupWiFi(); // buka portal sinric pro dan lakukan koneksi ulang
}
}
buttonState = currentState; // Memperbarui status tombol
}
}