Составляющие замка:
основные:
— Arduino
— Arduino protoshield + breadboard
— L293D
— актуатор центрального замка (от автомобиля ВАЗ)
— пульт управления от охранной сигнализации
— корпус и блок питания (на 12 и 5В) от старого хаба D-LINK
мелочёвка:
пучок проводов 30шт для бредборда
— 2 розетки RJ45
— 2 вилки RJ45
— геркон
— шпингалет металлический
— кучка винтов и гаечек для крепления всего этого к корпусу
видео работы:
скетч:
#include <Password.h> #include <Keypad.h> Password password = Password( "0000" ); const byte ROWS = 4; const byte COLS = 3; char keys[ROWS][COLS] = { { '1','2','3' } , { '4','5','6' } , { '7','8','9' } , { '*','0','#' } }; byte rowPins[ROWS] = { 3, 4, 5, 6}; byte colPins[COLS] = { 7, 8, 9}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); byte Closed = 0; byte Gerkon = 2; byte LedRed = 12; byte LedGreen = 13; byte MotorPin1 = 0; byte MotorPin2 = 1; byte MotorPinGo = 11; boolean programMode = false; int speakerPin = 10; void setup(){ pinMode(MotorPin1, OUTPUT); pinMode(MotorPin2, OUTPUT); pinMode(LedRed, OUTPUT); pinMode(LedGreen, OUTPUT); pinMode(speakerPin, OUTPUT); pinMode(Gerkon, INPUT); digitalWrite(Gerkon, HIGH); digitalWrite(LedRed, LOW); digitalWrite(LedGreen, LOW); digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPinGo, LOW); keypad.addEventListener(keypadEvent); keypad.setDebounceTime(100); startupSound(); } void loop(){ char key = keypad.getKey(); if (Closed==1) { digitalWrite(LedRed,HIGH); digitalWrite(LedGreen,LOW); } else{ digitalWrite(LedRed,LOW); digitalWrite(LedGreen,HIGH); } } void keypadEvent(KeypadEvent key){ switch (keypad.getState()){ case PRESSED: switch (key){ case '#': guessPassword(); digitalWrite(LedRed, LOW); break; case '*': CloseBolt(); digitalWrite(LedRed, LOW); digitalWrite(LedGreen, LOW); break; default : if (key != NO_KEY){ } password.append(key); digitalWrite(LedRed, HIGH); analogWrite(speakerPin, 128); break; } break; case RELEASED: switch (key){ default : digitalWrite(LedRed, LOW); analogWrite(speakerPin, 0); break; } break; } } void guessPassword(){ if (password.evaluate()){ if (Closed==1) { digitalWrite(LedGreen,HIGH); OpenBolt(); digitalWrite(LedGreen,LOW); password.reset(); } } else{ digitalWrite(LedGreen,LOW); password.reset(); errorSound(); } } void startupSound() { int note = (1/587.33)*500000; for (int _=0;_<100000/note;_++){ delayMicroseconds(note); digitalWrite(speakerPin, HIGH); delayMicroseconds(note); digitalWrite(speakerPin, LOW); } note = (1/523.25)*500000; for (int _=0;_<100000/note;_++){ delayMicroseconds(note); digitalWrite(speakerPin, HIGH); delayMicroseconds(note); digitalWrite(speakerPin, LOW); } note = (1/659.26)*500000; for (int _=0;_<100000/note;_++){ delayMicroseconds(note); digitalWrite(speakerPin, HIGH); delayMicroseconds(note); digitalWrite(speakerPin, LOW); } } void errorSound() { int n = 2000; for (int vez=0;vez<2;vez++){ for (int _=0;_<30;_++){ delayMicroseconds(n); digitalWrite(speakerPin, HIGH); delayMicroseconds(n); digitalWrite(speakerPin, LOW); } delay(50); } } void openSound() { int n = 300; for (int vez=0;vez<3;vez++){ for (int _=0;_<100;_++){ delayMicroseconds(n); digitalWrite(speakerPin, HIGH); delayMicroseconds(n); digitalWrite(speakerPin, LOW); } delay(100); } } void OpenBolt() { if (Closed == 1){ digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, HIGH); digitalWrite(MotorPinGo, HIGH); delay(30); digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPinGo, LOW); Closed=0; openSound(); } } void CloseBolt() { if (Closed == 0){ closeSound1(); do { delay(1); } while (digitalRead(Gerkon)==1); delay(3000); //wait 3 seconds digitalWrite(MotorPin1, HIGH); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPinGo, HIGH); delay(30); digitalWrite(MotorPin1, LOW); digitalWrite(MotorPin2, LOW); digitalWrite(MotorPinGo, LOW); Closed=1; closeSound2(); } } void closeSound1() { int n = 200; for (int vez=0;vez<2;vez++){ for (int _=0;_<100;_++){ delayMicroseconds(n); digitalWrite(speakerPin, HIGH); delayMicroseconds(n); digitalWrite(speakerPin, LOW); } delay(100); } } void closeSound2() { int n = 450; for (int _=0;_<110;_++){ delayMicroseconds(n); digitalWrite(speakerPin, HIGH); delayMicroseconds(n); digitalWrite(speakerPin, LOW); } }
руководство по работе с клавиатурой пульта управления:
Автор проекта: nikitosk
Ссылки
Статья автора на хабре: Кодовый замок на Arduino за 20 минут
The Matrix Keypad how-to
0 комментариев на «“Кодовый замок на Arduino”»
Прикольно у вас получилось!
Пульт фирменный (дорогой, поди, зараза).
А я тут как раз недавно делал тоже кодовый замок, только немножко другого плана. Там вся механика промышленная, а вот клавиатурный модуль с микроконтроллером и реле — самодельные.фотка
Если интересно — фото тут:
это не наша разработка, а хабраюзера — nikitosk (ссылка на оригинал находится в конце заметки в разделе ссылки)
Пульт от сломанной охранной сигнализации.
Отдельно не видел, чтобы продавались.
ОО круто! знакомая статья 🙂
🙂 точно 🙂 не посмотрел, что вы зарегистрированы и у нас, поэтому взял смелость разместить описание Вашего проекта 🙂
отличная работа!
Мне приятно 🙂 Спасибо!