#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <MQTT.h>
Adafruit_MPU6050 mpu;
LiquidCrystal_I2C lcd(0x27, 16, 2);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";
WiFiClient net;
MQTTClient client;
void connectWiFi() {
delay(10);
WiFi.begin(ssid, password);
lcd.print("Menunggu WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
lcd.clear();
lcd.print("WiFi Terhubung");
delay(2000);
}
void connectMQTT() {
lcd.clear();
lcd.print("Menunggu Server");
// Coba koneksi ke broker dengan Client ID unik
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX); // Tambahkan karakter acak
// Hubungkan ke broker MQTT
while (!client.connect(clientId.c_str())) {
delay(1000);
}
lcd.clear();
lcd.print("Server Terhubung");
delay(2000);
}
void setup() {
// Inisialisasi I2C dengan pin yang sesuai (SDA = 21, SCL = 22)
Wire.begin(21, 22);
// Coba untuk menginisialisasi MPU6050
if (!mpu.begin()) {
while (1) {
delay(10);
}
}
// Setel rentang akselerometer dan giroskop
mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
mpu.setGyroRange(MPU6050_RANGE_250_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
// inisialisasi MQTT
client.begin(mqtt_server, net);
// Inisialisasi LCD
lcd.begin(16, 2);
lcd.backlight();
// hhubungkan ke wifi dan server
connectWiFi();
connectMQTT();
}
void loop() {
// Jika MQTT terputus, coba hubungkan lagi
if (!client.connected()) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Koneksi Terputus");
connectWiFi();
connectMQTT();
}
// Dapatkan event sensor baru
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Tampilkan nilai akselerasi X dan Y di baris pertama LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("X:");
lcd.print(a.acceleration.x, 1); // Nilai X dengan 1 digit desimal
lcd.setCursor(8, 0);
lcd.print(" Y:");
lcd.print(a.acceleration.y, 1); // Nilai Y
lcd.setCursor(0, 1); // Baris kedua
lcd.print("Z:");
lcd.print(a.acceleration.z, 1); // Nilai Z
client.publish("sensor/acceleration/x", String(a.acceleration.x, 2), true, 1);
client.publish("sensor/acceleration/y", String(a.acceleration.y, 2), true, 1);
client.publish("sensor/acceleration/z", String(a.acceleration.z, 2), true, 1);
delay(500); // Publikasi setiap 1 detik
}