#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Konfigurasi MQTT
const char* mqtt_server = "broker.emqx.io"; // Broker MQTT
const int mqtt_port = 1883; // Port MQTT
const char* mqtt_topic = "MET01-000007"; // Topik untuk mengirim data
WiFiClient espClient;
PubSubClient client(espClient);
// Data multiple sensor
float pressure = random(0, 10);
float stand = 50;
// Variabel waktu untuk logika penambahan nilai
unsigned long previousMillis = 0; // Variabel untuk melacak waktu sebelumnya
const unsigned long interval = 1000; // Interval 1 detik (1000 ms)
const unsigned long sendInterval = 30000; // Interval pengiriman data ke broker MQTT 30 detik
unsigned long lastSendMillis = 0; // Waktu terakhir data dikirim
void setup_wifi() {
delay(500);
Serial.println();
Serial.print("Menghubungkan ke ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi terhubung");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// void reconnect() {
// // Loop hingga terkoneksi kembali ke broker MQTT
// if (!client.connected()) {
// Serial.print("Menghubungkan ke broker MQTT...");
// if (client.connect("ESP8266Client3")) { // ID klien unik
// Serial.println("Terhubung");
// } else {
// Serial.print("Gagal, rc=");
// Serial.print(client.state());
// Serial.println(" Coba lagi dalam 5 detik");
// delay(5000);
// }
// }
// }
void reconnect() {
static unsigned long lastReconnectAttempt = 0;
unsigned long now = millis();
if (!client.connected()) {
if (now - lastReconnectAttempt > 5000) { // Coba reconnect setiap 5 detik
lastReconnectAttempt = now;
Serial.print("Menghubungkan ke broker MQTT...");
if (client.connect("ESP8266Client3")) {
Serial.println("Terhubung");
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" Coba lagi nanti...");
}
}
}
}
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqtt_port);
}
void loop() {
if (!client.connected()) {
reconnect(); // Hanya panggil reconnect jika tidak terhubung
} else {
client.loop(); // Jalankan loop MQTT saat sudah terhubung
}
unsigned long currentMillis = millis(); // Ambil waktu saat ini
// Logika penambahan nilai stand setiap detik
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
stand++; // Tingkatkan nilai stand
}
// Kirim data setiap 30 detik
if (currentMillis - lastSendMillis >= sendInterval) {
lastSendMillis = currentMillis;
// Membuat JSON untuk data sensor
StaticJsonDocument<200> jsonDoc;
jsonDoc["stand"] = stand;
jsonDoc["pressure"] = pressure;
// Konversi JSON ke string
char jsonBuffer[512];
serializeJson(jsonDoc, jsonBuffer);
// Publish data JSON ke broker MQTT
if (client.connected()) {
client.publish(mqtt_topic, jsonBuffer);
Serial.println("Data dikirim: ");
Serial.println(jsonBuffer);
} else {
Serial.println("Koneksi MQTT terputus, data tidak dikirim.");
}
// Cetak nilai stand
Serial.print("Nilai stand terkini: ");
Serial.println(stand);
}
}