#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "elmo_fire_frames.h" // Include the frame header
// OLED configuration
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Pin definitions
const int flameSensorPin = 18; // Flame sensor connected to GPIO 18
const int buzzerPin = 19; // Active buzzer connected to GPIO 19
// Debounce variables
unsigned long lastFireTime = 0;
const unsigned long fireConfirmTime = 300; // ms flame must persist
// Animation frames
const unsigned char* frames[] = {frame0, frame1, frame2, frame3};
const int frameCount = 4;
// Function to show fire animation
void showFireAnimation() {
for (int i = 0; i < frameCount; i++) {
display.clearDisplay();
display.drawBitmap(0, 0, frames[i], 128, 64, SSD1306_WHITE);
display.display();
delay(150); // Adjust speed of animation
}
}
void setup() {
Serial.begin(115200);
pinMode(flameSensorPin, INPUT);
pinMode(buzzerPin, OUTPUT);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("⚠️ OLED not detected"));
while (true); // Halt if OLED fails
}
// Show startup message
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Flame System Ready");
display.display();
delay(2000);
}
void loop() {
int flameReadings = 0;
const int samples = 10;
// Take multiple readings for stability
for (int i = 0; i < samples; i++) {
flameReadings += digitalRead(flameSensorPin);
delay(5);
}
int averageReading = flameReadings / samples;
bool flameDetected = (averageReading < 1); // Active LOW = flame
if (flameDetected) {
if (millis() - lastFireTime > fireConfirmTime) {
Serial.println("🔥 Flame Detected!");
digitalWrite(buzzerPin, HIGH);
// Show animated fire warning
showFireAnimation();
}
} else {
lastFireTime = millis(); // Reset debounce timer
Serial.println("✅ No Flame");
digitalWrite(buzzerPin, LOW);
// Show safe message
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 25);
display.println("No flame detected.");
display.display();
}
delay(100);
}