버튼을 누르고 있으면 LED가 On되고 버튼을 떼면 LED가 Off되는 것은 이제 쉽다. 

https://pilimage.tistory.com/16

 

[C/STM32] 2. LED ON/OFF - 버튼 제어 추가

1초 간격으로 LED를 On/off를 하는 것은 이제 쉽다. https://pilimage.tistory.com/15 [C/STM32] 1. LED ON/OFF 가장 쉬운 LED ON/OFF를 해보자 . 먼저 프로젝트를 만들고 Clock & Configuration에서 Clock을 설정..

pilimage.tistory.com

 

버튼을 한 번 누르면 LED가 켜지고 다시 한 번 더 누르면 LED가 꺼질 수는 없는가?

당연히 가능하다. 

 

버튼이 눌렸다는 인식은 여러가지 방법으로 가능하겠지만 인터럽트를 사용하지 않고 폴링으로 해보겠다. 

 

폴링 방식이란 무엇인가?

버튼의 상태를 주기적으로 확인하는 방식으로 메인 루프에서 버튼의 상태를 계속 확인하면서 버튼이 눌려졌다는 상황을 판단한다.

 

버튼을 확인하는 방법은 버튼이 눌렸을 때의 tick과 버튼이 떨어졌을 때의 tick을 이용하여 

버튼이 떨어졌을 때 동작하도록 만들었다. 

btn_state는 버튼의 상태를 의미하고 초기값은 0이다. 

push_btn은 버튼이 눌린 상태를 표시하는 flag로 초기값은 0이다

stable_time은 채터링 방지 시간으로 초기값은 100ms로 하였다

 

1. push_btn의 초기값이 0이므로 if문에 해당된다. 

2. 버튼이 눌려져 btn_state가 1이되면 push_btn을 1로 바꾸고 그 때의 tick을 얻는다.

3. push_btn이 1이므로 else 구문으로 들어간다. 

4. 버튼이 떨어져서 btn_state가 0이 되면 그 때의 tick과 버튼을 눌렀을 때의 tick을 비교하여 stable_time보다 크면 LED를 반전 시켰다. 

5.  stable_time보다 작으면 push_btn = 0으로 바꾸어 초기 상태로 돌아간다. 

 

* Chattering (채터링)이란? 

버튼(=스위치)를 누르거나 떨어질 때, 0(LOW) -> 1(HIGH) 또는 1(HIGH)->0(LOW) 으로 한순간에 변하는 것이 아니라 떨어졌다 붙었다 하는 현상을 말한다. 

 

 

* void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

 GPIO 핀의 출력을 반전시키는 함수로 LED의 ON/OFF에 사용하였다.

 

 

반응형

+ Recent posts