자바스크립트(JavaScript)로 배우는 피지컬 컴퓨팅(Physical Computing) — (5/8) 온도와 습도 측정하기

Minkyu Lee
7 min readMay 14, 2021

--

이번 강좌에서는 디지털 펄스(Digital Pulse)를 이해하고 DHT11 디지털 온습도 센서를 이용하여 온도와 습도를 측정해보도록 하자.

강좌 전체 목차

준비물

  • 라즈베리파이 피코 — 1개
  • 브레드보드(Breadboard) — 1개
  • 디지털 온습도 센서(DHT11) — 1개(모듈 형태도 무방)
  • 점퍼 와이어 — 여러 개

DHT11은 매우 대중적으로 많이 쓰이는 디지털 온도 습도 센서이다. DHT 온습도 센서는 다양한 종류가 있는 DHT11, DHT22 가 가장 많이 쓰인다. 각각의 동작 방식과 정확도가 약간씩 차이가 있음을 유의하자.

DHT11 디지털 온습도 센서의 핀아웃(pinout)

회로 구성

DHT11 센서의 VCC와 GND 핀을 각각 3V3과 GND에 연결한다. 거의 모든 센서와 부품은 전력 공급이 필요하기 때문에 항상 3V3, GND에 기본적으로 연결이 되어야 한다. 마지막으로 온도 습도 데이터를 전달 받기 위한 위한 OUT 핀을 GPIO15에 연결한다.

DHT11을 피코에 연결

프로젝트 만들기

지난번 강좌까지는 터미널과 텍스트 편집기만 간단히 사용해왔다. 이번 강좌부터는 프로젝트를 생성하고 외부 라이브러리를 사용해 볼 예정이다. 먼저 프로젝트 폴더를 만들어보자. 그리고 npm init 명령어로 간단히 프로젝트를 초기화해보자. 그러면 일반적인 Node.js 프로젝트에서 처럼 기본적인 package.json 가 생성될 것이다.

$ mkdir dht11-test
$ cd dht11-test
$ npm init -y

외부 라이브러리 사용하기

모든 부품은 제각기 사용하는 방법이 있다. 이러한 방법은 부품의 제조사가 데이터시트(datasheet)라는 문서를 항상 함께 제공한다. 데이터시트에는 부품의 특성 및 사용법 등이 상세하게 기록되어 있다. 부품의 고유 번호를 안다면 alldatasheet.com 에서 검색할 수 있다.

하지만 데이터시트를 보고 부품을 사용하는 것은 전문지식을 갖고 있지 않은 사람이 하기에는 어려움이 많다. 그래서 부품을 쉽게 쓸 수 있는 라이브러리를 개발자들이 오픈소스로 공개하는 경우가 많다. Kaluma 공식 홈페이지에는 공개되어 있는 모듈을 Packages 페이지에서 찾을 수 있다. 물론 우리가 사용할 DHT 온습도 센서도 라이브러리를 찾을 수 있다. 여기서 해당 모듈에 대한 Github URL이 공개 되어 있는데, 이것으로 모듈을 내 프로젝트에 설치할 수 있다.

$ npm install https://github.com/niklauslee/dht --save

라이브러리를 추가했다면 package.json 파일도 해당 모듈이 추가되어 있을것이다.

센서에서 온습도 읽기

아래 코드를 index.js 에 작성하고 파일을 저장한 다음 CLI를 사용하여 프로그램을 업로드를 해보자.

DHT11 센서 값을 읽고 터미널에 표시하기
$ kaluma flash index.js --port <port> --bundle

CLI 명령에서 --bundle 옵션에 주목하자. index.js 프로그램은 외부 모듈인 dht 를 사용하고 있기 때문에, 업로드를 하기 전에 하나의 파일로 번들링이 되어야 한다. 이를 CLI가 자동으로 해주는 것이 바로 --bundle 옵션이다. 별로 번들링을 하고 싶다면 bundle 명령을 직접 사용하거나, Webpack 등과 같은 도구로 직접 번들링을 하여도 무방하다.

한번 업로드된 프로그램은 Pico 내부의 플래쉬 메모리에 저장되고 곧바로 실행이 되는데, 콘솔로 출력한 온습도 정보를 확인할 수가 없다. 따라서 다시 터미널로 접속해주어야 한다. 터미널에 접속하면 이미 메시지가 일부 지나쳐 있을 수 있는데, 처음부터 업로드된 프로그램을 다시 실행하고 싶다면 터미널에서 .load 명령만 보내주면 된다. 우리집의 온도와 습도를 측정할 수 있는 장치를 이렇게 쉽게 만들 수가 있다!

> .load
Humidity: 58 %
Temperature: 25.4 C

디지털 펄스 (Digital Pulse)

DHT11 센서와 데이터를 주고 받을 수 있는 것이 OUT 핀 하나 밖에 없는데 어떻게 온도와 습도 정보를 요청하고 전달 받을 수 있는 것일까? DHT11 센서의 작동 방법을 간단하게 설명하면 다음과 같다.

  1. Pico는 온습도 데이터를 달라고 요청하기 위해, OUT 핀으로 HIGH 신호를 특정 시간 동안 보낸다.
  2. DHT11 센서는 요청이 확인되면, 온도와 습도 데이터를 변조(modulation)해서 OUT핀으로 전송한다. 쉽게 말하면 온도와 습도 데이터를 2진수로 바꾼 다음 01을 순서대로 보내는데, 이 때 HIGH 신호를 짧게주면 0으로 처리, HIGH 신호를 길게주면 1로 처리하는 방식이다. 이렇게 총 40-bit를 전송한다.
  3. Pico는 OUT 핀의 신호 변화를 잘 관찰하면서 HIGH 신호와 LOW 신호를 측정한 다음, 그 결과를 바탕으로 복조(demodulation)하여 원래의 온도와 습도 데이터를 읽어낸다.

기본적으로 원리는 어렵지 않지만, 이것을 직접 프로그램으로 작성해서 온도 습도 데이터를 읽기에는 만만치가 않다. 그래서 그냥 라이브러리를 사용해서 쉽게 read() 함수만 호출하면 된다.

그래도 Kaluma에서는 이러한 디지털 펄스를 쉽게 읽을 수 있는 pulseRead() 함수를 제공한다는것 쯤은 알아두자. 이 함수는 특정 핀에서 HIGHLOW 신호가 얼마의 시간 동안 유지 되었는지를 마이크로초(microsecond) 단위로 기록해서 배열로 돌려준다. 예를 들어 아래 그림과 같은 신호가 GPIO15번 핀으로 들어온다고 가정해보자.

아래 코드와 같이 실행하면 GPIO15번핀에서 3번의 신호 변화를 관찰하고 각 신호가 유지된 시간을 us (microseconds — 1/1,000,000초)단위로 돌려주는데, 단 HIGH 값이 읽어졌을 때 부터 기록을 시작한다. 결과는 [30, 20, 50] 이 나올 것이다. pulseRead() 함수에 대한 자세한 내용은 역시 레퍼런스를 참고하기 바란다.

> pinMode(15, INPUT);
> pulseRead(15, 3, {stateState: HIGH});
[30, 20, 50]

이번 강좌에서는 디지털 펄스에 대해서 배우고 이를 통해 DHT11 센서에서 온도와 습도 값을 읽어서 터미널에 표시해 보았다. 다음 강좌에서는 이것을 별도의 디스플레이에 표시해서 실제 사용이 가능하도록 해보자.

--

--

Minkyu Lee
Minkyu Lee

Written by Minkyu Lee

PhD in Computer Science, JavaScript enthusiast, Amateur Jazz drummer.

No responses yet