목표
푸시버튼을 단순히 한번 눌러서 LED를 켜거나 끌 수 없는 안전한 버튼을 구현하는 예제입니다.
푸시버튼을 3번 연속으로 누르면 LED를 켭니다. 단 버튼을 누르고 1초 이내 다음 버튼을 누르지 않으면 카운트는 0으로 초기화 됩니다. 푸시버튼을 3초이상 길게 누르면 LED를 끕니다.
하드웨어
부품
부품 | 갯수 |
---|---|
적색 LED | 1 |
220Ω 저항 ¹ | 1 |
푸시버튼 | 1 |
연결
아래의 핀을 가로 방향으로 서로 연결해줍니다.
부품1 | 부품2 | GPIO |
---|---|---|
LED + ¹ | | 23 |
LED – | 220Ω 저항 | GND |
푸시버튼 핀1 ² | | 3.3V |
푸시버튼 핀2 ¹ | | 14 |
I/O 장치
푸시버튼과 LED를 I/O장치에 추가합니다.
변수
푸시버튼의 누름 여부를 저장할 변수를 추가합니다.
- “버튼 누름” (디지털)
로직
컨트롤러는 사용자가 언제 푸시버튼을 누를지 모르기 때문에 항상 푸시버튼의 값을 읽어옵니다.
만약, 푸시버튼을 3회 누르면 LED를 켭니다. 이 때 누르는 간격이 1초보다 크면 횟수 카운트는 0으로 초기화됩니다.
또한 푸시버튼을 3초간 계속 누르면 LED를 끕니다.
이를 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 푸시버튼의 값 읽어오기
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[제어] 푸시버튼을 3회 누르면 LED를 켜기
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[조건] 푸시버튼을 3회 누르면 (누르는 간격은 1초 이내)
앞에서, 푸시버튼의 값을 “버튼 누름”이라는 변수에 저장해두었습니다. 그러므로 “버튼 누름” 변수의 값이 3회 false에서 true가 되었는지 검사하는 조건을 추가합니다. 만약 이 간격이 1초보다 크면 카운트는 0으로 초기화됩니다. 또한 조건을 만족할 경우에도 카운트는 다시 0부터 시작합니다.
- 타입: 비교
- 변수선택: “버튼 누름”
- 연산자: = (같다)
- 값: true
- 조건 옵션: 카운트
- 값: 3
- 타임아웃: 0시간 0분 1초 0밀리초
[동작] LED를 켠다
LED에 true를 쓰는 동작을 추가합니다.
- 타입: I/O장치
- 장치선택: LED
- 명령: WRITE_PIN
- 값: true
[제어] 푸시버튼을 3초 이상 누르면 LED를 끈다.
[조건] 푸시버튼을 3초간 누르면
앞에서, 푸시버튼이 눌러졌는지 여부를 “버튼 누름”이라는 변수에 저장해두었습니다. 그러므로 “버튼 누름” 변수가 3초이상 true인지 검사하는 조건을 추가합니다. 만약 시간을 카운트하는 도중 한번이라도 해당 변수의 값이 false가 되면 다시 0초부터 카운트를 시작합니다. 또한 조건을 만족하는 경우에도 다시 0초부터 카운트를 시작합니다.
- 타입: 비교
- 변수선택: “버튼 누름”
- 연산자: = (같다)
- 값: true
- 조건옵션: 유지시간
- 값: 0시간 0분 3초 0밀리초
[동작] LED를 끈다
LED에 false를 쓰는 동작을 추가합니다.
- 타입: I/O장치
- 장치선택: LED
- 명령: WRITE_PIN
- 값: false