Budowa własnego systemu alarmowego na Arduino to doskonały projekt dla entuzjastów robotyki, elektroniki i automatyki domowej. Dzięki mikrokontrolerowi Arduino stworzysz prosty, ale skuteczny detektor ruchu z syreną, diodami LED i opcjami zdalnego sterowania – w pełni dopasowany do Twoich potrzeb.
Projekt jest skalowalny – od prostego alarmu po rozbudowaną centralę z klawiaturą, LCD, laserem i powiadomieniami GSM.
W tym przewodniku krok po kroku wyjaśniamy, jak złożyć podstawowy system na Arduino Uno lub ESP32, dodać zaawansowane funkcje jak powiadomienia SMS czy sterowanie BLE, oraz omawiamy przykładowy kod źródłowy.
Dlaczego warto zbudować alarm na Arduino?
Arduino to platforma open‑source, tania, elastyczna i łatwa w programowaniu. Oto najważniejsze powody, dla których warto:
- Niski koszt – start już poniżej 100 zł bez kompromisów w funkcjonalności;
- Pełna konfigurowalność – łatwo dodasz czujniki PIR, kontraktony drzwiowe, wiązkę laserową czy moduł GSM;
- Integracja z IoT – zdalne sterowanie przez Bluetooth Low Energy (BLE) lub SMS;
- Bezpieczeństwo danych – lokalne przetwarzanie bez konieczności użycia chmury.
Podstawowa wersja wykrywa ruch za pomocą czujnika PIR, uzbraja się po odliczeniu czasu i uruchamia syrenę. Wersja zaawansowana dodaje klawiaturę numeryczną, wyświetlacz LCD i powiadomienia SMS.
Potrzebne komponenty
Poniżej znajdziesz listy części dla dwóch wariantów: podstawowego (ESP32) i zaawansowanego (Arduino Uno):
Wariant podstawowy (ESP32 – ok. 50 zł)
Do uruchomienia najprostszej wersji przygotuj:
- ESP32 (np. ESP32‑S3 Dev Module) – mikrokontroler z Wi‑Fi/BLE;
- Czujnik PIR HC‑SR501 – detekcja ruchu;
- Syrena/buzzer 5 V – sygnał alarmu;
- Diody LED – czerwona (alarm) i zielona (rozbrojenie);
- Rezystory 220 Ω, przewody jumper, płytka stykowa;
- Zasilanie 5 V – USB lub bateria.
Wariant zaawansowany (Arduino Uno – ok. 150 zł)
Do rozbudowy systemu przygotuj:
- Arduino Uno lub Nano – kontroler główny;
- Czujnik PIR + kontrakton (magnes drzwiowy) – do ochrony stref;
- Wiązka laserowa (moduł laser + fotorezystor) – bariera optyczna;
- Klawiatura 4×4 i LCD 16×2 – obsługa i komunikaty;
- Moduł GSM (np. Neoway M590) – wysyłanie SMS;
- Syrena, diody LED, przekaźniki – sterowanie dodatkowymi urządzeniami;
- Silnik krokowy lub serwo – np. do automatyki bramy.
Schemat połączeń podstawowy (ESP32)
Podłącz piny według tej mapy połączeń:
RED_LED_PIN (16) → czerwona LED
GREEN_LED_PIN (15) → zielona LED
SIREN_PIN (5) → syrena
MOTION_PIN (13) → czujnik PIR (sygnał)
Pamiętaj o wspólnej masie oraz prawidłowym podłączeniu GND i VCC.
Przygotowanie środowiska programistycznego
Wykonaj krótką konfigurację przed wgraniem kodu:
- Pobierz i zainstaluj Arduino IDE z oficjalnej strony.
- Dla ESP32 włącz wsparcie: Narzędzia → Płytka → Menedżer płytek → wyszukaj i zainstaluj ESP32 Arduino, a następnie wybierz ESP32S3 Dev Module.
- Dla Arduino Uno wybierz płytkę Arduino Uno z listy.
Zainstaluj następujące biblioteki w Menedżerze bibliotek:
- NimBLE‑Arduino – obsługa BLE na ESP32;
- Keypad – sterowanie klawiaturą 4×4;
- LiquidCrystal – wyświetlanie komunikatów na LCD 16×2;
- SoftwareSerial – komunikacja z GSM tam, gdzie potrzebny jest dodatkowy UART.
Kod źródłowy – krok po kroku
Podstawowy kod dla ESP32 (detekcja ruchu + BLE)
Ten przykład uzbraja alarm po 10 sekundach, reaguje na sygnał z PIR i pozwala dodać zdalne sterowanie przez BLE:
// Definicje pinów
#define RED_LED_PIN 16 // czerwona dioda (alarm)
#define GREEN_LED_PIN 15 // zielona dioda (rozbrojenie)
#define MOTION_PIN 13 // PIR
#define SIREN_PIN 5 // syrena alarmowa
unsigned long now, armStart, lastTrigger = 0;
const unsigned long ARM_DELAY = 10000; // 10 sekund
bool sensor_armed = false, armingInProgress = false, motion = false;
void setup() {
Serial.begin(115200);
Serial.println("Starting Alarm!");
pinMode(RED_LED_PIN, OUTPUT);
digitalWrite(RED_LED_PIN, LOW);
pinMode(GREEN_LED_PIN, OUTPUT);
digitalWrite(GREEN_LED_PIN, LOW);
pinMode(SIREN_PIN, OUTPUT);
digitalWrite(SIREN_PIN, LOW);
pinMode(MOTION_PIN, INPUT);
}
void loop() {
now = millis();
int pirState = digitalRead(MOTION_PIN); // Odczyt PIR
if (sensor_armed && pirState == HIGH) {
if (!motion) {
Serial.println("MOTION DETECTED!!!");
}
motion = true;
digitalWrite(RED_LED_PIN, HIGH);
if (lastTrigger == 0) {
lastTrigger = now;
digitalWrite(SIREN_PIN, HIGH); // Uruchom syrenę
}
}
// Odliczanie do uzbrojenia (miganie czerwoną LED)
if (armingInProgress) {
if ((now / 250) % 2 == 0) {
digitalWrite(RED_LED_PIN, HIGH);
} else {
digitalWrite(RED_LED_PIN, LOW);
}
if (now - armStart >= ARM_DELAY) {
sensor_armed = true;
armingInProgress = false;
digitalWrite(RED_LED_PIN, LOW);
digitalWrite(GREEN_LED_PIN, LOW);
Serial.println("Alarm is now ARMED!");
}
}
// Dodaj tu obsługę BLE do uzbrajania/rozbrajania
}
Jak działa
Poniżej znajdziesz krótkie omówienie kluczowych bloków:
- setup() – inicjalizacja pinów, portu szeregowego i stanów początkowych;
- loop() – odczyt PIR, odliczanie do uzbrojenia (miganie LED), włączenie syreny po wykryciu ruchu;
- monitor szeregowy – uruchom przy 115200 baud, aby śledzić komunikaty z pracy systemu.
Zaawansowany kod dla Arduino Uno (klawiatura, LCD, GSM)
Ten szkic dodaje uzbrajanie hasłem („123456”), 10‑sekundowe opóźnienie, powiadomienia SMS oraz dwa typy alarmu (PIR i laser):
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <Password.h>
Password password1 = Password("123456"); // Kod PIR
Password password2 = Password("654321"); // Kod laser
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = { /* macierz klawiatury */ };
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int buzzer = 11, pirakt = 10, las = 12; // Piny
int odliczanie = 0, aktyw = 0;
void setup() {
pinMode(buzzer, OUTPUT);
digitalWrite(buzzer, HIGH); // Buzzer off
pinMode(pirakt, INPUT_PULLUP);
pinMode(las, INPUT_PULLUP);
// Inicjalizacja LCD i GSM
}
void loop() {
char key = keypad.getKey();
if (key) {
password1.append(key); // Sprawdź hasło
}
// Odliczanie 10s po PIR
if (odliczanie >= 10 && digitalRead(pirakt) == LOW && (aktyw == 1)) {
digitalWrite(buzzer, LOW); // Alarm!
// Wyślij SMS przez GSM
}
// Obsługa lasera: przerwanie → natychmiastowy alarm
}
Rozszerzenia
Aby dodać natychmiastowy alarm od wiązki laserowej, użyj warunku w pętli głównej: if (digitalRead(las) == LOW) { alarm(); }
Montaż i testowanie
Po złożeniu układu na płytce stykowej przeprowadź szybkie testy zgodnie z poniższą sekwencją:
- Połącz elementy na płytce stykowej zgodnie ze schematem.
- Wgraj kod przez Arduino IDE (Upload).
- Test działania – po uruchomieniu zielona LED = rozbrojony, miganie czerwonej = uzbrajanie, ruch z PIR = syrena.
- Kalibracja PIR – wyreguluj czułość i czas podtrzymania potencjometrami.
- Aplikacja mobilna – dla ESP32 użyj nRF Connect (BLE) do wysłania komend ARM/DISARM.
Uwaga: testuj w kontrolowanych warunkach – syrena jest głośna i może powodować dyskomfort.
Zaawansowane funkcje i ulepszenia
Gdy podstawy działają stabilnie, rozwiń projekt o poniższe możliwości:
- SMS powiadomienia – podłącz moduł GSM i wyślij alerty komendami AT+CMGS;
- Wiązka laserowa – laser na wyjściu, fotorezystor na wejściu; przerwanie wiązki = alarm;
- Sterowanie bramą – użyj przekaźnika i silnika, aktywowanego kodem lub SMS;
- LCD – prezentuj statusy jak „UZBROJONY” lub „ALARM!” dla czytelnej obsługi;
- Integracja z Home Assistant – komunikacja przez ESP32 Wi‑Fi;
- Bezpieczeństwo – włącz watchdog, hasła przechowuj w formie zaszyfrowanej.
Potencjalne problemy i rozwiązania
Poniższa tabela pomoże szybko zdiagnozować typowe usterki i wdrożyć poprawki:
| Problem | Przyczyna | Rozwiązanie |
|---|---|---|
| PIR wywołuje fałszywe alarmy | Zbyt wysoka czułość lub zakłócenia | Skalibruj potencjometry, dodaj opóźnienie programowe i filtr programowy. |
| ESP32 nie łączy przez BLE | Brak wymaganej biblioteki lub niewłaściwa płytka | Zainstaluj NimBLE‑Arduino i zweryfikuj wybór modułu w IDE. |
| GSM nie wysyła SMS | Błędny PIN karty SIM lub komendy AT | Odblokuj PIN i przetestuj zestaw komend AT w monitorze szeregowym. |
| Arduino resetuje się | Wahania zasilania lub spadki napięcia | Dodaj kondensator 100 µF na linii zasilania i sprawdź źródło 5 V. |