본문 바로가기
졸작을해보아요

1. 라즈베리파이와 온습도센서 연결

by Rudy 2021. 11. 19.

졸작이 시작되었다. 요즘 프로젝트 팀플이 너무 많아서 정신이 없다. 기말고사는 공부도 못하고 칠 삘ㅎㅎ.. 이번학기는 전장 못 받을 것 같음 연구실일도 기절할 정도로 너무 많다 ㅋㅋ 에효 프로젝트나 무사히 잘 끝났으면 좋겠다ㅎㅎ,,,

 

 

암튼

최종발표에 대비해서 시연을 조금이라도 해봐야 하기 때문에 졸작을 슬슬 시작해야 함

그래서

간단하게 라즈베리파이에 온습도센서를 연결해서 온습도 값을 받아오는 것을 해보았다.

 

 

라즈베리파이 4B

GPIO 핀맵과 각각 2번, 7번, 9번에 선을 연결해주면 된다.

 

그리고 아래 깃에서 참고해가며 연결하였다.

 

https://github.com/adafruit/Adafruit_CircuitPython_DHT

 

패키지 업그레이드

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-dev python3-pip
sudo python3 -m pip install --upgrade pip setuptools wheel
sudo pip3 install adafruit-circuitpython-dht

2. 코드 작성

import time
import adafruit_dht
from board import *


# GPIO4
SENSOR_PIN = D4

dht11 = adafruit_dht.DHT11(SENSOR_PIN, use_pulseio=False)


while True:

	temperature = dht11.temperature
	humidity = dht11.humidity
	print(f"Humidity= {humidity:.2f}")
	print(f"Temperature= {temperature:.2f}°C")
    sleep(10)

 

winscp를 이용해서 라즈베리로 옮긴 뒤, putty에서 실행한다.

잘 된다.

 

받아오는 온습도 값을 이용해서 뭔가를 하려면 값을 계속 받아와야 한다.

 

import time
import adafruit_dht
import threading
import os
import glob
from board import *


# GPIO4
SENSOR_PIN = D4

dht11 = adafruit_dht.DHT11(SENSOR_PIN, use_pulseio=False)
temperature=0
humidity=0


def get_dht():
	global temperature
	global humidity

	while True:
		
		temperature = dht11.temperature
		humidity = dht11.humidity
		#print(f"Humidity= {humidity:.2f}")
		#print(f"Temperature= {temperature:.2f}°C")
		#time.sleep(0.5)


dht_thread=threading.Thread(target=get_dht)
#server_thread=threading.Thread(target=server)
dht_thread.daemon=True
#server_thread.daemon=True
#server_thread.start()
dht_thread.start()
#server_thread.join()
dht_thread.join()
print("end...")

스레드는 차후에 소켓통신 구현하고나서 센서 여러개들 상호작용 잘 돼라고 미리 넣어봤다. 

get_dht 함수를 만들어서 while문 이용해서 온습도 값을 계속해서 받아온다.

온도랑 습도 변수를 전역변수로 선언했기 때문에 global로 다시 함수 안에서 정의해줘야 한다.

 

* 근데 print를 이용해서 온습도 값을 잘 받아오고 있다는 것을 확인하면 확인하다가 

이런 에러가 발생하였다. 구글링 해도 해결이 안 돼서 그냥 print문을 뺐다. 어차피 print문은 서버에서 맞바로 값을 제대로 받아오고 있다는 것을 확인하는 용도니까. 

print문 빼고 나서 계속 함수 돌렸는데 오랜 시간이 지나도 에러나지 않고 돌아간다. 하지만 그래도 print문을 이용해서 어떤 값을 받아오고 있는지 궁금하다. 그래서 구글링을 더 했다. 나름 해결했다. 정답인지는 모르겠지만.

import time
import adafruit_dht
import threading
import os
import glob
from board import *


# GPIO4
SENSOR_PIN = D4

dht11 = adafruit_dht.DHT11(SENSOR_PIN, use_pulseio=False)
temperature=0
humidity=0


def get_dht():
	global temperature
	global humidity

	while True:
		try:
			temperature = dht11.temperature
			humidity = dht11.humidity
			print(f"Humidity= {humidity:.2f}")
			print(f"Temperature= {temperature:.2f}°C")
		except RuntimeError:
            			print('Failed')
		time.sleep(0.5)


dht_thread=threading.Thread(target=get_dht)
#server_thread=threading.Thread(target=server)
dht_thread.daemon=True
#server_thread.daemon=True
#server_thread.start()
dht_thread.start()
#server_thread.join()
dht_thread.join()
print("end...")

온습도 값을 받아오다가 런타임 에러가 생기면 failed 메시지를 출력하고 계속 실행한다. try except이용!

여기까지 하고 나서는 더 찾아보지 않았지만 센서로 값을 받아오고 그걸 출력하느라 타임아웃이 생기는 것 같다. 그래서 타임아웃이 발생할 때 어떻게 해야할지 코드에 작성해두지 않았기 때문에 에러 발생 메시지를 띄우고 프로그램이 강종되는듯 그래서 try except를 이용해서 타임아웃이 생기면 메시지를 출력하고 계속 값을 띄우게 만든거다. 이렇게 하니 중간에 멈추는 일 없이 잘 된다. 굿!

 

댓글