SharedIT | 묻고 답하기(AMP)

라즈베리파이와 DHT11를 이용한 온습도 모니터링

안녕하세요

제가 사용한 파이썬 코드는 아래와 같습니다.


import time

import board

import adafruit_dht

dhtDevice = adafruit_dht.DHT11(board.D20)

while True:

try:

temperature_c = dhtDevice.temperature

temperature_f = temperature_c * (9 / 5) + 32

humidity = dhtDevice.humidity

print("Temp: {:.1f} F / {:.1f} C Humidity: {}% ".format(temperature_f, temperature_c, humidity))

time.sleep(10.0)

except KeyboardInterrupt:

pass

print('Exit with ^C. Goodbye!')

exit()


이렇게 코드를 입력하고 작동 시키면 처음에는 정상적으로 작동하다가 중간에 오류가 발생하여 멈춥니다.

해당 오류코드는 아래와 같습니다.


Traceback (most recent call last):

File "/home/pi/Desktop/DHT11.py", line 7, in <module>

temperature_c = dhtDevice.temperature

File "/home/pi/.local/lib/python3.9/site-packages/adafruit_dht.py", line 274, in temperature

self.measure()

File "/home/pi/.local/lib/python3.9/site-packages/adafruit_dht.py", line 226, in measure

raise RuntimeError("DHT sensor not found, check wiring")

RuntimeError: DHT sensor not found, check wiring


어떤것이 문제고 어떻게 해결하면 될까요 ㅠㅠ 도움 부탁드립니다.

Tags : 태그가 없습니다.

1개의 답변이 있습니다.

wansoo
  0 추천 | 약 2년 전

RuntimeError: DHT sensor not found, check wiring


이 메시지가 중요한 정보가 되겠고요.

DHT 센서로 부터 정보를 읽어 오려고 했는데, 센서가 작동하지 않는 상황인것 같네요.


케이블에 접촉 불량이 있는 건 아닌지 등을 확인해 보셔야 할 것 같고요.


만약, 케이블 접촉 불량이나 하드웨어적인 문제가 없고... 라즈베리 파이 자체를 완전히 껐다가 잠시 후 다시 켜서 사용하면 정상적으로 작동한다면... 아래의 적어둔 저의 개인적인 노하우를 참조하시면 도움이 될 수 있을거라 보여지네요.



DHT22를 여러개 사용하고 있는데요.

지금 운영하고 있는 것만해도 10개 이상 되다 보니...

다양한 노하우를 얻게 되었는데...

DHT22가 다운이 잘 되더군요.

DHT22도 다운이 잘 되는데... DHT11은 더 할 거라 보여 지고요.


DHT22 센서가 다운되었을때 해결할 수 있는 방법이, DHT22에 전원 공급을 몇초간 끊어 줘야 센서가 초기화되어 사용할 수 있게 되더군요.


라즈베리 파이에 Vcc 핀을 통해서 센서에 전원을 공급하고 있는 상태라면...

라즈베리 파이를 완전히 꺼줬다가 몇 초후에 수동으로 전원을 다시 공급해서 켜 줘야만 센서에 전원 공급을 끊었다가 다시 공급할수 있기 때문에...

단순히 라즈베리 파이를 재부팅하게 해서 자동으로 복구되게 할수는 없어 센서를 초기화 시켜서 자동으로 복구 시킬 수 있는 방법을 찾느라 굉장히 고심을 했었는데요.

해외 인터넷 자료들 까지 모두 찾아 봐도 DHT 센서를 라즈베리 파이에서 전원 공급을 차단해서 자동 초기화 할 수 있는 방법을 찾지는 못했고요.


그렇다고 센서가 다운될때마다 사람이 가서 라즈베리파이를 수동으로 껐다 다시 켜 줘야 한다는 건... 말이 안되는 상황이었고...

센서를 한 두개 사용하는 것도 아니고...

관련 문제가 생길때마다 센서가 설치된 기기들을 찾아 다니며 수동으로 껐다 켠다는게... 일거리만 많아지다 보니... 차라리 사용하지 않는게 더 현명할 수도 있을 것 같아 정말 열심히 해결 방법을 찾으려고 노력했었습니다.


몇일간 자료를 찾고 혼자서 고심하던 끝에 문득 떠오르는 생각이...

DHT22 전원으로 3.3V 전원을 공급해주면 되는데, Vcc 핀의 전원을 라즈베리파이에서 일정 시간 동안에 전원 공급을 차단해 줄 수만 있으면 해결할 수 있지만 해당 기능이 없다 보니...

그렇다면 Vcc 3.3V 전원을 공급해 주지 않고, 데이터 Pin의 전원 3.3V를 DHT22 Vcc 전원으로 공급해 주면 어떨까 하는 생각이 떠 오르더군요.


데이터 Pin은 3.3V 출력 및 0V로 전원 차단도 얼마든지 할 수 있다 보니...

물론 DHT 센서를 구동하기 위해 전압만 만족해서는 안되고 전류 공급이 맞아 줘야 하긴 하겠지만,

일단 한번 시도해 보자는 생각에 데이터 핀을 통해서 DHT22 Vcc 전원 공급을 해 보았는데...

감격스럽게도 DHT22 센서가 잘 작동하더군요.


DHT 센서로 부터 온/습도를 읽어 오다가 2번 연속 읽어 오지 못하는 오류가 발생한다면 DHT 센서의 Vcc에 연결된 라즈베리파이 데이터 핀의 출력을 0으로 변경했다가 다시 1로 변경한 후에 DHT로 부터 값을 읽어 오도록 해서 1년 넘게 잘 사용하고 있습니다.


똑같은 DHT 센서라도 부품에 따라서 작동하는 환경에 따라서 몇 주 이상 아무 문제 없이 잘 작동하는 경우도 있고, 하루도 못 넘기고 다운되어 값을 읽어 오지 못하는 경우도 있던데...


확실한건 오류없이 오래 가냐, 짧은 주기로 오류가 발생하는 차이이지 모든 DHT 센서가 장기적으로 사용할때 다운되어 버리기 때문에 강제적으로 전원 공급을 차단해 줘야 하는 상황이 발생한다는 거였습니다.


저 처럼 전원 공급 방법을 편법적으로 한번 사용해 보시길 바랍니다.


해당 내용으로 라즈베리 파이쪽 강의를 하시는 교수님 2분에게 DHT Vcc로 데이터 Pin의 High 값을 공급했을때 발생할 문제점 등에 대해서 문의를 해 보았는데, 센서의 제조사 세부 설명서를 참조해서 규격에 맞춰서 사용하라는 답변만 하시고, 된다/안된다는 답변은 하지 않으시긴 했지만...


제가 1년 이상 사용해본 결과 아무 문제 없다는 결론을 얻었습니다.

powerhg7 | 약 2년 전

자세한 답변 정말 감사합니다. wansoo님께서 고안하신 방법이 좋은 해법이 될거같다는생각이 듭니다. 그런데 여기서 질문하고 싶은게 2가지가 있습니다. 

1번쨰는  센서 Vcc를 데이터핀의 전원 3.3V를 DHT22 Vcc 전원으로 공급 한다는 말이 Vcc를 핀번호 1번2번4번17번이 아닌 GPIO 핀에  연결하라는 것으로 해석하면 될까요?


2번째는 제가 우연하게도 wansoo님께서 고안하신 방법과 비슷하게 수동으로 전원을 뻈다가 다시 연결하는 식으로 문제 해결을 했었는데요 여기서 문제가 이 방법으로 했을때 아래와 같은 오류 코드가 뜹니다.

Unable to set line 18 to input


그래서 매번 전원도 차단하고, 데이터핀 위치도 바꾸고 코드에 데이터핀 번호도 변경하는 번거로움이 있는데 혹시 이건 어떤 문제 인지 아시나요?

wansoo | 약 2년 전

예, DHT Vcc 전원 공급을 GPIO 핀을 사용한다는 의미가 맞습니다.


1과 17은 3.3V Vcc에 해당되겠고, 2와 4는 5.5V Vcc이고, DHT가 3.3~5.5 사용할 수 있기 때문에 3.3V Vcc 또는 5.5V Vcc 모두 사용 가능하겠는데요.

GPIO output mode에서 high값 출력 전압이 3.3V 이기 때문에 GPIO port를 output mode로 해서 high 값으로 DHT에 3.3V 전원을 공급하고, 오류가 생기면 low 값으로 0V로 전원 공급을 일정 시간 차단했다가 다시 high로 전환해서 전원을 다시 공급하는 형태로 운영하고 있습니다.

조금 더 복잡한 방법이지만, 라즈베리파이의 Vcc 핀을 사용하면서 Vcc pin과 DHT 사이에 릴레이 스위치(전자 스위치)를 달아서 릴레이를 라즈베리 파이에서 제어함으로서 DHT의 전원을 차단하는 방식으로 DHT를 초기화 시키는 방법을 사용할 수도 있겠고요.


Unable to set line 18 to input

은 18번째 핀을 input mode로 설정할 수 없다는 의미인걸로 보이는데요.


저는 주로 C로 코딩을 해서 사용하고 있어서 해당 문제는 아직 없었네요.

파이썬으로도 2대 정도 운영하고 있긴 한데...

값을 읽어 올때 C 코드로 읽는 것 보다 파이썬으로 읽어올때가 오류가 더 적은 것 같긴 하던데...



인터넷 검색해 보니 관련 문제에 대한 내용이 많이 검색되긴하네요.

adafruit 라이브러리를 업데이트해서 사용해 보라는 내용도 있고요.

pip3 install --upgrade adafruit-blinka adafruit-circuitpython-dht



libgpiod가 설치되어 있지 않다면 설치해서 사용하라는 내용도 있고...

apt install libgpiod2


adafruit-blinka를 재 설치해서 사용해보라는 내용도 있고...

pip3 install --upgrade --force-reinstall adafruit-blinka



pin의 mode는 재부팅이 되면 초기화가 될 것 같은데...

pin을 특정 소프트웨어가 잡고 있다고 해도,

재 부팅 후에는 pin mode가 초기화되어 다시 설정할 수 있게 될 것 같은데...??


재부팅과 동시에 계속 pin을 잡고 있는 상태이기 때문에 그럴까 하는 느낌도 들고요.


shell에서 gpio 명령으로 mode 변경을 한번 시도해 보면 어떨지 궁금하네요.


그전에 

gpio readall

명령을 수행해서 전체 pin의 상태를 한번 확인해 보고...


gpio -g mode 18 in
명령을 실행 시켜서 18번 핀이 in  mode로 변경되었는지도 한번 확인해 보시고...



ps auxw | grep libgpiod

명령으로 libgpiod 서비스가 작동되고 있는지를 확인해서 작동되고 있다면,

해당 프로세서를 kill 시킨 후에 시도해 볼 필요도 있을 것 같고요.

powerhg7 | 약 2년 전

자세한 설명 감사합니다. 

Unable to set line 18 to input 문제의 경우 말씀하신 방법대로 해보고 라스베리파이 공식 홈페이지에 QnA하여 피드백 받은 내용으로 해보아도 해결이 안되네요 ㅠㅠ 


라즈베리파이 공식 홈페이지 운영자가 답변한 내용에도 너무 저렴한 센서라서 그런지 안정적인 센서는 아니라서 오류가 많은 센서라고 말씀하시더라고요... 


지금까지 자세하고 친절한 답변 감사합니다. 많이 배워갑니다. :)