用樹莓派和DS18B20作個汽車溫度記錄儀[原創]python
很想知道夏日陽光暴曬下,汽車內的最高溫度以及溫度的變化狀況。以爲用樹莓派和DS18B20來實現應該很簡單,因而就嘗試搗鼓了一下,半天時間就搞定了,寫下來和你們分享。如下原創內容歡迎網友轉載,但請註明出處:https://www.cnblogs.com/heleshengbash
1、樹莓派讀取DS18B20的溫度值網絡
Raspbian系統已經可以支持DS18B20單總線(1-wire)溫度傳感器,只要簡單配置就能夠直接讀取,無需本身編寫底層驅動。ide
配置過程也很簡單:工具
打開Raspbian系統的/boot/config.txt文件,在最後一行添加以下代碼。測試
dtoverlay=w1-gpio-pullup,gpiopin=17編碼
其中最後一個數字17表示:樹莓派和DS18B20鏈接所使用的擴展引腳編號,即下表中BCM編碼列中對應的數字。可根據須要選擇樹莓派40pin擴展口中的任意引腳。spa
圖1 樹莓派40Pin引腳對照表命令行
修改完config.txt後關機,將DS18B20的數據腳(TO-92封裝的中間一個引腳)鏈接到樹莓派的17pin,同時鏈接電源和地引腳。另外,還要在DS18B20的數據引腳和VCC之間鏈接一個4.7K的上拉電阻方可正常使用。code
從新開啓樹莓派後就能夠在/sys/bus/w1/devices下找到名爲28-XXXXXXX(XXXXXXX爲實際DS18B20的編號)的目錄了,其中的文件w1_slave包含了實際溫度值,用cat指令查看文件內容以下圖所示。
圖2 命令行讀取溫度數值
其中第一行末尾都會有一個YES或NO,若是是YES,那第二行緊接着就是溫度,以1/1000攝氏度爲單位。
在使用中我發現,若是直接使用DS18B20芯片和樹莓派相連,則因爲DS18B20和樹莓派的CPU過近,每每會使測量獲得的溫度偏高近10℃。所以我在某寶購買了一個帶有金屬外殼和較長連線的DS18B20,價格不過7-8元,但測量準確度大大提升。另外因爲有較長的連線,4.7K電阻的焊接也變得很容易。完成的傳感器以下圖3所示。
圖3 完成後的DS18B20探頭
2、用Python讀取並保存溫度值
編寫一個簡單的Python程序,每分鐘讀取一個溫度值,並將其按照固定格式保存在文件中,方便查看和分析。具體代碼以下所示,其核心思路是每5秒查看一次系統時間,若是達到1分鐘就讀取並保存一次數據。
1 # -*- coding: utf-8 -*- 2 import time 3 while True: 4 time.sleep(5)#休眠5秒再次查看有沒有到分鐘數字發生改變 5 year=time.localtime(time.time()).tm_year 6 mon=time.localtime(time.time()).tm_mon 7 mday=time.localtime(time.time()).tm_mday 8 hour=time.localtime(time.time()).tm_hour 9 min=time.localtime(time.time()).tm_min 10 sec=time.localtime(time.time()).tm_sec 11 if sec <= 5: 12 tp=open("/home/pi/temp_data/temp.csv","a") 13 #用末尾添加的方式在temp.csv文件的末尾添加新的時間和溫度數據 14 tp.write(str(year)) 15 tp.write("/") 16 tp.write(str(mon)) 17 tp.write("/") 18 tp.write(str(mday)) 19 tp.write("/") 20 tp.write(str(hour)) 21 tp.write("/") 22 tp.write(str(min)) 23 tp.write("/") 24 tp.write(str(sec)) 25 tp.write(",")#csv文件的分隔符 26 #讀取溫度傳感器 27 tfile=open("/sys/bus/w1/devices/28-000003e6d2d2/w1_slave",'r') 28 lines=tfile.readlines() 29 tfile.close() 30 k=lines[1].find('t=') 31 temp_str = lines[1][k+2:k+7] 32 temperature=float(temp_str)/1000.0 33 print(temperature) 34 tp.write(str(temperature)) 35 tp.write("\n") 36 tp.close() 37
3、將保存溫度值配置成系統啓動任務
因爲汽車內沒有顯示器,也不方便每次開機還要用終端啓動上邊的Python程序。所以有必要將這個程序配置爲開機就運行的系統任務。
首先,安裝用於配置和查看啓動任務的chkconfig,在終端中更實用以下命令行:sudo apt-get install chkconfig
其次,編寫啓動Python程序的腳本tmp_rec.sh以下所示。
#!/bin/bash
python3 /home/pi/python_ex/DS18B20/wr_time_temp.py
爲這個腳本增長可執行權限,並將其拷貝到/etc/init.d/下
mv tmp_rec.sh /etc/init.d/
chmod +r /etc/init.d/tmp_rec.sh
第三,將tmp_rec.sh添加到啓動運行的服務進程中:
chkconfig --add tmp_rec.sh
添加後能夠經過如下命令行查看該服務的狀態:
chkconfig --list tmp_rec.sh
第四,若是須要關閉該啓動運行的服務則能夠執行如下命令行:
chkconfig --del tmp_rec.sh
4、記錄溫度車內溫度變化曲線
將鏈接了DS18B20的樹莓派放入車內,採用點菸器車載充電器的USB口供電,便可實現車內溫度變化曲線記錄功能。
圖4 車內鏈接樹莓派和DS18B20
使用時值得注意的是,樹莓派3沒有實時時鐘,每次上電須要鏈接網絡獲取時間來做爲系統時間。而本記錄程序在溫度的同時還要記錄當前時間。所以除非你的車停在有WIFI信號的地方,不然須要打開手機熱點供樹莓派鏈接網絡獲取系統時間。
前面的Python程序在記錄溫度數據文件(*.csv)時採用了ASCII碼,所以可使用Matlab、Excel和Python matplot等任意流行的繪圖工具來繪製車內溫度變化曲線。
圖5 車內溫度曲線
由上圖能夠基本看出一天中車內溫度變化趨勢,中午10:00左右放入後數小時達到最高值29℃左右,隨後因爲下午和晚間有雨,從而致使溫度逐漸下降。剛開始階段的溫度驟降,是因爲手握DS18B20的緣由形成的。另外因爲下雨全天溫度峯值並不如想象中高,下次能夠選擇一個晴朗的日子再次測試。