/* Tugas IoT 7A - Pertemuan 6
Anggota kelompok:
Restu Raina Rahmah (2030511012)
Alfi Nur Afiati (2030511072) */
#include <WiFi.h> //library wifi
#include <PubSubClient.h> //library PubSubClient
#include "DHTesp.h" //library sensor DHT22
const int DHT_PIN = 15; //mengatur pin ke-15 untuk terhubung dengan sensor DHT22
const int LED_PIN = 13; //mengatur pin ke-13 untuk terhubung dengan LED
DHTesp dhtSensor; //deklarasi objek dan kelas dari libary sensor DHT22
const char* ssid = "Wokwi-GUEST"; //inisialisasi nama jaringan
const char* password = ""; //inisialisasi password jaringan
const char* mqtt_server = "test.mosquitto.org"; //inisialisasi alamat server
const char* mqtt_topic_suhu = "/restu/alfi/suhu"; //inisialisasi topik untuk suhu
const char* mqtt_topic_kelembaban = "/restu/alfi/kelembaban"; //inisialisasi topik untuk kelembaban
const char* topic = "/restu/alfi/led"; //inisialisasi topik untuk lampu
WiFiClient espClient; //mengelola koneksi wifi pada perangkat terhubung ke jaringan wifi
PubSubClient client(espClient); //komunikasi melalui protokol MQTT
unsigned long lastMsg = 0; //untuk melacak waktu terakhir pengiriman data suhu dan kelembaban ke broker MQTT
#define MSG_BUFFER_SIZE (50) //mendefinisikan konstanta dengan nilai 50, yang digunakan untuk menyimpan pesan-pesan MQTT yang akan dikirim atau diterima.
float temp = 0; //deklarasi variabel temp dengan tipe data float dan menetapkan nilai awal = 0
float hum = 0; //deklarasi variabel hum dengan tipe data float dan menetapkan nilai awal = 0
int value = 0; //deklarasi variabel value dengan tipe data integer dan menetapkan nilai awal = 0
//menyiapkan fungsi untuk setup wifi
void setup_wifi() {
delay(10); //memberikan jeda 10 milidetik untuk mulai terhubung wifi
Serial.println(); //mencetak baris kosong pada serial monitor
Serial.print("Connecting to "); //mencetak kalimat "Connecting to " pada serial monitor
Serial.println(ssid); //mencetak nama SSID jaringan wifi ("Wokwi-GUEST") pada serial monitor
WiFi.mode(WIFI_STA); //mengatur mode wifi sebagai mode klien
WiFi.begin(ssid, password); //untuk terhubung ke jaringan wifi dengan SSID dan password yang telah ditentukan
while (WiFi.status() != WL_CONNECTED) { //perulangan untuk menunggu koneksi wifi belum berhasil terhubung
delay(500); //memberikan jeda 500 milidetik (0,5 detik)
Serial.print("."); //mencetak titik pada serial monitor setiap kali mencoba untuk terhubung ke jaringan wifi
}
Serial.println(""); //mencetak baris kosong pada serial monitor
Serial.println("WiFi connected"); // mencetak kalimat "WiFi connected" pada serial monitor
Serial.println("IP address: "); //mencetak kalimat "IP address: " pada serial monitor
Serial.println(WiFi.localIP()); //mencetak alamat IP lokal IP adress esp32 pada serial monitor
}
//fungsi callback terjadi setiap ada pesan yang diterima dari topik tertentu pada protokol MQTT.
//fungsi callback disini terdapat topik, isi pesan dan panjang payload
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived ["); //mencetak kalimat "Message arrived [" pada serial monitor
Serial.print(topic); //mencetak isi dari topik
Serial.print("] "); //mencetak tanda ]
for (int i = 0; i < length; i++) { //melakukan perulangan yang akan mencetak setiap byte dari payload
Serial.print((char)payload[i]); //mencetak karakter dari payload
}
Serial.println(); //mencetak baris baru pada serial monitor untuk pemisahan saat perulangan selesai.
if ((char)payload[0] == '0') { //kondisi dimana jika payload bernilai '0'
digitalWrite(13, LOW); //LED (pin 13) tetap mati
}
else if ((char)payload[0] == '1') { //kondisi dimana jika payload bernilai '1'
digitalWrite(13, HIGH); //LED (pin 13) menyala
}
}
//fungsi untuk menghubungkan kembali klien MQTT (PubSubClient) ke broker MQTT
void reconnect() {
while (!client.connected()) { //perulangan masih terus berjalan selama esp32 ke broker belum terhubung
Serial.print("Attempting MQTT connection..."); //mencetak kalimat "Attempting MQTT connection..." pada serial monitor
String clientId = "ESP8266Client-"; //membuat suatu objek clientId dengan tipe data string
clientId += String(random(0xffff), HEX); //membuat clientId secara acak dalam format heksadesimal
if (client.connect(clientId.c_str())) { //kondisi dimana telah terhubung dengan broker menggunakan id klien
Serial.println("Connected"); //mencetak kalimat "Connected"
client.publish("/indobot/mqtt", "Indobot"); //mengirim pesan "Indobot" ke topik "/indobot/mqtt"
client.subscribe(topic); //melakukan subscribe ke topik yang telah ditentukan
} else { //kondisi sebaliknya, dimana belum berhasil terhubung dengan broker menggunakan id klien
Serial.print("failed, rc="); //mencetak pesan "failed, rc=" bahwa koneksi gagal pada serial monitor
Serial.print(client.state()); //mencetak status koneksi ke broker
Serial.println(" try again in 5 seconds"); //mencetak kalimat " try again in 5 seconds"
delay(5000); //jeda selama 5 detik sebelum mencoba kembali
}
}
}
//Fungsi setup digunakan untuk melakukan inisialisasi dan konfigurasi awal sebelum program utama dijalankan.
void setup() {
Serial.begin(115200); //Mencetak komunikasi serial dengan kecepatan baud 115200. Ini membuka saluran komunikasi serial antara perangkat dan terminal komputer.
pinMode(13, OUTPUT); //Mengatur pin digital 13 sebagai output
setup_wifi(); //Memanggil fungsi setup_wifi(), yang kemungkinan mengatur koneksi WiFi pada perangkat.
client.setServer(mqtt_server, 1883); //Mengatur server MQTT yang akan digunakan oleh objek client dari kelas PubSubClient. mqtt_server adalah alamat server MQTT, dan 1883 adalah port default untuk protokol MQTT.
client.setCallback(callback); //Mengatur fungsi callback sebagai fungsi pemanggil kembali untuk menangani pesan yang diterima dari broker MQTT.
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); //Menginisialisasi sensor suhu dan kelembaban DHT dengan objek dhtSensor dari kelas DHTesp. DHT_PIN adalah nomor pin yang terhubung ke sensor, dan DHTesp::DHT22 menentukan jenis sensor DHT yang digunakan (DHT22).
}
//fungsi loop adalah perintah yang dijalankan berulang kali selama perangkat berada dalam kondisi aktif.
void loop() {
if (!client.connected()) { //: Memulai blok pernyataan kondisional, ini berfungsi untuk mengecek apakah klien MQTT tidak terhubung ke broker MQTT.
reconnect(); //Jika klien tidak terhubung, maka fungsi reconnect() akan dipanggil
}
client.loop(); //memproses dan menanggapi pesan-pesan yang diterima atau dikirim.
unsigned long now = millis(); //Mendefinisikan variabel now sebagai bilangan bulat dan memberikan nilai awal berupa waktu saat ini dalam milidetik.
if (now - lastMsg > 2000) { //Memulai blok pernyataan kondisional.
lastMsg = now; //Jika selisih waktu lebih dari 2000 milidetik, maka nilai lastMsg diperbarui dengan nilai waktu saat ini.
TempAndHumidity data = dhtSensor.getTempAndHumidity(); // Memanggil metode getTempAndHumidity() pada objek dhtSensor dari kelas DHTesp.
String temp = String(data.temperature, 2); // Mengubah nilai suhu menjadi string dua angka di belakang koma
Serial.print("Temperature: "); //Mencetak teks "Temperature: " ke terminal serial.
Serial.println(temp); //Mencetak nilai suhu yang telah dikonversi menjadi String ke terminal serial dengan baris baru.
client.publish(mqtt_topic_suhu, temp.c_str()); //Mengirim nilai suhu ke broker MQTT pada topik yang telah ditentukan.
String hum = String(data.humidity, 1); // Mengubah nilai suhu menjadi string satu angka di belakang koma.
Serial.print("Humidity: "); //Mencetak teks "Humidity: " ke terminal serial.
Serial.println(hum); //Mencetak nilai kelembaban yang telah dikonversi menjadi String ke terminal serial dengan baris baru.
client.publish(mqtt_topic_kelembaban, hum.c_str()); //Mengirim nilai kelembaban ke broker MQTT pada topik yang telah ditentukan.
}
}