Robot Pemadam Api - Arduino Project

Project 1

Diagram Sistem & Alur Kerja

Diagram Wiring Fire-Fighting Robot

Robot ini menggunakan tiga sensor api (kiri, tengah, kanan) untuk mendeteksi lokasi api. Saat api terdeteksi, robot bergerak mendekati api dan menyiramkan air melalui pompa mini serta servo yang menggerakkan selang ke kiri-kanan.

A. Daftar Bahan yang Dibutuhkan

NoNama BarangJumlah
1Arduino Uno R31
2Buzzer Aktif 5 Volt1
3Pompa Air Mini 5V1
4LCD OLED 0.96 Inch1
5Sensor Api3
6Roda Motor DC2
7Kabel Jumper Male to Male10
8Kabel Jumper Male to Female10
9Kabel Jumper Female to Female10
10Breadboard 400 Lubang1
11Servo MG90S1
12Baterai 186503
13Tempat Baterai 18650 (isi 2)1
14Tempat Baterai 18650 (isi 1)1
15Sakelar Kecil 2 Pin1
161 Channel Relay Module 5V1
17Chasis Mobil 4WD1
18Selang 5 mm5 meter
19Expansion Shield / Board Arduino Nano R31
20LED RGB Arduino3
21Adaptor 9V 2A Port Arduino1
Catatan: Roda Motor DC dibeli 2 karena sudah ada 2 unit sebelumnya. Driver motor L298N tidak dibeli karena masih tersedia. Chasis mobil bersifat opsional karena sudah memiliki versi 2WD, namun direncanakan upgrade ke 4WD dengan rangka yang lebih besar.

B. Estimasi Harga Semua Barang

NoBarangHarga SatuanQtySubtotal (Rp)
1Arduino Uno R3110.0001110.000
2Buzzer Aktif 5V6.00016.000
3Pompa Air Mini 5V10.000110.000
4LCD OLED 0.96"26.500126.500
5Sensor Api5.400316.200
6Roda Motor DC16.000232.000
7Kabel Jumper M-M8.00018.000
8Kabel Jumper M-F8.00018.000
9Kabel Jumper F-F8.00018.000
10Breadboard 400 lubang6.36016.360
11Servo MG90S28.750128.750
12Baterai 1865015.000345.000
13Tempat baterai (2 slot)8.05018.050
14Tempat baterai (1 slot)5.00015.000
15Sakelar kecil 2 pin1.30011.300
16Relay 1 ch 5V5.51215.512
17Chasis Mobil 4WD95.000195.000
18Selang 5mm3.000515.000
19Expansion Shield Nano30.000130.000
20LED RGB5.000315.000
21Adaptor 9V 2A30.400130.400
TOTAL ESTIMASIRp 520.872

C. Kode Program Arduino

Salin kode berikut ke IDE Arduino dan pastikan library Servo.h sudah tersedia.

#include <Servo.h>

// Define flame sensor pins
#define FLAME_SENSOR_LEFT A0
#define FLAME_SENSOR_CENTER A1
#define FLAME_SENSOR_RIGHT A2

// Define motor driver pins
#define MOTOR_L1 5  // Left Motor Forward
#define MOTOR_L2 6  // Left Motor Backward
#define MOTOR_R1 9  // Right Motor Forward
#define MOTOR_R2 10 // Right Motor Backward

// Define relay for water pump
#define RELAY_PIN 7

// Define servo motor pin
#define SERVO_PIN 3

// Create Servo object
Servo waterServo;

// Flame sensor threshold
#define FIRE_DETECTED_THRESHOLD 800  // Adjust based on sensor readings

void setup() {
    // Initialize Serial Monitor
    Serial.begin(9600);

    // Set motor pins as output
    pinMode(MOTOR_L1, OUTPUT);
    pinMode(MOTOR_L2, OUTPUT);
    pinMode(MOTOR_R1, OUTPUT);
    pinMode(MOTOR_R2, OUTPUT);

    // Set relay as output
    pinMode(RELAY_PIN, OUTPUT);
    digitalWrite(RELAY_PIN, LOW);  // Ensure relay (pump) is OFF at startup

    // Initialize servo motor
    waterServo.attach(SERVO_PIN);
    waterServo.write(90); // Set initial servo position to center

    // Set flame sensor pins as input
    pinMode(FLAME_SENSOR_LEFT, INPUT);
    pinMode(FLAME_SENSOR_CENTER, INPUT);
    pinMode(FLAME_SENSOR_RIGHT, INPUT);

    Serial.println("🚀 Fire Fighting Robot Initialized...");
}

void loop() {
    // Read flame sensor values
    int flameLeft = analogRead(FLAME_SENSOR_LEFT);
    int flameCenter = analogRead(FLAME_SENSOR_CENTER);
    int flameRight = analogRead(FLAME_SENSOR_RIGHT);

    // Print sensor values to Serial Monitor
    Serial.print("Flame Left: ");
    Serial.print(flameLeft);
    Serial.print(" | Flame Center: ");
    Serial.print(flameCenter);
    Serial.print(" | Flame Right: ");
    Serial.println(flameRight);

    // Check flame detection
    if (flameCenter < FIRE_DETECTED_THRESHOLD) {
        Serial.println("🔥 Fire Detected at Center! Moving Forward...");
        moveForward();
        activateWaterPump();
    }
    else if (flameLeft < FIRE_DETECTED_THRESHOLD) {
        Serial.println("🔥 Fire Detected at Left! Turning Left...");
        turnLeft();
        activateWaterPump();
    }
    else if (flameRight < FIRE_DETECTED_THRESHOLD) {
        Serial.println("🔥 Fire Detected at Right! Turning Right...");
        turnRight();
        activateWaterPump();
    }
    else {
        Serial.println("✅ No Fire Detected. Stopping...");
        stopMotors();
        deactivateWaterPump();  // Ensure pump is OFF when no fire is detected
    }

    delay(500); // Delay for stability
}

// Function to move forward
void moveForward() {
    digitalWrite(MOTOR_L1, HIGH);
    digitalWrite(MOTOR_L2, LOW);
    digitalWrite(MOTOR_R1, HIGH);
    digitalWrite(MOTOR_R2, LOW);
}

// Function to turn left
void turnLeft() {
    digitalWrite(MOTOR_L1, LOW);
    digitalWrite(MOTOR_L2, HIGH);
    digitalWrite(MOTOR_R1, HIGH);
    digitalWrite(MOTOR_R2, LOW);
    delay(500);  // Adjust timing
    stopMotors();
}

// Function to turn right
void turnRight() {
    digitalWrite(MOTOR_L1, HIGH);
    digitalWrite(MOTOR_L2, LOW);
    digitalWrite(MOTOR_R1, LOW);
    digitalWrite(MOTOR_R2, HIGH);
    delay(500);  // Adjust timing
    stopMotors();
}

// Function to stop motors
void stopMotors() {
    digitalWrite(MOTOR_L1, LOW);
    digitalWrite(MOTOR_L2, LOW);
    digitalWrite(MOTOR_R1, LOW);
    digitalWrite(MOTOR_R2, LOW);
}

// Function to activate water pump and move servo
void activateWaterPump() {
    Serial.println("🚰 Activating Water Pump...");
    digitalWrite(RELAY_PIN, HIGH);  // Turn ON the water pump

    // Move the servo from left to right
    for (int pos = 60; pos <= 120; pos += 5) {  
        waterServo.write(pos);
        delay(100);
    }

    // Move the servo from right to left
    for (int pos = 120; pos >= 60; pos -= 5) {  
        waterServo.write(pos);
        delay(100);
    }

    delay(2000);  // Pump stays on for 2 seconds
    deactivateWaterPump();  // Turn off the water pump
}

// Function to deactivate water pump
void deactivateWaterPump() {
    Serial.println("✅ Deactivating Water Pump...");
    digitalWrite(RELAY_PIN, LOW);  // Turn OFF the water pump
    waterServo.write(90);  // Reset servo to center position
}