#include <WiFi.h>
#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <PubSubClient.h>
// Konfigurasi MQTT
const char* mqtt_server = "test.mosquitto.org";
const char* mqtt_topic = "mqtt/Bhima_satria_rizki_sugiono/data";
// Konfigurasi sensor DHT22
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi RTC DS1307
RTC_DS1307 rtc;
// Inisialisasi klien MQTT
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long previousMillis = 0;
const long interval = 5000; // Interval 5 detik
void setup() {
Serial.begin(115200);
// Koneksi ke WiFi
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Inisialisasi sensor DHT22
dht.begin();
// Inisialisasi RTC DS1307
Wire.begin();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// Set waktu RTC jika belum diatur
if (!rtc.isrunning()) {
Serial.println("RTC is not running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Set koneksi MQTT
client.setServer(mqtt_server, 1883);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (!client.connected()) {
reconnect();
}
client.loop();
// Baca data dari sensor DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Baca waktu dari RTC DS1307
DateTime now = rtc.now();
String timestamp = String(now.year()) + "-" +
twoDigits(now.month()) + "-" +
twoDigits(now.day()) + " " +
twoDigits(now.hour()) + ":" +
twoDigits(now.minute()) + ":" +
twoDigits(now.second());
// Persiapan data JSON
String dataJSON = "{\"nama\":\"Bhima Satria Rizki Sugiono\", \"data\": {\"temperature\": \"" + String(temperature) + "\", \"humidity\": \"" + String(humidity) + "\"}, \"timestamp\": \"" + timestamp + "\"}";
// Tampilkan data di Serial Monitor
Serial.print("Datetime : ");
Serial.println(timestamp);
Serial.print("Temperature : ");
Serial.println(temperature);
Serial.print("Humidity : ");
Serial.println(humidity);
Serial.print("Data Pack : ");
Serial.println(dataJSON);
// Kirim data ke MQTT
bool result = client.publish(mqtt_topic, dataJSON.c_str());
Serial.print("Result Publish : ");
Serial.println(result ? "Success" : "Failed");
}
}
void reconnect() {
// Loop sampai terhubung ke server MQTT
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client")) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
String twoDigits(int number) {
if (number < 10) {
return "0" + String(number);
}
return String(number);
}