IGNIS
FINAL PROGRAMMING
#include <Servo.h>
// Flame sensor pins
#define FLAME_CENTER A0
#define FLAME_LEFT A1
#define FLAME_RIGHT A2
// Motor control pins
#define LM_FORWARD 2
#define LM_BACKWARD 3
#define RM_FORWARD 4
#define RM_BACKWARD 5
// Servo and pump control pins
#define PUMP_PIN 6
#define SERVO_PIN 11
// Ultrasonic sensor pins
#define TRIG_PIN 8
#define ECHO_PIN 9
// Constants
const int SERVO_CENTER = 90;
const int SERVO_LEFT = 45;
const int SERVO_RIGHT = 135;
const int OBSTACLE_DISTANCE = 20; // cm
const int FLAME_THRESHOLD = 500; // Flame intensity threshold
Servo myservo;
bool isExtinguishing = false;
void setup() {
// Motor pins
pinMode(LM_FORWARD, OUTPUT);
pinMode(LM_BACKWARD, OUTPUT);
pinMode(RM_FORWARD, OUTPUT);
pinMode(RM_BACKWARD, OUTPUT);
// Flame sensor pins
pinMode(FLAME_CENTER, INPUT);
pinMode(FLAME_LEFT, INPUT);
pinMode(FLAME_RIGHT, INPUT);
// Other pins
pinMode(PUMP_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Initialize components
myservo.attach(SERVO_PIN);
myservo.write(SERVO_CENTER);
Serial.begin(9600);
Serial.println("Firefighting robot initialized and ready!");
}
void loop() {
1
IGNIS
if (isObstacleAhead()) {
handleObstacle();
return;
}
if (detectFlame()) {
extinguishFire();
} else {
moveForward();
}
}
// Flame detection
bool detectFlame() {
int center = analogRead(FLAME_CENTER);
int left = analogRead(FLAME_LEFT);
int right = analogRead(FLAME_RIGHT);
Serial.print("Flame Readings - Center: ");
Serial.print(center);
Serial.print(", Left: ");
Serial.print(left);
Serial.print(", Right: ");
Serial.println(right);
return (center < FLAME_THRESHOLD || left < FLAME_THRESHOLD || right <
FLAME_THRESHOLD);
}
// Extinguish fire with improvements
void extinguishFire() {
if (isExtinguishing) return;
isExtinguishing = true;
stopMovement();
Serial.println("Fire detected! Activating extinguisher...");
unsigned long pumpStartTime = millis(); // Track time for water dispensing
while (millis() - pumpStartTime < 5000) { // Keep spraying water for 5 seconds
digitalWrite(PUMP_PIN, HIGH);
// Sweeping motion for the servo
for (int angle = SERVO_LEFT; angle <= SERVO_RIGHT; angle += 5) {
myservo.write(angle);
delay(50); // Small delay for smooth movement
}
for (int angle = SERVO_RIGHT; angle >= SERVO_LEFT; angle -= 5) {
myservo.write(angle);
delay(50);
}
// Re-check flame during sweeping
if (!detectFlame()) break; // Stop if flame is extinguished
}
digitalWrite(PUMP_PIN, LOW);
myservo.write(SERVO_CENTER); // Reset servo to center position
Serial.println("Fire extinguished. Re-checking for flame...");
2
IGNIS
delay(2000); // Re-check flame after 2 seconds
if (detectFlame()) {
Serial.println("Flame reignited! Re-engaging extinguisher...");
extinguishFire();
}
isExtinguishing = false;
}
// Movement functions
void moveForward() {
setMotors(HIGH, LOW, HIGH, LOW);
}
void moveBackward() {
setMotors(LOW, HIGH, LOW, HIGH);
}
void turnLeft() {
setMotors(LOW, HIGH, HIGH, LOW);
}
void turnRight() {
setMotors(HIGH, LOW, LOW, HIGH);
}
void stopMovement() {
setMotors(LOW, LOW, LOW, LOW);
}
// Set motor states
void setMotors(int lmForward, int lmBackward, int rmForward, int rmBackward) {
digitalWrite(LM_FORWARD, lmForward);
digitalWrite(LM_BACKWARD, lmBackward);
digitalWrite(RM_FORWARD, rmForward);
digitalWrite(RM_BACKWARD, rmBackward);
}
// Obstacle detection
bool isObstacleAhead() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration * 0.034 / 2;
return distance < OBSTACLE_DISTANCE;
}
// Handle obstacles
void handleObstacle() {
stopMovement();
Serial.println("Obstacle detected. Navigating...");
turnLeft();
3
IGNIS
delay(700); // Turn left
if (isObstacleAhead()) {
turnRight();
delay(1400); // Turn right longer if left is blocked
}
moveForward();
}