Arduinoセキュリティ&アラームシステムの自作:ステップバイステップチュートリアル
概要
Arduinoでセキュリティアラームシステムを構築します。Aボタン押下後10秒で警戒開始。超音波センサーで物体検知するとブザー鳴動。4桁パスワード(初期値1234)入力で解除可能。Bボタンでパスワード変更モード(現在のパスワード入力後、新パスワード設定)。

パスワード間違い時は「Wrong! Try Again」表示で再入力待ち。電池駆動も可能なコンパクトな防犯デバイスです。
必要な部品

- Arduinoボード(Uno、Nano等)
- 超音波センサー(HC-SR04等)
- LCD 16×2(I2Cモジュール付き推奨)
- ブザー(アクティブ/パッシブどちらでも可、PWMピン接続)
- 4×4マトリックスキーパッド
- ブレッドボードとジャンパーワイヤー
回路図

ブザーはPWM対応ピン1本で駆動。4×4キーパッドは8ピン(行4、列4)。各キーは行と列をショートさせるタクトスイッチ。例えば行1をLOW、全列をHIGHにし、キー「3」押下で列3がLOWになるのを検出する方式。

超音波センサーとLCDの接続詳細は過去の詳細チュートリアルを参照してください。
Arduinoコード解説
LiquidCrystal標準ライブラリとKeypadライブラリ(別途インストール必要)を使用。ブザー、超音波センサーピン、変数、キーマップ、キーパッド・LCDオブジェクトを定義。
#include <LiquidCrystal.h>
#include <Keypad.h>
#define buzzer 8
#define trigPin 9
#define echoPin 10
long duration;
int distance, initialDistance, currentDistance, i;
int screenOffMsg = 0;
String password = "1234";
String tempPassword;
boolean activated = false;
boolean activateAlarm = false;
boolean alarmActivated = false;
boolean passChangeMode = false;
boolean passChanged = false;
const byte ROWS = 4; const byte COLS = 4;
char keypressed;
char keyMap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {14, 15, 16, 17}; // A0-A3
byte colPins[COLS] = {18, 19, 20, 21}; // A4-A5 + 2,3等
Keypad myKeypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // (rs, en, d4, d5, d6, d7)
void setup() {
lcd.begin(16,2);
pinMode(buzzer, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
loop()メインフロー:
1. アラーム非作動時:ホーム画面表示
「A - Activate」「B - Change Pass」表示。キーパッド読み取りで'A'ならブザー短音、activateAlarm=true。
if (!alarmActivated) {
if (screenOffMsg == 0) {
lcd.clear(); lcd.setCursor(0,0); lcd.print("A - Activate");
lcd.setCursor(0,1); lcd.print("B - Change Pass");
screenOffMsg = 1;
}
keypressed = myKeypad.getKey();
if (keypressed == 'A') { tone(buzzer, 1000, 200); activateAlarm = true; }
}
2. 作動カウントダウン(9秒)
activateAlarm=trueなら「Alarm will be activated in」表示、9→1秒カウントダウン(ブザー短音付き)。完了で「Alarm Activated!」、初期距離取得、alarmActivated=true。
if (activateAlarm) {
lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm will be");
lcd.setCursor(0,1); lcd.print("activated in");
int countdown = 9;
while (countdown != 0) {
lcd.setCursor(13,1); lcd.print(countdown); countdown--;
tone(buzzer, 700, 100); delay(1000);
}
lcd.clear(); lcd.setCursor(0,0); lcd.print("Alarm Activated!");
initialDistance = getDistance();
activateAlarm = false; alarmActivated = true;
}
3. 警戒中:超音波センサー監視
現在距離+10cm補正 < 初期距離 なら物体検知と判定。ブザー連続鳴動、enterPassword()呼び出し。
if (alarmActivated) {
currentDistance = getDistance() + 10;
if (currentDistance < initialDistance) {
tone(buzzer, 1000); lcd.clear(); enterPassword();
}
}
4. パスワード入力画面
「*** ALARM *** / Pass>」表示。キーパッドで数字入力(画面は*表示)。4桁超えや'#'でクリア。'*'押下で照合:一致ならアラーム解除(noTone、フラグリセット、ホーム画面戻り)、不一致なら「Wrong! Try Again」2秒表示後再入力待ち。
void enterPassword() {
int k=5; tempPassword=""; activated=true;
lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** ALARM *** ");
lcd.setCursor(0,1); lcd.print("Pass>");
while(activated) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY) {
if (keypressed >= '0' && keypressed <= '9') {
tempPassword += keypressed; lcd.setCursor(k,1); lcd.print("*"); k++;
}
}
if (k > 9 || keypressed == '#') { tempPassword=""; k=5; lcd.clear(); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); }
if (keypressed == '*') {
if (tempPassword == password) { activated=false; alarmActivated=false; noTone(buzzer); screenOffMsg=0; }
else { lcd.setCursor(0,1); lcd.print("Wrong! Try Again"); delay(2000); lcd.clear(); lcd.print(" *** ALARM *** "); lcd.setCursor(0,1); lcd.print("Pass>"); }
}
}
}
5. パスワード変更モード(Bボタン)
現在のパスワード入力→一致なら新パスワード入力→'*'で確定・保存。入力桁数オーバーや'#'でクリア。同じくブザー音でフィードバック。
else if (keypressed == 'B') {
lcd.clear(); int i=1; tone(buzzer,2000,100); tempPassword="";
lcd.setCursor(0,0); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">");
passChangeMode=true; passChanged=true;
while(passChanged) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY) {
if (keypressed >= '0' && keypressed <= '9') { tempPassword+=keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer,2000,100); }
}
if (i>5 || keypressed=='#') { tempPassword=""; i=1; lcd.clear(); lcd.print("Current Password"); lcd.setCursor(0,1); lcd.print(">"); }
if (keypressed=='*') {
i=1; tone(buzzer,2000,100);
if (password == tempPassword) {
tempPassword=""; lcd.clear(); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">");
while(passChangeMode) {
keypressed = myKeypad.getKey();
if (keypressed != NO_KEY) {
if (keypressed >= '0' && keypressed <= '9') { tempPassword+=keypressed; lcd.setCursor(i,1); lcd.print("*"); i++; tone(buzzer,2000,100); }
}
if (i>5 || keypressed=='#') { tempPassword=""; i=1; tone(buzzer,2000,100); lcd.clear(); lcd.print("Set New Password"); lcd.setCursor(0,1); lcd.print(">"); }
if (keypressed=='*') { i=1; tone(buzzer,2000,100); password=tempPassword; passChangeMode=false; passChanged=false; screenOffMsg=0; }
}
}
}
}
}
超音波距離測定関数
long getDistance() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
return distance;
}
完全なソースコード
記事末尾に完全版コード掲載(上記全セクション統合版)
仕上げ
プラスチック電気ボックスに全部品を収納・配線して完成。

シンプルですが実用的なアラームシステムです。質問はコメント欄へどうぞ。
製造プロセス
- Python連携で信頼性向上: Arduino RFID勤怠管理システム
- Arduino UNOで作るLCDアニメーション&ゲーム入門
- SERENA:Arduino Mega 2560とTFT LCDタッチスクリーン搭載カスタムアラームシステム
- ArduinoとRFモジュールでアラームシステムのセキュリティを評価する
- Arduinoオーディオ周波数検出器 – 高感度サウンドモジュールで最大音量ピークの周波数を測定
- 1Sheeldで作るスマートホーム自動化&セキュリティシステム
- Arduino三目並べ:MAX7219 LEDマトリクスと段ボールケースで自作
- ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
- SparkFun 7セグメントディスプレイで作る信頼性の高いArduinoカウントダウンタイマー
- スマート地下室換気システム:Arduinoで湿度制御
- Python 3からArduino UNOを制御 – シリアル通信でLED点滅デモ