#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU6050.h>
#include <DHT.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define GREEN_LED 12
#define YELLOW_LED 13
#define ORANGE_LED 14
#define RED_LED 15
#define DHTPIN 4
#define DHTTYPE DHT22
#define TILT_SENSOR_PIN 34
#define WIND_SENSOR_PIN 35
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "thingsboard.cloud";
const char* access_token = "kel7";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 20, 4);
MPU6050 mpu;
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Wire.begin();
mpu.initialize();
pinMode(GREEN_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(ORANGE_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
lcd.init();
lcd.backlight();
dht.begin();
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
Serial.println("Setup complete");
}
void setup_wifi() {
delay(10);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected");
}
void callback(char* topic, byte* payload, unsigned int length) {
String incomingMessage;
for (unsigned int i = 0; i < length; i++) {
incomingMessage += (char)payload[i];
}
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
Serial.println(incomingMessage);
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, incomingMessage);
if (error) {
Serial.print("deserializeJson() failed: ");
Serial.println(error.f_str());
return;
}
if (String(topic).startsWith("v1/devices/me/rpc/request/")) {
String status = doc["params"]["status"];
controlLED(status);
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32_Client", access_token, NULL)) {
Serial.println("connected");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
int16_t ax, ay, az;
int16_t gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
float accelMagnitude = sqrt(ax * ax + ay * ay + az * az);
float gyroMagnitude = sqrt(gx * gx + gy * gy + gz * gz);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
int tiltValue = analogRead(TILT_SENSOR_PIN);
float tiltAngle = map(tiltValue, 0, 4095, 0, 90);
int windValue = analogRead(WIND_SENSOR_PIN);
float windSpeed = map(windValue, 0, 4095, 0, 50); // Example mapping
String status;
if (accelMagnitude < 10000 && gyroMagnitude < 10000 && temperature < 30 && humidity < 70 && tiltAngle < 10 && windSpeed < 10) {
status = "Normal";
setLED(GREEN_LED);
} else if (accelMagnitude < 20000 && gyroMagnitude < 20000 && temperature < 35 && humidity < 75 && tiltAngle < 20 && windSpeed < 20) {
status = "Advisory";
setLED(YELLOW_LED);
} else if (accelMagnitude < 30000 && gyroMagnitude < 30000 && temperature < 40 && humidity < 80 && tiltAngle < 30 && windSpeed < 30) {
status = "Watch";
setLED(ORANGE_LED);
} else {
status = "Warning";
setLED(RED_LED);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Status:");
lcd.print(status);
lcd.setCursor(0, 1);
lcd.print("Temp:");
lcd.print(temperature);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Hum:");
lcd.print(humidity);
lcd.print(" %");
lcd.setCursor(0, 3);
lcd.print("Wind:");
lcd.print(windSpeed);
lcd.print(" km/h");
Serial.print("Status: ");
Serial.println(status);
Serial.print("Temp: ");
Serial.print(temperature);
Serial.print(" C ");
Serial.print("Hum: ");
Serial.print(humidity);
Serial.print(" % ");
Serial.print("Wind Speed: ");
Serial.print(windSpeed);
Serial.println(" km/h");
String payload = "{";
payload += "\"status\":\"" + status + "\",";
payload += "\"temperature\":" + String(temperature) + ",";
payload += "\"humidity\":" + String(humidity) + ",";
payload += "\"windSpeed\":" + String(windSpeed) + ",";
payload += "\"tiltAngle\":" + String(tiltAngle);
payload += "}";
client.publish("v1/devices/me/telemetry", (char*) payload.c_str());
sendLEDStatus(status);
delay(1000);
}
void setLED(int ledPin) {
digitalWrite(GREEN_LED, ledPin == GREEN_LED);
digitalWrite(YELLOW_LED, ledPin == YELLOW_LED);
digitalWrite(ORANGE_LED, ledPin == ORANGE_LED);
digitalWrite(RED_LED, ledPin == RED_LED);
}
void sendLEDStatus(String status) {
String payload = "{";
payload += "\"LEDStatus\":\"" + status + "\"";
payload += "}";
client.publish("v1/devices/me/telemetry", (char*) payload.c_str());
}
void controlLED(String status) {
if (status == "Normal") {
setLED(GREEN_LED);
} else if (status == "Advisory") {
setLED(YELLOW_LED);
} else if (status == "Watch") {
setLED(ORANGE_LED);
} else if (status == "Warning") {
setLED(RED_LED);
}
sendLEDStatus(status);
}