#include <IRremote.hpp>
#include <DHTesp.h>
#include <HardwareSerial.h> // For GSM serial
#define DHT_PIN 15
#define IR_RECEIVE_PIN 23
#define SMOKE_PIN 34
#define METHANE_PIN 35
#define CO_PIN 32
#define LDR_PIN 36
#define BUTTON_PIN 5
// GSM module pins
#define GSM_TX 17
#define GSM_RX 16
HardwareSerial GSM_serial(2); // UART2 for GSM
DHTesp dhtSensor;
enum HazardLevel { SAFE, ALERT };
HazardLevel currentHazard = SAFE;
volatile bool isAlarmMuted = false;
const int SMOKE_THRESHOLD = 1500;
const int METHANE_THRESHOLD = 1800;
const int CO_THRESHOLD = 1600;
unsigned long previousSensorReadMillis = 0;
const long sensorReadInterval = 2000;
unsigned long lastButtonPressMillis = 0;
const long debounceDelay = 50;
void setup() {
Serial.begin(115200);
// DHT sensor
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
// IR Receiver
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
// Pins
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(SMOKE_PIN, INPUT);
pinMode(METHANE_PIN, INPUT);
pinMode(CO_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
// GSM setup
GSM_serial.begin(115200, SERIAL_8N1, GSM_RX, GSM_TX);
delay(1000);
Serial.println("GSM Serial initialized");
}
void loop() {
unsigned long currentMillis = millis();
handleButton();
handleIR();
handleGSMResponse();
if (currentMillis - previousSensorReadMillis >= sensorReadInterval) {
previousSensorReadMillis = currentMillis;
TempAndHumidity data = dhtSensor.getTempAndHumidity();
float humidity = data.humidity;
float temperature = data.temperature;
int smokeVal = analogRead(SMOKE_PIN);
int methaneVal = analogRead(METHANE_PIN);
int coVal = analogRead(CO_PIN);
int ldrVal = analogRead(LDR_PIN);
currentHazard = (smokeVal > SMOKE_THRESHOLD || methaneVal > METHANE_THRESHOLD || coVal > CO_THRESHOLD) ? ALERT : SAFE;
printStatus(temperature, humidity, smokeVal, methaneVal, coVal, ldrVal);
triggerAlarm();
}
}
void handleButton() {
if (millis() - lastButtonPressMillis > debounceDelay) {
if (digitalRead(BUTTON_PIN) == LOW) {
toggleMute();
lastButtonPressMillis = millis();
}
}
}
void handleIR() {
if (IrReceiver.decode()) {
Serial.print("IR Code Received: 0x");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
toggleMute();
IrReceiver.resume();
}
}
void handleGSMResponse() {
while (GSM_serial.available()) {
Serial.write(GSM_serial.read());
}
}
void toggleMute() {
isAlarmMuted = !isAlarmMuted;
Serial.println(isAlarmMuted ? ">>>> ALARM MUTED <<<<" : ">>>> ALARM UNMUTED <<<<");
}
void triggerAlarm() {
if (currentHazard == ALERT && !isAlarmMuted) {
Serial.println("!!! HAZARD DETECTED - ALARM ACTIVE !!!");
sendSMS("ShieldSense Alert: Hazard Detected!", "+911234567890"); // Replace with your number
}
}
void sendSMS(const String &message, const String &number) {
Serial.println("Sending SMS...");
GSM_serial.println("AT+CMGF=1"); // Text mode
delay(500);
GSM_serial.println("AT+CMGS=\"" + number + "\"");
delay(500);
GSM_serial.print(message);
GSM_serial.write(26); // Ctrl+Z
delay(3000);
Serial.println("SMS: " + message);
Serial.println("SMS sent.");
}
void printStatus(float temp, float hum, int smoke, int methane, int co, int ldr) {
Serial.print("Temp: "); Serial.print(temp, 1); Serial.print("°C | ");
Serial.print("Hum: "); Serial.print(hum, 1); Serial.print("% | ");
Serial.print("Smoke: "); Serial.print(smoke); Serial.print(" | ");
Serial.print("Methane: "); Serial.print(methane); Serial.print(" | ");
Serial.print("CO: "); Serial.print(co); Serial.print(" | ");
Serial.print("LDR: "); Serial.print(ldr);
Serial.print(currentHazard == ALERT ? " -> [ALERT]" : " -> [SAFE]");
Serial.println();
}