라즈베리파이, 아두이노
라즈베리파이에서 one-wire 온도센서(DS18B20) 읽는 제일 쉬운 방법
포도알77
2021. 11. 27. 10:45
1. One wire는?
1개의 데이터 선에 여러 장치를 붙여서 쓰는 식이다. 우리가 멀티탭에 전원을 꽂아서 쓰듯.
이 방식을 이용하면 선 1개로 여러 개의 센서를 붙일 수 있는데, 나는 온도 센서를 한줄로 붙여서 외부, 베란다, 거실 온도를 측정했다.
2. Raspberry 설정
1) one-wire 설정 enable 해주자.
sudo raspi-config
interface -> one-wire -> enable
2) 아래의 명령으로 w1 모듈을 프로브 해주자.
sudo modeprobe w1-gpio
sudo modprobe w1-therm
3) reboot을 하자.
4) /sys/bus/w1/devices 디렉터리가 생성되면 설정 완료
3. 디바이스 확인하기
나는 DS18B20 온도 센서를 3개 썼다. 이 온도 센서는 아래와 같이 28-으로 시작한다.
28-0000075bb47e
28-0000075be046
28-0000075cddf2
온도 값은 해당 장치 아래 파일에서 확인할 수 있다.
cat /sys/bus/w1/devices/28-0000075cddf2/w1_slave
2a 01 4b 46 7f ff 06 10 16 : crc=16 YES
2a 01 4b 46 7f ff 06 10 16 t=18625
여기서 t=X가 온도 값이다. 이 값에 1000을 나눠주면 된다.
4. python 코드
간단하게 파일 열어서 해당 값을 re로 뽑아내면 된다.
장치 id는 내가 따로 온도 센서를 추가하지 않는 한 변하지 않을 것이므로 그냥 하드 코딩 해버렸다.
import re
tempPattern = re.compile('t=(\\d+)')
def getTemp(sid):
f = open('/sys/bus/w1/devices/'+sid+'/w1_slave')
lines = f.readlines()
f.close
for s in lines:
v = tempPattern.search(s)
if(v):
return float(v.group(1))/1000
return -999
sids = ['28-xxxxxxxxxxx']
for sid in sids:
v = getTemp(sid)
print(sid, v)
이제 이 데이터를 db에 넣어주면 된다.