一起玩转树莓派(9)——DS18B20测温模块应用

简介:        关于使用树莓派测量温度,我们之前在学习模数转换的相关博客中已经有过应用。其实除了使用传统的AD采集温度数据外,我们也可以通过树莓派中的单总线技术结合DS18B20传感器来更加方便精准的测量环境温度。

一起玩转树莓派(9)——DS18B20测温模块应用

       关于使用树莓派测量温度,我们之前在学习模数转换的相关博客中已经有过应用。其实除了使用传统的AD采集温度数据外,我们也可以通过树莓派中的单总线技术结合DS18B20传感器来更加方便精准的测量环境温度。

一、认识DS18B20模块与单总线通信

      DS18B20是一种改进型的智能温度传感器。与传统的热敏电阻相比,其可以直接读出被测量的温度,并且能够根据实际应用场景中的要求进行简单的编程。无论是读取数据还是写入数据,DS18B20都只需要一条接口线,因此其使用的是单总线的通讯协议。DS18B20模块的主要优势在于其抗干扰能力强,精度高,无需复杂的软件处理可以直接输出温度数据。本次实验,我们使用的DS18B20模块如下图所示:

可以看到此模块有3个引脚,除了电源引脚和接地引脚外,剩下的一个就是用来输出温度数据的引脚。

      单总线通信被称为one-wire通信,因此又常常被简称为1w总线通信。首先我们需要先开始树莓派的1w总线通信功能,打开树莓派的Raspberry Configuration菜单,在Interfaces选项中将1-Wire功能开启,如下图所示。

如果我们是通过无交互页面的终端登录的树莓派,也可以通过修改配置文件来开启1-Wire功能,在树莓派Linux系统的根目录下,找到如下路径的文件:

/boot/config.txt

在其中添加如下一行文本即可:

dtoverlay=w1-gpio

需要注意,添加之后需要重启树莓派。需要注意,1-Wire功能默认将使用树莓派的BCM编码为GPIO4的引脚作为通信引脚,如何我们要进行自定义,可以在刚才的配置文件中进行指定,如下:

dtoverlay=w1-gpio,gpiopin=18

其表示要使用BCM编码为GPIO18的引脚作为通信引脚。

做完了上面的操作后,我们可以在树莓派终端中使用如下指令查看单总线是否启动成功:

$ lsmod

终端输出效果如下:

可以看到,如果有显示w1_gpio和wire两个部分,则表示单总线已经启动成功,分别在终端执行如下两条命令:

$ modprobe w1-gpio
$ modprobe w1-therm

如果终端没有输出任何信息,则表示单总线已经初始化完成,此时实际上我们已经可以让DS18B20进行工作了。

二、通过DS18B20模块获取环境温度

通过前面的操作,我们已经完成了基本的准备工作,将DS18B20连接到树莓派,引脚对应如下:

DS18B20 树莓派
+ 3.3V
- GND
out BCM编码为GPIO4的引脚

之后我们从树莓派的终端进入如下目录:

/sys/bus/w1/devices

在此目录下,我们可以看到有两个文件,如下图所示:

其中以28-xxx开头的文件夹中的文件记录的就是1w单总线输入的数据,需要注意,读者操作时,此文件夹的名称和笔者可能并不完全一样,其表示传感器设备的编号,大家这里只需要找到28-xx开头的文件夹即可。在此文件夹中,有一个名为w1_slave的文件,此文件中记录的就是传感器的温度数据,我们可以打开看看,内容如下:

d2 01 55 05 7f 7e 81 66 59 : crc=59 YES
d2 01 55 05 7f 7e 81 66 59 t=29125

其中,大部分数据我们都无需关心,其最后的t=29125就是当前的环境温度,将其转换为摄氏温度,直接除以1000即可,例如上面的数据表明当前的环境温度是29.125摄氏度。

      目前为止,我们已经可以非常轻松的获取DS18B20模块提供的温度数据了,但是查看的方式非常不智能,其实我们可以通过Python程序来不停的读取此数据文件,解析出其中的温度数据,之后无论是做记录还是进行其他元件控制都会非常方便。编写示例代码如下:

#coding:utf8

import os,time
# 传感器编号
name = "28-020692455d61"
# 设备记录数据的文件地址
device_file ='/sys/bus/w1/devices/' + name + '/w1_slave'

# 读取文件数据
def read_temp_raw():
    f = open(device_file,'r')
    lines = f.readlines()
    f.close()
    return lines

# 解析温度数据
def read_temp():
    lines = read_temp_raw()
    # 此行默认不是'YES' 表明未读取到有效数据
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        # 循环继续读
        lines = read_temp_raw()
    # 找到第2行的't='的位置
    equals_pos = lines[1].find('t=')
    # 将温度数据取出
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string)/1000.0
    return temp_c

while True:
    print('%fC'%read_temp())
    time.sleep(1)

在树莓派中运行上面代码,可以看到控制台输出的当前温度数据,如下图所示:

三、讲在后面

      本篇博客,我们介绍了如何使用one-wire单总线进行外设数据的读取,DS18B20只是作为示例,抛砖引玉,通过树莓派的1w总线,我们还可以连接更多的外设实现更加有创意的东西,大家开动脑筋,尽情玩耍吧!

专注技术,懂的热爱,愿意分享,做个朋友
目录
相关文章
|
4月前
|
传感器 机器学习/深度学习 算法
【指纹识别】指纹细节提取(Matlab代码实现)
【指纹识别】指纹细节提取(Matlab代码实现)
351 4
|
4月前
|
人工智能 安全 程序员
RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通
本文用轻松幽默的方式解密如何在RAG系统中选择、调教和监督生成模型,让它成为一个既聪明又靠谱的知识助手。从模型选择到提示工程再到质量控制,手把手教你如何避开AI的「胡言乱语」陷阱。
204 11
|
9月前
|
机器学习/深度学习 人工智能 搜索推荐
AutoGLM沉思:智谱AI推出首个能"边想边干"的自主智能体!深度研究+多模态交互,颠覆传统AI工作模式
AutoGLM沉思是由智谱AI推出的一款开创性AI智能体,它突破性地将深度研究能力与实际操作能力融为一体,实现了AI从被动响应到主动执行的跨越式发展。
902 16
AutoGLM沉思:智谱AI推出首个能"边想边干"的自主智能体!深度研究+多模态交互,颠覆传统AI工作模式
|
JavaScript 前端开发 网络安全
全局代理与自动代理主要差异与选择
全局代理与自动代理主要差异与选择
1241 12
|
机器学习/深度学习 存储 人工智能
梯度累积的隐藏陷阱:Transformer库中梯度累积机制的缺陷与修正
在本地微调大规模语言模型时,由于GPU显存限制,通常采用梯度累积技术来模拟大批次训练。然而,实际研究表明,梯度累积方法在主流深度学习框架中会导致模型性能显著下降,尤其是在多GPU环境中。本文详细探讨了梯度累积的基本原理、应用场景及存在的问题,并通过实验验证了修正方案的有效性。研究指出,该问题可能在过去多年中一直存在且未被发现,影响了模型的训练效果。
1095 4
梯度累积的隐藏陷阱:Transformer库中梯度累积机制的缺陷与修正
|
存储 关系型数据库 MySQL
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
分布式事物【悲观锁、乐观锁、读锁、写锁、间隙锁、临键锁 、 表锁、行锁、页面锁、 如何避免死锁】(二)-全面详解(学习总结---从入门到深化)
822 0
|
Prometheus 监控 Cloud Native
grafana展示的CPU利用率与实际不符的问题探究
观察到`mpstat`命令显示单核CPU的`%usr`和`%sys`分别持续在70%和20%,而Grafana监控数据显示较低。问题源于Grafana表达式计算的是CPU时间增量而非利用率。`mpstat`通过`/proc/stat`获取数据并计算CPU利用率,而`node-exporter`直接导出原始数据。调整Grafana表达式以匹配`mpstat`的计算方式后,两者结果一致。解决方案是修正Grafana查询以准确反映CPU占用率。
686 1
grafana展示的CPU利用率与实际不符的问题探究
|
网络协议 安全 JavaScript
Web实时通信的学习之旅:WebSocket入门指南及示例演示
Web实时通信的学习之旅:WebSocket入门指南及示例演示
2320 0
|
存储 人工智能 安全
AI工具使公司面临数据泄露的风险
AI工具使公司面临数据泄露的风险
|
负载均衡 算法 网络虚拟化
ensp中链路聚合配置命令
链路聚合(Link Aggregation)是结合多条物理链路形成逻辑链路的技术,提升网络带宽、增强冗余性和优化负载均衡。在高带宽、高可靠性及负载均衡需求的场景如服务器集群、数据中心等中广泛应用。配置包括手动和自动模式,手动模式下,如LSW1和LSW2,通过`int eth-trunk`、`trunkport`等命令配置接口和成员链路。自动模式下,如SW3和LSW4,使用LACP协议动态聚合,通过`mode lacp-static`和`load-balance dst-mac`命令设置。配置后,使用`dis eth-trunk`检查聚合状态。
2656 1
ensp中链路聚合配置命令

热门文章

最新文章