#define dhtPin 17
#include <WiFi.h>
#include <PubSubClient.h>
WiFiClient wifiClient;
PubSubClient mqtt(wifiClient);
#include "DHT.h"
#define dhtType DHT22
DHT dht(dhtPin, dhtType);
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
#include <ArduinoJson.h>
const char *wifiSsid = "Wokwi-GUEST";
const char *wifiPass = "";
const char *mqttPubTopic = "mqtt/rifkiardiansah/data";
const char *mqttID = "RifkiDevice";
const char *mqttBroker = "test.mosquitto.org";
uint16_t mqttPort = 1883;
void setup() {
Serial.begin(115200);
WiFi.begin(wifiSsid, wifiPass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("Status : Connected to WiFi");
dht.begin();
rtc.begin();
mqttSetup();
}
void loop() {
mqttCheck();
mqtt.loop();
static unsigned long lastUplink = 0;
if (millis() - lastUplink > 5000) { //interval 5 detik
String timestampUTC = getTime(); //get waktu
float tempValue = dht.readTemperature(); //get suhu
float humiValue = dht.readHumidity(); //get kelembaban
if (isnan(tempValue) || isnan(humiValue)) {
tempValue = 0.0;
humiValue = 0.0;
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
sendData_Mqtt(timestampUTC, tempValue, humiValue);
lastUplink = millis();
}
}
void mqttSetup() {
mqtt.setServer(mqttBroker, mqttPort);
mqtt.connect(mqttID);
Serial.println("Status : MQTT SetServer Finish");
}
void mqttCheck() {
static unsigned long lastCheck = 0;
if (millis() - lastCheck > 500) {
if (!mqtt.connected()) {
Serial.println("Status : Reconnecting to MQTT");
mqtt.connect(mqttID); //menghubungkan ulang
if (!mqtt.connected()) {
Serial.println("Status : Failed to Connect MQTT");
mqtt.connect(mqttID);
}
Serial.println("Status : Reconnected to MQTT");
}
lastCheck = millis();
}
}
void sendData_Mqtt(String &time, float &temp, float &humi) {
String pubStat;
DynamicJsonDocument doc(256);
doc["nama"] = "Rifki Ardiansah";
doc["data"]["temp"] = temp;
doc["data"]["humi"] = humi;
doc["timestamp"] = time;
String msg;
serializeJson(doc, msg);
char finalDataChar[msg.length() + 1];
msg.toCharArray(finalDataChar, msg.length() + 1);
if (mqtt.publish(mqttPubTopic, finalDataChar)) {
pubStat = "sukses";
}
else pubStat = "gagal";
Serial.println("Datetime : " + time);
Serial.println("Temperature : " + String(temp));
Serial.println("Humidity : " + String(humi));
Serial.println("Data Pack : " + msg);
Serial.println("Result Publish : " + pubStat);
Serial.println();
}
String getTime() {
DateTime now = rtc.now();
return String(now.year(), DEC) + "-" + String(now.month(), DEC) + "-" + String(now.day(), DEC) + " " + String(now.hour(), DEC) + ":" + String(now.minute(), DEC) + ":" + String(now.second(), DEC);
}