//Konfigurasi pin
byte pinRedLed = 2;
byte pinGreenLed = 4;
byte pinPompa = 26;
byte pinLdr = 33;
byte pinSoil = 35;
byte pinDht = 25;
#include <ArduinoJson.h>
//Wifi & Mqtt Parameter
#include <WiFi.h>
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient mqtt(espClient);
#include "DHT.h"
#define dhtType DHT22
DHT dht(pinDht, dhtType);
const char *wifiSSID = "Wokwi-GUEST";
const char *wifiPass = "";
const char* mqttPubTopic = "egrotek/pub/APPFq3jMwvaFc5HlihKzG/DEV7jBg2CQ6wOBVu90r2v";
const char* mqttSubTopic = "egrotek/sub/APPFq3jMwvaFc5HlihKzG/DEV7jBg2CQ6wOBVu90r2v";
const char *mqttID = "DEV7jBg2CQ6wOBVu90r2v";
const char *mqttUser = "mswUEUEsvXMAxHAwgD";
const char *mqttPass = "YBS8tb2ZhlG7dnIYE9";
const char *mqttBroker = "iot.egrotek.id";
uint16_t mqttPort = 1883;
uint8_t uplinkInterval = 5; //interval dalam detik
//Data Variabel
int soilMoist;
int lightIntensity;
float tempValue;
float humiValue;
float set_moismin = 10;
float set_humimin = 50;
bool redState = false;
bool greenState = false;
bool pompaState = false;
void setup() {
Serial.begin(115200);
pinMode(pinRedLed, OUTPUT);
pinMode(pinGreenLed, OUTPUT);
//Pompa Setup
pinMode(pinPompa, OUTPUT);
pinMode(pinLdr, INPUT);
pinMode(pinSoil, INPUT);
dht.begin();
//wifi setup
wifiSetup();
//mqtt Setup
mqttSetup();
}
void loop() {
mqttCheck();
mqtt.loop();
static unsigned long prevReadSensor = 0;
if (millis() - prevReadSensor > 2000) {
lightIntensity = analogRead(pinLdr); //baca intensitas cahaya
soilMoist = getMoisture(); //baca kelembaban tanah
tempValue = dht.readTemperature(); //baca suhu udara
humiValue = dht.readHumidity(); //baca kelembaban udara
Serial.println("Intensitas Cahaya:" + String(lightIntensity) + " lx");
Serial.println("Soil Moisture :" + String(soilMoist) + " %");
Serial.println("Suhu Udara :" + String(tempValue) + " c");
Serial.println("Kelembaban Udara :" + String(humiValue) + " %");
if (soilMoist < set_moismin or humiValue < set_humimin) {
redState = 1;
greenState = 0;
pompaState = 1;
} else {
redState = 0;
greenState = 1;
pompaState = 0;
}
digitalWrite(pinRedLed, redState);
digitalWrite(pinGreenLed, greenState);
digitalWrite(pinPompa, pompaState);
prevReadSensor = millis();
}
static unsigned long prevSend = 0;
if (millis() - prevSend > uplinkInterval * 1000) {
String data = "{\"ldr\":" + String(lightIntensity) + ",\"sm\":" + String(soilMoist) + ",\"temp\":" + String(tempValue) + ",\"humi\":" + String(humiValue) + ",\"set_moismin\":" + String(set_moismin) + ",\"set_humimin\":" + String(set_humimin) + "}";
sendData_Mqtt(data);
prevSend = millis();
}
}
uint8_t getMoisture() {
uint16_t maxMoistADC = 293;
uint16_t minMoistADC = 680;
uint16_t adc = analogRead(pinSoil);
adc = constrain(adc, maxMoistADC, minMoistADC);
uint8_t moisture = map(adc, minMoistADC, maxMoistADC, 0, 100);
return moisture;
}
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 > 1000) {
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_moismin :" + String(set_moismin));
Serial.println("set_humimin :" + String(set_humimin));
}
void executeJson(String data) {
JsonDocument doc;
deserializeJson(doc, data);
if (doc.containsKey("moismin")) set_moismin = doc["moismin"];
if (doc.containsKey("humimin")) set_humimin = doc["humimin"];
}
void sendData_Mqtt(String msg) {
// mqttCheck();
char finalDataChar[msg.length() + 1];
msg.toCharArray(finalDataChar, msg.length() + 1);
mqtt.publish(mqttPubTopic, finalDataChar);
Serial.println("Send Data : " + String(finalDataChar)); //debug
}