목표
사용자가 일정시간이 이상 푸시버튼을 누르지 않으면 LED를 끄는 대기모드를 구현하는 예제입니다.
푸시버튼A 또는 푸시버튼B를 누르면 LED램프를 켭니다. 10초이상 아무 버튼도 누르지 않았다면 LED램프를 끕니다. 10초를 카운트하는 도중 아무 버튼을 누르면 LED는 켜지고 카운트는 0으로 초기화됩니다.
하드웨어
부품
부품 | 갯수 |
---|---|
적색 LED | 1 |
220Ω 저항 ¹ | 1 |
푸시버튼 | 2 |
부품1
부품2
GPIO
LED + ¹
20
LED –
220Ω 저항
GND
푸시버튼A 핀1 ²
3.3V
푸시버튼A 핀2 ¹
14
푸시버튼B 핀1 ²
3.3V
푸시버튼B 핀2 ¹
15
연결
아래의 핀을 가로 방향으로 서로 연결해줍니다.
부품1 | 부품2 | GPIO |
---|---|---|
LED + ¹ | | 20 |
LED – | 220Ω 저항 | GND |
푸시버튼A 핀1 ² | | 3.3V |
푸시버튼A 핀2 ¹ | | 14 |
푸시버튼B 핀1 ² | | 3.3V |
푸시버튼B 핀2 ¹ | | 15 |
I/O 장치
푸시버튼과 LED를 I/O장치에 추가합니다.
변수
푸시버튼의 누름 여부를 저장할 변수를 추가합니다.
- “버튼A 누름” (디지털)
- “버튼B 누름” (디지털)
로직
컨트롤러는 사용자가 언제 푸시버튼을 누를지 알수 없으므로 항상 푸시버튼A,B의 값을 읽어옵니다.
푸시버튼A 또는 푸시버튼B를 누르는 순간 LED를 켜고, 푸시버튼 A,B 모두 10초간 누르지 않으면 LED를 끕니다.
이를 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 푸시버튼의 값 읽어오기
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[제어] 푸시버튼A 또는 푸시버튼B를 누르는 순간 LED를 켠다.
조건 연산자가 OR (또는)인 제어를 추가합니다.
- 조건 연산자: OR
[조건] 푸시버튼A를 누르는 순간
앞에서, 푸시버튼A가 눌러졌는지 여부를 “버튼A 누름”이라는 변수에 저장해두었습니다. 그러므로 그 변수의 값이 false에서 true가 되는 순간이 푸시버튼A를 누르는 순간이며 이를 검사하는 조건을 추가합니다.
- 타입: 비교
- 변수선택: “버튼A 누름”
- 연산자: = (같다)
- 값: true
- 조건 옵션: 참인 순간
[조건] 푸시버튼B를 누르는 순간
앞에서, 푸시버튼B가 눌러졌는지 여부를 “버튼B 누름”이라는 변수에 저장해두었습니다. 그러므로 그 변수의 값이 false에서 true가 되는 순간이 푸시버튼B를 누르는 순간이며 이를 검사하는 조건을 추가합니다.
- 타입: 비교
- 변수선택: “버튼B 누름”
- 연산자: =, 값: true
- 조건옵션: 참인 순간
[동작] LED를 켠다.
LED에 true를 쓰는 동작을 추가합니다.
- 타입: I/O장치
- 장치선택: LED
- 명령: WRITE_PIN
- 값: true
[제어] 10초동안 아무 버튼도 누르지 않으면 LED를 끈다.
제어의 조건이 10초동안 유지되어야 조건을 만족하는 제어를 추가합니다.
- 조건옵션: 유지시간
- 값: 0h 0m 10s 0ms
[조건] 10초 동안 아무 버튼도 누르지 않았을때
아무 버튼을 누르지 않았다는 조건을 직접 만들어도 되지만, 앞서 만든 “제어 – 푸시버튼A 또는 푸시버튼B를 누르는 순간 LED를 켠다” 의 조건의 정반대 조건입니다. 그러므로 조건을 직접 만들지 않고 기존 제어의 조건을 참조하여 이와 반대되는 조건을 추가합니다.
- 타입: 조건참조
- 참조: 제어 – 푸시버튼A 또는 푸시버튼B를 누르는 순간 LED를 켠다.
- 조건 옵션: 반전
[동작] LED를 끈다.
LED에 false를 쓰는 동작을 추가합니다.
- 타입: I/O장치
- 장치선택: LED
- 명령: WRITE_PIN
- 값: false