/*
Dibuat Oleh
Nama : Efrino Wahyu Eko Pambudi
NIM : 3.34.22.1.07
Kelas : IK - 2B
*/
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHTesp.h>
#include <PubSubClient.h>
//mengimpor berbagai pustaka yang dibutuhkan untuk proyek ini.
//Diantaranya adalah pustaka WiFi, Wire (untuk komunikasi I2C),
//LiquidCrystal_I2C (untuk mengendalikan layar LCD dengan I2C), DHTesp (pustaka sensor DHT22),
//dan PubSubClient (untuk menghubungkan dan berkomunikasi dengan server MQTT).
LiquidCrystal_I2C lcd(0x27,20,4);
//mengendalikan layar LCD I2C dengan alamat 0x27, dan ukuran 20 karakter per baris dan 4 baris.
const int DHT_PIN = 15;
const int pinled = 18;
const int pinledd = 5;
const int pinleddd = 19;
//deklarasi konstanta untuk pin yang digunakan. DHT_PIN adalah pin yang terhubung ke sensor DHT22,
//dan pinled adalah pin yang digunakan untuk mengontrol LED.
DHTesp dht;
float suhu = 0;
float kelembaban = 0;
// inisialisasi sensor DHT22 dan variabel untuk menyimpan nilai suhu dan kelembaban.
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const char* mqtt_user = "";
const char* mqtt_password = "";
const char* mqtt_topic = "polines/Ik/33422107";
//pengaturan WiFi dan server MQTT yang akan digunakan.
WiFiClient espClient;
PubSubClient client(espClient);
// inisialisasi klien WiFi dan klien PubSubClient untuk berkomunikasi dengan server MQTT.
void setup() {
Serial.begin(115200);
dht.setup(DHT_PIN, DHTesp::DHT22);
pinMode(pinled, OUTPUT);
pinMode(pinledd, OUTPUT);
pinMode(pinleddd, OUTPUT);
connectWiFi();
client.setServer(mqtt_server, 1883);
lcd.init();
lcd.backlight();
lcd.setCursor(3,0);
lcd.print("Monitoring");
lcd.setCursor(2,1);
lcd.print("Suhu & Kelembaban");
lcd.setCursor(8,2);
lcd.print("By");
lcd.setCursor(5,3);
lcd.print("Efrino WEP");
delay(3000);
lcd.clear();
}
void loop() {
TempAndHumidity data = dht.getTempAndHumidity();
// Membaca data suhu dan kelembaban dari sensor DHT22 dan menyimpannya dalam objek "data".
suhu = data.temperature;
// Menyimpan nilai suhu dari objek "data" ke dalam variabel "suhu"
kelembaban = data.humidity;
// Menyimpan nilai kelembaban dari objek "data" ke dalam variabel "kelembaban"
if (!client.connected()) { //Memeriksa apakah klien MQTT tidak terhubung ke server MQTT.
reconnect();// sambung kembali
}
Serial.print("Temp: ");//Mencetak teks "Temp: " ke dalam monitor serial.
Serial.print(suhu);//Mencetak nilai suhu ke dalam monitor serial.
Serial.println("C");
Serial.print("Hum: ");
Serial.print(kelembaban);
Serial.println("%");
publishData();// Memanggil fungsi publishData() untuk mengirim data suhu
//dan kelembaban ke server MQTT.
delay(2000);
if (suhu > 38) { //Memulai blok kondisional ...
digitalWrite(pinled, HIGH);
digitalWrite(pinledd, LOW);
digitalWrite(pinleddd, LOW);
}else if (suhu < 20){
digitalWrite(pinledd, HIGH);
digitalWrite(pinled, LOW);
digitalWrite(pinleddd, LOW);
} else {
digitalWrite(pinled, LOW);
digitalWrite(pinledd, LOW);
digitalWrite(pinleddd, HIGH);
}
lcd.init();
lcd.backlight();
lcd.setCursor(1,0);
lcd.print("Ruangan Pintar");
lcd.setCursor(1,1);
lcd.print("Efrino Wahyu Eko P");
//suhu
lcd.setCursor(0,2);
lcd.print("Suhu :");
lcd.setCursor(13,2);
lcd.print(suhu);
lcd.setCursor(19,2);
lcd.print("C");
//kelembaban
lcd.setCursor(0,3);
lcd.print("Kelembaban :");
lcd.setCursor(13,3);
lcd.print(kelembaban);
lcd.setCursor(19,3);
lcd.print("%");
delay(2000);
}
void connectWiFi() { //Mendefinisikan fungsi connectWiFi.
WiFi.begin(ssid, password); //Memulai koneksi WiFi dengan SSID dan kata sandi yang telah ditentukan.
while (WiFi.status() != WL_CONNECTED) {
//Memulai loop while yang akan berjalan selama perangkat tidak terhubung ke WiFi.
delay(1000);
Serial.println("Connecting to WiFi...");//Mencetak pesan "Connecting to WiFi..." ke monitor serial.
}
Serial.println("Connected to WiFi");
//Mencetak pesan "Connected to WiFi" ke monitor serial ketika perangkat berhasil terhubung.
}
void reconnect() {
while (!client.connected()) {
//Memulai loop while yang akan berjalan selama klien MQTT tidak terhubung ke server MQTT.
if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
//Memeriksa apakah klien MQTT berhasil terhubung dengan server MQTT menggunakan
//ID klien "ESP32Client", nama pengguna MQTT (mqtt_user), dan kata sandi MQTT (mqtt_password).
Serial.println("Connected to MQTT Broker");
//Mencetak pesan "Connected to MQTT Broker" ke monitor serial ketika klien berhasil terhubung ke server MQTT.
} else {
delay(2000);
}
}
}
void publishData() {
char tempStr[10];
//Membuat array karakter tempStr dengan panjang maksimal 10 karakter.
char humStr[10];
//Membuat array karakter humStr dengan panjang maksimal 10 karakter.
dtostrf(suhu, 6, 2, tempStr);
//Mengonversi nilai suhu (suhu) menjadi string dengan presisi 2 angka desimal
//dan menyimpannya dalam tempStr.
dtostrf(kelembaban, 6, 2, humStr);
//Mengonversi nilai kelembaban (kelembaban) menjadi string dengan presisi 2 angka desimal
//dan menyimpannya dalam humStr
String topic_humidity = "polines/Ik/33422107/Kelembaban";
//Membuat objek string topic_humidity yang berisi topik untuk data kelembaban
String topic_temperature = "polines/Ik/33422107/Suhu";
client.publish(topic_humidity.c_str(), humStr);
//Mengirim data kelembaban ke server MQTT dengan menggunakan topik dari topic_humidity
//dan data yang disimpan dalam humStr.
client.publish(topic_temperature.c_str(), tempStr);
}