목표
장애물 감지 적외선 센서를 이용하여 자동 소변기를 구현하는 예제입니다.
자동소변기는 사람이 감지되면 몇 초후에 물을 한번 내려주고, 사람이 감지되었다가 떠나면 한번 더 물을 내려줍니다.
사람감지 및 물펌프 작동여부는 대시보드 램프 위젯으로 표시합니다.
하드웨어
부품
부품 | 갯수 |
---|---|
장애물 감지 적외선 센서 | 1 |
연결
아래의 핀을 가로 방향으로 서로 연결합니다.
장애물 감지 센서 | GPIO |
---|---|
VCC ¹ | 3.3V |
GND | GND |
OUT ² | 15 |
I/O장치
장애물 감지 센서를 I/O장치에 추가합니다.
변수
사람감지 및 물펌프 등 필요한 변수를 추가합니다.
- “사람 감지” (디지털)
- “물펌프” (디지털)
- “소변중” (디지털)
로직
항상 장애물 감지 센서에서 장애물이 감지되었는지 여부를 읽어옵니다. 만약 3초 이상 계속 장애물이 감지되면 물펌프를 3초간 작동합니다. 물펌프가 작동한 이후에 사람이 떠나는 순간에 물펌프를 다시 3초간 작동합니다. 만약 사람이 3초보다 짧은 시간동안 감지되었다가 떠나면 물펌프를 다시 작동하지 않습니다. 이를 위해 “소변중”이라는 변수를 사용하여 물펌프의 작동여부를 결정합니다.
이를 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 항상 장애물 감지여부를 읽어온다
제어를 추가합니다. 모든 설정은 기본값을 사용합니다.
[조건] 항상
항상 만족하는 조건을 추가합니다.
타입: 항상유효
[동작] 장애물 감지 여부를 읽어온다
장애물 감지 센서의 값을 읽어서 “사람 감지” 변수에 저장하는 동작을 추가합니다.
- 타입: I/O장치
- 장치선택: 장애물 감지 센서
- 명령: READ_PIN
- 값: “사람 감지” 변수 선택
[제어] 3초 이상 장애물이 감지되면 물펌프를 3초간 작동한다.
조건 연산자가 AND (그리고)인 제어를 추가합니다.
[조건] 장애물이 3초 이상 감지되면
앞에서 장애물 감지 센서의 값을 “사람 감지”라는 변수에 저장했습니다. 그러므로 이 변수의 값이 3초이상 true인지 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “사람 감지”
- 연산자: = (같다)
- 값: true
- 조건옵션: 유지시간
- 값: 0시간 0분 3초 0밀리초
[조건] “소변중” 변수가 false라면
이 조건이 필요한 이유는 사람이 3초 이상 감지되고 물펌프가 동작을 완료한 뒤에 다시 물펌프가 동작하지 않게 하기 위함입니다. 만약 이 조건이 없다면 사람이 감지되는 동안 계속 3초마다 물펌프가 동작합니다.
- 타입: 비교
- 변수: “소변중”
- 연산자: = (같다)
- 값: false
- 옵션: 없음
[동작] 물펌프를 작동한다.
본 예제에서는 실제 물펌프를 사용하지 않고 대시보드의 램프 위젯을 사용합니다. 위젯과 연결된 “물펌프”라는 변수에 true를 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “물펌프”
- 값: true
[동작] 3초 대기한다.
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 3초 0밀리초
[동작] 물펌프를 정지한다.
“물펌프”라는 변수에 false를 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “물펌프” 선택
- 값: false
[동작] “소변중” 변수를 true로 설정한다.
“소변중” 변수를 true로 설정합니다. 이 변수는 사람이 감지되었다가 떠날때 다시 물펌프를 작동할지 결정하는데 사용됩니다.
- 타입: 쓰기
- 변수: “소변중” 선택
- 값: true
[제어] 사람이 감지되었다가 떠났고 “소변중” 변수가 true라면 물펌프를 다시 3초간 작동한다.
조건 연산자가 AND (그리고)인 제어를 추가합니다.
[조건] 사람이 감지되지 않는 순간
“사람 감지” 변수의 값이 true였다가 false가 되는 순간인지 검사하는 조건을 추가합니다.
- 타입: 비교
- 변수: “사람 감지”
- 연산자: = (같다)
- 값: false
- 조건옵션: 참인 순간
[조건] “소변중” 변수가 true라면
이 조건이 필요한 이유는 이전에 사람이 3초간 감지되어 물펌프가 작동했을 경우에만, 사람이 떠날 때 다시 물펌프를 작동하기 위함입니다. 만약 이 조건이 없으면 사람이 잠깐만 감지되었다가 떠나도 항상 물펌프가 작동하게 되는 문제가 있습니다.
- 타입: 비교
- 변수: “소변중”
- 연산자: = (같다)
- 값: true
- 옵션: 없음
[동작] 물펌프를 작동한다.
“물펌프” 라는 변수에 true를 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “물펌프” 선택
- 값: true
[동작] 3초 대기한다.
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 3초 0밀리초
[동작] 물펌프를 정지한다.
“물펌프”라는 변수에 false를 쓰는 동작을 추가합니다.
- 타입: 쓰기
- 변수: “물펌프” 선택
- 값: false
[동작] “소변중” 변수를 false로 설정한다.
사람이 떠났으므로 “소변중” 변수를 false로 초기화 합니다.
- 타입: 쓰기
- 변수: “소변중” 선택
- 값: false
대시보드
대시보드를 추가합니다.
사람이 감지되었는지 여부를 표시할 읽기 위젯을 추가합니다.
- 구분: 읽기
- 변수: “사람 감지”
- 타입: 램프
물펌프 작동여부를 표시할 읽기 위젯을 추가합니다.
- 구분: 읽기
- 변수: “물펌프”
- 타입: 램프
실행
버튼을 눌러서 RUN모드로 진입합니다.