用树莓派和DS18B20做个汽车温度记录仪
用树莓派和DS18B20做个汽车温度记录仪[原创]
很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况。觉得用树莓派和DS18B20来实现应该很简单,于是就尝试捣鼓了一下,半天时间就搞定了,写下来和大家分享。以下原创内容欢迎网友转载,但请注明出处:http://blog.163.com/he_lesheng
一、树莓派读取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
三、将保存温度值配置成系统启动任务
由于汽车内没有显示器,也不方便每次开机还要用终端启动上边的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的原因造成的。另外由于下雨全天温度峰值并不如想象中高,下次可以选择一个晴朗的日子再次测试。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java源码-LinkedList
开篇 LinkedList基于链表实现,在List中间进行插入和删除的代价较低,提供了优化的顺序访问。LinkedList在随机访问方面相对比较慢,但是它的特性集较ArrayList更大。 LinkedList的实现是一个双向链表,LinkedList存储的Node节点包含指向前置后置节点的指针。 LinkedList类图 LinkedList类图 LinkedList的数据存储结构图 LinkedList类定义 LinkedList的类定义中包含first节点和last节点,通过first节点(指向头节点)和last节点(指向尾节点)将串联所有的list中的节点,看下Node的定义就知道了。 Node的prev和next节点分别指向前后节点。 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size ...
- 下一篇
Java 数组 之 一维数组 搜索元素
http://www.verejava.com/?id=16992664685428 /** 题目: 从scores中查找给定的值value 在数组scores中的索引位置 思路: 1. 遍历数组scores中的值, 如果有值与 给定的value相等 打印出当前索引 否则打印-1 没有找到 */ import java.util.Scanner; public class ArraySearch { public static void main(String[] args) { //一维数组的定义和初始化 int[] scores = { 90, 70, 50, 80, 60, 85 }; System.out.println("请输入要查找的值value:"); Scanner in = new Scanner(System.in); int value = in.nextInt(); //. 遍历数组scores中的值, 如果有值与 给定的value相等 打印出当前索引 //否则打印-1 没有找到 boolean isSearch = false; for (int i = 0;...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL8.0.19开启GTID主从同步CentOS8
- Hadoop3单机部署,实现最简伪集群
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题