#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <string>
#include <ArduinoJson.h>
#define MAX_CHARACTER 50
#define fill_btn 2
#define drain_btn 15
#define turbPin 34
#define pakan_switch 21
#define trigPin 32
#define echoPin 35
String kondisiPakan;
int turb;
char mqtt_topic[] = "iot";
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "0.tcp.ap.ngrok.io";
const int port = 16528;
bool isProcessOn = false;
float jarak;
int previousPakanValue = 0;
int previousTurbValue = 0;
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
pinMode(turbPin, INPUT);
pinMode(pakan_switch, INPUT_PULLUP);
pinMode(fill_btn, INPUT_PULLUP);
pinMode(drain_btn, INPUT_PULLUP);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
Wire.begin(26, 27);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
setup_wifi();
client.setServer(mqtt_server, port);
while (!client.connected()) {
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT Broker");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" Retrying in 5 seconds");
delay(5000);
}
}
}
void ultra(){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
int durasiPantulan = pulseIn(echoPin, HIGH);
jarak = durasiPantulan * 0.034 / 2;
if (jarak > 100.0) {
jarak = 100.0;
}
Serial.println(jarak);
}
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void pakan() {
int currentPakanValue = digitalRead(pakan_switch);
if (!isProcessOn && currentPakanValue != previousPakanValue) {
if (currentPakanValue == 1) {
Serial.println("Pakan Tersedia");
lcd.setCursor(0, 1);
lcd.print("Pakan Tersedia");
kondisiPakan = "PENUH";
} else {
Serial.println("Pakan Habis");
lcd.setCursor(0, 1);
lcd.print("Pakan Habis ");
kondisiPakan = "HABIS";
}
previousPakanValue = currentPakanValue;
}
}
void kekeruhan(){
turb = analogRead(turbPin);
turb = map(turb, 0, 4095, 0, 180);
if (!isProcessOn && turb != previousTurbValue) {
Serial.print("Kekeruhan : ");
lcd.setCursor(0, 0);
lcd.print("Kekeruhan : ");
lcd.print(turb);
Serial.println(turb);
previousTurbValue = turb;
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void fill() {
turb = analogRead(turbPin);
turb = map(turb, 0, 4095, 0, 180);
int currentPakanValue = digitalRead(pakan_switch);
if (digitalRead(fill_btn) == LOW && !isProcessOn) {
// Proses fill dimulai
Serial.println("Air sedang diisi");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Filling water");
isProcessOn = true;
} else if (digitalRead(fill_btn) == LOW && isProcessOn) {
Serial.println("Air dihentikan dari diisi");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fill done");
delay(1000);
lcd.clear();
lcd.print("Kekeruhan : ");
lcd.print(turb);
if (currentPakanValue == previousPakanValue) {
Serial.println("Pakan Tersedia");
lcd.setCursor(0, 1);
lcd.print("Pakan Tersedia");
} else {
Serial.println("Pakan Habis");
lcd.setCursor(0, 1);
lcd.print("Pakan Habis ");
}
isProcessOn = false;
}
}
void drain() {
int currentPakanValue = digitalRead(pakan_switch);
if (digitalRead(drain_btn) == LOW && !isProcessOn) {
Serial.println("Air sedang dikuras");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Draining water");
isProcessOn = true;
} else if (digitalRead(drain_btn) == LOW && isProcessOn) {
if (jarak <= 25) {
Serial.println("Air selesai dikuras");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Drain done");
delay(1000);
lcd.clear();
lcd.print("Kekeruhan : ");
lcd.print(turb);
if (currentPakanValue == previousPakanValue) {
Serial.println("Pakan Tersedia");
lcd.setCursor(0, 1);
lcd.print("Pakan Tersedia");
} else {
Serial.println("Pakan Habis");
lcd.setCursor(0, 1);
lcd.print("Pakan Habis ");
}
isProcessOn = false;
}
}
}
void loop() {
turb = analogRead(turbPin);
turb = map(turb, 0, 4095, 0, 180);
fill();
drain();
ultra();
if (!client.connected()) {
reconnect();
}
if (turb >= 150 && jarak > 25) {
Serial.println("Air sedang dikuras");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Draining water");
}
if (!isProcessOn) {
pakan();
kekeruhan();
}
Serial.println(turb);
StaticJsonDocument<300> doc;
doc["turb"] = turb;
doc["kondisiPakan"] = kondisiPakan;
String out;
serializeJson(doc, out);
char json[out.length() + 1];
out.toCharArray(json, out.length() + 1);
client.publish(mqtt_topic, out.c_str());
delay(5000);
}