라즈베리파이 4B에 MH-Z19B 붙이기

취미삼아 라즈베리파이 4B 로 MagicMirror 를 활용한 디지털 앨범을 만들어보는 중입니다. (해당 내용에 대한 글은 작업이 완료되면 올릴 예정입니다.)

시간, 날씨, 배경사진 등과 같은 기능들은 MagicMirror 에서 제공하는 모듈들 설치만으로 쉽게 출력할 수 있었습니다만.. 뭔가 심심합니다.

마침 집에 온습도계처럼 이산화탄소나 미세먼지 농도들을 눈으로 쉽게 확인할 수 있는 기기가 있으면 좋겠다고 생각했는데 잘 됐습니다.

저희 집에 아주 작은 꼬맹이가 있어서 요즘같이 더울땐 창문 꼭꼭 닫고 에어컨 내내 틀어주는 중인데, 이럴땐 집안의 이산화탄소 농도 신경써서 환기 시켜줘야 한다더군요.

하지만... 어떻게 신경써야 하는지 잘 모르겠더라구요. 그렇다고 너무 자주 환기 시키자니 전기세도 신경쓰이구요. 따라서 이왕 디지털 앨범 제작 시작한 것 조금 더 욕심 부려서 몇몇 센서들도 라즈베리파이 4b 에 붙여서 앨범에서 쉽게 확인할 수 있도록 진행해보기로 했습니다.

먼저, 정말 가장 신경쓰이는 이산화탄소 농도 측정을 위해 이산화탄소 센서를 먼저 붙여보겠습니다.


MH-Z19B - 이산화탄소 측정 센서

센서는 사전 조사 끝에 Winsen 사의 MH-Z19B를 사용하기로 했고, 해당 센서의 주요 특징들을 다음과 같이 정리해보았습니다. 이 외 내용은 아래 Datasheet 에 기술되어 있습니다.

  • NDIR 방식(IR 방식 대비 정밀도 ↑, 수명 ↑, 측정 가능 시간 ↑, 비용 ↑, 대중적으로 사용됨)
  • 3 종류의 측정 범위를 코드를 통해 동적으로 설정 가능함.
    • 0 ~ 2000ppm
    • 0 ~ 5000ppm
    • 0 ~ 10000ppm
  • 동작 전압: 5V
  • 평균 소모 전류: < 20mA
  • 센서 출력 방식: UART, PWM, Analog Output 지원
  • 원형인 MH-Z19 에서 MH-Z19B 와 같이 외부 형태가 조금 변경된 모델들이 있어 용도에 따라 선택 필요함. 집에 인두기가 없어 땜질 필요 없는 MH-Z19B 로 선택함.
  • MH-Z19Z 는 브레드보드에 딱 맞을 것 처럼 생겼으나.. 맞지 않아 MH-Z19B로 최종 선택함.
MH-Z19 시리즈


라즈베리파이 4B UART0 활성화

MH-Z19B 와 라즈베리파이 4B 는 UART ITF 로 붙일 계획입니다. 먼저 라즈베리파이 4B 의 UART 포트 활성화 및 UART0 에 할당된 블루투스 장치를 Mini UART 로 돌릴 필요가 있습니다. 설정 방법은 다음과 같고, 라즈베리파이 홈페이지의 UART 설정 페이지를 참고하여 정리한 내용입니다.

먼저 /boot/config.txt 의 마지막에 다음과 같은 내용을 추가합니다.

$ sudo vim /boot/config.txt
...
# Mini UART 활성화
enable_uart=1

# 블루투스 장치가 Mini UART 사용하도록 변경 및 PL011(UART0)를 Primary UART 로 변경
dtoverlay=miniuart-bt
core_freq=250

다음으로는 콘솔에서 raspi-config 명령을 수행합니다.

$ sudo raspi-config

이후 아래 기술된 순서에 따라 설정하여 Linux serial console 비활성화 및 Serial Port 를 활성화 합니다.

  1. 5 Interfacing Options 선택
  2. P6 Serial 선택
  3. Would you like a login shell to be accessible over serial? 에서 "No" 선택
  4. Would you like the serial port hardware to be enabled? 에서 "Yes" 선택
  5. raspi-config 종료 및 Pi 재부팅(sudo reboot)


라즈베리파이 4B 와 MH-Z19B 연결

아래 라즈베리파이 4B와 MH-Z19B 의 핀 맵핑을 확인하여 그림과 같이 연결합니다. TXD, RXD 는 반대로 연결해야 하는 것 유의 필요합니다. (이 연결은 라즈베리파이 4B 와 MH-Z19B 간 UART 통신을 위한 연결이고, 이 외 센서의 PWM, Analog Output 출력을 사용하기 위해서는 다른 방식의 연결이 필요합니다.)

라즈베리파이 4B <-> MH-Z19B 핀 맵핑

라즈베리파이 4B <-> MH-Z19B 핀 맵핑

라즈베리파이 4B <-> MH-Z19B 와이어링

라즈베리파이 4B <-> MH-Z19B 와이어링

실제 연결 사진

다음은 제가 가진 라즈베리파이 4B 에 MH-Z19B 를 연결한 사진입니다. 센서 하단에 조금 두꺼운 양면 테이프 붙여서 작은 싸이즈 빵판에 붙였더니 깔끔하게 정리가 되더라구요.


MH-Z19B 센서 값 출력해보기

개인적으로 Java 가 제일 익숙하니, Java 로 코드를 작성해보기로 합니다. 다행히 맨땅부터 시작할 필요없이 이미 라즈베리파이 3B 에서 MH-Z19B 를 위한 드라이버 코드를 Github 에서 찾을 수 있었습니다.

해당 코드 베이스로 Gradle 기반 프로젝트로 생성해서, 조금만 입맛에 맞게 수정 후 수행 해 보았습니다. 아래 출력 결과처럼 센서값 잘 받아와서 출력해주고 있네요. 작성한 코드는 https://github.com/alprogs/mh-z19b-tool 에서 받으실 수 있습니다.

$ gradle run 
Starting a Gradle Daemon, 2 incompatible Daemons could not be reused, use --status for details

> Task :run
[18:06:54][MHZ19BDriver ][open ][82 ] [/dev/serial0] before - useCount:0 timeout:1000
[18:06:54][MHZ19BDriver ][open ][85 ] [/dev/serial0] opening serial port…
[18:06:56][MHZ19BDriver ][open ][96 ] [/dev/serial0] opened serial port.
[18:06:56][MHZ19BDriver ][open ][99 ] [/dev/serial0] after - useCount:1 timeout:1000
[18:06:56][MHZ19BDriver ][setDetectionRange ][251] [/dev/serial0] set the detection range to 5000 ppm.
[18:06:56][MHZ19BDriver ][setAutoCalibration ][241] [/dev/serial0] set auto calibration to OFF.
[18:06:56][App ][doProcess ][29 ] CO²:256
[18:07:06][App ][doProcess ][29 ] CO²:970
[18:07:16][App ][doProcess ][29 ] CO²:969
[18:07:26][App ][doProcess ][29 ] CO²:969
...

센서 값은 환기 중에는 600ppm 정도 나오다가, 평균 1000ppm 정도이고 하루정도 창문 꼭꼭 닫고 있다보면 1500ppm 까지도 오르더군요. 아래 그림에 따르면 1000ppm 이상은 넘지 안도록 관리하는게 좋을 것 같습니다. 작업중인 디지털 앨범에는 본 프로그램 조금 수정해서 CO2 값 출력되도록 했는데 훨씬 마음에 드네요. 조금 더 욕심 부려서 센서 한두개만 더 붙여봐야겠습니다.

CO2 농도에 따른 인체에 끼치는 영향


* Environment

- HW: Raspberry Pi 4 Model B 8G
- OS: Raspberry Pi OS Buster 64bit
- openjdk-14-jdk
- Gradle 6.6


* References

- Raspberry Pi Model 4B Datasheet (Release 1, 2019.06.21)
- MH-Z19B Datasheet (Ver 1.5, 2019.09.23)
- Raspberry Pi Foundation: UART Configuration
- GitHub: mh-z19b-driver

Leave a Comment