#include <WiFiClientSecure.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT HiveMQ Cloud
const char* mqtt_server = "62b087ee16c04fdd9c241ee60b036017.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
const char* mqtt_user = "idrismqtt";
const char* mqtt_pass = "Idris123";
const char* topic = "sensor/data";
WiFiClientSecure wifiClient;
PubSubClient client(wifiClient);
// Optional: Sertifikat root HiveMQ Cloud (kamu bisa skip verifikasi sertifikat, tapi untuk produksi disarankan tidak)
const char* root_ca = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIFBTCCAu2gAwIBAgIQWgDyEtjUtIDzkkFX6imDBTANBgkqhkiG9w0BAQsFADBP\n" \
"MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy\n" \
"Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa\n" \
"Fw0yNzAzMTIyMzU5NTlaMDMxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF\n" \
"bmNyeXB0MQwwCgYDVQQDEwNSMTMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n" \
"AoIBAQClZ3CN0FaBZBUXYc25BtStGZCMJlA3mBZjklTb2cyEBZPs0+wIG6BgUUNI\n" \
"fSvHSJaetC3ancgnO1ehn6vw1g7UDjDKb5ux0daknTI+WE41b0VYaHEX/D7YXYKg\n" \
"L7JRbLAaXbhZzjVlyIuhrxA3/+OcXcJJFzT/jCuLjfC8cSyTDB0FxLrHzarJXnzR\n" \
"yQH3nAP2/Apd9Np75tt2QnDr9E0i2gB3b9bJXxf92nUupVcM9upctuBzpWjPoXTi\n" \
"dYJ+EJ/B9aLrAek4sQpEzNPCifVJNYIKNLMc6YjCR06CDgo28EdPivEpBHXazeGa\n" \
"XP9enZiVuppD0EqiFwUBBDDTMrOPAgMBAAGjgfgwgfUwDgYDVR0PAQH/BAQDAgGG\n" \
"MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATASBgNVHRMBAf8ECDAGAQH/\n" \
"AgEAMB0GA1UdDgQWBBTnq58PLDOgU9NeT3jIsoQOO9aSMzAfBgNVHSMEGDAWgBR5\n" \
"tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAKG\n" \
"Fmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0gBAwwCjAIBgZngQwBAgEwJwYD\n" \
"VR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVuY3Iub3JnLzANBgkqhkiG9w0B\n" \
"AQsFAAOCAgEAUTdYUqEimzW7TbrOypLqCfL7VOwYf/Q79OH5cHLCZeggfQhDconl\n" \
"k7Kgh8b0vi+/XuWu7CN8n/UPeg1vo3G+taXirrytthQinAHGwc/UdbOygJa9zuBc\n" \
"VyqoH3CXTXDInT+8a+c3aEVMJ2St+pSn4ed+WkDp8ijsijvEyFwE47hulW0Ltzjg\n" \
"9fOV5Pmrg/zxWbRuL+k0DBDHEJennCsAen7c35Pmx7jpmJ/HtgRhcnz0yjSBvyIw\n" \
"6L1QIupkCv2SBODT/xDD3gfQQyKv6roV4G2EhfEyAsWpmojxjCUCGiyg97FvDtm/\n" \
"NK2LSc9lybKxB73I2+P2G3CaWpvvpAiHCVu30jW8GCxKdfhsXtnIy2imskQqVZ2m\n" \
"0Pmxobb28Tucr7xBK7CtwvPrb79os7u2XP3O5f9b/H66GNyRrglRXlrYjI1oGYL/\n" \
"f4I1n/Sgusda6WvA6C190kxjU15Y12mHU4+BxyR9cx2hhGS9fAjMZKJss28qxvz6\n" \
"Axu4CaDmRNZpK/pQrXF17yXCXkmEWgvSOEZy6Z9pcbLIVEGckV/iVeq0AOo2pkg9\n" \
"p4QRIy0tK2diRENLSF2KysFwbY6B26BFeFs3v1sYVRhFW9nLkOrQVporCS0KyZmf\n" \
"wVD89qSTlnctLcZnIavjKsKUu1nA1iU0yYMdYepKR7lWbnwhdx3ewok=\n" \
"-----END CERTIFICATE-----\n";
// Buffer untuk 200 data
struct SensorData {
float x;
float y;
float z;
float suhu;
};
SensorData buffer[200];
int bufferIndex = 0;
SensorData readSensor() {
SensorData data;
// Random float antara -5.00 dan 5.00
data.x = ((float)random(-500, 501)) / 100.0;
data.y = ((float)random(-500, 501)) / 100.0;
data.z = ((float)random(-500, 501)) / 100.0;
// Random suhu 34 – 40
data.suhu = random(340, 401) / 10.0;
return data;
}
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Menghubungkan ke MQTT...");
if (client.connect("ESP32Client", mqtt_user, mqtt_pass)) {
Serial.println("terhubung.");
} else {
Serial.print("gagal, rc=");
Serial.print(client.state());
Serial.println(" coba lagi dalam 5 detik.");
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terhubung!");
// TLS config
wifiClient.setCACert(root_ca);
client.setServer(mqtt_server, mqtt_port);
client.setBufferSize(32768);
reconnectMQTT();
}
void loop() {
if (!client.connected()) {
reconnectMQTT();
}
client.loop();
SensorData data = readSensor();
buffer[bufferIndex++] = data;
if (bufferIndex >= 200) {
DynamicJsonDocument doc(80000);
JsonArray arr = doc.to<JsonArray>();
for (int i = 0; i < bufferIndex; i++) {
JsonObject obj = arr.createNestedObject();
obj["x"] = buffer[i].x;
obj["y"] = buffer[i].y;
obj["z"] = buffer[i].z;
obj["suhu"] = buffer[i].suhu;
}
String jsonString;
serializeJson(doc, jsonString);
Serial.print("Ukuran payload JSON: ");
Serial.println(jsonString.length());
if (client.publish(topic, jsonString.c_str())) {
Serial.println("Batch data x,y,z,suhu terkirim ke MQTT!");
} else {
Serial.println("Gagal mengirim batch.");
}
bufferIndex = 0;
}
delay(100); // waktu antar pembacaan sensor
}