Raspberry Pi_Kor_25.8.2 digital sensor DS18b20를 이용한 온도 측정


Published Book on Amazon


All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2


출판된 한글판 도서


최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상)
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하)


Original Book Contents


25.8.2  digital sensor DS18b20를 이용한 온도 측정

 

25.8.2.1    DS18B20 sensor 특징 

 

시중에는 온도를 측정하는 여러 가지의 센스가 있지만, Raspberry Pi ADC (Analog to Digital Converter) 장치가 없으므로 TMP36과 같은 analog 온도 sensor는 직접적으로 사용할 수 없다.

 

여기서는 digital sensor DS18B20 Raspberry Pi와 직접 연결하여 온도를 측정할 것이다.

 

시중에서 판매되는 DS18B20 sensor에는 여러 가지가 있는데, 아래 그림과 같이 원래의 원형 sensor도 있고, 일반적인 DS18B20 sensor Arduino와 같은 실험용 interface board에서 용이하게 사용할 수 있도록 약간 변형한 것도 있다. 두 가지 모두 모든 성능과 특징은 동일하지만 connector의 배열 위치가 약간 다르게 되어 있다어떤 것을 사용하더라도 pin의 위치만 고려하면 모든 것이 동일하다.


원형 sensor                         변형 sensor

 

No

원형 sensor

변형 sensor

기능

1

GND

-

ground

2

Vdd

+

power

3

DQ

S

data line

그림 25‑20 digital 온도 sensor DS18b20


 

DS18B20은 다음과 같은 특징을 가지고 있다.

 

항목

내용

Interface

1-Wire bus Interface 방식 사용

전압 범위

3.0V to 5.5V

전원 공급 방식

external supply 가능, parasite power 가능 (data line을 통한 전원 공급)

운영 온도

-55°C to +125°C (-67°F to +257°F)

측정 오차

±0.5°C from -10°C to +85°C

온도계 해상도

User Selectable from 9 to 12 Bits

Digital 전환

12-Bit Digital Word in 750ms (Max)

Resistor 사용

weak pullup resistor, 4.7 K ~10 K ohm

 

DS18B20 Maxim에서 개발한 1-Wire bus protocol을 사용하는데, 이 방식은 한 개의 control signal을 사용한 bus communication 방식으로, microprocessor (the master device)는 각 장치에 부여된 64 bit code를 이용하여 bus에 연결된 장치를 구별하고, 명령을 내린다. 즉 하나의 bus에 여러 개의 장치를 동시에 연결하여 사용할 수 있다는 것을 의미한다. 이 방식에서 하나의 bus에서 연결할 수 있는 장치의 수는 개념적으로는 제한이 없다.


 

DS18B20에서는 모든 device 3-state 또는 open-drain port (DS18B20 DQ pin)을 경유하여 bus에 연결되므로 control line weak pullup resistor를 필요로 한다. 통상 4.7KΩ 또는 10KΩ의 pull-up 저항을 사용한다.

 


 

DS18B20 sensor는 외부의 별도 전원을 사용할 수도 있지만, parasite power mode를 사용하면 별도의 전원을 사용하지 않고도 sensor를 운영할 수 있다. parasite power mode란 온도 측정 값을 전달하는데 사용되는 data line을 사용하여 sensor에 전원을 공급하는 방식을 의미한다. 이런 방식을 사용하며 data line에 공급되는 전류를 이용하여 sensor 자체의 전원을 공급하는 것이다. 아래 그림에서 왼쪽은 외부의 별도 전원을 사용한 경우이며, 오른쪽은 parasite power mode를 사용한 경우이다.


 

parasite power mode에서는 bus "High" 상태일 때 pull-up resistor를 통하여 공급된 전원이 DQ pin을 경유하여 sensor에 전원이 공급된다. bus signal "High" 상태일 때 내부의 capacitor (CPP)에 충전을 하고, bus "Low" 상태이면 내부 장치에 전원을 공급한다.  

 

DS18b20에 대한 보다 상세한 내용에 대해서는 다음을 참고하기 바란다.

    http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf


 

25.8.2.2    Raspberry Pi sensor의 연결

 

1-Wire protocol을 사용하는 DS18B20 sensor bus에 병렬로 설치된다. 모든 sensor는 동일 data pin을 사용한다. data line Raspberry Pi pin 7(BCM port 4)에 연결하도록 한다.  

 

data line pull-up 저항을 사용하는데, 4.7K ~ 10K ohm 저항을 사용한다. 여러 개의 sensor가 동시에 설치되는 경우에도 pull-up 저항은 하나만 설치하면 된다.

 

다음은 Raspberry Pi pin 1에서 공급되는 3.3V전원으로 sensor에 별도의 외부 전원을 공급하는 방식으로 회로를 구성한 형태이다


 


 

25.8.2.3    1-Wire bus protocol의 활성화

 

Raspbian/Occidentalis DS18b20에서 사용하는 1-Wire bus protocol을 지원한다. 1-Wire protocol을 사용하고자 하면 해당 protocol을 먼저 활성화해야 한다.

 

1-Wire protocol 활성화를 하려면 먼저 "/boot/config.txt" 파일에서 다음 내용을 추가한다.

 

~ 중략

# Activate 1-Wire protocol

dtoverlay=w1-gpio

 

"config.txt" 파일을 수정하고 시스템을 reboot를 한다. "/sys/bus/w1/" 폴더가 생성되어 있으면 정상 처리된 것이다.

 

pi@raspberrypi ~ $ ls /sys/bus -l

~ 중략

drwxr-xr-x 4 root root 0 Jun 14 22:51 spi

drwxr-xr-x 4 root root 0 Jun 14 22:17 usb

drwxr-xr-x 4 root root 0 Jun 14 22:51 w1

drwxr-xr-x 4 root root 0 Jun 14 22:51 workqueue

 

만약 해당 폴더가 생성되어 있지 않다면, "modprobe" 명령을 사용하여 다음과 같은 절차로 해당 장치를 활성화하고, 다시 위의 "/sys/bus/w1/" 폴더가 생성되어 있는지 확인한다.

 

sudo modprobe w1-gpio

 

sudo modprobe w1-therm

 


 

25.8.2.4    DS18B20의 온도 측정 값 interface 파일

 

1-Wire bus protocol이 정상적으로 활성화되고, Raspberry Pi sensor가 연결되면 sensor에서 측정한 값이 Raspberry Pi의 특정 파일로 interface된다. interface되는 자료는 "/sys/bus/w1/devices" 폴더 밑에 생성된다.

 

해당 폴더의 내용을 확인하여 "28-xxxxxx" 형식의 폴더가 생성되어 있는지를 확인한다. 이 폴더는 1-Wire bus protocol에 설치된 하나의 특정 sensor를 의미하고, 이 폴더가 생성되어 있다면 Raspberry Pi sensor와 정상적으로 연결되어 sensor의 측정 자료를 interface하고 있다는 것을 의미한다.

 

sensor가 측정한 온도 값은 "/sys/bus/w1/devices/28-xxxxxx/w1_slave" 파일에 저장된다.


 

해당 파일의 내용을 확인해 보면 다음과 같은 형식일 것이다

 

be 01 55 00 7f ff 0c 10 1f : crc=1f YES

be 01 55 00 7f ff 0c 10 1f t=27875

 

여기서 두 번째 행에서 "t=nnnnn" 형태로 되어 있는 자료가 sensor가 측정한 섭씨 온도 값으로 1000으로 나누어서 사용한다. 위의 값은 "27.875 CEL"가 될 것이다.

 

25.8.2.5    온도 값 처리 프로그램 작성 

 

여기서는 Raspberry Pi "/sys/bus/w1/devices/28-xxxxxx/w1_slave" 파일에 interface되어 있는 자료를 읽어서 화면에 보여주는 프로그램을 작성할 것이다.

 

프로그램 개발언어는 Python 3를 사용한다. Python 3 IDLE를 시작하고, 아래와 같은 Python 프로그램을 작성하여 "sensor_temP_DS18B20.py" 파일에 저장한다.

 

import os

import glob

import time

 

# os.system('modprobe w1-gpio')

# os.system('modprobe w1-therm')

 

w1_device_dir = '/sys/bus/w1/devices/'

w1_data_dir = glob.glob(w1_device_dir + '28*')[0]

 

w1_device_file = w1_data_dir + '/w1_slave'

 

def read_temp_raw():

   f = open(w1_device_file, 'r')

   lines = f.readlines()

   f.close()

   return lines

 

def read_temp():

   lines = read_temp_raw()

   while lines[0].strip()[-3:] != 'YES':

      time.sleep(0.2)

      lines = read_temp_raw()

 

   equals_pos = lines[1].find('t=')

   if equals_pos != -1:

      temp_string = lines[1][equals_pos+2:]

      temp_c = float(temp_string) / 1000.0

      temp_f = temp_c * 9.0 / 5.0 + 32.0

      return temp_c, temp_f

 

while True:

   print("CEL temperature =%f \t FAH temperature =%f" %read_temp())

   time.sleep(1)

 


 

위의 프로그램의 내용을 좀 살펴보면 다음과 같다.

    sensor에서 interface하는 device file "/sys/bus/w1/devices/28-xxxxxx/w1_slave"로 설정한다.

    파일의 첫 행에서 끝에 "YES"라는 값이 있을 때까지 해당 파일을 반복적으로 읽는다.

    온도 측정 값이 들어오면, "t="로 시작하는 값을 읽어서 CEL 온도와 FAH 온도로 변환한다

    CEL 온도와 FAH 온도를 인쇄한다.

 

Terminal 화면에서 sudo 명령으로 다음과 같이 프로그램을 실행한다. 그러면 sensor에서 측정한 온도 값이 화면에 계속적으로 표시될 것이다.  

 

sudo  python  sensor_temp_DS18B20.py


 

 


 

Leave a Reply