정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

소스코드 질문
우노호환보드 | 2015-11-12

klant님이 하신 금고소스를 이용하여 키패드#을 누르면 비밀번호를 설정하고싶은데 조언을 구할수있을까요..

#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Servo.h>

Servo locker;
LiquidCrystal lcd(13, 12, 11, 9, A1, A0);
char secretCode[6] = {'1','2','3','1','2','3'};
char input[6];
char key;
int position = 0;
int wrong = 0;
int i = 0;
int j = 0;
int pos = 0;
int a=0;
int b=0;
const byte rows = 4;
const byte cols = 4;
boolean c=false;

char keys[rows][cols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[rows] = {8, 7, 6, 5};   //키패드 행 핀번호
byte colPins[cols] = {4, 3, 2, A2};  //키패드 열 핀번호

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2);
  locker.attach(10);
  locker.write(90);
  pinMode(10,INPUT);      //모터 핀번호에 맞는 모드설정
}

void loop()  //계속 루프 된다
{
  while(a==0)  //a가 0이라면 밑에 써있는 함수 실행
  {
    input_key();            // 암호입력모드
    password();             // 비밀번호 확인
    password_check();       // 현재 상태 표시
  }
  if(a==1)                  // 올바른 패스워드 일경우
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    pinMode(10,OUTPUT);
    locker.write(180);      // 모터 180도 돌음
    lcd.print("perfect complete");  //완료
    delay(2000);   //딜레이 2초
    pinMode(10,INPUT);
    key = keypad.waitForKey();     //사용자가 * 을 누를때까지 대기한다.
    if(key == '*')      //* 을 누르면 잠김
    { 
      a=0;               // 플래그 지우기(지우는 이유는 위에 loop부분이 다시 돌기위해서)
      lcd.clear();        //LCD 클리어
      lcd.setCursor(0,0);
      pinMode(10,OUTPUT);
      locker.write(90);     // 모터 90도 돌고 CLOSE
      lcd.print("    Lock ON");    //lock on 표시
      delay(2000);   //딜레이 2초
      pinMode(10,INPUT); 
    }
  }
}

void input_key()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("    Password");
  for (i = 0; i < 6; i++)
  {
    key = keypad.waitForKey();
    input[i] = key;
    lcd.setCursor(i + 6, 1);
    lcd.print("*");      //비밀번호 * 표시
  }
}

void password()
{
  wrong = 0;
  for (j = 0; j < 6; j++)
  {
    if (secretCode[j] == input[j])
    {
    }
    else if (secretCode[j] != input[j])
    {
      wrong += 1;
    }
  }
}

void password_check()
{
  if (wrong == 0)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("      PASS");
    delay(2000);
    a=1;
    lcd.clear();
  }
  else if (wrong != 0)
  {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("     wrong");
    delay(2000);
    a=0;
    lcd.clear();
    wrong = 0;
  }
}

프로필사진

Klant 2015-11-16 13:28:10

안녕하세요!

우선 답변이 늦어진 점 죄송합니다.

현재 소스 코드로는 비밀 번호를 소스 코드에서 설정해야 하는데 비밀 번호를 설정하는 기능을 넣고 싶으신거죠?

keypad의 #버튼이 눌렸을 때 비밀 번호에 해당하는  secretCode 배열의 값을 넣어주는 소스가 필요할 것 같습니다.

비밀 번호를 설정하는 소스 코드는 해당 소스의 input_key()와 password() 함수를 참고하시면 될 것 같구요! ;)

프로필사진

우노호환보드 2015-11-16 20:23:05

제가 소스를 계속 수정하고 실험을 해보았는데 인터럽트가 필요하시다는 분들도있어서 도움을 청할수있을까요..ㅠ

프로필사진

Klant 2015-11-18 08:19:57

안녕하세요!

키패트의 '*' 버튼과 '#' 버튼을 적절히 이용하면 인터럽트가 필요할거 같지 않은데요? 

키패트의 * 버튼은 비밀 번호 입력용, 키패트의 # 버튼은 비밀 번호 설정용으로 사용하시면 될 것 같습니다.

 

프로필사진

우노호환보드 2015-11-18 09:42:43

비밀번호 설정부분을 루프부분에 넣으려고하는데 작동이 이상하거나 반응을 하지않네요...

프로필사진

우노호환보드 2015-11-18 10:01:22

소스좀 알려드릴수있나요..배열로 설정하는방법을 알고싶습니다.

이전글   |    안녕하세요 2015-11-12
다음글   |    아두이노 Tian처럼 BLE와 WiFi 모듈이 모두 탑재된 보드를 만들 계획은 없는지요?... 2015-11-14