用樹莓派和DS18B20做個汽車溫度記錄儀[原創]


用樹莓派和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()
37  
View 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的原因造成的。另外由於下雨全天溫度峰值並不如想象中高,下次可以選擇一個晴朗的日子再次測試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM