用樹莓派和DS18B20做個汽車溫度記錄儀[原創] 很想知道夏日陽光暴曬下,汽車內的最高溫度以及溫度的變化情況。覺得用樹莓派和DS18B20來實現應該很簡單,於是就嘗試搗鼓了一下,半天時間就搞定了,寫下來和大家分享。以下原創內容歡迎網友轉載,但請註明出處:http://blog.163.com/he ...
用樹莓派和DS18B20做個汽車溫度記錄儀[原創]
很想知道夏日陽光暴曬下,汽車內的最高溫度以及溫度的變化情況。覺得用樹莓派和DS18B20來實現應該很簡單,於是就嘗試搗鼓了一下,半天時間就搞定了,寫下來和大家分享。以下原創內容歡迎網友轉載,但請註明出處:https://www.cnblogs.com/helesheng
一、樹莓派讀取DS18B20的溫度值
Raspbian系統已經能夠支持DS18B20單匯流排(1-wire)溫度感測器,只要簡單配置就可以直接讀取,無需自己編寫底層驅動。
配置過程也很簡單:
打開Raspbian系統的/boot/config.txt文件,在最後一行添加如下代碼。
dtoverlay=w1-gpio-pullup,gpiopin=17
其中最後一個數字17表示:樹莓派和DS18B20連接所使用的擴展引腳編號,即下表中BCM編碼列中對應的數字。可根據需要選擇樹莓派40pin擴展口中的任意引腳。
圖1 樹莓派40Pin引腳對照表
修改完config.txt後關機,將DS18B20的數據腳(TO-92封裝的中間一個引腳)連接到樹莓派的17pin,同時連接電源和地引腳。另外,還要在DS18B20的數據引腳和VCC之間連接一個4.7K的上拉電阻方可正常使用。
重新開啟樹莓派後就可以在/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探頭
二、用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() 37View Code
三、將保存溫度值配置成系統啟動任務
由於汽車內沒有顯示器,也不方便每次開機還要用終端啟動上邊的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
四、記錄溫度車內溫度變化曲線
將連接了DS18B20的樹莓派放入車內,採用點煙器車載充電器的USB口供電,即可實現車內溫度變化曲線記錄功能。
圖4 車內連接樹莓派和DS18B20
使用時值得註意的是,樹莓派3沒有實時時鐘,每次上電需要連接網路獲取時間來作為系統時間。而本記錄程式在溫度的同時還要記錄當前時間。因此除非你的車停在有WIFI信號的地方,否則需要打開手機熱點供樹莓派連接網路獲取系統時間。
前面的Python程式在記錄溫度數據文件(*.csv)時採用了ASCII碼,因此可以使用Matlab、Excel和Python matplot等任意流行的繪圖工具來繪製車內溫度變化曲線。
圖5 車內溫度曲線
由上圖可以基本看出一天中車內溫度變化趨勢,中午10:00左右放入後數小時達到最高值29℃左右,隨後由於下午和晚間有雨,從而導致溫度逐漸降低。剛開始階段的溫度驟降,是由於手握DS18B20的原因造成的。另外由於下雨全天溫度峰值並不如想象中高,下次可以選擇一個晴朗的日子再次測試。