Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <LiquidCrystal.h>
- #include <IRremote.h>
- // Initialize the LCD (RS, EN, D4, D5, D6, D7)
- LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
- // Define pins for the ultrasonic sensor, buzzer, LED, and IR receiver
- const int trigPin = 2;
- const int echoPin = 3;
- const int buzzerPin = 6;
- const int ledPin = 5;
- const int irPin = 4; // IR receiver pin
- // Define variables
- long echoDuration;
- int distance;
- int averageDistance;
- const int thresholdDistance = 20; // Distance threshold for alarm
- const int MAX_VALID_DISTANCE = 400; // Maximum valid distance in cm
- bool alarmEnabled = true; // State of the alarm system
- // IR Remote variables
- IRrecv irReceiver(irPin);
- // Variables for manual tone generation
- unsigned long previousBuzzMicros = 0;
- const unsigned int buzzIntervalMicros = 500; // Half period in microseconds for 1 kHz tone
- bool buzzState = false;
- bool buzzerActive = false; // Tracks if the buzzer should be active
- // Variables for filtering sensor readings
- #define NUM_READINGS 5
- int readings[NUM_READINGS]; // Array to hold distance readings
- int readIndex = 0; // Index of the current reading
- int total = 0; // Total of the readings
- void setup() {
- // Pin modes
- pinMode(trigPin, OUTPUT);
- pinMode(echoPin, INPUT);
- pinMode(buzzerPin, OUTPUT);
- pinMode(ledPin, OUTPUT);
- // Initialize LCD
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("Fire Alarm Ready");
- // Initialize Serial Monitor
- Serial.begin(9600);
- // Initialize IR receiver
- IrReceiver.begin(irPin, ENABLE_LED_FEEDBACK); // Start the IR receiver
- // Initialize readings array
- for (int i = 0; i < NUM_READINGS; i++) {
- readings[i] = MAX_VALID_DISTANCE;
- total += readings[i];
- }
- }
- void loop() {
- // Handle IR remote input
- handleIRRemote();
- // Trigger the ultrasonic sensor
- digitalWrite(trigPin, LOW);
- delayMicroseconds(2);
- digitalWrite(trigPin, HIGH);
- delayMicroseconds(10);
- digitalWrite(trigPin, LOW);
- // Measure the duration of the echo pulse
- echoDuration = pulseIn(echoPin, HIGH, 30000); // Timeout after 30ms
- // Calculate the distance in cm
- if (echoDuration == 0 || echoDuration >= 30000) {
- // No echo received or timeout
- distance = MAX_VALID_DISTANCE;
- Serial.println("No echo received or timeout.");
- } else {
- distance = echoDuration * 0.034 / 2;
- Serial.print("Echo Duration: ");
- Serial.print(echoDuration);
- Serial.print(" us, Distance: ");
- Serial.print(distance);
- Serial.println(" cm");
- }
- // Filter the distance readings
- total = total - readings[readIndex]; // Subtract the oldest reading
- readings[readIndex] = distance; // Store the new reading
- total = total + readings[readIndex]; // Add the new reading to total
- readIndex = (readIndex + 1) % NUM_READINGS; // Advance index
- averageDistance = total / NUM_READINGS;
- Serial.print("Average Distance: ");
- Serial.println(averageDistance);
- unsigned long currentMillis = millis();
- unsigned long currentMicros = micros(); // For buzzer timing
- // Alarm logic
- if (alarmEnabled) {
- if (averageDistance > 0 && averageDistance < thresholdDistance) {
- digitalWrite(ledPin, HIGH); // Turn ON LED
- buzzerActive = true; // Activate the buzzer
- // Display alarm message
- lcd.setCursor(0, 1);
- lcd.print("Smoke Detected! ");
- } else {
- digitalWrite(ledPin, LOW); // Turn OFF LED
- buzzerActive = false; // Deactivate the buzzer
- digitalWrite(buzzerPin, LOW); // Ensure buzzer is OFF
- buzzState = false; // Reset buzz state
- // Clear LCD message if necessary
- lcd.setCursor(0, 1);
- lcd.print(" "); // Clear the row
- }
- } else {
- // If the alarm system is disabled
- digitalWrite(ledPin, LOW); // Ensure LED is OFF
- buzzerActive = false; // Deactivate the buzzer
- digitalWrite(buzzerPin, LOW); // Ensure buzzer is OFF
- buzzState = false; // Reset buzz state
- lcd.setCursor(0, 1);
- lcd.print("ALARM DISABLED "); // Display disabled message
- }
- // Manual buzzer control
- if (buzzerActive) {
- if (currentMicros - previousBuzzMicros >= buzzIntervalMicros) {
- previousBuzzMicros = currentMicros;
- buzzState = !buzzState;
- digitalWrite(buzzerPin, buzzState ? HIGH : LOW);
- }
- } else {
- digitalWrite(buzzerPin, LOW); // Ensure buzzer is OFF when not active
- }
- // No need for delay here
- }
- // Function to handle IR remote input
- void handleIRRemote() {
- // Check if an IR signal is available
- if (IrReceiver.decode()) {
- Serial.print("IR Code Received: ");
- Serial.print(IrReceiver.decodedIRData.command, HEX);
- Serial.print(" (HEX), ");
- Serial.print(IrReceiver.decodedIRData.command);
- Serial.println(" (DEC)");
- // Use the actual received code
- uint8_t receivedCommand = IrReceiver.decodedIRData.command;
- // Handle the command
- switch (receivedCommand) {
- case 0xA2: // Replace 0xA2 with the actual code from your remote
- alarmEnabled = !alarmEnabled; // Toggle alarm state
- // When alarm is toggled, reset alarm state
- digitalWrite(ledPin, LOW); // Turn OFF LED
- buzzerActive = false; // Deactivate the buzzer
- digitalWrite(buzzerPin, LOW); // Ensure buzzer is OFF
- buzzState = false; // Reset buzz state
- if (alarmEnabled) {
- lcd.setCursor(0, 0);
- lcd.print("Fire Alarm Ready");
- lcd.setCursor(0, 1);
- lcd.print(" "); // Clear any old messages
- Serial.println("Alarm Enabled");
- } else {
- lcd.setCursor(0, 0);
- lcd.print("Alarm is OFF ");
- lcd.setCursor(0, 1);
- lcd.print("ALARM DISABLED ");
- Serial.println("Alarm Disabled");
- }
- break;
- default:
- lcd.setCursor(0, 0);
- lcd.print("Unknown Command ");
- Serial.println("Unknown IR Command Received");
- break;
- }
- IrReceiver.resume(); // Prepare to receive the next signal
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement