버튼 처리가 귀찮아서 라이브러리를 만들었습니다.
버튼을 누르고 있을 때, 누르지 않을 때, 눌리고 첫 이벤트를 구분하여 리턴해주는 라이브러리입니다.
버튼이 플로팅(floating)상태라면 당연하게도 제대로 동작하지 않습니다.
(참고 : [Arduino] 버튼(Button)의 값이 정확하지 않을때 - 풀 업(Pull Up), 풀 다운(Pull Down) 사용 방법 )
아두이노는 게임 루프처럼 무한루프가 돌면서 여러 가지 상태를 판단하여 동작하게 됩니다.
이 상태에서 그냥 버튼을 눌렸다고 동작을 시키면 버튼이 몇 번 눌렸는지, 언제 눌렸는지 판단을 할 수 없습니다.
결국 상태가 변한 처음 한 번(버튼 업 -> 버튼 다운, 버튼 다운 -> 버튼 업)을 판단하여 동작해야 합니다.
이것을 구현하려면 처음 상태 값이 변했을 때를 기록했다가 다시 변하면 그걸 신호를 주면 됩니다.
버튼이 눌리지 않았을 때 상태 값을 클래스가 생성될 때 받아서 저장해둡니다.
버튼의 값을 'ClickCheck'함수로 넘기면 버튼 상태를 판단하여
1 : (Up) 버튼이 눌려있지 않음
2 : (Down) 버튼이 눌림
3 : (First Down) 버튼이 처음 눌림
값을 리턴합니다.
'ButtonClickCheck.h'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
#include "arduino.h"
class ButtonClickCheck
{
public:
//버튼이 눌리지 않았을때 판단값
int ButtonUpLevel;
private:
//버튼 값이 바뀌였는지 여부
bool bBtnPush1;
bool bBtnPush2;
public:
//버튼 판단을 위한 라이브러리
//nButtonUpLevel : (int)버튼이 눌리지 않았을때 판단값. LOW or HIGH
ButtonClickCheck(int nButtonUpLevel)
{
ButtonUpLevel = nButtonUpLevel;
bBtnPush1 = false;
bBtnPush2 = false;
}
~ButtonClickCheck()
{
}
public:
int ClickCheck(int nDigitalRead);
};
|
cs |
버튼 상태를 판단하도록 함수를 작성합니다.
'ButtonClickCheck.cpp'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 |
#include "arduino.h"
#include "ButtonClickCheck.h"
//클릭여부를 판단한다.
//nDigitalRead : (int) 입력된 디지털 값
//return : (int) 1=Up, 2=Down, 3=First Down
int ButtonClickCheck::ClickCheck(int nDigitalRead)
{
//결과
int nReturn = 0;
//1.버튼 값이 기존과 다른지 여부 확인
//1-1. 입력값 확인
if( ButtonUpLevel != nDigitalRead)
{//버튼이 눌림
bBtnPush1 = true;
}
else
{//버튼이 안눌림
bBtnPush1 = false;
}
//1-2. 기존 입력값 확인
if(bBtnPush2 == true)
{//기존에 버튼이 눌려있었음
//기존 상태 먼저 저장
nReturn = 2;
if(bBtnPush1 == false)
{//이번엔 버튼이 안눌림
bBtnPush2 = false;
nReturn = 1;
}
}
else if(bBtnPush2 == false)
{//기존 버튼이 눌려있지 않음
//기존 상태 먼저 저장
nReturn = 1;
if(bBtnPush1 == true)
{//이번엔 버튼이 눌림
bBtnPush2 = true;
nReturn = 3;
}
}
return nReturn;
} |
cs |
위에서 만든 라이브러리를 로드하고 테스트 코드를 작성합니다.
(참고 : [Arduino] 라이브러리 작성하기 )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 |
#include <ButtonClickCheck.h>
#define Button01 2
#define Button02 4
//테스트 1
ButtonClickCheck BCC_1(HIGH);
//테스트 2
ButtonClickCheck BCC_2(LOW);
void setup()
{
Serial.begin(9600);
pinMode(Button01, INPUT);
pinMode(Button02, INPUT);
}
void loop()
{
//컴퓨터에 신호를 준다.
int nBtnState01 = BCC_1.ClickCheck(digitalRead(Button01));
int nBtnState02 = BCC_2.ClickCheck(digitalRead(Button02));
Serial.print(nBtnState01);
Serial.print(" : ");
Serial.println(nBtnState02);
delay(500);
} |
cs |
이제 테스트용 회로를 만들어 봅시다.
GitHub - https://github.com/dang-gun/ArduinoSample/tree/master/ButtonClickCheck
이제 펌웨어를 올리고 테스트해봅시다.
눌렀을 때 값이 잘 나오네요.
이거.....아마 찾으면 있을 거 같은데......찾는것 보다 만든 게 빠른가? 해서 만들었습니다 ㅎㅎㅎㅎ
근데 다 만들고 나니까 손댈 게 더 보이네요;;;
[하드웨어] 체중계 분해하여 체중계 만들기 - 3선 로드 셀(Load cell) 배선을 하자 (13) | 2019.11.01 |
---|---|
[하드웨어] 정류회로 만들기 (0) | 2019.10.09 |
[Arduino] 버튼 처리를 위한 라이브러리 - ButtonClickCheck (0) | 2019.07.28 |
[Arduino] 버튼(Button)의 값이 정확하지 않을때 - 풀 업(Pull Up), 풀 다운(Pull Down) 사용 방법 (0) | 2019.07.26 |
[하드웨어] 무한 거울(Infinity Mirror) 거울 만들기 (0) | 2019.04.11 |