Cirkit Designer LogoCirkit DesignerYour all-in-one circuit design IDE Launch Cirkit Designer App

Arduino UNO Fire Detection System with RTC and I2C LCD

View and Edit Project In Cirkit DesignerImage of Arduino UNO Fire Detection System with RTC and I2C LCD

Circuit Documentation

Summary

This circuit is designed for fire detection and response. It utilizes an Arduino UNO microcontroller to read data from a flame sensor and control a relay, which in turn controls a water pump. Additionally, the circuit includes an I2C LCD for displaying messages and a buzzer for audible alerts. The system also incorporates a DS1302 RTC module for timekeeping.

Component List

  1. Arduino UNO

    • Description: A microcontroller board based on the ATmega328P.
    • Pins: UNUSED, IOREF, Reset, 3.3V, 5V, GND, Vin, A0, A1, A2, A3, A4, A5, SCL, SDA, AREF, D13, D12, D11, D10, D9, D8, D7, D6, D5, D4, D3, D2, D1, D0
  2. 16x2 I2C LCD

    • Description: A 16x2 character LCD display with I2C interface.
    • Pins: GND, VCC, SDA, SCL
  3. 12V Single Channel Relay

    • Description: A relay module for switching high voltage devices.
    • Pins: NC, COM, NO, IN, GND, VCC
  4. Mini Diaphragm Water Pump

    • Description: A small water pump powered by 12V.
    • Pins: Positive (+), Negative (-)
  5. 12V 7Ah Battery

    • Description: A 12V lead-acid battery.
    • Pins: 12v +, 12v -
  6. KY-026 Flame Sensor

    • Description: A flame sensor module for detecting fire.
    • Pins: AO, GND, VCC, DO
  7. Buzzer

    • Description: A simple piezoelectric buzzer.
    • Pins: PIN, GND
  8. DS1302 RTC

    • Description: A real-time clock module for timekeeping.
    • Pins: VCC, GND, CLK, DATA, RST

Wiring Details

Arduino UNO

16x2 I2C LCD

12V Single Channel Relay

Mini Diaphragm Water Pump

12V 7Ah Battery

KY-026 Flame Sensor

Buzzer

DS1302 RTC

Code Documentation

#include <virtuabotixRTC.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Inisialisasi RTC pada pin 6, 7, dan 8 (sesuaikan jika berbeda)
virtuabotixRTC myRTC(6, 7, 8); // C D R

// Inisialisasi LCD I2C pada alamat 0x27 (sesuaikan jika berbeda) dan ukuran 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);

int flameSensorPin = A0; 
int buzzerPin = 9;      
int threshold = 950;     
int relay = 2;

void setup() {
  pinMode(flameSensorPin, INPUT);  // Atur flame sensor sebagai input
  pinMode(buzzerPin, OUTPUT);      // Atur buzzer sebagai output
  pinMode(relay, OUTPUT);          // Atur relay sebagai output
  Serial.begin(9600);              // Memulai komunikasi serial untuk debugging

  // Inisialisasi LCD
  lcd.init();          // Mengganti lcd.begin() dengan lcd.init()
  lcd.backlight();     // Menyalakan backlight LCD
  lcd.setCursor(0, 0);
  lcd.print("Fire Detection");

  delay(2000); // Tampilkan pesan awal selama 2 detik
  lcd.clear();

  // Tampilkan pesan untuk mengatur waktu RTC
  Serial.println("Masukkan waktu RTC (format: HH:MM:SS DD/MM/YYYY):");
}

void loop() {
  // Mengecek apakah ada input waktu baru yang diterima dari Serial Monitor
  if (Serial.available() > 0) {
    String inputTime = Serial.readString(); // Membaca input waktu dari serial
    setRTCTime(inputTime); // Set RTC time berdasarkan input
  }

  myRTC.updateTime(); // Update waktu dari RTC
  int sensorValue = analogRead(flameSensorPin); // Membaca nilai dari flame sensor

  if (sensorValue < threshold) {    // Jika nilai sensor lebih rendah dari threshold (terdeteksi api)
    digitalWrite(relay, HIGH);      // Aktifkan relay

    // Tampilkan waktu terdeteksi api di Serial Monitor
    Serial.print("Terdeteksi Api Pada Waktu : ");
    Serial.print(myRTC.dayofmonth); // Tanggal
    Serial.print("/");
    Serial.print(myRTC.month);      // Bulan
    Serial.print("/");
    Serial.print(myRTC.year);       // Tahun
    Serial.print(" ");
    Serial.print(myRTC.hours);      // Jam
    Serial.print(":");
    Serial.print(myRTC.minutes);    // Menit
    Serial.print(":");
    Serial.println(myRTC.seconds);  // Detik

    // Tampilkan pesan "Fire Detected" di LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Fire Detected!");
    lcd.setCursor(0, 1);
    lcd.print(myRTC.hours);
    lcd.print(":");
    lcd.print(myRTC.minutes);
    lcd.print(" ");
    lcd.print(myRTC.dayofmonth); // Tanggal
    lcd.print("/");
    lcd.print(myRTC.month);      // Bulan
    lcd.print("/");
    lcd.print(myRTC.year);       // Tahun

    
    while (analogRead(flameSensorPin) < threshold) { 
      digitalWrite(buzzerPin, HIGH); 
      delay(500);                    
      digitalWrite(buzzerPin, LOW);  
      delay(100);                    
    }

    digitalWrite(relay, LOW);        
  } else {
    digitalWrite(buzzerPin, LOW);   
    digitalWrite(relay, LOW);       

    // Tampilkan nilai sensor dan waktu standby di Serial Monitor
    Serial.print("Nilai Sensor: ");
    Serial.println(sensorValue);
    Serial.print("System Time: ");
    Serial.print(myRTC.dayofmonth); // Tanggal
    Serial.print("/");
    Serial.print(myRTC.month);      // Bulan
    Serial.print("/");
    Serial.print(myRTC.year);       // Tahun
    Serial.print(" ");
    Serial.print(myRTC.hours);      // Jam
    Serial.print(":");
    Serial.print(myRTC.minutes);    // Menit
    Serial.print(":");
    Serial.println(myRTC.seconds);  // Detik
    Serial.println("---------Standby---------"); 

    // Tampilkan waktu standby di LCD
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("System Standby");
    lcd.setCursor(0, 1);
    lcd.print(myRTC.hours);
    lcd.print(":");
    lcd.print(myRTC.minutes);
    lcd.print(" ");
    lcd.print(myRTC.dayofmonth); // Tanggal
    lcd.print("/");
    lcd.print(myRTC.month);      // Bulan
    lcd.print("/");
    lcd.print(myRTC.year);       // Tahun
  }

  delay(1000); // Jeda 1