树莓派 SAKS 扩展板实用应用 之 数字温度计

本文所介绍的内容基于树莓派瑞士军刀扩展板(SAKS),由于 SAKS 基于树莓派通用的 GPIO 设计,文中的原理和代码也适用于其他情况。

本文由树莓派实验室创作,遵循CC协议(署名-非商业性使用-禁止演绎-相同方式共享),欢迎树莓派爱好者们遵循协议内容转载传播。谢绝不遵守协议的转载和抄袭。

本节以 SAKS 扩展板为硬件基础,实现一个数字温度计,显示实时室温。利用 SAKS 扩展板预留的 DS18B20 的排座,直插一个 DS18B20 温度传感器用于感知温度。再将温度显示在数码管上。

由于我们已经开始基于 SAKS SDK 开发(了解 SAKS SDK 发布的信息请阅读这里),本例程中涉及到的 SAKS 扩展板引脚编号我们根本不需要再关心。

一、读取 DS18B20 温度值

2012年12月之后的 Raspbian 系统已经能够支持 DS18B20 单总线温度传感器。这种传感器由半导体包裹的头和三个引脚组成,它是一种精确地数字设备。DS18B20 传感器可以以非并行连接接入,这一点几乎与其他市售的传感器都不同!所有传感器共享相同的针脚,SAKS 扩展板已经在 VCC 脚和数据脚之间加入一个 4.7k 欧的电阻。用于拉高数据输出脚的电压,保持数据输出的稳定。

要注意 DS18B20 插入 SAKS 扩展板排座的方向,弧形的一边如图所示。如果你接反了,有可能会烧坏传感器。


DS18B20 插入示意图

为了验证 DS18B20 插入之后是否正常工作,在终端输入以下命令:

sudo modprobe w1-gpio
sudo modprobe w1-therm
cd /sys/bus/w1/devices
ls

执行到这里时,如果 “devices” 目录下出现了以 “28-” 开头的目录,就表示 DS18B20 被正确识别了。

注意:假如到了这一步,无法看到“28-” 开头的目录,请先确认一下你是否使用了2015-02-16之后的Raspbain系统,如果是,则建议按照如下方法修改配置:
sudo nano /boot/config.txt
在最后一行手动添加这个,保存并重启树莓派。
dtoverlay=w1-gpio-pullup,gpiopin=4
根据官方的说法,在2015-02-16之后的Raspbain版本,为了防止GPIO的冲突,使用了新的dt策略,查看 /boot/overlay/readme

cd 28-xxxx(XXX换成实际的传感器编号)
cat w1_slave

执行到这里就能看到两行文字,第一行末尾都会有一个YES或NO,如果是YES,那第二行紧接着就是温度,以1/1000摄氏度为单位。
20151011124736364-0

所以在上面的例子中,实际读取到的温度是25.75摄氏度。

二、显示温度

要将从传感器读取到的温度数值显示在 SAKS 扩展板的数码管上,首先要了解数码管的使用方法。在 SAKS SDK 中,数码管的 show 方法已经封装了数码管的逻辑,因此任何时候调用数码管显示数值,只需要调用这个方法,把数值作为参数提供即可。如果你有兴趣了解数码管具体是如何被驱动工作的,可以在 SDK 源码中找到相关的部分。其次,DS18B20温度的读取,SDK中同样做了封装,提供了方便快捷的方法来获取。好了,要显示温度数值就简单了。程序代码如下:

from sakshat import SAKSHAT
import time

#Declare the SAKS Board
SAKS = SAKSHAT()

if __name__ == "__main__":
    while True:
        #从 ds18b20 读取温度(摄氏度为单位)
        temp = SAKS.ds18b20.temperature
        #返回值为 -128.0 表示读取失败
        if temp == -128.0 :
            #10秒后再次尝试
            time.sleep(10)
            continue

        print (("%5.1f" % temp).replace(' ','#'))
        #数码管显示温度数值,5位(含小数点)、精确到小数点1后1位
        SAKS.digital_display.show(("%5.1f" % temp).replace(' ','#'))
        time.sleep(5)
    input("Enter any keys to exit...")

将上面的程序源码保存为 main.py 接下来如果要运行,请注意程序开头的 from sakshat import SAKSHAT,需要导入 SAKS SDK 模块。为此我们需要将 SAKS SDK 模块的相关文件和 main.py 放在一起才能正确执行 main.py 程序。我们准备了一个包含 main.py 和 SAKS SDK 的包并在 Github 上提供下载:https://github.com/spoonysonny/SAKS-tutorials/tree/master/temperature-display-ds18b20

在终端运行:

sudo git clone https://github.com/spoonysonny/SAKS-tutorials.git
cd SAKS-tutorials/temperature-display-ds18b20
sudo python main.py

温度数值实时显示在了 SAKS 扩展板上。

后面我们后面将开始介绍如何基于 SAKS 扩展板 DIY 各种有趣、实用的东西,欢迎持续关注!

本文属于《树莓派瑞士军刀扩展板(SAKS)DIY 教程》系列文章,查看系列文章目录,请访问:http://shumeipai.nxez.com/swiss-army-knife-shield-for-raspberry-pi-diy-tutorials