天天看點

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

關于使用樹莓派測量溫度,我們之前在學習模數轉換的相關部落格中已經有過應用。其實除了使用傳統的AD采集溫度資料外,我們也可以通過樹莓派中的單總線技術結合DS18B20傳感器來更加友善精準的測量環境溫度。

一、認識DS18B20子產品與單總線通信

     DS18B20是一種改進型的智能溫度傳感器。與傳統的熱敏電阻相比,其可以直接讀出被測量的溫度,并且能夠根據實際應用場景中的要求進行簡單的程式設計。無論是讀取資料還是寫入資料,DS18B20都隻需要一條接口線,是以其使用的是單總線的通訊協定。DS18B20子產品的主要優勢在于其抗幹擾能力強,精度高,無需複雜的軟體處理可以直接輸出溫度資料。本次實驗,我們使用的DS18B20子產品如下圖所示:

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

可以看到此子產品有3個引腳,除了電源引腳和接地引腳外,剩下的一個就是用來輸出溫度資料的引腳。

     單總線通信被稱為one-wire通信,是以又常常被簡稱為1w總線通信。首先我們需要先開始樹莓派的1w總線通信功能,打開樹莓派的Raspberry Configuration菜單,在Interfaces選項中将1-Wire功能開啟,如下圖所示。

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

如果我們是通過無互動頁面的終端登入的樹莓派,也可以通過修改配置檔案來開啟1-Wire功能,在樹莓派Linux系統的根目錄下,找到如下路徑的檔案:

/boot/config.txt

在其中添加如下一行文本即可:

dtoverlay=w1-gpio

需要注意,添加之後需要重新開機樹莓派。需要注意,1-Wire功能預設将使用樹莓派的BCM編碼為GPIO4的引腳作為通信引腳,如何我們要進行自定義,可以在剛才的配置檔案中進行指定,如下:

dtoverlay=w1-gpio,gpiopin=18

其表示要使用BCM編碼為GPIO18的引腳作為通信引腳。

做完了上面的操作後,我們可以在樹莓派終端中使用如下指令檢視單總線是否啟動成功:

$ lsmod

終端輸出效果如下:

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

可以看到,如果有顯示w1_gpio和wire兩個部分,則表示單總線已經啟動成功,分别在終端執行如下兩條指令:

$ modprobe w1-gpio

$ modprobe w1-therm

如果終端沒有輸出任何資訊,則表示單總線已經初始化完成,此時實際上我們已經可以讓DS18B20進行工作了。

二、通過DS18B20子產品擷取環境溫度

通過前面的操作,我們已經完成了基本的準備工作,将DS18B20連接配接到樹莓派,引腳對應如下:

DS18B20 樹莓派

+ 3.3V

- GND

out BCM編碼為GPIO4的引腳

之後我們從樹莓派的終端進入如下目錄:

/sys/bus/w1/devices

在此目錄下,我們可以看到有兩個檔案,如下圖所示:

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

其中以28-xxx開頭的檔案夾中的檔案記錄的就是1w單總線輸入的資料,需要注意,讀者操作時,此檔案夾的名稱和筆者可能并不完全一樣,其表示傳感器裝置的編号,大家這裡隻需要找到28-xx開頭的檔案夾即可。在此檔案夾中,有一個名為w1_slave的檔案,此檔案中記錄的就是傳感器的溫度資料,我們可以打開看看,内容如下:

d2 01 55 05 7f 7e 81 66 59 : crc=59 YES

d2 01 55 05 7f 7e 81 66 59 t=29125

其中,大部分資料我們都無需關心,其最後的t=29125就是目前的環境溫度,将其轉換為攝氏溫度,直接除以1000即可,例如上面的資料表明目前的環境溫度是29.125攝氏度。

     目前為止,我們已經可以非常輕松的擷取DS18B20子產品提供的溫度資料了,但是檢視的方式非常不智能,其實我們可以通過Python程式來不停的讀取此資料檔案,解析出其中的溫度資料,之後無論是做記錄還是進行其他元件控制都會非常友善。編寫示例代碼如下:

#coding:utf8

import os,time

# 傳感器編号

name = "28-020692455d61"

# 裝置記錄資料的檔案位址

device_file ='/sys/bus/w1/devices/' + name + '/w1_slave'

# 讀取檔案資料

def read_temp_raw():

   f = open(device_file,'r')

   lines = f.readlines()

   f.close()

   return lines

# 解析溫度資料

def read_temp():

   lines = read_temp_raw()

   # 此行預設不是'YES' 表明未讀取到有效資料

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

       time.sleep(0.2)

       # 循環繼續讀

       lines = read_temp_raw()

   # 找到第2行的't='的位置

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

   # 将溫度資料取出

   if equals_pos != -1:

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

       temp_c = float(temp_string)/1000.0

   return temp_c

while True:

   print('%fC'%read_temp())

   time.sleep(1)

在樹莓派中運作上面代碼,可以看到控制台輸出的目前溫度資料,如下圖所示:

一起玩轉樹莓派(9)——DS18B20測溫子產品應用

三、講在後面

     本篇部落格,我們介紹了如何使用one-wire單總線進行外設資料的讀取,DS18B20隻是作為示例,抛磚引玉,通過樹莓派的1w總線,我們還可以連接配接更多的外設實作更加有創意的東西,大家開動腦筋,盡情玩耍吧!