树莓派温度传感器,Raspberry Pi如何使用DS18B20测量温度

在本教程中,我详细记录了怎么用树莓派操作DS18B20温度传感器来测量温度。

Raspberry-Pi-Temperature-Sensor.jpg

和大多数传感器一样,这个传感器的配置非常简单,只包括一个基本的电路和一些简单的代码。

我使用的是ds18B20防水传感器,这个探头通过单线接口提供温度。更好的是,这款产品是防水的,如果你需要在潮湿的环境中使用传感器,它非常合适。

还有许多其他的温度传感器可以和树莓派集成,但本教程我将专注于ds18b20。

ds18b20温度传感器在很多情况下都很方便,特别是在监测表面和液体的温度时。

设备清单

这个Raspberry Pi温度传感器所需要的设备如下,点击链接可以直达特别优惠购买。

建议

可选

构建树莓派ds18b20电路

需要构建的电路非常简单,因为只需要一个电阻和温度传感器。

在本教程中使用的传感器是DS18B20传感器的防水版。它看起来就像一条很长的线,一端有一个厚厚的部分。如果你只有一个普通版本,没有布线和防水,那么它看起来就像一个晶体管。

该传感器的温度测量误差在0.05°C以内,非常准确。它可以处理高达125°C(260°F)的温度,但建议将其保持在100°C(210°F)以下。这款设备还有一个板载模拟数字转换器,所以能够轻松地将其连接到Pi上的数字GPIO引脚。

请记住,不是所有的温度传感器都是一样的。在本教程中,像TMP36这样的不能简单地替换ds18b20。

TMP36是一个模拟设备,它与Pi的集成难度稍大。TMP36的问题和在光传感器上遇到的问题一样,因为树莓Pi没有模拟引脚。

把这个电路组装起来是超级简单的,将在下面快速地进行一些基本说明。如果你有困难,那么请参考图示。

如果需要更多关于GPIO引脚的信息,那么一定要查看我的树莓派GPIO引脚入门指南

1. 首先,将Pi的3v3引脚接正极轨,地线引脚接面包板上的地线。

2. 现在将DS18B20传感器放到面包板上。

3. 在传感器的正极引线和输出引线之间放置一个4.7k的电阻。

4. 将一根导线从正极引线放到3v3正极轨道上。

5. 将一条线从输出引线放回Raspberry Pi的4号引脚(如果使用物理编号,则为7号引脚)。

6. 将一根导线从地线引出到地轨上。

一旦完成,电路应该看起来类似于下图。  请记住,某些版本的温度传感器可能有更多的电线,而不是三根。请参考数据表,了解每根线的更多信息。

Raspberry-Pi-Temperature-Sensor-Diagram-v2.png

树莓派温度传感器代码

设置温度传感器的代码比电路本身要复杂一些。这种复杂性只是因为我们需要处理来自传感器的数据。

由于使用的是Python,所以值得学习一些基础知识,所以我强烈建议大家看看我的Python初学者指南

在制作Python脚本之前,首先需要设置Pi,使其能够从传感器读取数据。要做到这一点,需要添加OneWire支持。

1. 添加对OneWire的支持,需要打开启动配置文件,运行以下命令来完成。

sudo nano /boot/config.txt

2. 在该文件的底部输入以下内容:

dtoverlay=w1-gpio

3. 一旦完成保存和退出,按ctrl x,然后按y。现在运行以下命令重新启动Pi。

sudo reboot

4. 可以跳过下载代码到Pi上,或者按照接下来的几个步骤来检查传感器是否真的在工作。

5. Raspberry Pi重新启动后,运行modprobe,加载正确的模块。

sudo modprobe w1-gpio
sudo modprobe w1-therm

6. 现在换到设备目录下,用ls查看目录下的文件夹和文件。

cd /sys/bus/w1/devices
ls

7. 运行下面的命令,使用ls命令将cd后面的编号改为你的目录中出现过的内容。(如果你有多个传感器,会有多个目录)

cd 28-000007602ffa

8. 现在运行以下命令。

cat w1_slave

9. 这个命令应该输出数据,但你会发现它对用户不是很友好。

第一行的末尾应该有一个YES或NO。如果是YES,那么第二行就会出现温度。这一行看起来会类似于t=12323这样的东西,你需要做一些数学运算,使之成为我们可以轻松理解的可用温度。例如,摄氏度只要除以1000就可以了。

temperature-output.jpg

现在是时候写Python脚本了。

如果想了解更多的代码,会在下面简单的解释一下。这段代码来源于Adafruit的教程。如果想下载它可以使用下面的命令。

git clone https://github.com/pimylifeup/temperature_sensor.git

在Python脚本中导入三个包,OS、Glob和time。

接下来,运行modprobe命令,这些命令和我们之前使用的一样。

声明三个不同的变量,它们引用传感器数据的位置。不应该改变这些变量。

import os
import glob
import time
 
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
 
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

在read_temp_raw函数中,打开了包含温度输出的文件。从这个文件中读取所有的行,然后返回它,这样调用这个函数的代码就可以使用它。在这种情况下,read_temp函数会调用这个函数。

def read_temp_raw():
    f = open(device_file, 'r')
    lines = f.readlines()
    f.close()
    return lines

在read_temp函数中,处理来自read_temp_raw函数的数据。首先要确保第一行包含YES。这样就会打印一行温度。

如果有温度,就用 lines[1].find(‘t=’)来查找 t= 的值。Lines[1]是查找数组中的第2个元素,本例中是第2行。

Equals_pos是温度(t)的起始位置,在这个位置上加2,得到实际的温度数字。

然后将这个数字转换成摄氏和华氏温度。将这两个数值返回给调用这个函数的代码。这个函数就是位于while循环中的print。

def read_temp():
    lines = read_temp_raw()
    while lines[0].strip()[-3:] != 'YES':
        time.sleep(0.2)
        lines = read_temp_raw()
    equals_pos = lines[1].find('t=')
    if equals_pos != -1:
        temp_string = lines[1][equals_pos+2:]
        temp_c = float(temp_string) / 1000.0
        temp_f = temp_c * 9.0 / 5.0 + 32.0
        return temp_c, temp_f

while循环始终为真,所以它将永远运行,直到程序被错误或用户取消脚本而中断。它只是调用print函数中的read_temp。打印函数允许我们在屏幕上看到输出。脚本每读完一个传感器,就会进入1秒钟的睡眠状态。

while True:
	print(read_temp())	
	time.sleep(1)

测试代码

下载或完成了代码的编写后,正确地设置了电路,可以调用Python脚本了。要调用Python脚本,只需运行以下命令。

sudo python thermometer_sensor.py

现在应该有一个华氏和摄氏两种温度的输出。

temperature-sensor-readings.jpg

 

进一步的扩展

能够用这个Raspberry Pi温度传感器做的事情还有不少。

可以让Python脚本连接到数据库,如MYSQL,并以这种方式存储数据。给数据添加一个时间戳,在未来回顾数据并比较任何变化。

可以使用存储在MYSQL数据库中的数据来制作漂亮的图表,显示一天、一个月甚至一年的温度。也可以让它实时地绘制一个图表。

另外,使用influxDB与Grafana一起使用也是一种可视化显示温度统计数据的好方法。

如果你遇到任何问题或者反馈,请在下面留言讨论。

平均: 5 / 5. votes: 1

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派温度传感器,Raspberry Pi如何使用DS18B20测量温度

赞 (0)

评论

5+2=