#include <DHT.h>
#include <Servo.h>
// ---------------- PIN DEFINITIONS ----------------
#define MQ2_PIN A0
#define DHT_PIN 2
#define DHT_TYPE DHT22
#define TRIG_PIN 3
#define ECHO_PIN 4
#define BUZZER_PIN 5
#define LED_PIN 6
#define SERVO_PIN 9
#define STEP_PIN 10
#define DIR_PIN 11
#define ENABLE_PIN 12
// ---------------- SETTINGS ----------------
#define GAS_THRESHOLD 400
#define DISTANCE_THRESHOLD 15 // cm
#define TEMP_THRESHOLD 50 // Celsius
DHT dht(DHT_PIN, DHT_TYPE);
Servo myServo;
// Stepper settings
int stepDelay = 1000; // microseconds
int stepperSteps = 200; // one revolution for a 1.8-degree motor
// ------------------------------------------------
void setup() {
Serial.begin(9600);
// Sensors
dht.begin();
// Ultrasonic
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Outputs
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
// Stepper driver
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(ENABLE_PIN, OUTPUT);
// Enable A4988
digitalWrite(ENABLE_PIN, LOW);
// Servo
myServo.attach(SERVO_PIN);
myServo.write(0);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(LED_PIN, LOW);
Serial.println("System Started");
}
// ------------------------------------------------
void loop() {
// ---------- MQ2 GAS SENSOR ----------
int gasValue = analogRead(MQ2_PIN);
// ---------- DHT22 ----------
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// ---------- ULTRASONIC ----------
long duration;
float distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH, 30000);
if (duration == 0) {
distance = 999;
} else {
distance = duration * 0.0343 / 2;
}
// ---------- SERIAL MONITOR ----------
Serial.println("-------------------------");
Serial.print("MQ2 Gas Value: ");
Serial.println(gasValue);
if (!isnan(temperature)) {
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" C");
} else {
Serial.println("DHT22 temperature error");
}
if (!isnan(humidity)) {
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
} else {
Serial.println("DHT22 humidity error");
}
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// =================================================
// GAS / SMOKE DETECTION
// =================================================
if (gasValue > GAS_THRESHOLD) {
Serial.println("!!! GAS/SMOKE DETECTED !!!");
// Turn ON LED
digitalWrite(LED_PIN, HIGH);
// Buzzer ON
digitalWrite(BUZZER_PIN, HIGH);
// Move servo to safety position
myServo.write(90);
// Stop for a short time
delay(500);
}
else {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Normal servo position
myServo.write(0);
}
// =================================================
// HIGH TEMPERATURE
// =================================================
if (!isnan(temperature) && temperature > TEMP_THRESHOLD) {
Serial.println("!!! HIGH TEMPERATURE !!!");
digitalWrite(LED_PIN, HIGH);
// Beep buzzer
tone(BUZZER_PIN, 2000);
delay(200);
noTone(BUZZER_PIN);
}
// =================================================
// ULTRASONIC OBJECT DETECTION
// =================================================
if (distance < DISTANCE_THRESHOLD) {
Serial.println("Object detected nearby");
// Turn LED ON
digitalWrite(LED_PIN, HIGH);
// Rotate stepper clockwise
digitalWrite(DIR_PIN, HIGH);
rotateStepper(stepperSteps);
}
delay(1000);
}
// =================================================
// STEPPER MOTOR FUNCTION
// =================================================
void rotateStepper(int steps) {
for (int i = 0; i < steps; i++) {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(stepDelay);
}
}