altair의 프로젝트 일기

라즈베리파이 피코로 온습도계 만들기 본문

IT/임베디드

라즈베리파이 피코로 온습도계 만들기

altair823 2022. 6. 27. 04:08

1. 배경

 또 지겨운 여름이 시작되었다. 추우면 이불 속으로 들어가 숨기라도 하겠지만 이렇게 더운 날에는 피할 방도가 없다. 강렬한 태양신의 눈에는 누구도 벗어날 수 없는 모양이다. 녹은 아이스크림처럼 방바닥에 누워 어서 빨리 밤이 찾아와 숨 돌릴 수 있게 되기를 기다리고 있었다. 그러다가 보일러 패널이 눈에 들어왔다.

보일러 패널에는 항상 숫자가 하나 출력된다. 바로 현재 방의 기온이다. 요즘 같은 날에는 30도 밑을 볼 새가 없지만, 추운 겨울이 오면 21, 20, 심지어 17까지 내려가기도 한다. 그 날 내 눈에 보였던 온도는 30도였다. 도저히 믿기지 않았다. 이렇게 숨이 턱턱 막힐 정도로 더운데 30도 밖에 안된다고? 

 생각해보니 겨울에도 이런 일이 자주 있었다. 이불 속에 들어가 전기장판을 세게 틀어야 살만한 추운 겨울이면 내 체감 기온과 보일러 패널의 숫자 사이의 간극에 억울해 했던 기억이 있다. 나는 이렇게 추운데, 20도가 넘는다고?

 그러다가 문득 저번에 사놓고 핀 헤더까지 납땜해 브레드보드에 붙여놓고도 구석에서 처박혀 있는 라즈베리파이 피코가 떠올랐다. 살면서 한 번도 임베디드 센서나 전선들을 보드에 연결해 본 적이 없었지만 이 참에 쓸만한 온습도계도 만들고 공부도 해보는 기회로 삼기로 했다. 더울 때 에어컨을 트는 것에 대한 수치적인 이유도 얻으면 더 좋고.

 

2. 계획

 개인적으로는 계획을 잘 세우지 않지만 이런 프로젝트에서 계획이 얼마나 중요한지 몸으로 직접 배웠기 때문에, 그리고 무엇보다 센서나  디스플레이 등을 처음 사서 연결해보는 것이기 때문에 몇 가지 단계로 목표를 설정하고 진행했다. 

1. Jeff Geerling의 피코 리뷰 비디오에 따르면 라즈베리파이 피코는 내부에 온도 센서를 내장하고 있다고 한다. 이것이 현재 기온을 적절히 표시하는지 테스트 해본다. 

 

2. 1602 LCD 디스플레이를 사용해 측정한 온도를 출력해본다. 이를 통해 LCD에 문자열을 출력하는 방법을 익힌다. 

1602 LCD with I2C

 

3. 온습도 센서를 새로 구매해 피코에 연결하고 데이터를 받아온다. 사람들이 많이 사용하는 온습도 센서는 DHT-11과 DHT-22가 있는데 정밀도에 있어서 DHT-22가 더 유리하니 몇 천원 더 비싸더라도 이를 사용한다. 

DHT-22 온습도 센서 모듈. 이 처럼 모듈로 된 제품을 사용하면 저항 없이 보드에 직접 연결해도 이상이 없다.

 

DHT-11과 22의 차이점

4. 마지막으로 포맥스를 이용해 케이스를 제작하고 부품들을 전선으로 납땜하여 안에 집어넣는다. 그리고 배터리를 연결해 사용한다. 과거에 라즈베리파이 CCTV를 제작하면서 카메라 부품 거치대를 만들 때 쓴 포맥스가 많이 남아있고, 어디서 파는지도 알고 있다. 

 4단계를 제외한 나머지는 프로토타입 겸 테스트 성격이 강하고, 포맥스 케이스에 모두 집어 넣어야 완성이라고 볼 수 있을 것이다. 

 

3. 내부 온도 센서 값 읽기

 라즈베리파이 피코의 C SDK 문서를 보면, 피코에는 다음과 같은 기능의 ADC가 내장되어 있다고 한다. 

여섯 번째 항목을 보면 내부 온도 센서가 존재한다는 것이 보인다.

 

 또한 이어지는 다음을 보면, ADC 값은 한 번에 하나 씩 읽을 수 있으며 온도 센서는 4번 입력으로 값이 들어온다는 것을 알 수 있다. 

 

 이 내부 온도 센서를 사용하려면 몇 가지 단계를 거쳐야 한다. 먼저 다음 함수를 보자. 

 피코는 내부 온도 센서를 ADC를 통해 값을 받아오기 위해 먼저 온도 센서를 켜고 끄는 위의 함수를 사용해야 한다.

 그리고 위의 함수를 사용해 4번 입력을 ADC로 읽을 것을 설정한다. 

 모두 설정 했다면 위의 함수로 센서 값을 읽는다. 앞에서 언뜻 보였겠지만 문서는 온도 센서를 통해 읽은 값을 섭씨 온도로 바꾸는 방법을 다음처럼 알려주고 있다. 

T = 27 - ( ADC_Voltage - 0.706 ) / 0.001721

 이를 간단하게 C 코드로 나타내면 다음과 같다. 

uint16_t raw = adc_read();
const float conversion_factor = 3.3f / (1<<12);
float result = raw * conversion_factor;
float temp = 27 - (result -0.706)/0.001721;

 

4. 1602 LCD에 출력하기

 이번에는 어차피 LCD에 문자만 간단히 출력하면 되므로, 핀도 더 적게 쓰고 쉬운 I2C 통신을 사용했다. 

1602, 2004 LCD 데이터 버스를 I2C로 바꾸어주는 모듈

 1602 LCD와 피코의 와이어링 정보와 LCD관련 C 함수들은 피코의 C SDK 문서 부록에 잘 설명되어 있다. 와이어링만 간단히 살펴보면 다음과 같다. 

 만약 정격전압으로 5V를 사용하는 LCD라면 와이어링에 신경써야 할 것이다. 대부분의 1602 LCD는 5V를 정격전압으로 사용하는데, SCL과 SDA같은 데이터 버스는 3.3V를, LCD 백라이트는 5V를 필요로 한다. 저 그림에서 VCC가 연결된 곳은 피코가 3.3v를 출력하는 곳이므로, 이대로 연결하면 LCD가 흐릿하거나 올바르게 출력하지 않을 수 있다. (나의 경우 LCD가 너무 흐릿해 글자가 잘 보이지 않았다)

만약 피코가 USB 전원을 사용한다면 VCC 선을 피코의 USB 포트 바로 오른쪽(40번 핀)에 연결하는 것이 좋다. 

라즈베리파이 피코의 핀 구성

 피코의 데이터 시트를 보면 VBUS 핀은 마이크로 USB 전원에 직접 연결되어 있다고 한다. 만약 USB로 피코에게 전원을 주고 있다면 여기에서 5V 전압을 얻을 수 있다. 여기에 LCD의 VCC를 연결해 적절한 전압을 얻을 수 있었다(만약 USB가 아닌 다른 방법으로 전원을 인가하고 있다면 VBUS는 0V를 출력할 것이다).

 이하는 C SDK 문서 부록의 함수들을 사용해 LCD에 출력하는 코드이다. 

lcd_set_cursor(0, 0);
char title[16] = "Pico temp!";
lcd_string(title);

lcd_set_cursor(1, 0);
char temp_str[16];
std::string t = "temp: " + std::to_string(temp);
strcpy(temp_str, t.c_str());
lcd_string(temp_str);

 

5. 마이크로 파이썬

 LCD를 연결하면서 여러 뻘짓을 하다가 보니 왜 굳이 C로 프로그램을 작성하고 있는지 의문이 들었다. 저번 피코 프로젝트는 최적화를 통한 높은 성능을 요구했기 때문에 C++로 만들었지만, 이번 프로젝트는 기껏해야 온도를 센서에서 읽어와 LCD에 출력하는게 다인데 말이다. 그래서 위의 LCD 출력까지 C로 작성했지만 생산성과 편의를 위해 MicroPython으로 다시 작성했다. 앞으로 소개하는 모든 진행상황은 모두 마이크로 파이썬으로 만들었다. 

 1602 LCD 출력 코드는 dhylands/python_lcd T-622/RPI-PICO-I2C-LCD 를 참조해 사용하였다. 

 

6. 온습도 센서 모듈 연결하기

DHT22-datasheet (1).pdf
0.88MB

 위 파일은 내가 산 DHT-22의 데이터 시트다. 이에 따르면, 온습도 모듈 DHT-22는 핀이 4개 있지만 하나는 사용하지 않는다(만약 핀이 3개 있는 모듈이라면 모두 사용해야 한다)

3번 핀이 NULL로 적혀있는 것을 볼 수 있다.

 또한 LCD와는 다르게 3.3V부터  6V까지 전원으로 사용할 수 있으므로, LCD가 사용하는 VBUS가 아닌 36번 핀인 3V3(OUT)을 사용하면 된다. 

 마이크로 파이썬은 온습도 모듈 DHT-22를 지원한다. 문서를 보면

 이렇게 예시를 들고 있다. DHT22 클래스를 특정한 핀 객체를 사용해 생성한다. 

 그리고 생성한 객체를 사용해 온도와 습도를 각각 섭씨와 퍼센트 값으로 얻을 수 있다. 

 여기서 주의할 점은 객체 생성에 쓰인 핀 번호가 피코의 데이터 시트의 일반적인 핀 번호가 아닌 GPIO핀의 번호라는 것이다. 만약 위 시트 기준으로 왼쪽 위에서부터 4번째 핀에 연결했다면 그 핀은 GP2, 즉 GPIO 2번 핀이므로 DHT22(machine.Pin(2))라고 생성자에게 주어야 하는 것이다(이것 때문에 한참 해맸다......). 

 잠깐 딴길로 새자면, LCD의 I2C 연결 또한 핀 번호를 필요로 하는데, 이 역시 GPIO 핀 번호를 생성자에 주어야 한다.

마이크로 파이썬의 I2C 클래스는 I2C 식별자와 SCL, SDA 핀의 GPIO 핀 번호를 요구한다.

 나의 경우 LCD의 주파수까지 200000으로 바꿔줘야 작동했다. 

 어쨌든 이런 식으로 온습도 센서의 값을 읽고 LCD에 출력할 수 있었다. 

7. 가조립

피코에 온습도 센서, LCD를 모두 연결한 모습. 온습도가 올바르게 출력되고 있다.

7. 케이스에 넣기

 과거에 써봤던 소재인 포맥스를 사용해 케이스를 제작했다. 포맥스는 압축한 스티로폼으로 생각하면 편한데, 단단하고 폼보드보다 자국이 쉽게 남지 않는 장점이 있다. 게다가 집에서 커터칼로도 자를 수 있느니 꽤 적합한 재료였다. 접착제로는 글루건을 사용했다. 

 

Extruded PVC Foam Sheet - Google 검색

Piedmont Plastics carries foam PVC sheet and expanded PVC, including Sintra, Komatex, and Celtec, for point of purchase (POP) displays, signs, and kiosks.

www.google.com

포맥스에 구멍을 뚫고 LCD와 센서를 박아 넣었으며, 전선들은 각 핀에 납땜했다.
뚜껑을 덮기 전.
뚜껑을 덮고 완성한 모습. 온도와 습도가 올바르게 나오고 있다.
18650 리튬이온 배터리를 전원으로 사용하는 모습. 마이크로 USB를 연결하면 모두 전원이 될 수 있다.

 

마무리

 처음으로 마이크로컨트롤러에 여러 모듈을 연결해 본 프로젝트였다. 평소에 수업에서 내주는 과제와 달리 문제를 해결하기 위해 온갖 곳을 돌아다니고 데이터 시트들을 읽어보는게 새롭고 즐거운 경험이었다. 모니터에 나오는 글자들만 보며 '와, 잘 돌아가네' 하고 끝냈던 프로젝트들과 달리 내 생활에 실제로 유용한 전자제품을 만들어볼 수 있다는게 정말 짜릿했다. 앞으로도 필요한 간단한 전자제품이 있다면 이렇게 부품만 몇 개 사서 직접 만들 수도 있지 않을까?

 

참고

파이썬으로 작성한 전체 소스코드

 

GitHub - altair823/pico_temperature_py

Contribute to altair823/pico_temperature_py development by creating an account on GitHub.

github.com

 

 

GitHub - altair823/pico_temperature_cpp

Contribute to altair823/pico_temperature_cpp development by creating an account on GitHub.

github.com

(C++ 소스코드는 온습도 센서 측정을 포함하지 않는다)

 

class I2C – a two-wire serial protocol — MicroPython 1.19.1 documentation

© Copyright - The MicroPython Documentation is Copyright © 2014-2022, Damien P. George, Paul Sokolovsky, and contributors. Last updated on 18 Jun 2022.

docs.micropython.org

 

 

 

MicroPython: ESP32/ESP8266 with DHT11/DHT22 Temperature and Humidity Sensor | Random Nerd Tutorials

This tutorial shows how to use the DHT11 or DHT22 temperature and humidity sensors with the ESP32 and ESP8266 development boards using MicroPython firmware.

randomnerdtutorials.com

 

 

 

Raspberry Pi Documentation - RP2040

The official documentation for Raspberry Pi computers and microcontrollers

www.raspberrypi.com

 

Comments