#include <WiFi.h> // Mengimpor library untuk koneksi WiFi
#include <MQTT.h> // Mengimpor library untuk protokol MQTT
#include <ESP32Servo.h> // Mengimpor library untuk mengontrol servo motor
#include <NusabotSimpleTimer.h> // Mengimpor library untuk timer sederhana
#include <DHTesp.h> // Mengimpor library untuk sensor DHT (suhu dan kelembapan)
// Membuat objek untuk koneksi WiFi, klien MQTT, servo, timer, dan sensor DHT
WiFiClient net; // Objek untuk koneksi WiFi
MQTTClient client; // Objek untuk klien MQTT
Servo servo; // Objek untuk mengontrol servo motor
NusabotSimpleTimer timer; // Objek untuk timer sederhana
DHTesp dhtSensor; // Objek untuk sensor DHT
// Mendefinisikan SSID dan password untuk koneksi WiFi
const char ssid[] = "Wokwi-GUEST"; // Nama WiFi
const char pass[] = ""; // Password WiFi (kosong dalam hal ini)
// Mendefinisikan pin GPIO untuk LED, servo, potensiometer, dan sensor DHT
const int pinRed = 2; // Pin untuk LED merah
const int pinGreen = 4; // Pin untuk LED hijau
const int pinBlue = 16; // Pin untuk LED biru
const int pinLED = 13; // Pin untuk LED tambahan
const int pinServo = 18; // Pin untuk servo motor
const int pinPot = 33; // Pin untuk potensiometer
const int pinDHT = 25; // Pin untuk sensor DHT
// Variabel untuk menyimpan nilai dari potensiometer
int pot, oldPot = 0; // 'pot' untuk menyimpan nilai potensiometer, 'oldPot' untuk menyimpan nilai sebelumnya
// String serial_number = "12345678";
void setup() {
// Mengatur pin GPIO sebagai OUTPUT dan INPUT
pinMode(pinRed, OUTPUT); // Mengatur pin merah sebagai output
pinMode(pinGreen, OUTPUT); // Mengatur pin hijau sebagai output
pinMode(pinBlue, OUTPUT); // Mengatur pin biru sebagai output
pinMode(pinLED, OUTPUT); // Mengatur pin LED tambahan sebagai output
pinMode(pinPot, INPUT); // Mengatur pin potensiometer sebagai input
pinMode(pinDHT, INPUT); // Mengatur pin sensor DHT sebagai input
// Menghubungkan servo ke pin yang ditentukan dengan rentang pulsa
servo.attach(pinServo, 500, 2400);
// Mengatur sensor DHT dengan tipe DHT22
dhtSensor.setup(pinDHT, DHTesp::DHT22);
// Memulai koneksi ke WiFi
WiFi.begin(ssid, pass);
// Menginisialisasi klien MQTT dengan alamat broker
client.begin("103.197.190.148", net);
// Menetapkan fungsi callback untuk menangani pesan yang diterima
client.onMessage(subscribe);
// Mengatur interval untuk fungsi publishPot setiap 1000 ms (1 detik)
timer.setInterval(1000, publishPot);
// Mengatur interval untuk fungsi publishDHT setiap 2000 ms (2 detik)
timer.setInterval(2000, publishDHT);
// Memanggil fungsi untuk menghubungkan ke WiFi dan broker MQTT
connect();
}
void loop() {
client.loop(); // Memproses pesan MQTT yang masuk
timer.run(); // Menjalankan timer untuk fungsi publish
if (!client.connected()) { // Memeriksa apakah klien MQTT terhubung
connect(); // Jika tidak terhubung, panggil fungsi connect untuk mencoba menyambung kembali
}
delay(10); // Menunggu selama 10 milidetik
}
// Fungsi callback untuk menangani pesan yang diterima
void subscribe(String &topic, String &data) {
// Menangani pesan untuk topik "kelasiot/led"
if (topic == "kelasiot/led") {
if (data == "nyala") { // Jika data adalah "nyala"
digitalWrite(pinLED, 1); // Menghidupkan LED
} else if (data == "mati") { // Jika data adalah "mati"
digitalWrite(pinLED, 0); // Mematikan LED
}
}
// Menangani pesan untuk topik "kelasiot/servo"
if (topic == "kelasiot/servo") {
int posServo = data.toInt(); // Mengonversi data menjadi integer untuk posisi servo
servo.write(posServo); // Menggerakkan servo ke posisi yang ditentukan
}
}
// Fungsi untuk menerbitkan nilai potensiometer ke broker MQTT
void publishPot() {
pot = analogRead(pinPot); // Membaca nilai dari potensiometer
if (pot != oldPot) { // Memeriksa apakah nilai potensiometer telah berubah
client.publish("kelasiot/potentiometer", String(pot), false, 1); // Menerbitkan nilai potensiometer ke topik "kelasiot/potentiometer" dengan QoS 1
oldPot = pot; // Memperbarui nilai sebelumnya
}
}
// Fungsi untuk menerbitkan data suhu dan kelembapan dari sensor DHT ke broker MQTT
void publishDHT() {
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // Membaca data suhu dan kelembapan dari sensor DHT
Serial.println("Temp: " + String(data.temperature, 2) + "°C"); // Mencetak suhu ke Serial Monitor
Serial.println("Humidity: " + String(data.humidity, 1) + "%"); // Mencetak kelembapan ke Serial Monitor
Serial.println("---");
// Mempublish data suhu dan kelembapan pada broker MQTT
client.publish("kelasiot/suhu", String (data.temperature, 2), true, 1);
client.publish("kelasiot/kelembapan", String (data.humidity, 1 ), true, 1 );
}
void rgb(bool red, bool green, bool blue){
digitalWrite(pinRed, red);
digitalWrite(pinGreen, green);
digitalWrite(pinBlue, blue);
}
void connect(){
rgb(1,0,0);//Merah
while(WiFi.status() != WL_CONNECTED){
delay(500);
}
rgb(0,1,0);//Hijau
//memberikan status offline
client.setWill("kelasiot/espSatu/status", "offline", true, 1);
while(!client.connect("kelasiot123", "ProjectAkhir" , "123456")){// client ID tidak boleh sama dengan lainnya
delay(500);
}
rgb(0,0,1);
client.publish("kelasiot/espSatu/status", "online", true, 1);
client.subscribe("kelasiot/#", 1); //subscribe menggunakan QoS 1
}