// ============ Include Library ===================
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Arduino_JSON.h>
#include <ESP32Servo.h>
// ============ End Include Library ===================
// ============ Define Pin ===================
#define SERVO_PIN 18 // Pin untuk servo
#define LED_PIN 4 // Pin untuk LED
// ============ End Define Pin ==============
// ============ Variabel ===================
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
// ============ MQTT ===============
const char *mqttServer = "j31faa13.ala.asia-southeast1.emqxsl.com";
const char *topic_temperature = "monitoring/sensor/kelembapan"; // Topik untuk kelembapan dari Proyek 1
const char *topic_humidity = "monitoring/sensor/suhu"; // Topik untuk suhu dari Proyek 1
const char *topic_light = "monitoring/sensor/cahaya"; // Topik untuk cahaya dari Proyek 2
const char *mqtt_username = "mentoring-12";
const char *mqtt_password = "mentoring12";
int port = 8883;
// ============ End MQTT ===============
unsigned long lastTime = 0;
unsigned long intervalTime = 1000;
float temperature, humidity; // Variabel untuk menyimpan data suhu dan kelembapan
int lightValue; // Variabel untuk menyimpan data cahaya
Servo servo; // Objek untuk kontrol servo
bool isPumpOn = false;
bool isLightOn = false;
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";
// ============ End Variabel ===================
// ============ Class ===================
WiFiClientSecure espClient;
PubSubClient client(espClient);
// ============ End Class ===================
// ============ Function ===================
void wifi_init();
void mqtt_init();
void dht_init();
void dht_read();
void convert_temperature();
void send_data();
void process_data();
void control_actuator();
void ldr_init();
void read_ldr();
void callback(char *topic, byte *payload, unsigned int length);
// ============ End Function ===================
void setup() {
Serial.begin(115200);
wifi_init();
mqtt_init();
servo.attach(SERVO_PIN); // Menghubungkan pin servo
}
void loop() {
client.loop();
if (!client.connected()) {
mqtt_init();
}
send_data();
control_actuator();
}
void wifi_init() {
Serial.print("Connecting to WiFi");
WiFi.begin(ssid, pass, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
}
void mqtt_init() {
espClient.setCACert(root_ca);
client.setServer(mqttServer, port);
client.setCallback(callback);
while (!client.connected()) {
String client_id = "mentoring-iot-3-";
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(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
client.subscribe(topic_temperature);
client.subscribe(topic_humidity);
client.subscribe(topic_light);
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(2000);
}
}
}
void callback(char *topic, byte *payload, unsigned int length) {
// Callback function implementation
String message;
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (strcmp(topic, topic_temperature) == 0) {
temperature = message.toFloat();
} else if (strcmp(topic, topic_humidity) == 0) {
humidity = message.toFloat();
} else if (strcmp(topic, topic_light) == 0) {
lightValue = message.toInt();
}
}
void control_actuator() {
// Tambahkan logika pengendalian aktuator berdasarkan data yang diterima
// Contoh: Mengendalikan servo dan LED berdasarkan nilai suhu, kelembapan, dan cahaya yang diterima
// Di sini Anda dapat menambahkan logika sesuai kebutuhan
// Misalnya, jika suhu di atas ambang batas tertentu, hidupkan servo dan matikan LED
// Jika cahaya di bawah ambang batas tertentu, matikan servo dan hidupkan LED
// Contoh logika sederhana:
if (temperature > 30 && humidity > 60) {
// Hidupkan servo dan matikan LED
servo.write(90); // Putar servo ke posisi tengah (90 derajat)
digitalWrite(LED_PIN, LOW); // Matikan LED
} else if (lightValue < 500) {
// Matikan servo dan hidupkan LED
servo.write(0); // Putar servo ke posisi awal (0 derajat)
digitalWrite(LED_PIN, HIGH); // Hidupkan LED
} else {
// Matikan servo dan LED
servo.write(0); // Putar servo ke posisi awal (0 derajat)
digitalWrite(LED_PIN, LOW); // Matikan LED
}
}
void send_data() {
// Kirim data suhu, kelembapan, dan cahaya ke Serial Monitor
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Light Value: ");
Serial.println(lightValue);
}
void dht_init() {
// Inisialisasi sensor DHT22
}
void dht_read() {
// Baca data suhu dan kelembapan dari sensor DHT22
}
void convert_temperature() {
// Konversi suhu jika diperlukan
}
void ldr_init() {
pinMode(LED_PIN, OUTPUT); // Atur pin LED sebagai output
}
void read_ldr() {
// Baca nilai cahaya dari sensor LDR
}