#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU6050.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT22
#define CURRENTPIN 34
#define GASPIN 35
#define LED_PIN 14
#define LCD_BLINK_INTERVAL 500 // milliseconds
unsigned long lastReadingTime = 0;
const unsigned long readingInterval = 5000; // 5 seconds
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD 20x4
MPU6050 mpu;
DHT dht(DHTPIN, DHTTYPE);
// Thresholds
float vibrationThreshold = 20000.0;
float tempThreshold = 60.0;
float currentThreshold = 2.5;
float gasBaseline = 0.0;
float gasThresholdPPM = 0.0;
float humidityThreshold = 80.0;
bool isAlertActive = false;
bool lcdVisible = true;
unsigned long lastBlinkTime = 0;
void setup() {
Serial.begin(9600);
Wire.begin();
dht.begin();
mpu.initialize();
lcd.init();
lcd.backlight();
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
if (!mpu.testConnection()) {
Serial.println("MPU6050 connection failed");
while (1);
}
lcd.setCursor(0, 0);
lcd.print("SIHMS Booting...");
delay(2000);
lcd.clear();
Serial.println("Warming up MQ-2 sensor...");
delay(5000);
calibrateGasSensor();
gasThresholdPPM = gasBaseline + 200.0;
Serial.println("Gas sensor calibrated.");
Serial.println("Baseline: " + String(gasBaseline));
Serial.println("Threshold: " + String(gasThresholdPPM));
}
void loop() {
// --- Sensor Readings ---
unsigned long now = millis();
// Check if it's time for the next reading
if (now - lastReadingTime >= readingInterval) {
lastReadingTime = now;
// --- Sensor Readings ---
int16_t ax, ay, az;
mpu.getAcceleration(&ax, &ay, &az);
float vibration = sqrt(ax * ax + ay * ay + az * az);
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("DHT22 read failed");
return;
}
int currentRaw = analogRead(CURRENTPIN);
float currentVoltage = currentRaw * (3.3 / 4095.0);
float current = (currentVoltage - 1.65) / 0.185;
int gasRaw = analogRead(GASPIN);
float gasVoltage = gasRaw * (3.3 / 4095.0);
float gasPPM = gasVoltage * 1000;
Serial.println("==== Sensor Readings ====");
Serial.print("Temperature: "); Serial.print(temperature); Serial.println(" °C");
Serial.print("Humidity: "); Serial.print(humidity); Serial.println(" %");
Serial.print("Current: "); Serial.print(current); Serial.println(" A");
Serial.print("Vibration: "); Serial.println(vibration);
Serial.print("Gas Emission: "); Serial.print(gasPPM); Serial.println(" ppm");
Serial.println();
// --- Alert Logic ---
String alertMessage = "";
String alertValue = "";
bool alertTriggered = false;
if (temperature > tempThreshold) {
alertMessage = "Overheat!";
alertValue = "Temp: " + String(temperature) + " C";
alertTriggered = true;
Serial.println("Overheat Alert!");
} else if (current > currentThreshold) {
alertMessage = "Current Spike!";
alertValue = "Curr: " + String(current) + " A";
alertTriggered = true;
Serial.println("Current Spike Alert!");
} else if (vibration > vibrationThreshold) {
alertMessage = "Vibrations High!";
alertValue = "Vib: " + String(vibration);
alertTriggered = true;
Serial.println("Vibration Alert!");
} else if (gasPPM > gasThresholdPPM) {
alertMessage = "Gas Emission High!";
alertValue = "PPM: " + String(gasPPM);
alertTriggered = true;
Serial.println("Gas Alert Triggered!");
} else if (humidity > humidityThreshold) {
alertMessage = "Humidity High!";
alertValue = "Hum: " + String(humidity) + "%";
alertTriggered = true;
Serial.println("Humidity High!");
}
// --- If Alert Active ---
if (alertTriggered) {
isAlertActive = true;
digitalWrite(LED_PIN, HIGH);
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0); lcd.print("ALERT TRIGGERED");
lcd.setCursor(0, 1); lcd.print(alertMessage);
lcd.setCursor(0, 2); lcd.print(alertValue);
lcd.setCursor(0, 3); lcd.print("Take precautions");
}
// --- No Alert: Normal Display ---
else {
if (isAlertActive) {
isAlertActive = false;
lcd.backlight(); // Ensure LCD is on
lcd.clear();
digitalWrite(LED_PIN, LOW); // Turn off LED
}
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("Vib: ");
lcd.print(vibration);
lcd.setCursor(0, 2);
lcd.print("Curr: ");
lcd.print(current);
lcd.print("A ");
lcd.setCursor(0, 3);
lcd.print("Gas: ");
lcd.print(gasPPM);
lcd.print("ppm");
}
}
// --- LCD Blinking (if alert is active) ---
if (isAlertActive) {
if (now - lastBlinkTime >= LCD_BLINK_INTERVAL) {
lastBlinkTime = now;
lcdVisible = !lcdVisible;
if (lcdVisible) {
lcd.backlight();
} else {
lcd.noBacklight();
}
}
}
}
void calibrateGasSensor() {
int samples = 50;
long total = 0;
Serial.println("Calibrating gas sensor...");
for (int i = 0; i < samples; i++) {
int reading = analogRead(GASPIN);
total += reading;
delay(100);
}
float avgRaw = total / samples;
float avgVoltage = avgRaw * (3.3 / 4095.0);
gasBaseline = avgVoltage * 1000;
}