用树莓派和DS18B20作个汽车温度记录仪[原创]

用树莓派和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  
View Code

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的缘由形成的。另外因为下雨全天温度峰值并不如想象中高,下次能够选择一个晴朗的日子再次测试。

相关文章
相关标签/搜索