樹莓派以其計算能力及其在物聯網、家庭自動化等領域的廣泛應用而聞名。然而,對于任何電子系統與現實世界進行交互并獲取有關它的信息,系統必須使用傳感器。該過程使用多種類型的傳感器,并根據要測量的參數及其應用選擇所需的傳感器。在本教程中,我們將學習將溫度傳感器DS18B20與樹莓派連接。
DS18B20是廣泛使用的溫度傳感器,主要用于化工、礦山等惡劣工作環境的場所。本文將介紹該傳感器以及它如何超越其他溫度傳感器,最后將其與Raspberry Pi連接并查看16x2 LCD上的溫度值。
所需材料
DS18B20 溫度傳感器
樹莓派
16*2液晶顯示屏
10k修剪鍋
10k 上拉電阻
面包板
連接線
DS18B20溫度傳感器簡介
DS18B20是一款三端子溫度傳感器,采用TO-92(晶體管型)封裝。它非常易于使用,只需要一個外部組件即可開始工作。此外,它只需要MCU / MPU的一個GPIO引腳即可與之通信。典型的DS18B20溫度傳感器及其引腳名稱如下所示。
該傳感器也可作為防水版本提供,其中傳感器由圓柱形金屬管覆蓋。在本教程中,我們將使用上面顯示的普通晶體管型傳感器。DS18B20為1線可編程溫度傳感器,只需數據引腳即可將信息發送到微控制器或微處理器板(如Raspberry Pi)。每個傳感器都有一個唯一的 64 位地址,因此也可以將多個傳感器連接到同一個 MCU/MPU,因為每個傳感器可以在同一數據總線上單獨尋址。傳感器的規格如下所示。
工作電壓:3-5V
測量范圍:-55°C 至 +125°C
精度:±0.5°C
分辨率:9 位至 12 位
現在我們對傳感器有了足夠的了解,讓我們統計它與樹莓派的接口。
先決條件
假設您的樹莓派已經使用操作系統刷新并能夠連接到互聯網。如果沒有,請先按照樹莓派入門教程進行操作,然后再繼續。這里我們使用Rasbian Jessie安裝的Raspberry Pi 3。
還假設您可以通過終端窗口或其他應用程序訪問您的 pi,通過這些應用程序您可以編寫和執行 python 程序并使用終端窗口。
電路圖
正如我們在本教程前面所說,我們將DS18B20傳感器與Pi連接,并在16*2 LCD屏幕上顯示溫度值。因此,傳感器和LCD應與樹莓派連接,如下所示。
按照電路圖進行相應的連接。LCD和DS18B20傳感器均在+5V的幫助下工作,+5V由樹莓派上的5V引腳提供。LCD使用Raspberry Pi在4位模式下工作,GPIO引腳18,23,24和25用于數據線,GPIO引腳7和8用于控制線。電位計也用于控制LCD的對比度水平。DS18B20的數據線連接到GPIO引腳4。另請注意,必須使用10K電阻器拉動電路圖中所示的高電平數據。
您可以按照上面的電路圖進行連接,也可以使用引腳表跟進 GPIO 引腳編號。
我使用單股線和公對母線在面包板上構建電路以進行連接。如您所見,傳感器只需要一根電線即可連接,因此占用的空間和引腳更少。建立所有連接后,我的硬件如下所示。現在是時候啟動 pi 并開始編程了。
在樹莓P上安裝Adafruit LCD庫
溫度值將顯示在 16*2 LCD 顯示屏上。Adafruit 為我們提供了一個庫,可以在 4 位模式下輕松操作此 LCD,因此讓我們通過打開終端窗口 Pi 并按照以下步驟將其添加到我們的樹莓派中。
第 1 步:使用以下行在樹莓派上安裝 git。Git允許您克隆 Github 上的任何項目文件,并在 Raspberry pi 上使用它。我們的庫在 Github 上,所以我們必須安裝 git 才能將該庫下載到 pi 中。
apt-get install git
第 2 步:以下行鏈接到存在庫的 GitHub 頁面,只需執行該行即可克隆 Pi 主目錄上的項目文件
git clone git://github.com/adafruit/Adafruit_Python_CharLCD
第 3 步:使用以下命令更改目錄行,進入我們剛剛下載的項目文件。命令行如下
cd Adafruit_Python_CharLCD
第 4 步:目錄中會有一個名為 setup.py 的文件,我們必須安裝它,以安裝庫。使用以下代碼安裝庫
sudo python setup.py install
也就是說,庫應該已成功安裝。現在同樣,讓我們繼續安裝同樣來自Adafruit的DHT庫。
在 Pi 中啟用單線接口
由于DS18B20傳感器通過單線方式通信,因此必須按照以下步驟在Pi上啟用單線通信。
第 1 步:-打開命令提示符并使用以下命令打開配置文件
sudo nano /boot/config.txt
第 2 步:-在配置文件中添加行“dtoverlay=w1-gpio”(在下圖中包圍)并保存文件,如下所示
第 3 步:-使用 Ctrl+X 退出文件并通過按“Y”保存它,然后按 Enter 鍵。最后使用命令重新啟動 Pi
sudo reboot
第 4 步:-重新啟動后,再次打開終端并輸入以下命令。
sudo modprobe w1–gpio sudo modprobe w1-therm. cd /sys/bus/w1/devices ls
您的終端窗口將顯示如下內容
第 5 步:-在步驟 4 結束時,當您輸入 ls 時,您的 pi 將顯示一個唯一的數字,該數字對于每個用戶來說都是不同的,具體取決于傳感器,但始終以 28- 開頭。就我而言,號碼是28-03172337caff。
第 6 步:-現在我們可以通過輸入以下命令來檢查傳感器是否正常工作
cd 28-XXXXXXXXXXXX [use the name of your directory or use Tab key for auto complete)
cat w1_slave
這兩個命令將從傳感器讀取數據并將其顯示在終端上,如下所示。下圖中的溫度值用紅色包圍。在我的情況下,溫度值為37 * C。
為 DS18B20 傳感器編程樹莓派
現在,我們的Pi已準備好針對LCD進行編程并使用單線協議。因此,我們可以編寫最終程序,從DS18B20傳感器讀取溫度值并將其顯示在LCD屏幕上。本頁末尾給出了執行相同操作的完整 python 程序。但是,下面我將代碼分成有意義的小片段來解釋它們。
與往常一樣,我們通過導入程序所需的頭文件來開始程序。這里我們導入時間處理延時功能,LCD接頭使用LCD與Pi。操作系統標頭用于處理操作系統中的文件。
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引腳。使用上面提供的 GPIO 引腳圖了解各個 GPIO 引腳的引腳號。一旦我們聲明了LCD連接到哪些PI引腳,我們就可以指定行數和列數,最后使用以下代碼行對其進行初始化。
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后,我們在LCD上打印示例文本消息。字符“n”用于提及換行符。顯示介紹后,我們引入了 2 秒的延遲,供用戶閱讀介紹消息。
lcd.message('DS18B20 with Pi n -CircuitDigest') #Give a intro message
time.sleep(2) #wait for 2 secs
現在,如果您能回憶起使用 Pi 啟用單線接口的步驟 4。我們必須重復相同的代碼行,因此我們使用 os.system 函數來執行相同的行。然后我們指定必須從中讀取溫度值的文件位置。device_folder變量指向以“28-”開頭的文件夾,因為我們不知道文件夾的確切名稱,我們使用 * 符號打開以 28 開頭的任何內容。最后,在該文件夾中,我們使用另一個名為device_file的變量,該變量實際上指向內部具有溫度值的文件。
然后我們使用名為 get_temp 的函數,在其中我們定義從我們在上述步驟中剛剛鏈接的文件中讀取溫度的過程。正如我們之前與終端檢查的那樣,該文件內部將包含溫度值,但它將采用以下格式
由此我們只需要 37000 的值,即溫度值。這里的實際溫度值是37.00*C。因此,從這種文本格式中,我們必須修剪所有無用的數據并得到整數值 37000,最后將其除以 1000以獲得實際數據。下面顯示的函數完全相同
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
變量行用于讀取文件內的行。然后比較這些行,搜索字母“t=”,并將該字母后面的值保存在變量temp_string中。最后,為了獲得溫度值,我們使用變量temp_c將字符串值除以 1000。最后返回函數的結果temp_c變量。
在無限 while 循環中,我們只需要調用上面定義的函數即可獲取溫度值并將其顯示在 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代碼在頁面末尾給出,請使用代碼并在Raspberry Pi上編譯它。按照電路圖中所示進行連接,在執行程序之前,請確保已按照上述步驟安裝LCD頭文件并在pi上啟用單線通信。完成后,只需執行程序,如果一切按預期工作,您應該能夠注意到介紹文本。如果沒有,請調整對比度電位器,直到看到一些東西。最終結果如下所示。
#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
-
溫度傳感器
+關注
關注
48文章
2918瀏覽量
155899 -
DS18B20
+關注
關注
10文章
778瀏覽量
80716 -
樹莓派
+關注
關注
116文章
1699瀏覽量
105536
發布評論請先 登錄
相關推薦
評論