Парольный доступ с клавиатруры
- Войдите на сайт для отправки комментариев
Вс, 29/11/2015 - 19:20
Здравствуйте!
Помогите решить задачу:
имеется:
1. Arduino Uno;
2. клавиатура 3х4;
3. 3 светодиода;
Задача стостоит в следующем:
необходимо организовать включение/выключение светодиодов с клавиатруры после ввода пароля - например вводим пароль "1111", - получаем доступ к фунцкиям. указываем номер функции "44" - включение светодиода, или "55" - выключение светодиода, затем указываем номер светодиода "01" и загорается/тухнет первый светодиод. (важно указывать номер светодиода именно "01" а не "1").
свой скетч, который у меня никак не хочет работать, пока не выкладываю, т.к. там чейчас полная каша ((( ..
Разделом ошиблись.
В какой-то степени Вы правы. Это был бы самый простой вариант =)
но интерес именно сделать самому. просто не могу сообразить в какую сторону копать. пробую просто включить/выключить светодиод этим скетчем:
#include <Keypad.h> #define ledpin 13 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] = {9, 8, 7, 6}; byte colPins[COLS] = { 3, 4, 5}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); char code[2]; //массив содержащий последние две нажатые кнопки int count=0; // счетчик для массива "code" void setup() { pinMode(ledpin, OUTPUT); Serial.begin(9600); keypad.addEventListener(keypadEvent); } void loop() { keypad.getKey(); } void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: //при нажатии кнопки: switch(count){ //проверяем счетчик, если равен 0, заносим первое число в массив, если 1 - второе. case 0: code[0]=eKey; count=1; break; case 1: code[1]=eKey; count=0; break; } Serial.print("Pressed:"); Serial.println(eKey); Serial.print("code:"); Serial.print(code[0]); Serial.println(code[1]); // Serial.println(eKey); switch (eKey) { // далее стандартный оператор библиотеки <Keypad.h> case '*': digitalWrite(ledpin, HIGH); break; case '#': digitalWrite(ledpin, HIGH); break; default: digitalWrite(ledpin, LOW); break; } } }так у меня есть в массиве "code" последние две нажатые кнопки.... не получается анализировать их оператором switch. Тоесть можно проверять массив при нажатии звездочки или решетки, но нужно зажечь светодиод просто набрав с клавиатуры "01"
Возможно неправильная сама логика.... поправьте пожалуйста
Попробуйте так
Попробуйте так
Спасибо!! очень простое решение и все работает :)
#include <Keypad.h> #include <Password.h> Password password1 = Password( "1111" ); Password password2 = Password( "44" ); 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] = {9, 8, 7, 6}; byte colPins[COLS] = { 3, 4, 5}; Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); #define ledpin 13 char code[2]; int count = 0; int access = 0; void setup() { pinMode(ledpin, OUTPUT); Serial.begin(9600); keypad.addEventListener(keypadEvent); } void loop() { keypad.getKey(); } void keypadEvent(KeypadEvent eKey) { switch (keypad.getState()) { case PRESSED: Serial.print("Pressed:"); Serial.println(eKey); if (access == 2) { switch (count) { case 0: code[0] = eKey; count = 1; break; case 1: code[1] = eKey; count = 0; break; } Serial.print("code:"); Serial.print(code[0]); Serial.println(code[1]); if (code[0] == '0' && code[1] == '1') { digitalWrite(ledpin, !digitalRead(ledpin)); code[0] = '0'; code[1] = '0'; } } switch (eKey) { case '*': checkPassword(); break; case '#': password1.reset(); password2.reset(); access = 0; break; default: password1.append(eKey); password2.append(eKey); break; } } } void checkPassword() { switch (access) { case 0: if (password1.evaluate()) { Serial.println("password1 OK, access=1"); access = 1; password1.reset(); password2.reset(); } else { Serial.println("password WRONG, access=0"); password1.reset(); password2.reset(); access = 0; } break; case 1: if (password2.evaluate()) { Serial.println("password2 OK enter 01"); access = 2; password1.reset(); password2.reset(); code[0] = '0'; code[1] = '0'; } else { Serial.println("password WRONG, access=0"); password1.reset(); password2.reset(); access = 0; } break; } }тренируюсь пока на одном светодиоде, все получается: Воодим пароль пользователя "1111", вводим номер функции "44" (включение/выключение), затем просто нажав "01" светодиод меняет свое состояние!
vosara, еще раз спасибо!