라즈베리파이, 아두이노

라즈베리파이에서 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에 넣어주면 된다.

페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사