#include <Arduino_JSON.h>
#include <ESP32Servo.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttServer = "n69919ff.ala.asia-southeast1.emqxsl.com";
const char* mqttUsername = "Mentoring";
const char* mqttPassword = "munyenyo";
int mqttPort = 8883;
const char* topicTemp = "monitoring/sensor/suhu";
const char* topicHumidity = "monitoring/sensor/kelembapan";
const char* topicLight = "monitoring/sensor/cahaya";
const char* topicActuator = "sensor/aktuator";
// SSL Root CA certificate
static const char *root_ca PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
)EOF";
WiFiClientSecure espClient;
PubSubClient client(espClient);
Servo servoMotor; // Inisialisasi objek Servo
volatile float receivedTemperature;
volatile float receivedHumidity;
volatile int receivedLight;
float temperatureThreshold = 25.0; // Batas suhu untuk menyiram tanaman (contoh: 25 derajat Celsius)
float humidityThreshold = 60.0; // Batas kelembapan untuk menyiram tanaman (contoh: 60%)
int lightThreshold = 800; // Batas tingkat kecerahan/cahaya untuk menyalakan LED (contoh: 500)
int pinLED = 4; // Pin untuk mengontrol LED (contoh: pin 2)
void mqtt_init() {
espClient.setCACert(root_ca);
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "sub-esp32-iot-6-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (client.connect(client_id.c_str(), mqttUsername, mqttPassword)) {
Serial.println("Public EMQX MQTT broker connected");
client.subscribe(topicTemp);
client.subscribe(topicHumidity);
client.subscribe(topicLight);
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
// Mengkonversi byte payload menjadi string
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message:");
Serial.println(message);
// Handle pesan berdasarkan topik
if (strcmp(topic, topicTemp) == 0) {
// Jika pesan masuk dari topik temperature
JSONVar json = JSON.parse(message);
if (JSON.typeof(json) == "undefined") {
Serial.println("Parsing JSON failed!");
return;
}
if (json.hasOwnProperty("temperature")) {
double temp = json["temperature"];
receivedTemperature = temp;
Serial.print("Temperature: ");
Serial.println(receivedTemperature);
// Cek kondisi untuk menyiram tanaman berdasarkan suhu dan kelembapan
if (receivedTemperature > temperatureThreshold || receivedHumidity < humidityThreshold) {
Serial.println("Menyiram tanaman...");
servoMotor.write(90); // Posisi tengah untuk menyiram
delay(1000); // Delay untuk menjaga air mengalir
} else {
Serial.println("Tidak perlu menyiram tanaman.");
servoMotor.write(0); // Servo kembali ke posisi awal
}
} else {
Serial.println("Temperature key not found in JSON");
}
} else if (strcmp(topic, topicHumidity) == 0) {
// Jika pesan masuk dari topik humidity
JSONVar json = JSON.parse(message);
if (JSON.typeof(json) == "undefined") {
Serial.println("Parsing JSON failed!");
return;
}
if (json.hasOwnProperty("humidity")) {
double hum = json["humidity"];
receivedHumidity = hum;
Serial.print("Humidity: ");
Serial.println(receivedHumidity);
// Menyiram tanaman jika kondisi suhu dan kelembapan terpenuhi
if (receivedTemperature > temperatureThreshold || receivedHumidity < humidityThreshold) {
Serial.println("Menyiram tanaman...");
servoMotor.write(90); // Posisi tengah untuk menyiram
delay(1000); // Delay untuk menjaga air mengalir
servoMotor.write(0); // Kembali ke posisi awal
delay(5000); // Delay sebelum melakukan pengecekan lagi
}
} else {
Serial.println("Humidity key not found in JSON");
}
} else if (strcmp(topic, topicLight) == 0) {
// Jika pesan masuk dari topik light
JSONVar json = JSON.parse(message);
if (JSON.typeof(json) == "undefined") {
Serial.println("Parsing JSON failed!");
return;
}
if (json.hasOwnProperty("light_level")) {
int light = json["light_level"];
receivedLight = light;
Serial.print("Light Level: ");
Serial.println(receivedLight);
// Matikan penyiraman jika cahaya (light) memenuhi threshold
if (receivedLight > lightThreshold) {
Serial.println("Cahaya Melewati Batas");
digitalWrite(pinLED, HIGH); // LED menyala
} else {
// Lanjutkan menyiram jika cahaya (light) masih kurang
Serial.println("Cahaya normal");
digitalWrite(pinLED, LOW); // LED mati
}
} else {
Serial.println("Light key not found in JSON");
}
}
}
void setup() {
Serial.begin(115200);
servoMotor.attach(5); // Menghubungkan servo ke pin 5
pinMode(pinLED, OUTPUT); // Mengatur pin LED sebagai OUTPUT
// Menghubungkan ke WiFi
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
// Menghubungkan ke MQTT broker
espClient.setCACert(root_ca); // Variabel root_ca diakses di sini
client.setServer(mqttServer, mqttPort);
// Set callback untuk menerima pesan dari MQTT broker
client.setCallback(callback);
// Mencoba menghubungkan ke broker MQTT
if (!client.connected()) {
Serial.println("Connecting to MQTT broker...");
if (client.connect("ESP32Client", mqttUsername, mqttPassword)) {
Serial.println("Connected to MQTT broker!");
// Berlangganan topik
client.subscribe(topicTemp);
client.subscribe(topicHumidity);
client.subscribe(topicLight);
} else {
Serial.print("Failed to connect to MQTT broker, rc=");
Serial.print(client.state());
Serial.println(" Trying again in 5 seconds...");
delay(5000);
}
}
}
void loop() {
// Periksa koneksi WiFi
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected. Reconnecting...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
}
// Periksa koneksi ke MQTT broker
if (!client.connected()) {
Serial.println("Disconnected from MQTT broker. Reconnecting...");
mqtt_init();
if (client.connect("ESP32Client", mqttUsername, mqttPassword)) {
Serial.println("Connected to MQTT broker!");
// Berlangganan topik
client.subscribe(topicTemp);
client.subscribe(topicHumidity);
client.subscribe(topicLight);
} else {
Serial.print("Failed to connect to MQTT broker, rc=");
Serial.print(client.state());
Serial.println(" Trying again in 5 seconds...");
delay(5000);
}
}
// Loop untuk menerima pesan dari MQTT broker
client.loop();
}