// Created by Sigit Pramono & Team
// email : [email protected]
//Konfigurasi pin
byte pinRedLed = 2;
byte pinGreenLed = 4;
byte pinPompa = 26;
byte pinTrig = 14;
byte pinEcho = 32;
#include <ArduinoJson.h>
//Wifi & Mqtt Parameter
#include <WiFi.h>
#include <PubSubClient.h>
const char *wifiSSID = "Wokwi-GUEST";
const char *wifiPass = "";
WiFiClient espClient;
PubSubClient mqtt(espClient);
// Setting Broker
const char *mqttBroker = "iot.egrotek.id";
uint16_t mqttPort = 1883;
const char *mqttID = "DEVeTDZ8qKbfUqcgs6etB";
const char *mqttUser = "yEbjwbEY9DImosTGga";
const char *mqttPass = "WuTTWBXLOrGJCBTP6w";
const char *mqttPubTopic = "egrotek/pub/APPMFZEwNlrJKoA7DMlES/DEVeTDZ8qKbfUqcgs6etB";
const char *mqttSubTopic = "egrotek/sub/APPMFZEwNlrJKoA7DMlES/DEVeTDZ8qKbfUqcgs6etB";
//Data Variabel
float waterLevel;
float kedalamanTandon = 200.0; //satuan cm
float set_levelmax = 190.0;
float set_levelmin = 10.0;
bool redState = false;
bool greenState = false;
bool pompaState = false;
uint8_t uplinkInterval = 5; //interval dalam detik
void setup() {
Serial.begin(115200);
pinMode(pinRedLed, OUTPUT);
pinMode(pinGreenLed, OUTPUT);
pinMode(pinPompa, OUTPUT);
pinMode(pinTrig, OUTPUT);
pinMode(pinEcho, INPUT);
//wifi setup
wifiSetup();
//mqtt Setup
mqttSetup();
}
void loop() {
mqttCheck();
mqtt.loop();
static unsigned long prevReadSensor = 0;
if (millis() - prevReadSensor > 1000) {
waterLevel = getWaterLevel();
Serial.println("Water Level :" + String(waterLevel) + " cm");
if (waterLevel <= set_levelmin) {
redState = 1;
greenState = 0;
pompaState = 1;
}
else if (waterLevel >= set_levelmax) {
redState = 0;
greenState = 1;
pompaState = 0;
}
else {
redState = 1;
greenState = 1;
}
digitalWrite(pinRedLed, redState);
digitalWrite(pinGreenLed, greenState);
digitalWrite(pinPompa, pompaState);
prevReadSensor = millis();
}
static unsigned long prevSend = 0;
if (millis() - prevSend > uplinkInterval * 1000) {
String data = "{\"wl\":" + String(waterLevel) + ",\"set_levelmin\":" + String(set_levelmin) + ",\"set_levelmax\":" + String(set_levelmax) + "}";
sendData_Mqtt(data);
prevSend = millis();
}
}
void wifiSetup() {
//connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(wifiSSID);
WiFi.begin(wifiSSID, wifiPass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.print("WiFi connected - ESP IP address: ");
Serial.println(WiFi.localIP());
}
//MQTT
void mqttSetup() {
mqtt.setServer(mqttBroker, mqttPort);
mqtt.setCallback(callback);
Serial.println("Status : MQTT SetServer Finish");
}
void mqttCheck() {
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 100) {
if (!mqtt.connected()) {
Serial.println("Status : Reconnecting to MQTT");
mqtt.connect(mqttID, mqttUser, mqttPass); //menghubungkan ulang
if (!mqtt.connected()) {
Serial.println("Status : Failed to Connect MQTT");
mqtt.connect(mqttID, mqttUser, mqttPass); //menghubungkan ulang jika gagal
}
Serial.println("Status : Reconnected to MQTT");
}
mqtt.subscribe(mqttSubTopic);
lastCheck = millis();
}
}
void callback(char *topic, byte *message, unsigned int length) {
String messageTemp;
for (int i = 0; i < length; i++) {
messageTemp += (char)message[i];
}
executeJson(messageTemp);
Serial.println("Topic :" + String(topic));
Serial.println("Message :" + messageTemp);
Serial.println("Set Lv Min:" + String(set_levelmin));
Serial.println("Set Lv Max:" + String(set_levelmax));
}
void sendData_Mqtt(String msg) {
char finalDataChar[msg.length() + 1];
msg.toCharArray(finalDataChar, msg.length() + 1);
mqtt.publish(mqttPubTopic, finalDataChar);
Serial.println("Send Data : " + String(finalDataChar)); //debug
}
void executeJson(String data) {
JsonDocument doc;
deserializeJson(doc, data);
if (doc.containsKey("levelmin")) set_levelmin = doc["levelmin"];
if (doc.containsKey("levelmax")) set_levelmax = doc["levelmax"];
}
float getWaterLevel() {
digitalWrite(pinTrig, HIGH);
delayMicroseconds(10);
digitalWrite(pinTrig, LOW);
float duration_us = pulseIn(pinEcho, HIGH);
float distance_cm = 0.017 * duration_us;
float level = kedalamanTandon - distance_cm;
if (level < 0.0) level = 0.0;
return level;
}