#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <PubSubClient.h>
// LCD and MPU6050 initialization
LiquidCrystal_I2C lcd(0x27, 20, 4);
Adafruit_MPU6050 mpu;
// WiFi and MQTT credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "good-moose.com";
const char* mqttTopic = "/ENGEA110/043-2";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
// Function to connect to WiFi
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
// MQTT callback function
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
// Reconnect to MQTT server
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.publish("outTopic", "hello world");
client.subscribe("inTopic");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void setup(void) {
Serial.begin(115200);
while (!Serial) delay(1000);
Serial.println("Adafruit MPU6050 test!");
// Initialize MPU6050
if (!mpu.begin()) {
Serial.println("Failed to find MPU6050 chip");
while (1) { delay(1000); }
}
Serial.println("MPU6050 Found!");
mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
mpu.setGyroRange(MPU6050_RANGE_500_DEG);
mpu.setFilterBandwidth(MPU6050_BAND_5_HZ);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hello World");
// Set up WiFi and MQTT
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// Print out the values
Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
Serial.print("Rotation X: ");
Serial.print(g.gyro.x);
Serial.print(", Y: ");
Serial.print(g.gyro.y);
Serial.print(", Z: ");
Serial.print(g.gyro.z);
Serial.println(" rad/s");
Serial.print("Temperature: ");
Serial.print(temp.temperature);
Serial.println(" degC");
Serial.println("");
// Display data on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Acc X: ");
lcd.print(a.acceleration.x);
lcd.setCursor(0, 1);
lcd.print("Acc Y: ");
lcd.print(a.acceleration.y);
lcd.setCursor(0, 2);
lcd.print("Acc Z: ");
lcd.print(a.acceleration.z);
lcd.setCursor(11, 0);
lcd.print(" X: ");
lcd.print(g.gyro.x);
lcd.setCursor(11, 1);
lcd.print(" Y: ");
lcd.print(g.gyro.y);
lcd.setCursor(11, 2);
lcd.print(" Z: ");
lcd.print(g.gyro.z);
lcd.setCursor(0, 3);
lcd.print("Temp: ");
lcd.print(temp.temperature);
lcd.println(" C");
delay(1000);
// Create JSON message
String msg = "{";
msg += "\"Ax\":" + String(a.acceleration.x) + ",";
msg += "\"Ay\":" + String(a.acceleration.y) + ",";
msg += "\"Az\":" + String(a.acceleration.z) + ",";
msg += "\"Gx\":" + String(g.gyro.x) + ",";
msg += "\"Gy\":" + String(g.gyro.y) + ",";
msg += "\"Gz\":" + String(g.gyro.z) + ",";
msg += "\"Temperature\":" + String(temp.temperature);
msg += "}";
}