DHT11은 4핀(1핀 미사용) 온습도 센서로, 상대 습도 20~90%, 온도 0~50°C를 측정합니다. 3~5.5V DC로 동작하며 독자적인 원와이어(OneWire) 프로토콜로 통신합니다. 이 프로토콜은 매우 정밀한 타이밍이 필요하며, LOW/HIGH 비트는 신호가 HIGH인 지속 시간으로 인코딩됩니다. 전체 읽기 시간은 최대 23.4ms(시작 지연 18ms + 데이터 윈도우 최대 5.4ms)입니다.
배경
윈도우 10 IoT 코어 출시 초기, 라즈베리 파이 2와 DHT11로 C# 구현을 시도했으나 타이밍 문제로 실패했습니다. C#은 IoT 코어에서 충분히 빠르지 않았기 때문입니다. 마이크로소프트 포럼에서 같은 어려움을 겪는 개발자들과 논의하던 중, 마이크로소프트가 C++로 원와이어 프로토콜(DHT11 예제)을 지원하는 샘플을 공개한 것을 발견하고 이를 C# 라이브러리로 포팅하게 되었습니다.
라이브러리
이 라이브러리는 마이크로소프트가 공개한 샘플 코드를 리팩토링한 것으로, 원작자의 노고에 감사드립니다.
네임스페이스 Sensors.Dht에 Dht11 클래스를 제공합니다. 사용법은 간단합니다:
using Sensors.Dht;
GpioPin pin = GpioController.GetDefault().OpenPin(4, GpioSharingMode.Exclusive);
Dht11 dht11 = new Dht11(pin, GpioPinDriveMode.Input); // 풀업 저항 직접 추가 시 InputPullUp
DhtReading reading = await dht11.GetReadingAsync().AsTask(); // 기본 재시도 20회
DhtReading 구조체:
public value struct DhtReading {
bool TimedOut;
bool IsValid;
double Temperature;
double Humidity;
int RetryCount;
}
관찰 사항
C++에서도 매번 읽기 성공하지 못해 재시도 옵션이 필요합니다(마이크로소프트 샘플에 포함). 라즈비안(리눅스)과 아두이노 우노에서의 성능 비교를 위해 각 플랫폼용 코드를 깃허브에 포함했습니다. 프로젝트 동영상에서 플랫폼별 출력 비교를 확인할 수 있습니다.