Sistem de alarmă cu senzor ultrasonic

02.01.2026

Acesta este un proiect practic, pe care îl poți folosi ca și sistem de alarmă. În imaginile de mai sus nu se poate observa circuitul, dar este același ca și în schițe. Singura diferență este că am folosit un Arduino nano. Când senzorul detectează prezența unui corp pe o rază de 80 cm începe să sune alarma. Mai are și un buton on/off. Îți poți da seama când sistemul este pornit după ledul roșu. Dacă este aprins atunci sistemul este pornit.

Componente necesare:

  • Placă Arduino Nano (merge și UNO sau altă placă compatibilă Arduino)

  • Senzor cu ultrasunete HC-SR04

  • Buzzer piezo

  • Buton (push-button)

  • LED (sau poți folosi LED-ul intern pe pinul 13, dar în codul de mai jos am folosit D8)

  • Rezistor 220Ω (doar dacă folosești LED extern)

  • Fire de legătură (jumper wires)

  • Breadboard (opțional, recomandat pentru teste și organizarea componentelor)

  • Conexiuni:

    1. Buzzer piezo

      • Pin pozitiv (+) → D2

      • Pin negativ (-) → GND

    2. Senzor HC-SR04

      • VCC → 5V

      • GND → GND

      • TRIG → D4

      • ECHO → D6

    3. Buton ON/OFF

      • Un pin → D9

      • Celălalt pin → GND

    4. LED

      • Anod (+) → D12

      • Catod (-) → GND prin rezistor 220Ω

    Cod:

    const int buzzerPin = 2;

    const int trigPin = 4;

    const int echoPin = 6;

    const int butonPin = 9;

    const int ledPin = 12;

    const long alarmDuration = 30000;

    const int detectionRange = 80;

    // FILTRARE – OPTIMIZAT

    const int samples = 3;

    const int confirmReads = 2;

    const int maxJump = 35;

    bool alarmOn = false;

    bool systemOn = true;

    unsigned long alarmStartTime = 0;

    unsigned long lastBeepTime = 0;

    bool buzzerState = false;

    const int beepOn = 400;

    const int beepOff = 300;

    int lastButtonState = HIGH;

    int detectCount = 0;

    long lastDistance = -1;

    // ================= DISTANȚĂ =================

    long readDistance() {

    digitalWrite(trigPin, LOW);

    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH);

    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);

    long duration = pulseIn(echoPin, HIGH, 25000);

    if (duration == 0) return -1;

    return duration * 0.034 / 2;

    }

    // ================= FILTRAT =================

    long readDistanceFiltered() {

    long sum = 0;

    int valid = 0;

    for (int i = 0; i < samples; i++) {

    long d = readDistance();

    if (d > 5 && d < 250) {

    sum += d;

    valid++;

    }

    delay(3);

    }

    if (valid == 0) return -1;

    return sum / valid;

    }

    void setup() {

    pinMode(buzzerPin, OUTPUT);

    pinMode(trigPin, OUTPUT);

    pinMode(echoPin, INPUT);

    pinMode(butonPin, INPUT_PULLUP);

    pinMode(ledPin, OUTPUT);

    digitalWrite(ledPin, HIGH);

    Serial.begin(9600);

    }

    void loop() {

    // ===== BUTON =====

    int reading = digitalRead(butonPin);

    if (reading == LOW && lastButtonState == HIGH) {

    systemOn = !systemOn;

    alarmOn = false;

    detectCount = 0;

    digitalWrite(buzzerPin, LOW);

    digitalWrite(ledPin, systemOn ? HIGH : LOW);

    delay(200);

    }

    lastButtonState = reading;

    if (!systemOn) return;

    // ===== CITIRE =====

    long dist = readDistanceFiltered();

    Serial.println(dist);

    if (dist < 0) {

    detectCount = 0;

    } else {

    if (lastDistance > 0 && abs(dist - lastDistance) > maxJump) {

    detectCount = 0;

    } else {

    if (dist <= detectionRange) {

    detectCount++;

    if (dist <= 40) detectCount++; // BOOST RAPID

    } else {

    detectCount = 0;

    }

    }

    lastDistance = dist;

    }

    // ===== PORNIRE ALARMĂ =====

    if (!alarmOn && detectCount >= confirmReads) {

    alarmOn = true;

    alarmStartTime = millis();

    buzzerState = true;

    digitalWrite(buzzerPin, HIGH);

    lastBeepTime = millis();

    }

    // ===== ALARMĂ =====

    if (alarmOn) {

    if (millis() - alarmStartTime >= alarmDuration) {

    alarmOn = false;

    digitalWrite(buzzerPin, LOW);

    } else {

    if (buzzerState && millis() - lastBeepTime >= beepOn) {

    buzzerState = false;

    digitalWrite(buzzerPin, LOW);

    lastBeepTime = millis();

    }

    else if (!buzzerState && millis() - lastBeepTime >= beepOff) {

    buzzerState = true;

    digitalWrite(buzzerPin, HIGH);

    lastBeepTime = millis();

    }

    }

    }

    }