樹(shù)莓派以其計(jì)算能力及其在物聯(lián)網(wǎng)、家庭自動(dòng)化等領(lǐng)域的廣泛應(yīng)用而聞名。然而,對(duì)于任何電子系統(tǒng)與現(xiàn)實(shí)世界進(jìn)行交互并獲取有關(guān)它的信息,系統(tǒng)必須使用傳感器。該過(guò)程使用多種類型的傳感器,并根據(jù)要測(cè)量的參數(shù)及其應(yīng)用選擇所需的傳感器。在本教程中,我們將學(xué)習(xí)將溫度傳感器DS18B20與樹(shù)莓派連接。
DS18B20是廣泛使用的溫度傳感器,主要用于化工、礦山等惡劣工作環(huán)境的場(chǎng)所。本文將介紹該傳感器以及它如何超越其他溫度傳感器,最后將其與Raspberry Pi連接并查看16x2 LCD上的溫度值。
所需材料
DS18B20 溫度傳感器
樹(shù)莓派
16*2液晶顯示屏
10k修剪鍋
10k 上拉電阻
面包板
連接線
DS18B20溫度傳感器簡(jiǎn)介
DS18B20是一款三端子溫度傳感器,采用TO-92(晶體管型)封裝。它非常易于使用,只需要一個(gè)外部組件即可開(kāi)始工作。此外,它只需要MCU / MPU的一個(gè)GPIO引腳即可與之通信。典型的DS18B20溫度傳感器及其引腳名稱如下所示。
該傳感器也可作為防水版本提供,其中傳感器由圓柱形金屬管覆蓋。在本教程中,我們將使用上面顯示的普通晶體管型傳感器。DS18B20為1線可編程溫度傳感器,只需數(shù)據(jù)引腳即可將信息發(fā)送到微控制器或微處理器板(如Raspberry Pi)。每個(gè)傳感器都有一個(gè)唯一的 64 位地址,因此也可以將多個(gè)傳感器連接到同一個(gè) MCU/MPU,因?yàn)槊總€(gè)傳感器可以在同一數(shù)據(jù)總線上單獨(dú)尋址。傳感器的規(guī)格如下所示。
工作電壓:3-5V
測(cè)量范圍:-55°C 至 +125°C
精度:±0.5°C
分辨率:9 位至 12 位
現(xiàn)在我們對(duì)傳感器有了足夠的了解,讓我們統(tǒng)計(jì)它與樹(shù)莓派的接口。
先決條件
假設(shè)您的樹(shù)莓派已經(jīng)使用操作系統(tǒng)刷新并能夠連接到互聯(lián)網(wǎng)。如果沒(méi)有,請(qǐng)先按照樹(shù)莓派入門教程進(jìn)行操作,然后再繼續(xù)。這里我們使用Rasbian Jessie安裝的Raspberry Pi 3。
還假設(shè)您可以通過(guò)終端窗口或其他應(yīng)用程序訪問(wèn)您的 pi,通過(guò)這些應(yīng)用程序您可以編寫和執(zhí)行 python 程序并使用終端窗口。
電路圖
正如我們?cè)诒窘坛糖懊嫠f(shuō),我們將DS18B20傳感器與Pi連接,并在16*2 LCD屏幕上顯示溫度值。因此,傳感器和LCD應(yīng)與樹(shù)莓派連接,如下所示。
按照電路圖進(jìn)行相應(yīng)的連接。LCD和DS18B20傳感器均在+5V的幫助下工作,+5V由樹(shù)莓派上的5V引腳提供。LCD使用Raspberry Pi在4位模式下工作,GPIO引腳18,23,24和25用于數(shù)據(jù)線,GPIO引腳7和8用于控制線。電位計(jì)也用于控制LCD的對(duì)比度水平。DS18B20的數(shù)據(jù)線連接到GPIO引腳4。另請(qǐng)注意,必須使用10K電阻器拉動(dòng)電路圖中所示的高電平數(shù)據(jù)。
您可以按照上面的電路圖進(jìn)行連接,也可以使用引腳表跟進(jìn) GPIO 引腳編號(hào)。
我使用單股線和公對(duì)母線在面包板上構(gòu)建電路以進(jìn)行連接。如您所見(jiàn),傳感器只需要一根電線即可連接,因此占用的空間和引腳更少。建立所有連接后,我的硬件如下所示。現(xiàn)在是時(shí)候啟動(dòng) pi 并開(kāi)始編程了。
在樹(shù)莓P上安裝Adafruit LCD庫(kù)
溫度值將顯示在 16*2 LCD 顯示屏上。Adafruit 為我們提供了一個(gè)庫(kù),可以在 4 位模式下輕松操作此 LCD,因此讓我們通過(guò)打開(kāi)終端窗口 Pi 并按照以下步驟將其添加到我們的樹(shù)莓派中。
第 1 步:使用以下行在樹(shù)莓派上安裝 git。Git允許您克隆 Github 上的任何項(xiàng)目文件,并在 Raspberry pi 上使用它。我們的庫(kù)在 Github 上,所以我們必須安裝 git 才能將該庫(kù)下載到 pi 中。
apt-get install git
第 2 步:以下行鏈接到存在庫(kù)的 GitHub 頁(yè)面,只需執(zhí)行該行即可克隆 Pi 主目錄上的項(xiàng)目文件
git clone git://github.com/adafruit/Adafruit_Python_CharLCD
第 3 步:使用以下命令更改目錄行,進(jìn)入我們剛剛下載的項(xiàng)目文件。命令行如下
cd Adafruit_Python_CharLCD
第 4 步:目錄中會(huì)有一個(gè)名為 setup.py 的文件,我們必須安裝它,以安裝庫(kù)。使用以下代碼安裝庫(kù)
sudo python setup.py install
也就是說(shuō),庫(kù)應(yīng)該已成功安裝?,F(xiàn)在同樣,讓我們繼續(xù)安裝同樣來(lái)自Adafruit的DHT庫(kù)。
在 Pi 中啟用單線接口
由于DS18B20傳感器通過(guò)單線方式通信,因此必須按照以下步驟在Pi上啟用單線通信。
第 1 步:-打開(kāi)命令提示符并使用以下命令打開(kāi)配置文件
sudo nano /boot/config.txt
第 2 步:-在配置文件中添加行“dtoverlay=w1-gpio”(在下圖中包圍)并保存文件,如下所示
第 3 步:-使用 Ctrl+X 退出文件并通過(guò)按“Y”保存它,然后按 Enter 鍵。最后使用命令重新啟動(dòng) Pi
sudo reboot
第 4 步:-重新啟動(dòng)后,再次打開(kāi)終端并輸入以下命令。
sudo modprobe w1–gpio sudo modprobe w1-therm. cd /sys/bus/w1/devices ls
您的終端窗口將顯示如下內(nèi)容
第 5 步:-在步驟 4 結(jié)束時(shí),當(dāng)您輸入 ls 時(shí),您的 pi 將顯示一個(gè)唯一的數(shù)字,該數(shù)字對(duì)于每個(gè)用戶來(lái)說(shuō)都是不同的,具體取決于傳感器,但始終以 28- 開(kāi)頭。就我而言,號(hào)碼是28-03172337caff。
第 6 步:-現(xiàn)在我們可以通過(guò)輸入以下命令來(lái)檢查傳感器是否正常工作
cd 28-XXXXXXXXXXXX [use the name of your directory or use Tab key for auto complete)
cat w1_slave
這兩個(gè)命令將從傳感器讀取數(shù)據(jù)并將其顯示在終端上,如下所示。下圖中的溫度值用紅色包圍。在我的情況下,溫度值為37 * C。
為 DS18B20 傳感器編程樹(shù)莓派
現(xiàn)在,我們的Pi已準(zhǔn)備好針對(duì)LCD進(jìn)行編程并使用單線協(xié)議。因此,我們可以編寫最終程序,從DS18B20傳感器讀取溫度值并將其顯示在LCD屏幕上。本頁(yè)末尾給出了執(zhí)行相同操作的完整 python 程序。但是,下面我將代碼分成有意義的小片段來(lái)解釋它們。
與往常一樣,我們通過(guò)導(dǎo)入程序所需的頭文件來(lái)開(kāi)始程序。這里我們導(dǎo)入時(shí)間處理延時(shí)功能,LCD接頭使用LCD與Pi。操作系統(tǒng)標(biāo)頭用于處理操作系統(tǒng)中的文件。
import time #import time for creating delay
import Adafruit_CharLCD as LCD #Import LCD library
import os #Import for file handling
import glob #Import for global
接下來(lái)我們必須提到連接到樹(shù)莓派引腳的LCD引腳。使用上面提供的 GPIO 引腳圖了解各個(gè) GPIO 引腳的引腳號(hào)。一旦我們聲明了LCD連接到哪些PI引腳,我們就可以指定行數(shù)和列數(shù),最后使用以下代碼行對(duì)其進(jìn)行初始化。
lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI
lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI
lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI
lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI
lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI
lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI
lcd_backlight = 0 #LED is not connected so we assign to 0
lcd_columns = 16 #for 16*2 LCD
lcd_rows = 2 #for 16*2 LCD
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
lcd_columns, lcd_rows, lcd_backlight) #Send all the pin details to library
初始化LCD后,我們?cè)贚CD上打印示例文本消息。字符“n”用于提及換行符。顯示介紹后,我們引入了 2 秒的延遲,供用戶閱讀介紹消息。
lcd.message('DS18B20 with Pi n -CircuitDigest') #Give a intro message
time.sleep(2) #wait for 2 secs
現(xiàn)在,如果您能回憶起使用 Pi 啟用單線接口的步驟 4。我們必須重復(fù)相同的代碼行,因此我們使用 os.system 函數(shù)來(lái)執(zhí)行相同的行。然后我們指定必須從中讀取溫度值的文件位置。device_folder變量指向以“28-”開(kāi)頭的文件夾,因?yàn)槲覀儾恢牢募A的確切名稱,我們使用 * 符號(hào)打開(kāi)以 28 開(kāi)頭的任何內(nèi)容。最后,在該文件夾中,我們使用另一個(gè)名為device_file的變量,該變量實(shí)際上指向內(nèi)部具有溫度值的文件。
然后我們使用名為 get_temp 的函數(shù),在其中我們定義從我們?cè)谏鲜霾襟E中剛剛鏈接的文件中讀取溫度的過(guò)程。正如我們之前與終端檢查的那樣,該文件內(nèi)部將包含溫度值,但它將采用以下格式
由此我們只需要 37000 的值,即溫度值。這里的實(shí)際溫度值是37.00*C。因此,從這種文本格式中,我們必須修剪所有無(wú)用的數(shù)據(jù)并得到整數(shù)值 37000,最后將其除以 1000以獲得實(shí)際數(shù)據(jù)。下面顯示的函數(shù)完全相同
def get_temp(): #Fundtion to read the value of Temperature
file = open(device_file, 'r') #opent the file
lines = file.readlines() #read the lines in the file
file.close() #close the file
trimmed_data = lines[1].find('t=') #find the "t=" in the line
if trimmed_data != -1:
temp_string = lines[1][trimmed_data+2:] #trim the strig only to the temoerature value
temp_c = float(temp_string) / 1000.0 #divide the value of 1000 to get actual value
return temp_c #return the value to print on LCD
變量行用于讀取文件內(nèi)的行。然后比較這些行,搜索字母“t=”,并將該字母后面的值保存在變量temp_string中。最后,為了獲得溫度值,我們使用變量temp_c將字符串值除以 1000。最后返回函數(shù)的結(jié)果temp_c變量。
在無(wú)限 while 循環(huán)中,我們只需要調(diào)用上面定義的函數(shù)即可獲取溫度值并將其顯示在 LCD 屏幕上。我們還每 1 秒清除一次 LCD 以顯示更新的值。
while 1: #Infinite Loop
lcd.clear() #Clear the LCD screen
lcd.message ('Temp = %.1f C' % get_temp()) # Display the value of temperature
time.sleep(1) #Wait for 1 sec then update the values
輸出/工作
與往常一樣,完整的python代碼在頁(yè)面末尾給出,請(qǐng)使用代碼并在Raspberry Pi上編譯它。按照電路圖中所示進(jìn)行連接,在執(zhí)行程序之前,請(qǐng)確保已按照上述步驟安裝LCD頭文件并在pi上啟用單線通信。完成后,只需執(zhí)行程序,如果一切按預(yù)期工作,您應(yīng)該能夠注意到介紹文本。如果沒(méi)有,請(qǐng)調(diào)整對(duì)比度電位器,直到看到一些東西。最終結(jié)果如下所示。
#Program to read the values of Temp from the DS18B20 sensor and display them on the LCD
import time #import time for creating delay
import Adafruit_CharLCD as LCD #Import LCD library
import os #Import for file handling
import glob #Import for global
lcd_rs = 7 #RS of LCD is connected to GPIO 7 on PI
lcd_en = 8 #EN of LCD is connected to GPIO 8 on PI
lcd_d4 = 25 #D4 of LCD is connected to GPIO 25 on PI
lcd_d5 = 24 #D5 of LCD is connected to GPIO 24 on PI
lcd_d6 = 23 #D6 of LCD is connected to GPIO 23 on PI
lcd_d7 = 18 #D7 of LCD is connected to GPIO 18 on PI
lcd_backlight = 0 #LED is not connected so we assign to 0
lcd_columns = 16 #for 16*2 LCD
lcd_rows = 2 #for 16*2 LCD
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7,
lcd_columns, lcd_rows, lcd_backlight) #Send all the pin details to library
lcd.message('DS18B20 with Pi n -CircuitDigest') #Give a intro message
time.sleep(2) #wait for 2 secs
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def get_temp(): #Fundtion to read the value of Temperature
file = open(device_file, 'r') #opent the file
lines = file.readlines() #read the lines in the file
file.close() #close the file
trimmed_data = lines[1].find('t=') #find the "t=" in the line
if trimmed_data != -1:
temp_string = lines[1][trimmed_data+2:] #trim the strig only to the temoerature value
temp_c = float(temp_string) / 1000.0 #divide the value of 1000 to get actual value
return temp_c #return the value to prnt on LCD
while 1: #Infinite Loop
lcd.clear() #Clear the LCD screen
lcd.message ('Temp = %.1f C' % get_temp()) # Display the value of temperature
time.sleep(1) #Wait for 1 sec then update the values
-
溫度傳感器
+關(guān)注
關(guān)注
48文章
2962瀏覽量
156241 -
DS18B20
+關(guān)注
關(guān)注
10文章
780瀏覽量
80987 -
樹(shù)莓派
+關(guān)注
關(guān)注
117文章
1710瀏覽量
105761
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論