在本教程中,我详细记录了怎么用树莓派操作DS18B20温度传感器来测量温度。
和大多数传感器一样,这个传感器的配置非常简单,只包括一个基本的电路和一些简单的代码。
我使用的是ds18B20防水传感器,这个探头通过单线接口提供温度。更好的是,这款产品是防水的,如果你需要在潮湿的环境中使用传感器,它非常合适。
还有许多其他的温度传感器可以和树莓派集成,但本教程我将专注于ds18b20。
ds18b20温度传感器在很多情况下都很方便,特别是在监测表面和液体的温度时。
设备清单
这个Raspberry Pi温度传感器所需要的设备如下,点击链接可以直达特别优惠购买。
建议
可选
- ? 树莓派外壳
- ? USB鼠标
- ? USB键盘
- ? 以太网线或WiFi (如果你想联网,Raspberry Pi 3,4有内置的WiFi)。
构建树莓派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. 将一根导线从地线引出到地轨上。
一旦完成,电路应该看起来类似于下图。 请记住,某些版本的温度传感器可能有更多的电线,而不是三根。请参考数据表,了解每根线的更多信息。
树莓派温度传感器代码
设置温度传感器的代码比电路本身要复杂一些。这种复杂性只是因为我们需要处理来自传感器的数据。
由于使用的是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就可以了。
现在是时候写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
现在应该有一个华氏和摄氏两种温度的输出。
进一步的扩展
能够用这个Raspberry Pi温度传感器做的事情还有不少。
可以让Python脚本连接到数据库,如MYSQL,并以这种方式存储数据。给数据添加一个时间戳,在未来回顾数据并比较任何变化。
可以使用存储在MYSQL数据库中的数据来制作漂亮的图表,显示一天、一个月甚至一年的温度。也可以让它实时地绘制一个图表。
另外,使用influxDB与Grafana一起使用也是一种可视化显示温度统计数据的好方法。
如果你遇到任何问题或者反馈,请在下面留言讨论。
欢迎转载,请留下出处链接:Labno3 » 树莓派温度传感器,Raspberry Pi如何使用DS18B20测量温度