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

Arduino Nano-Based Motion-Activated Alarm with PIR Sensor and Buzzer

View and Edit Project In Cirkit DesignerImage of Arduino Nano-Based Motion-Activated Alarm with PIR Sensor and Buzzer

Circuit Documentation

Summary

This circuit is designed to interface an Arduino Nano with a variety of components including a buzzer, PIR sensor, Li-ion battery, power converter, battery charger module, rocker switch, relays, MQ-3 gas sensor, ignition switch, and a hobby gearmotor. The Arduino Nano acts as the central processing unit, controlling the relay and buzzer based on input from the PIR sensor and the MQ-3 gas sensor. The circuit is powered by a Li-ion battery, which is managed by a charger module and a step-up boost power converter to ensure the correct voltage is supplied to the components. A rocker switch is used to control the power flow in the circuit.

Component List

Wiring Details

Arduino Nano

Buzzer

PIR Sensor

Li-ion Battery (18650-2000mAh 3.7V 7.4WH)

Step Up Boost Power Converter (Adjustable Voltage Regulator)

Lipo Battery Charger Module

Rocker Switch

5V Relay

MQ-3 Breakout

Ignition Switch

Hobby Gearmotor (48:1 Gearbox)

Documented Code

#define Relay 13
#define buzzer A0
static const int sensorPin = 10;                    // sensor input pin 
int SensorStatePrevious = LOW;                      // previous state of the sensor

unsigned long minSensorDuration = 3000; // Time we wait before the sensor active as long 
unsigned long minSensorDuration2 = 6000;
unsigned long SensorLongMillis;                // Time in ms when the sensor was active
bool SensorStateLongTime = false;                  // True if it is a long active

const int intervalSensor = 50;                      // Time between two readings sensor state
unsigned long previousSensorMillis;                 // Timestamp of the latest reading

unsigned long SensorOutDuration;                  // Time the sensor is active in ms

//// GENERAL ////

unsigned long currentMillis;          // Variable to store the number of milliseconds since the Arduino has started

void setup() {
  Serial.begin(9600);                 // Initialise the serial monitor

  pinMode(sensorPin, INPUT);          // set sensorPin as input
  Serial.println("Press button");
  pinMode(Relay,OUTPUT);
  pinMode(buzzer,OUTPUT);
}

// Function for reading the sensor state
void readSensorState() {

  // If the difference in time between the previous reading is larger than intervalSensor
  if(currentMillis - previousSensorMillis > intervalSensor) {
    
    // Read the digital value of the sensor (LOW/HIGH)
    int SensorState = digitalRead(sensorPin);    

    // If the button has been active AND
    // If the sensor wasn't activated before AND
    // IF there was not already a measurement running to determine how long the sensor has been activated
    if (SensorState == LOW && SensorStatePrevious == HIGH && !SensorStateLongTime) {
     SensorLongMillis = currentMillis;
       SensorStatePrevious = LOW;
      
      Serial.println("Button pressed");
    }

    // Calculate how long the sensor has been activated
   SensorOutDuration = currentMillis - SensorLongMillis;

    // If the button is active AND
    // If there is no measurement running to determine how long the sensor is active AND
    // If the time the sensor has been activated is larger or equal to the time needed for a long active
    if (SensorState == LOW && !SensorStateLongTime && SensorOutDuration >= minSensorDuration) {
      SensorStateLongTime = true;
      digitalWrite(Relay,HIGH);
      Serial.println("Button long pressed");
    }
    if (SensorState == LOW && SensorStateLongTime && SensorOutDuration >= minSensorDuration2) {
     SensorStateLongTime = true;
      digitalWrite(buzzer,HIGH);
      delay(1000);
      Serial.println("Button long pressed");
    }
      
    // If the sensor is released AND
    // If the sensor was activated before
    if (SensorState == HIGH && SensorStatePrevious == LOW) {
      SensorStatePrevious = HIGH;
      SensorStateLongTime = false;
      digitalWrite(Relay,LOW);
      digitalWrite(buzzer,LOW);
      Serial.println("Button released");
  
    }
    
    // store the current timestamp in previousSensorMillis
   previousSensorMillis = currentMillis;

  }

}

void loop() {

  currentMillis = millis();    // store the current time
  readSensorState();           // read the sensor state
  
}

This code is designed to run on the Arduino Nano and controls a relay and a buzzer based on the input from a PIR sensor. The code defines the pin connections, sets up the serial communication, and initializes the pins. It includes a function readSensorState() that checks the state of the PIR sensor and activates the relay and buzzer accordingly. The loop() function continuously updates the current time and calls readSensorState() to process the sensor input.