#include <WiFi.h>
#include <MQTT.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <NusabotSimpleTimer.h>
LiquidCrystal_I2C lcd (0x27, 20, 4);
WiFiClient net;
MQTTClient client;
NusabotSimpleTimer timer;
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
const char broker[] = "pbl-hmi.cloud.shiftr.io";
const char username[] = "pbl-hmi";
const char password[] = "sOJ5rnkdfI6C8l1j";
const char topicTamu[] = "PKM/tamu";
const char topicDapur[] = "PKM/dapur";
const char topicTeras[] = "PKM/teras";
const char topicSuhu[] = "PKM/suhu";
const char topicKelembaban[] = "PKM/lembab";
const char topicCahaya[] = "PKM/status";
const char topicJarak[] = "PKM/waktu";
const char topicStatusTamu[] = "status/led/tamu";
const char topicStatusDapur[] = "status/led/dapur";
const char topicStatusTeras[] = "status/led/teras";
const char topicStatusBuzzer[] = "status/kondisi/buzzer";
#define pinDHT 19
#define tipe DHT22
DHT dht (pinDHT, tipe);
float suhu, suhuTerakhir = 0;
float lembab, lembabTerakhir = 0;
const int ldr = 34;
float cahaya, cahayaLama = 0;
const int ledTamu = 12;
const int ledDapur = 14;
const int ledTeras = 27;
const int buzzer = 33;
const int TRIG = 26;
const int ECHO = 25;
float pengukuran, pengukuranTerakhir = 0.00;
void setup() {
pinMode(ldr, INPUT);
pinMode(ledTamu, OUTPUT);
pinMode(ledDapur, OUTPUT);
pinMode(ledTeras, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(ledTamu, LOW);
digitalWrite(ledDapur, LOW);
digitalWrite(ledTeras, LOW);
digitalWrite(buzzer, LOW);
dht.begin();
lcd.begin(20, 4);
lcd.init();
lcd.backlight();
tampil(0, 0, ">>Proyek Sederhana<<");
tampil(0, 1, "--Smart Home Ilyas--");
tampil(0, 2, " Integrated With ");
tampil(0, 3, "-Internet of Things-");
delay(1000);
lcd.clear();
WiFi.begin(ssid, pass);
client.begin(broker, net);
client.onMessage(terimaData);
timer.setInterval(500, publishDHT);
timer.setInterval(500, kecerahanCahaya);
timer.setInterval(500, tinggi);
koneksi();
}
void loop() {
timer.run();
client.loop();
if (!client.connected()) {
koneksi();
}
delay(10);
}
void koneksi() {
tampil(0, 1, "Connecting To");
tampil(0, 2, "WiFi");
while (WiFi.status() != WL_CONNECTED) {
lcd.print(".");
delay(250);
}
lcd.clear();
tampil(0, 1, "WiFi Has Been");
tampil(0, 2, "Connected");
delay(500);
lcd.clear();
tampil(0, 1, "Connecting To");
tampil(0, 2, "MQTT Broker");
client.setWill("status/perangkat/ilyas", "offline", false, 0);
while (!client.connect("ESP32-DEVKIT-V0", username, password)) {
delay(250);
}
client.publish("status/perangkat/ilyas", "online", false, 0);
client.subscribe(topicTamu, 0);
client.subscribe(topicDapur, 0);
lcd.clear();
tampil(0, 1, "MQTT Has Been");
tampil(0, 2, "Connected");
delay(500);
lcd.clear();
}
void tampil(uint16_t kolom, uint16_t baris, String text) {
lcd.setCursor(kolom, baris);
lcd.print(text);
}
void terimaData(String &topic, String &pesan) {
if (topic == topicTamu) {
digitalWrite(ledTamu, pesan == "nyala" ? HIGH : LOW);
client.publish(topicStatusTamu, digitalRead(ledTamu) == HIGH ? "nyala" : "mati", false, 0);
}
else if (topic == topicDapur) {
digitalWrite(ledDapur, pesan == "nyala" ? HIGH : LOW);
client.publish(topicStatusDapur, digitalRead(ledDapur) == HIGH ? "nyala" : "mati", false, 0);
}
}
void publishDHT() {
suhu = dht.readTemperature();
lembab = dht.readHumidity();
tampil(0, 0, "Suhu = ");
if (suhu != suhuTerakhir) {
lcd.print(String(suhu, 2) + "C ");
client.publish(topicSuhu, String(suhu, 2), false, 0);
suhuTerakhir = suhu;
}
tampil(0, 1, "Lembab = ");
if (lembab != lembabTerakhir) {
lcd.print(String(lembab, 2) + "% ");
client.publish(topicKelembaban, String(lembab, 2), false, 0);
lembabTerakhir = lembab;
}
}
void kecerahanCahaya() {
cahaya = analogRead(ldr) / 4063.00 * 100.00;
tampil(0, 2, "Cahaya = ");
if (cahaya != cahayaLama) {
lcd.print(String(cahaya, 2) + "% ");
client.publish(topicCahaya, String(cahaya, 2), false, 0);
if (cahaya > 96.00) {
digitalWrite(ledTeras, HIGH);
client.publish(topicStatusTeras, digitalRead(ledTeras) == HIGH ? "nyala" : "mati", false, 0);
}
else {
digitalWrite(ledTeras, LOW);
client.publish(topicStatusTeras, digitalRead(ledTeras) == LOW ? "mati" : "nyala", false, 0);
}
cahayaLama = cahaya;
}
}
void tinggi() {
pengukuran = 0.0344 / 2 * readUltrasonicDistance(TRIG, ECHO);
tampil(0, 3, "Jarak = ");
if (pengukuran != pengukuranTerakhir) {
lcd.print(String(pengukuran, 2) + "cm ");
client.publish(topicJarak, String(pengukuran, 2), false, 0);
if (pengukuran >= 100) {
digitalWrite(buzzer, HIGH);
client.publish(topicStatusBuzzer, digitalRead(buzzer) == HIGH ? "nyala" : "mati", false, 0);
}
else {
digitalWrite(buzzer, LOW);
client.publish(topicStatusBuzzer, digitalRead(buzzer) == LOW ? "mati" : "nyala", false, 0);
}
pengukuranTerakhir = pengukuran;
}
}
float readUltrasonicDistance(int triggerPin, int echoPin)
{
pinMode(triggerPin, OUTPUT);
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
return pulseIn(echoPin, HIGH);
}