Скетч кодового замка на Ардуино
- Код: выделить все
// Урок 11. Кодовый замок на Ардуино с защитой от подбора кода
#include <Keypad.h> // библиотека матричной клавиатуры
#include <Servo.h> // библиотека управления серводвигателем
Servo myservo; // инициализация двигателя
// переменные счетчиков
int pos = 0;
int val = 0;
int alarm = 0;
int alar = 0;
const byte ROWS = 4; //строки клавиатуры
const byte COLS = 4; //столбцы клавиатуры
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; // строки клавиатуры
byte colPins[COLS] = {5,4,2,3}; // столбцы клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String summ;
String keystr;
int shet=0;
// установочный цикл
void setup(){
Serial.begin(9600);
myservo.attach(13);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
// тест индикации и сигнализации
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
// звуковой сигнал , где tone(номер вывода, частота тона, длительность)
tone(10, 800, 200);
// задержка
delay(200);
// отключение звукового сигнала
noTone(10);
tone(10, 500, 200);
delay(200);
noTone(10);
tone(10, 600, 200);
delay(200);
noTone(10);
tone(10, 700, 200);
delay(200);
noTone(10);
tone(10, 800, 200);
delay(200);
noTone(10);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
// основной цикл
void loop(){
if (val==0){
char key = keypad.getKey();
if (key){
Serial.println(key);
digitalWrite(11, HIGH);
tone(10, 1440, 200);
delay(200);
noTone(10);
digitalWrite(11, LOW);
shet=shet+1;
// считаем неверные вводы кода
if (shet==6){
summ="";
keystr="";
shet=0;
alarm = alarm +1;
Serial.println("LONG");
digitalWrite(12, HIGH);
tone(10, 600, 200);
delay(200);
noTone(10);
digitalWrite(12, LOW);
};
summ=summ+key;
Serial.println(summ);
keystr=String(key);
// сброс при ошибочном вводе кода
if (keystr=="#"){
summ="";
keystr="";
shet=0;
Serial.println("RESET");
digitalWrite(12, HIGH);
tone(10, 600, 200);
delay(200);
noTone(10);
digitalWrite(12, LOW);
};
// ввод, необязательно
if (keystr=="*"){
summ="";
keystr="";
shet=0;
Serial.println("ENTER");
digitalWrite(12, HIGH);
tone(10, 600, 200);
delay(200);
noTone(10);
digitalWrite(12, LOW);
};
// проверяем на соответствие верному коду
if (summ=="2548"){
Serial.println("PASS OK");
val=1;
summ="";
keystr="";
shet=0;
tone(10, 1200, 200);
delay(500);
noTone(10);
tone(10, 1200, 200);
delay(500);
noTone(10);
tone(10, 1200, 200);
delay(500);
noTone(10);
};
}
// включаем сирену при 5 неверных наборов кода
if (alarm>=5) {
for(alar = 0; alar <= 10; alar += 1)
{ tone(10, 500, 200);
delay(200);
noTone(10);
tone(10, 800, 200);
delay(200);
noTone(10);
} ;
alarm = 0;
alar = 0;
};
} else {
// открываем замок на 5 сек и закрываем
tone(10, 1500, 200);
delay(500);
noTone(10);
for(pos = 0; pos <= 90; pos += 1)
{ myservo.write(pos);
delay(10);
}
delay(5000);
tone(10, 1500, 200);
delay(500);
noTone(10);
for(pos = 90; pos>=0; pos-=1)
{myservo.write(pos);
delay(10);
}
delay(5000);
tone(10, 1500, 200);
delay(500);
noTone(10);
val=0;
};
}
После загрузки скетча кодовый замок готов к работе.
Набираем установленный код
2548, серводвигатель должен повернутся на 90 градусов на 5 секунд и вернуться в исходное положение.
Если это произошло, поздравляю, Вы собрали все правильно
, а если нет, проверяем работоспособность каждого компонента по отдельности.
Для упрощения отладки программы необходимо пользоваться встроенным инструментом в Ардуино IDE, монитором порта.
Если запустить монитор порта при подключенной к ПК плате Ардуино со скетчем кодового замка, то при нажатии клавиш клавиатуры в мониторе порта будут появляться цифры нажатой клавиши.
Так же будет выводится суммарный код и другой текст для отладки.
Например при вводе правильного пароля
2548 в мониторе порта должна появится надпись
PASS OK