#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <stdbool.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
#define LED_PIN 3
#define BUZZER_PIN 4
#define BUTTON_PIN 5
// Create OneWire instance
OneWire oneWire(ONE_WIRE_BUS);
// Pass oneWire reference to DallasTemperature library
DallasTemperature sensors(&oneWire);
// Initialize the LCD library with the I2C address and dimensions
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Define temperature thresholds
#define TEMP_THRESHOLD 50.0 // Example threshold temperature in Celsius
// Structure to hold the fire alarm state
struct FireAlarm {
bool isHighTemp;
bool alarmActive;
};
// Function prototypes
void initializeSystem(struct FireAlarm *alarm);
void checkTemperature(struct FireAlarm *alarm);
void updateDisplay(struct FireAlarm *alarm);
void handleAlarm(struct FireAlarm *alarm);
void setup() {
// Initialize components
struct FireAlarm alarm;
initializeSystem(&alarm);
}
void loop() {
static struct FireAlarm alarm;
// Check temperature
checkTemperature(&alarm);
// Update display and alarm status
updateDisplay(&alarm);
handleAlarm(&alarm);
// Add a small delay to avoid rapid looping
delay(2000);
}
void initializeSystem(struct FireAlarm *alarm) {
// Start serial communication for debugging
Serial.begin(9600);
// Initialize the temperature sensor
sensors.begin();
// Set pin modes
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Initialize LCD
lcd.init();
lcd.backlight();
// Initialize alarm state
alarm->isHighTemp = false;
alarm->alarmActive = false;
}
void checkTemperature(struct FireAlarm *alarm) {
// Request temperature measurement
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
// Print temperature for debugging
Serial.print("Current temperature: ");
Serial.print(tempC);
Serial.println(" C");
// Check if temperature exceeds threshold
if (tempC >= TEMP_THRESHOLD) {
alarm->isHighTemp = true;
alarm->alarmActive = true;
} else {
alarm->isHighTemp = false;
}
}
void updateDisplay(struct FireAlarm *alarm) {
lcd.clear();
if (alarm->isHighTemp) {
lcd.print("Fire, danger");
} else {
lcd.print("No fire, safe");
}
}
void handleAlarm(struct FireAlarm *alarm) {
if (alarm->alarmActive==false) {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
tone(BUZZER_PIN, -500);
} else {
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
tone(BUZZER_PIN, 1);
}
// Check if the button is pressed to reset the alarm
if (digitalRead(BUTTON_PIN) == HIGH) {
alarm->alarmActive = false;
}
}