#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <RTClib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 4 // Pin data sensor DHT22 terhubung ke GPIO 4
#define DHTTYPE DHT22 // Tipe sensor DHT 22
DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;
// MQTT
const char* mqttServer = "broker.emqx.io"; // Alamat server MQTT
const int mqttPort = 1883; // Port server MQTT
const char* mqttUser = ""; // Nama pengguna MQTT (kosongkan jika tidak ada)
const char* mqttPassword = ""; // Kata sandi MQTT (kosongkan jika tidak ada)
const char* clientId = "ESP32Client"; // ID klien MQTT
const char* ssid = "Wokwi-GUEST"; // SSID WiFi
const char* password = ""; // Kata sandi WiFi (kosongkan karena tidak diperlukan)
WiFiClient espClient;
PubSubClient mqttClient(espClient);
// Inisialisasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Penulisan data yang akan ditampilkan di LCD
const int numLines = 4;
String lines[numLines] = {"Raddyaarizaldy ", "IOT ", "BLK SURABAYA ", "2024 "};
void setup() {
Serial.begin(9600);
// Inisialisasi sensor DHT dan RTC
dht.begin();
rtc.begin();
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// Inisialisasi LCD
lcd.init();
lcd.backlight();
// Tampilkan teks awal pada setiap baris
for (int i = 0; i < numLines; i++) {
lcd.setCursor(0, i);
lcd.print(lines[i]);
}
// Setup WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
// Setup MQTT
mqttClient.setServer(mqttServer, mqttPort);
// Memulai koneksi ke MQTT broker
reconnectMQTT();
}
void loop() {
// Membaca suhu dari sensor DHT
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Mengantisipasi data yang dibaca sensor salah
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Gagal membaca sensor DHT!");
} else {
// Tampilkan suhu dan kelembaban di Serial Monitor
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.print("°C, Kelembaban: ");
Serial.print(humidity);
Serial.println("%");
// Kirim data suhu dan kelembaban ke topik MQTT
publishData("Suhu: " + String(temperature) + "°C, Kelembaban: " + String(humidity) + "%");
}
// Baca waktu dari RTC dan tampilkan di Serial Monitor
DateTime now = rtc.now(); // <--- Deklarasi objek DateTime
Serial.print(now.year(), DEC); Serial.print("/");
Serial.print(now.month(), DEC); Serial.print("/");
Serial.print(now.day(), DEC); Serial.println(".");
Serial.print(now.hour(), DEC); Serial.print(':');
Serial.print(now.minute(), DEC); Serial.print(':');
Serial.print(now.second(), DEC); Serial.println(".");
// Geser teks ke kiri
for (int i = 0; i < numLines; i++) {
lines[i] = lines[i].substring(1) + lines[i].substring(0, 1); // Geser satu karakter ke kiri
lcd.setCursor(0, i);
lcd.print(lines[i]);
}
delay(500); // Delay untuk efek berjalan yang lancar
}
void publishData(String data) {
if (!mqttClient.connected()) {
reconnectMQTT();
}
String topicDHT = "radz/iot/2024/data"; // Topik MQTT untuk data suhu dan kelembaban
mqttClient.publish(topicDHT.c_str(), data.c_str());
}
void reconnectMQTT() {
while (!mqttClient.connected()) {
Serial.println("Connecting to MQTT...");
if (mqttClient.connect(clientId, mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
}
else {
Serial.print("Failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
}