Arduino-сигнализация с паролем: пошаговый урок
Научимся делать Arduino-сигнализацию. Видео или текст ниже. Активация через 10 сек после кнопки A. Ультразвуковой датчик (HC-SR04) следит за дистанцией. При обнаружении объекта — пищит зуммер. Остановка — 4-значный пароль (по умолчанию 1234). Смена пароля: кнопка B → ввод текущего → новый 4-значный. Неправильный пароль — «Wrong! Try Again». Arduino, HC-SR04, LCD 16×2, зуммер (PWM пин), 4×4 клавиатура, макетка, перемычки. Зуммер — PWM пин. Клавиатура 4×4: 4 строки, 4 столбца. Кнопка = замыкание строки и столбца. Сканирование: строка LOW, столбцы HIGH → нажатие тянет столбец в LOW. Ультразвук и LCD — отдельные уроки. Библиотеки: LiquidCrystal (стандарт), Keypad (установить отдельно). Пины: buzzer(8), trig(9), echo(10). Клавиатура: строки 14-17, столбцы 18-21. LCD: пины 1,2,4,5,6,7. Переменные: пароль "1234", флаги состояния. Loop(): если не активировано — домашний экран «A - Activate / B - Change Pass». Нажатие A → звук, activateAlarm=true. Тогда countdown 9 сек (пик каждую сек), «Alarm Activated!», замер initialDistance. activateAlarm=false, alarmActivated=true. Если alarmActivated: текущая дистанция +10см < initialDistance → tone(1000), enterPassword(). enterPassword(): «*** ALARM *** / Pass>», ввод цифр в tempPassword (звёздочки на LCD). >4 цифр или # — сброс. * — проверка: если tempPassword==password → деактивация, noTone, возврат в меню. Иначе «Wrong! Try Again» 2 сек. Смена пароля (B): «Current Password >», ввод, * → проверка. Если верно → «Set New Password >», ввод нового, * → password=tempPassword, выход. Функция getDistance() — стандартный HC-SR04 (триггер 10 мкс, pulseIn, формула duration*0.034/2). Полный код в конце. Корпус — пластиковый электроящик, все компоненты внутри. Проект готов. Вопросы в комментариях!Обзор

Компоненты

Схема подключения


Исходный код
#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, isActivated, activateAlarm=false, alarmActivated=false;
boolean enteredPassword, passChangeMode=false, passChanged=false;
const byte ROWS=4, COLS=4;
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}; byte colPins[COLS] = {18,19,20,21};
Keypad myKeypad = Keypad(makeKeymap(keyMap), rowPins, colPins, ROWS, COLS);
LiquidCrystal lcd(1,2,4,5,6,7);
void setup(){ lcd.begin(16,2); pinMode(buzzer,OUTPUT); pinMode(trigPin,OUTPUT); pinMode(echoPin,INPUT); }if(!alarmActivated){
if(screenOffMsg==0){ lcd.clear(); 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; }
}
if(activateAlarm){
lcd.clear(); 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.print("Alarm Activated!"); initialDistance=getDistance(); activateAlarm=false; alarmActivated=true;
}if(alarmActivated){
currentDistance = getDistance() + 10;
if(currentDistance < initialDistance){ tone(buzzer,1000); lcd.clear(); enterPassword(); }
}void enterPassword(){
int k=5; tempPassword=""; activated=true;
lcd.clear(); 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>"); }
}
}
}else if(keypressed=='B'){
lcd.clear(); int i=1; tone(buzzer,2000,100); tempPassword="";
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;
}Финальные штрихи

Производственный процесс
- Надежная система учета рабочего времени на Arduino с RFID и Python
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- SERENA: Пользовательская система сигнализации на Arduino Mega 2560 с TFT Touchscreen
- Оценка безопасности сигнализации с Arduino и RF-модулями 433 МГц
- Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
- Умный дом и система безопасности на базе 1Sheeld
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
- Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
- Умная вентиляция подвала на Arduino: контроль влажности