목표
버튼을 누를 때 마다 순서에 따라 LED를 하나씩 켜고 끄는 예제입니다. 아래와 같이 동작해야 합니다.
- 버튼A를 누를 때 마다 LED를 초록, 노랑, 빨강의 순서로 켠다.
- 버튼B를 누를 때 마다 LED를 빨강, 노랑, 초록의 순서로 끈다.
- LED가 모두 켜진 상태에서 버튼A를 누르면 LED를 모두 끈다.
- LED가 모두 꺼진 상태에서 버튼B를 누르면 LED를 모두 켠다.
- 초기 상태에는 LED가 모두 켜진 상태여야 한다.
버튼A와 버튼B는 대시보드 버튼 위젯을 사용합니다.
하드웨어
부품
부품 | 갯수 |
---|---|
초록 LED | 1 |
노랑 LED | 1 |
빨강 LED | 1 |
220Ω 저항 ¹ | 3 |
연결
아래의 핀을 가로 방향으로 서로 연결해줍니다.
부품1 | 부품2 | GPIO |
---|---|---|
초록 LED + ¹ | | 23 |
초록LED – | 220Ω 저항 | GND |
노랑 LED + ¹ | | 24 |
노랑LED – | 220Ω 저항 | GND |
빨강 LED + ¹ | | 25 |
빨강LED – | 220Ω 저항 | GND |
I/O장치
3개의 LED를 I/O장치에 추가합니다.
변수
푸시버튼 위젯 및 카운트에 사용할 변수를 추가합니다.
- “버튼A” (디지털)
- “버튼B” (디지털)
- “카운트” (숫자)
로직
구현 내용이 복잡해 보이지만, 카운트 변수를 이용하면 쉽게 구현할 수 있습니다. 카운트 변수의 값에 따라 아래와 같이 LED의 상태를 아래와 같이 정의합니다.
“카운트” 변수 | 초록 LED | 노랑 LED | 빨강 LED |
---|---|---|---|
0 | OFF | OFF | OFF |
1 | ON | OFF | OFF |
2 | ON | ON | OFF |
3 | ON | ON | ON |
버튼A를 누르면 카운트 값이 증가하고, 버튼B를 누르면 카운트 값이 감소합니다. 또한 카운트 값이 0보다 작으면 3으로 설정하고, 3보다 커지면 0으로 설정합니다. 카운트가 증가할 때 초록, 노랑, 빨강 LED 순으로 켜지고 카운트가 감소할 때 빨강, 노랑, 초록 LED 순으로 꺼지게 됩니다. 초기에는 LED가 모두 켜진 상태여야 하므로 카운트 값을 처음 한번만 3으로 설정합니다.
카운트 값에 따른 LED의 켜짐, 꺼짐은 아래와 같습니다.
- 초록 LED는 카운트가 1 이상 이면 켜지고 그 이외는 꺼짐
- 노랑 LED는 카운트가 2 이상 이면 켜지고 그 이외는 꺼짐
- 빨강 LED는 카운트가 3 이상 이면 켜지고 그 이외는 꺼짐
위의 내용을 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 처음 한번만 카운트를 3으로 설정
[조건] 처음 한번만
첫번째 실행시에만 만족하고, 두번째 이후부터는 만족하지 않는 조건을 추가합니다.
- 타입: 1회 유효
[동작] 카운트를 3으로 설정
“카운트” 변수에 3을 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “카운트” 선택
- 값: 3
[제어] 버튼A를 누를 때 마다 카운트를 증가시킨다
제어를 추가합니다.
[조건] 버튼A를 누르는 순간
버튼A는 대시보드 버튼 위젯이므로, 위젯과 연결된 변수 “버튼A”의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “버튼A” 선택
- 값: true
- 조건 옵션: 참인 순간
[동작] 카운트를 1 증가한다
“카운트” 변수의 값을 1만큼 증가시키는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “카운트”
- 값: 1
- 옵션: 증가
[제어] 버튼B를 누를 때 마다 카운트를 감소시킨다
제어를 추가합니다.
[조건] 버튼B를 누르는 순간
버튼B는 대시보드 버튼 위젯이므로, 위젯과 연결된 변수 “버튼B”의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “버튼B” 선택
- 값: true
- 조건 옵션: 참인 순간
[동작] 카운트를 1 감소한다
“카운트” 변수의 값을 1 만큼 감소시키는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “카운트”
- 값: 1
- 옵션: 감소
[제어] 카운트가 0보다 작으면 3으로 설정한다
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[조건] 카운트가 0보다 작으면
“카운트” 변수의 값이 0보다 작은지 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “카운트”
- 연산자: < (작다)
- 값: 0
[동작] 카운트를 3으로 설정한다.
“카운트” 변수의 값을 3으로 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “카운트”
- 값: 3
[제어] 카운트가 3보다 크면 0으로 설정한다
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[조건] 카운트가 3보다 크면
“카운트” 변수의 값이 3보다 큰지 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “카운트”
- 연산자: > (크다)
- 값: 3
[동작] 카운트를 0으로 설정한다.
“카운트” 변수의 값을 0으로 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “카운트”
- 값: 0
[제어] 카운트에 따라 LED를 켜거나 끈다
[조건] 항상
항상 만족하는 조건을 추가합니다.
- 타입: 항상 유효
[동작] 카운트가 1 이상이면 초록 LED를 켜고 그렇지 않으면 끈다.
동작에 조건이 포함되어 있으므로 일반적으로는 제어를 통해 구현할 수 있지만 블록코딩을 이용하면 보다 간단하게 구현할 수 있습니다. “카운트의 값이 1 이상” 이라는 수식을 초록 LED의 입력 값으로 사용하면 수식이 참이면 LED가 켜지고 거짓이면 LED가 꺼집니다.
- 타입: I/O장치
- 장치: 초록 LED
- 값
- 블록모드로 전환
- 빠른입력-아날로그 에서 값 비교 블록을 추가
- “카운트”의 값 >= 1
[동작] 카운트가 2 이상이면 노랑 LED를 켜고 그렇지 않으면 끈다.
위와 동일한 방법으로 동작을 추가합니다.
- 타입: I/O장치
- 장치: 노랑 LED
- 값
- 블록모드로 전환
- 빠른입력-아날로그 에서 값 비교 블록을 추가
- “카운트”의 값 >= 2
[동작] 카운트가 3 이상이면 빨강 LED를 켜고 그렇지 않으면 끈다.
위와 동일한 방법으로 동작을 추가합니다.
- 타입: I/O장치
- 장치: 빨강 LED
- 값
- 블록모드로 전환
- 빠른입력-아날로그 에서 값 비교 블록을 추가
- “카운트”의 값 >= 3
대시보드
대시보드를 추가합니다.
버튼A, 버튼B 쓰기 위젯을 추가합니다.
- 구분: 쓰기
- 변수: “버튼A”
- 타입: 버튼
- 구분: 쓰기
- 변수: “버튼B”
- 타입: 버튼
카운트 값을 표시할 읽기 위젯을 추가합니다.
- 구분: 읽기
- 변수: “카운트”
- 타입: 텍스트
실행
버튼을 눌러서 RUN모드로 진입합니다.