#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define MAX_CHARACTER 50
#define MQTT_SERVER "0.tcp.ap.ngrok.io"
// Declaration of WiFi parameters
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Declaration of MQTT server parameters
char mqtt_topic[] = "greenhouse";
int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
// Declaration of WiFi setup function
void setupWifi() {
Serial.print("Connecting [ ");
Serial.print(ssid);
Serial.println(" ]");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(5000);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("");
}
// Check MQTT server connection function
void setupMqtt() {
while (!client.connected()) {
Serial.println("Loading MQTT");
String idClient = "client-";
idClient += String(random(0xffff), HEX);
if (client.connect(idClient.c_str())) {
Serial.println("MQTT connected");
Serial.println();
client.publish(mqtt_topic, "Device connected...");
client.publish(mqtt_topic, " ");
} else {
Serial.print("Failed: ");
Serial.print(client.state());
Serial.println(" Retrying...");
delay(5000);
}
}
}
// Setup function
void setup() {
Serial.begin(115200);
setupWifi();
client.setServer(MQTT_SERVER, mqtt_port);
if (!client.connected()) {
setupMqtt();
}
}
// Sensor
#define PIN_DHT 13
#define DHTTYPE DHT22
DHT dht(PIN_DHT, DHTTYPE);
#define PIN_LDR 35
#define PIN_MOISTURE 36
FC28Sensor fc28;
int moisture = 0;
int ldr = 0; const float GAMMA = 0.7; const float RL10 = 50; float voltage, resistance, lux; int adcValue = 0;
int temp = 0;
int hum = 0;
// Actuator
#define PIN_WATERPUMP 4
// bool relayON = LOW; bool relayOFF = HIGH; // Physical Relay using this code
bool relayON = HIGH; bool relayOFF = LOW; // Virtual Relay using this code
String pump;
// Baca Data Sensor
void bacaSensor() {
adcValue = analogRead(PIN_LDR); // Baca Tegangan Analog Sensor LDR
voltage = adcValue * 5/4095.0; // ESP bit=12 -> 4095, 5=Tegangan Referensi
resistance = 2000 * voltage / (1 - voltage / 5); // Rumus Resistansi Cahaya
ldr = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); // Rumus Intensitas Cahaya
moisture = fc28.getSoilMoisture(); // moisture
temp = dht.readTemperature(); // ekstrak data temperature
hum = dht.readHumidity(); // ekstrak data humidity
// display data ke serial monitor
Serial.println("=========================================");
Serial.println("Suhu Udara: "+String(temp)+"°C");
Serial.println("Kelembaban Udara: "+String(hum)+"%");
Serial.println("Kelembaban Tanah: "+String(moisture)+"%");
Serial.println("Intensitas Cahaya: "+String(ldr)+"lux");
}
// Kendali Otomatis Pompa
void Threshold(){
if (temp >= 0 && temp < 16) {
if (hum > 90 && hum <=100) {
if (ldr >= 500) {
digitalWrite(PIN_WATERPUMP, relayOFF);
pump = "OFF";
}
}
}
if (temp >= 16 && temp <= 34) {
if (hum >= 30 && hum <= 90) {
if (ldr >= 200 && ldr < 500) {
digitalWrite(PIN_WATERPUMP, relayOFF);
pump = "OFF";
}
}
}
if (temp > 34 && temp <= 100) {
if (hum >= 0 && hum < 30) {
if (ldr < 200) {
digitalWrite(PIN_WATERPUMP, relayON);
pump = "ON";
}
}
}
if (moisture >= 14.5 && moisture < 100){
digitalWrite(PIN_WATERPUMP, relayOFF);
pump = "OFF";
}
if (moisture >= 11.8 && moisture < 14.5) {
digitalWrite(PIN_WATERPUMP, relayOFF);
pump = "OFF";
}
if (moisture >= 0 && moisture < 11.8) {
digitalWrite(PIN_WATERPUMP, relayON);
pump = "ON";
}
Serial.println("Status Pompa: "+String(pump));
Serial.println("=========================================");
}
// Kirim Data ke MQTT Server
void kirimMQTT() {
if ((millis() - lastTime) > timerDelay) {
bacaSensor();
Threshold();
if (WiFi.status() == WL_CONNECTED) {
ConnectToMQTT();
String payload = "{\"Suhu Udara (°C)\":\"" + String(temp) + "\",\"Kelembapan Udara (%)\":\"" + String(hum) + "\",\"Kelembapan Tanah (%)\":\"" + String(moisture) + "\",\"Intensitas Cahaya (lux)\":\"" + String(ldr) + "\",\"Status Pompa\":\"" + String(pump) + "\"}";
client.publish("esp32/data", payload.c_str());
Serial.println("Data published to MQTT server");
client.disconnect();
} else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
delay(5000);
}
// Method untuk mengatur inisiasi awal
void setup() {
// inisiasi pin sensor
fc28.initFC28Sensor(9600, PIN_MOISTURE);
dht.begin();
pinMode(PIN_LDR, INPUT);
pinMode(PIN_WATERPUMP, OUTPUT);
// Memanggil method ConnectToWiFi
ConnectToWiFi();
}
// Method untuk mengatur perulangan
void loop() {
kirimAntares();
}