본문 바로가기
아두이노

Make IT! Arduino -#04 보안 저금통 만들기

by 오징어땅콩2 2020. 7. 14.
반응형

Make IT! Arduino -#04 보안 저금통 만들기

 

3번에 고생해서 그런지 4번은 하드웨어적으로 거의 껌이다. 

정말 쉽게 조립했다. 그래도 여전히 공차에 문제가 좀 있다.

줄이나 칼로 잘라버리고 조립했다.

1,2번 교제와 비교하면 1,2번 처럼 공차를 조금 크게 하면 될것 같다.

1,2번 교제가 딱 좋은것 같다.

공차를 제외 하면 하드웨어적인 오류는 없다.

 

그런데 이번 단계를 소프트웨어적인 오류가 좀 보인다.

1. 디지털핀을 출력으로 하기 위해서는 핀모드를 아웃풋으로 해야 한다.

1.1 교제에서는 이부분이 없다 명백한 오류다.

 

2. 키패드를 사용하기 위해서 keypad 라이브러리를 설치하라고 되어 있다.

2.1 설치에 대한 상세한 설명은 제외 하고도 정확히 어떤 라이브러리를 설치하라는 이야기가 없다.

2.2 참고로 아두이노에서 공식적으로 지원하는 keypad 라이브러리만 5개 이다.

2.3 정확한 설명이 있으면 좋겠다.

 

3. 키패드는 8개의 핀이 필요하다. 

3.1 본인 같으면 그냥 순서데로 핀을 정할것 같은데 번호가 순서데로 아니다.

3.2 0,1번은 시리얼통신을 위한 핀이기 때문에 왠만하면 사용하지 않는게 좋을것 같다.

3.3 소스코드의 핀번호와 교제에서 설명하는 핀번호하고 다르다.

3.4 교제에 있는 그림의 핀과는 일치한데, 전체적으로 통일하거나 수정해야 할 것 같다.

 

아래 소스코드는 본인이 좀 수정했다.

발생 할 수 있는 오류를 원천적으로 제거 하기 위해서 고쳤는데,

아무래도 좀 많이 수정해서 좀 미안 한듯 하다.

그래도 발생할 수 있는 오류는 원천 봉쇄하는게 좋을것 같다.

 

 
#include <Keypad.h>
#include <Servo.h>
 
#define ROWS 4
#define COLS 4
Servo Servo_Motor;
 
const int sPin = 12;
const int rPin = 11;
const int gPin = 10;
 
char* pw= "4321";
int pos = 0;
 
char keys[ROWS][COLS] =
{
  {'1''2','3','A'},
  {'4''5','6','B'},
  {'7''8','9','C'},
  {'*''0','#','D'},   
};
 
byte rPins[ROWS] = {9,8,7,6};
byte cPins[COLS] = {5,4,3,2};
 
Keypad kpad = Keypad(makeKeymap(keys), rPins, cPins, ROWS, COLS);
char key;
void setup() 
{
  pos = 0;
  Servo_Motor.attach(sPin);
  pinMode(rPin, OUTPUT);
  pinMode(gPin, OUTPUT);  
  SetLocked(true);
  Serial.begin(115200);
}
 
void loop() 
    key = 0;
    if(ReadKey())
    {
      if(key == '*' || key == '#')
      {
        pos = 0;
        SetLocked(true);
      }
      else if(key ==  pw[pos]) pos++;
      else pos = 0;
      
      if(pos == strlen(pw)) SetLocked(false);
    }
    delay(100);              
}
 
bool ReadKey()
{
  key = kpad.getKey();
  for (int i =0 ; i < ROWS; i++)
  {
    for (int k =0 ; k < COLS; k++)
    {
       if (key  == keys[i][k]) 
       {
          Serial.println(key);  
          return true;
       }
    }
  }
 
  return false;
}
 
void SetLocked(bool locked)
{
  if(locked)
  {
    digitalWrite(rPin, HIGH);
    digitalWrite(gPin, LOW);
    Servo_Motor.write(0);  
  }
  else 
  {
    digitalWrite(rPin, LOW);
    digitalWrite(gPin, HIGH);   
    Servo_Motor.write(100);  
  }
  delay(100);  
}
 

 

 

댓글