라즈베리 파이용 콤팩트 DHT 온습도 브레이크아웃: ATtiny85와 DHT22/DHT11
하드웨어 구성요소: Atmel ATTiny85 × 1 DHT22 온도 센서 × 1 DHT11 온습도 센서 × 1 SparkFun Tiny AVR Programmer × 1 Adafruit 4.7K Ω 저항 × 3 Adafruit 10K Ω 저항 × 1 Adafruit 100 Ω 저항 × 1 Adafruit 확산형 파란색 3mm LED × 1 Adafruit 택타일 버튼 스위치 × 1 Adafruit 브레이크어웨이 0.1″ 36핀 스트립 수 헤더 1개 @ 길이 6, 1개 @ 길이 2 (총 8핀) × 1 범용 점퍼 (0.1″) × 1 Arduino UNO & Genuino UNO 선택 사항 – 디버깅 및 테스트용. × 1 소프트웨어 앱 및 온라인 서비스: Microsoft Visual Studio 2015 Microsoft Windows 10 IoT Core Arduino IDE
이야기
소개
DHT11과 DHT22는 매우 저렴한 비용으로 정확도가 높아 인기 있는 온습도 센서입니다. 하지만 독자적인 원와이어 프로토콜로 작동해 정밀한 타이밍이 필요합니다. 이 센서들은 비실시간 운영체제를 실행하는 보드에서 읽기 어렵다는 것이 입증되었습니다.
한동안 전 "DHT11/DHT22 온도 센서"라는 제목의 글을 올려 C#에서 Microsoft C++ 샘플 코드를 사용해 이 센서들을 읽는 방법을 시연했습니다. 라이브러리는 판독값을 얻었지만 더 신뢰성 있게 만들기 위해 재시도 로직을 추가해야 했습니다. 이는 대부분 성공적이었지만 일부 사람들은 일관되게 작동시키는 데 어려움을 겪었습니다.
Windows 10 IoT Core를 실행하는 라즈베리 파이에서 이 센서들을 사용하는 데 대한 관심이 높은 것을 보고, 저렴한 비용을 유지하면서 매우 신뢰할 수 있는 센서 읽기 방법을 제공하는 두 번째 옵션을 만들기로 결정했습니다.
개요
여기서 제시하는 접근법은 DHT 센서를 저렴한 ATtiny85에 연결하고 I2C 슬레이브 장치로 설정하는 것입니다. 이는 TinyWireS 라이브러리를 사용하고 장치와 상호작용하기 위해 읽고 쓸 수 있는 레지스터 세트를 생성해 달성합니다.
이 장치는 다음 기능을 지원합니다:
- DHT 센서 읽기 간격을 지정하는 구성 가능한 읽기 간격. 기본값은 2초마다 읽기.
- 간격을 비활성화하고 요청 시 읽기를 수행하는 수동 모드.
- 현재 온도 판독값이 임계값 위 또는 아래일 때 인터럽트 핀을 트리거하는 구성 가능한 상한/하한 온도 임계값.
- 구성 저장 모드: 전원 켜짐 또는 리셋 후 구성된 설정을 복원.
- 구성 리셋: 저장된 구성을 기본값으로 재설정.
- 센서 전원 제어: 센서 전원을 켜고 끌 수 있어 전력 절약 가능.
- 프로그래머블 I2C 장치 주소. 기본 주소는 0x26이지만 명령으로 변경 가능. 장치가 주소를 기억함. 리셋 시 0x26으로 복구. C# 라이브러리에는 I2C 버스에서 장치를 검색하는 코드도 포함되어 있어 주소를 몰라도 연결 가능.
- 프로그래머블 DHT 모델 선택. 펌웨어 기본값은 DHT22지만 명령으로 다른 모델 사용 가능. 모델은 저장되어 리부팅이나 전원 사이클 후에도 유지.
소스 코드
이 프로젝트에는 세 가지 코드 세트가 있습니다. 보드용 메인 펌웨어, 아두이노 우노에 연결해 보드를 테스트하고 시연하는 아두이노 마스터 스케치, 라즈베리 파이에서 장치 사용법을 보여주는 Windows 10 IoT 코드 애플리케이션. 모든 코드는 링크된 GitHub 저장소에서 확인 가능합니다.
장치/회로
회로는 작고 몇 가지 저렴한 부품만 사용합니다. ATtiny85는 여러 공급업체에서 구입 가능합니다. 여러 개 구비해 두면 여러 용도로 유용합니다.
회로에는 다른 회로나 라즈베리 파이에 직접 연결할 수 있는 6핀 헤더가 있습니다. 핀 정의는 다음과 같습니다:
- GND → 자신의 회로 그라운드 또는 라즈베리 파이 그라운드 핀에 연결.
- RST → 장치 리셋/재부팅용. 정상 작동 시 5V에 연결. 이 핀에 순간적인 LOW 펄스를 줘서 장치 리셋.
- INT → 두 가지 용도. 임계값 활성화 시 임계값 초과하면 HIGH, 아니면 LOW. 절전 모드 사용 시 순간적인 HIGH 펄스로 장치 깨우기.
온보드 LED를 활성화(점퍼 추가) 또는 비활성화(점퍼 제거)하는 2핀 헤더도 있습니다.
더 큰 프로젝트에 활용할 경우 DHT Tiny 회로를 프로젝트 기존 회로에 병합하거나 내장할 수 있습니다. 이 경우 헤더 핀과 LED는 선택 사항입니다.
별도 보드에 회로를 구성하고 몇 가닥 와레나 연결 케이블로 라즈베리 파이에 연결할 수도 있습니다.
ATtiny85 프로그래밍
DHT_Tiny_Breakout.ino 스케치를 AVR 프로그래머로 ATtiny85에 로드하세요. 프로그래머가 없다면 아두이노 우노(또는 유사 보드)를 사용하세요. 아래 기사 중 하나 이상을 참고하세요.
- Hackster.io의 아두이노 우노로 ATtiny85 프로그래밍
- 가상 워크숍: 아두이노로 ATTiny85 프로그래밍
- 아두이노 1.6(또는 1.0)으로 ATtiny 프로그래밍
저는 SparkFun Tiny AVR Programmer로 ATtiny85를 로드합니다.
칩을 16MHz로 실행 중입니다. 방법에 대한 지침은 제 기사 ATtiny @ 16MHz를 참조하세요.
ATtiny85 사용 시 슬레이브 스케치에 TinyWireS 라이브러리가 라이브러리 폴더에 설치되어 있어야 합니다. 이 라이브러리는 https://github.com/rambo/TinyWire에서 다운로드 가능합니다.
브레드보드에 회로 구성
첫 단계는 DHT Tiny를 브레드보드에서 작동시키는 것입니다. 하프 사이즈 브레드보드에 프로젝트에 포함된 회로도와 브레드보드 다이어그램을 따라 회로를 구성하세요.
도움을 위한 몇 가지 팁:
- DHT Tiny를 별도 브레드보드에 구성한 뒤 다른 브레드보드로 DHT Tiny와 우노 또는 라즈베리 파이 간 연결을 만드세요.
- 헤더 핀 사용을 권장합니다. DHT Tiny를 단일 유닛으로 연결/분리하기 쉽기 때문입니다.
- 브레드보드에 표준 브레이크어웨이 수 헤더를 사용할 경우 검은색 플라스틱 림을 핀 중앙으로 조정해 브레드보드에 맞게 하세요(아래 이미지 참조). 롱노즈 플라이어로 조정하세요.
- 긴 브레이크어웨이 0.1″ 수 헤더가 있다면 브레드보드에 사용하세요. PCB에 납땜할 계획이면 일반 크기 헤더를 사용하세요. 긴 헤더는 PCB에 권장되지 않습니다.
- 브레드보드에 헤더 핀을 사용할 경우 암-암 점퍼 와이어가 필요합니다. 없다면 헤더 핀을 생략하고 두 보드 사이에 수-수 점퍼 와이어를 사용하세요.
- 와이어를 칩에서 최대한 멀리 떨어뜨려 칩을 빼서 프로그래밍하기 쉽게 만드세요.
아래는 제 DHT Tiny 브레드보드 버전 이미지들입니다.
아두이노 우노 연결
빠른 테스트, 시연, 또는 라즈베리 파이에서 작동 안 될 때 아두이노 우노(또는 유사 장치)에 DHT Tiny를 연결할 수 있습니다.
- INT 핀을 우노의 D3에 연결하고 점퍼로 LED 활성화.
DHT_Tiny_Master.ino 스케치를 로드하고 실행하세요. 이 스케치는 시리얼 모니터에 출력을 표시합니다.
두 보드 간 I2C 연결 시 SDA와 SCL 라인에 풀업 저항이 중요합니다. 이 회로에는 핀과 5V 사이에 두 개의 4.7K Ω 저항이 연결되어 있습니다.
아래는 아두이노 우노에 연결된 DHT Tiny 브레드보드 이미지들입니다.
라즈베리 파이 연결
빠른 테스트, 시연, 또는 라즈베리 파이에서 작동 안 될 때 아두이노 우노(또는 유사 장치)에 DHT Tiny를 연결할 수 있습니다.
- GND 핀을 라즈베리 파이 2/3의 GND (핀 9)에 연결.
- 5V 핀을 라즈베리 파이 2/3의 5V (핀 2)에 연결.
- RST 핀을 라즈베리 파이 2/3의 GPIO4 (핀 7)에 연결.
- SDA 핀을 라즈베리 파이 2/3의 SDA (핀 3)에 연결.
- SCL 핀을 라즈베리 파이 2/3의 SCL (핀 5)에 연결.
- INT 핀을 라즈베리 파이 2/3의 GPIO17 (핀 11)에 연결하고 LED 활성화.
두 보드 간 I2C 연결 시 SDA와 SCL 라인에 풀업 저항이 중요합니다. 이 회로에는 핀과 3V3 사이에 두 개의 4.7K Ω 저항이 연결되어 있습니다.
매우 중요! DHT Tiny 보드는 라즈베리 파이의 5V 핀으로 전원 공급되지만 풀업 저항은 라즈베리 파이의 3V3 핀(핀 1과 17)에 연결해야 합니다.
아래는 라즈베리 파이 3에 연결된 DHT Tiny 브레드보드 이미지들입니다.
Windows 10 애플리케이션 실행
프로젝트 하단의 GitHub 저장소 링크에서 코드를 받아 압축을 풀고 컴퓨터에 저장하세요. Visual Studio 2015에서 유니버설 애플리케이션 소스 코드를 열고 파이에 배포해 관리자 콘솔에서 실행하거나 Visual Studio에서 디버그 모드로 실행하세요.
Visual Studio로 Windows 10 IoT Core 애플리케이션 코드를 처음 실행하는 경우 다음 Microsoft 기사들을 참고하세요:
아래 비디오 시연을 보면 라즈베리 파이 3에서 DHT Tiny에 연결된 애플리케이션이 실행되는 것을 볼 수 있습니다.
애플리케이션 하이라이트
Windows 10 UWP 애플리케이션은 DHT Tiny의 모든 기능을 보여주는 시연 애플리케이션입니다. 코드는 장치에서 현재 온도, 습도 및 기타 레지스터 값을 표시합니다. UI는 장치 주소를 포함한 장치 구성 변경 방법도 제공합니다.
DHT Tiny 라이브러리
샘플 코드는 DHT Tiny와 상호작용하기 위해 작성된 라이브러리를 사용합니다. 이 라이브러리는 바로 사용 가능하며 모든 애플리케이션에 직접 포함할 수 있습니다.
NuGet에서 라이브러리 받기
프로젝트에 직접 포함하고 싶지 않다면 아래 명령으로 NuGet에서 DHT Tiny 라이브러리를 다운로드하세요. Visual Studio에서 패키지 관리자 콘솔을 열고 명령을 입력하세요.
PM> Install-Package IoT.DhtTiny
I2C 버스에서 장치 검색
DHT Tiny 라이브러리에는 I2C 버스에서 DHT Tiny 장치를 검색하고 주소 목록을 반환하는 메서드가 포함되어 있습니다. 이 목록으로 발견된 장치 중 하나 이상을 초기화할 수 있습니다. 장치 주소를 변경했는데 무엇으로 설정했는지 기억나지 않을 때 특히 유용합니다. 콜백 메서드는 선택 사항입니다.
// ***
// *** I2C 버스에서 DHT Tiny 장치 열거
// ***
IEnumerable<byte> address = await DhtTiny.FindAllDhtTinyAsync(this.FindAllDhtTinyCallback);
// ***
// *** 콜백 메서드
// ***
private void FindAllDhtTinyCallback(I2cScanEventArgs e) {
int percentComplete = (int)((double)e.CurrentIndex / (double)e.Total * 100.0d);
this.Status = string.Format("Locating devices [0x{0:X2}] [{1}%] [Found = {2:##0}]...", e.CurrentAddress, percentComplete, e.Items.Count());
}
라즈베리 파이용 DHT Tiny 브레이크아웃 회로도
소프트웨어 시연
이 비디오는 브레드보드에 연결된 DHT Tiny와 라즈베리 파이 3에서 실행되는 유니버설 애플리케이션을 모두 보여줍니다.
[비디오 추후 공개]
최종 장치 만들기
가장 쉽고 비용 효율적인 보드 제작 방법은 Adafruit의 Perma-Proto Quarter-sized Breadboard PCB 같은 PCB 프로토타입 보드를 사용하는 것입니다. 아래 이미지는 이 프로토타입 보드를 사용한 브레이크아웃을 보여줍니다. 드레멜로 보드의 전원 레일 부분을 제거했습니다.
더 보기: 라즈베리 파이용 DHT Tiny 브레이크아웃