Парольный доступ с клавиатруры

bad_user
Offline
Зарегистрирован: 13.11.2015

Здравствуйте! 

Помогите решить задачу: 

имеется:

1. Arduino Uno;

2. клавиатура 3х4;

3. 3 светодиода;

 

Задача стостоит в следующем:

необходимо организовать включение/выключение светодиодов с клавиатруры после ввода пароля - например вводим пароль "1111", - получаем доступ к фунцкиям. указываем номер функции "44" - включение светодиода, или "55" - выключение светодиода, затем указываем номер светодиода "01" и загорается/тухнет первый светодиод. (важно указывать номер светодиода именно "01" а не "1"). 

свой скетч, который у меня никак не хочет работать, пока не выкладываю, т.к. там чейчас полная каша ((( .. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Разделом ошиблись.

bad_user
Offline
Зарегистрирован: 13.11.2015

В какой-то степени Вы правы. Это был бы самый простой вариант =) 

но интерес именно сделать самому. просто не могу сообразить в какую сторону копать.  пробую просто включить/выключить светодиод этим скетчем: 

#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"

Возможно неправильная сама логика.... поправьте пожалуйста 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так

if (code[0]==0 && code[1]==1)digitalWrite(ledpin, HIGH);//01-вк.
 if (code[0]==0 && code[1]==2)digitalWrite(ledpin, LOW); //02-вык
bad_user
Offline
Зарегистрирован: 13.11.2015

vosara пишет:

Попробуйте так

if (code[0]==0 && code[1]==1)digitalWrite(ledpin, HIGH);//01-вк.
 if (code[0]==0 && code[1]==2)digitalWrite(ledpin, LOW); //02-вык

Спасибо!! очень простое решение и все работает :) 

#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, еще раз спасибо!