#include <Wire.h> // For I2C communication
#include <LiquidCrystal_I2C.h> // For I2C LCD
#include <OneWire.h> // For DS18B20
#include <DallasTemperature.h> // For DS18B20
// Pin configuration
#define TEMP_PIN 15 // GPIO15 for DS18B20
#define SMOKE_PIN 4 // GPIO4 for MQ-135 Analog Output
#define LED_PIN 2 // GPIO2 for onboard LED
#define BUZZER_PIN 5 // GPIO5 for buzzer
#define RELAY_PIN 16 // GPIO16 for relay controlling external LED
// Thresholds
#define TEMP_THRESHOLD 60 // Temperature threshold in °C
#define SMOKE_THRESHOLD 512 // Smoke level threshold (mapped value)
// Initialize DS18B20
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
// Initialize I2C LCD (address: 0x27, 16x2 display)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(115200);
sensors.begin(); // Initialize DS18B20 sensor
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(SMOKE_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT); // Initialize relay pin
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_PIN, HIGH); // Relay off initially (assuming active-low relay)
// Initialize LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("System Init...");
delay(2000);
lcd.clear();
Serial.println("System Initialized");
}
void displayOnLCD(float temp, int mappedPPM, bool tempAlert, bool smokeAlert, bool buzzerActive) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Smoke: ");
lcd.print(mappedPPM);
// Display alerts
if (tempAlert) {
lcd.setCursor(0, 1);
lcd.print("ALERT: Temp High!");
} else if (smokeAlert) {
lcd.setCursor(0, 1);
lcd.print("ALERT: Smoke High!");
}
// Display buzzer status
if (buzzerActive) {
lcd.setCursor(0, 1);
lcd.print("Buzzer ON");
}
}
void soundBuzzer() {
digitalWrite(BUZZER_PIN, HIGH);
delay(500);
digitalWrite(BUZZER_PIN, LOW);
delay(500);
}
void loop() {
// Read temperature from DS18B20
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
if (temp == DEVICE_DISCONNECTED_C) {
Serial.println("Failed to read temperature from DS18B20");
delay(2000);
return;
}
// Read smoke sensor value
int rawPPMValue = analogRead(SMOKE_PIN);
int mappedPPMValue = rawPPMValue / 4.095; // Map ADC value to 0-1000 scale for PPM
// Check thresholds
bool tempAlert = temp > TEMP_THRESHOLD;
bool smokeAlert = mappedPPMValue > SMOKE_THRESHOLD;
// Print values to Serial Monitor
Serial.print("Temperature: ");
Serial.print(temp);
Serial.println(" °C");
Serial.print("Mapped PPM: ");
Serial.println(mappedPPMValue);
bool buzzerActive = false;
// Handle alerts for high temperature or high smoke level
if (tempAlert || smokeAlert) {
digitalWrite(LED_PIN, HIGH); // Turn on onboard LED
digitalWrite(RELAY_PIN, LOW); // Turn off external LED (disconnect from battery)
soundBuzzer(); // Activate buzzer
buzzerActive = true; // Indicate buzzer is active
displayOnLCD(temp, mappedPPMValue, tempAlert, smokeAlert, buzzerActive);
if (tempAlert) Serial.println("ALERT: High Temperature!");
if (smokeAlert) Serial.println("ALERT: High Smoke Level!");
} else {
digitalWrite(LED_PIN, LOW); // Turn off onboard LED
digitalWrite(RELAY_PIN, HIGH); // Turn ON external LED (connect to battery)
displayOnLCD(temp, mappedPPMValue, false, false, buzzerActive);
}
delay(2000); // Delay for next reading
}