목표
비닐하우스의 온도, 습도 및 비 감지 여부에 따라 아래와 같이 동작합니다.
- 내부 온도가 30℃ 이상이면 5초 동안 창을 열고 (모터 정방향 회전) 5초 동안 대기
- 내부 온도가 20℃ 미만이면 5초 동안 창을 닫고 (모터 역방향 회전) 5초 동안 대기
- 강우센서에 비가 감지되면 온도와 상관없이 창을 닫기
- 내부 습도가 90% 이고 온도가 15℃ 이상이면 5초 동안 창을 열고 (모터 정방향 회전) 5초 동안 대기
측정된 온도와 습도는 대시보드의 게이지 위젯으로 표시하고 강우센서는 대시보드의 스위치 위젯으로 대체합니다.
본 예제에서는 창의 최대 열림, 최대 닫힘은 고려하지 않습니다.
하드웨어
부품
부품 | 갯수 |
---|---|
온습도 센서 (DHT11) | 1 |
5V 소형 DC 모터 | 1 |
L298N 모터 드라이버 | 1 |
5V DC Power Supply | 1 |
연결
아래의 핀을 가로 방향으로 서로 연결해줍니다.
DC모터 | L298N | DC 5V 파워 | DHT11 | GPIO |
---|---|---|---|---|
+ | OUT1 | | | |
– | OUT2 | | | |
| ENA ¹ | | | 16 |
| IN1 ¹ | | | 20 |
| IN2 ¹ | | | 21 |
| 5V | + | | |
| GND | – | | GND |
| | | VCC ² | 3.3V |
| | | Data ¹ | 15 |
| | | GND | GND |
I/O장치
DHT11, DC모터를 I/O 장치에 추가합니다.
변수
비 감지 여부 및 온도, 습도를 저장할 변수를 추가합니다.
- “온도” (숫자)
- “습도” (숫자)
- “비 감지” (디지털)
로직
우선, DHT11 센서로 부터 온도와 습도를 항상 읽어옵니다.
그런 다음, 제어그룹의 우선모드 옵션 중 “우선순위”를 이용하면 중요한 순서에 따라 실행 여부를 제어할 수 있습니다.
구현 내용을 가장 중요한 순서로 우선 순위를 매기면 아래와 같습니다. (숫자가 작은 것이 우선 순위가 높음)
즉, 우선 순위가 가장 높은 항목이 실행될 때 이보다 우선 순위가 낮은 항목들은 실행되지 않습니다.
- 우선 순위 1
- 내부 습도가 90% 이상이고 내부 온도가 15℃ 이상이면 비 감지 여부와 상관없이 창을 5초 동안 열고 (모터 정방향 회전) 5초 동안 대기
- 우선 순위 2
- 강우센서에 비가 감지되면 온도와 상관없이 창을 닫기
- 우선 순위 3
- 내부 온도가 30℃ 이상이면 5초 동안 창을 열고 (모터 정방향 회전) 5초 동안 대기
- 내부 온도가 20℃ 미만이면 5초 동안 창을 닫고 (모터 역방향 회전) 5초 동안 대기
이를 알고리즘 블록으로 나타내면 아래와 같습니다.
[로직]
로직을 추가합니다. 실행주기는 기본값을 사용합니다.
[제어] 항상 온도와 습도를 읽어온다.
DHT11 센서는 온도와 습도를 읽는 최소한 1초가 소요됩니다. 그러므로 센서에서 온도와 습도를 읽고 1초를 대기한 뒤에 다시 읽어야 합니다.
제어를 추가합니다. 모든 설정은 기본값입니다.
[제어그룹]
제어그룹을 추가합니다. 우선모드는 “우선순위”로 설정합니다.
[제어] 온도가 30도 이상이면 5초동안 창을 열고 5초동안 대기한다.
제어를 추가합니다. 우선순위는 3으로 설정합니다.
[조건] 온도가 30도 이상이면
“온도” 변수의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “온도”
- 연산자: >= (크거나 같다)
- 값: 30
- 옵션: 없음
[동작] 모터를 정방향 회전한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: true
- 회전속도: 100
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 5초 0밀리초
[동작] 모터를 정지한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: true
- 회전속도: 0
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 5초 0밀리초
[제어] 온도가 20도 미만이면 5초동안 창을 닫고 5초동안 대기한다.
제어를 추가합니다. 우선순위는 3으로 설정합니다.
[조건] 온도가 20도 미만이면
“온도” 변수의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “온도”
- 연산자: < (작다)
- 값: 20
- 옵션: 없음
[동작] 모터를 역방향 회전한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: false
- 회전속도: 100
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 시간: 0시간 0분 5초 0밀리초
[동작] 모터를 정지한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: false
- 회전속도: 0
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 5초 0밀리초
[제어] 비가 감지되면 창을 닫는다
제어를 추가합니다. 우선순위는 2로 설정합니다.
[조건] 비가 감지되면
본 예제에서는 강우 센서 대신 대시보드의 스위치 위젯을 사용합니다. 그러므로 위젯과 연결된 “비 감지”라는 변수의 값이 true 인지 여부를 검사합니다.
- 타입: 비교
- 변수: “비 감지” 선택
- 연산자: = (같다)
- 값: true
- 옵션: 없음
[동작] 모터를 역방향 회전한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: false
- 회전속도: 100
[제어] 습도가 90% 이상이고 온도가 15도 이상이면 5초간 창을 열고 5초간 기다린다
제어를 추가합니다. 조건 연산자는 AND (그리고), 우선순위는 1로 설정합니다.
[조건] 습도가 90% 이상이면
“습도” 변수의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “습도”
- 연산자: >= (크거나 같다)
- 값: 90
- 옵션: 없음
[조건] 온도가 15도 이상이면
“온도” 변수의 값을 비교하는 조건을 추가합니다.
- 타입: 비교
- 변수: “온도”
- 연산자: >= (크거나 같다)
- 값: 15
- 옵션: 없음
[동작] 모터를 정방향 회전한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: true
- 회전속도: 100
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 시간: 0시간 0분 5초 0밀리초
[동작] 모터를 정지한다.
동작을 추가합니다.
- 타입: I/O장치
- 장치선택: DC모터
- 명령: RUN
- 값
- 회전방향: true
- 회전속도: 0
[동작] 5초동안 기다린다
동작을 추가합니다.
- 타입: 시간지연
- 값: 0시간 0분 5초 0밀리초
대시보드
대시보드를 추가합니다.
온도를 표시할 위젯을 추가합니다.
- 구분: 읽기
- 변수: “온도”
- 타입: 게이지
- 단위: ℃
습도를 표시할 위젯을 추가합니다.
- 구분: 읽기
- 변수: “습도”
- 타입: 게이지
- 단위: %
비 감지여부를 설정할 위젯을 추가합니다.
- 구분: 쓰기
- 변수: “비 감지”
- 타입: 스위치
실행
버튼을 눌러서 RUN모드로 진입합니다.