电子说
概述
Raspbian发行版包括对DS18B20 1线温度传感器的支持。这些传感器采用晶体管等小的三引脚封装,是精确的数字设备。
在本课程中,您将学习如何在Raspberry Pi上使用DS18B20来获取温度读数。
从Raspberry开始Pi没有ADC(模数转换器),它不能直接使用TMP36之类的模拟温度传感器,这使得DS18B20成为温度传感的理想选择。
硬件
DS18B20晶体管外形尺寸(TO-92)部件和防水有线型号的面包板布局如下所示。我们提供了较旧的20针和现代40针Raspberry Pi连接器的示例。此设置将适用于已发布的所有Raspberry Pi型号,但不包含突破接头的Pi计算模块除外。
DS18B20“ 1-wire”传感器可以并联连接-与出售的几乎所有其他传感器不同!所有传感器都应共享相同的引脚,但是所有它们只需要一个4.7K电阻器
该电阻器用作数据线的“上拉”,并且需要保持数据传输的稳定和快乐
请注意正确选择DS18B20。弯曲的边缘应位于左侧,如下图所示。如果使用错误的方法,它将变热然后破裂。
DS18B20 +都是温度传感器,但与TMP36完全不同。您不能在本教程中使用TMP36!
40针(A,B,B +和零)Cobbler Plus原理图
-Pin(Raspberry Pi版本1和版本2)补鞋匠示意图
防水40针[黑色]
如果您使用的是DS18B20的防水版本,则该设备具有三根引线,红色,黑色和黄色。不需要连接的裸铜屏蔽线。
防水20针[黑色]
高温防水[白色]
如果使用我们出售的DS18B20的“高温”版本,将橙色条纹连接到3.3V,白色连接到地面,蓝色条纹是数据,引脚4。
您仍然需要〜4.7K-10K从数据到3.3V的电阻
DS18B20
尽管DS18B20看起来像普通的晶体管,但实际上内部有很多东西。
该芯片包括特殊的1有线串行接口以及控制逻辑和温度传感器本身。
其输出引脚发送数字消息,而Raspbian包括读取这些消息的接口。一旦我们在Raspberry Pi上使用“ raspi-config”工具启用了1-Wire,将在随后的重启中加载正确的内核模块。
启用1-Wire
下载:文件
复制代码
sudo raspi-config sudo raspi-config
选择接口选项
选择 1-Wire 》
选择是是是
退出raspi-config并重新启动Pi,以便加载1-wire内核模块。
下载:文件
复制代码
sudo reboot sudo reboot
验证是否在下次启动时加载了1-Wire内核模块。运行 lsmod 命令时,您应该会看到类似下面的输出。
下载:文件
复制代码
lsmod | grep -i w1_ lsmod | grep -i w1_
软件
Python程序处理任何失败的消息,并每秒报告摄氏度和华氏温度。
下载:Project Zip 或 thermometer.py | 在Github上查看
复制代码
import glob
import time
base_dir = ‘/sys/bus/w1/devices/’
device_folder = glob.glob(base_dir + ‘28*’)[0]
device_file = device_folder + ‘/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()
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 True:
print(read_temp())
time.sleep(1)
import glob
import time
base_dir = ‘/sys/bus/w1/devices/’
device_folder = glob.glob(base_dir + ‘28*’)[0]
device_file = device_folder + ‘/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()
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 True:
print(read_temp())
time.sleep(1)
接下来的三行,从中找到文件
下载:文件
复制代码
def read_temp_raw():
catdata = subprocess.Popen([‘cat’,device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = catdata.communicate()
out_decode = out.decode(‘utf-8’)
lines = out_decode.split(‘ ’)
return lines def read_temp_raw():
catdata = subprocess.Popen([‘cat’,device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = catdata.communicate()
out_decode = out.decode(‘utf-8’)
lines = out_decode.split(‘ ’)
return lines
读取温度是通过两个函数进行的,read_temp_raw只是从接口获取消息的两行。 read_temp函数会对此进行总结,以检查是否有错误消息,然后重试直到收到第一行末尾带有“ YES”的消息。该函数返回两个值,第一个为摄氏度,第二个为华氏。
如果希望将这两个值分开,如下例所示:
下载:文件
复制代码
deg_c, deg_f = read_temp() deg_c, deg_f = read_temp()
程序的主循环只是循环,读取温度并打印,然后睡眠一秒钟。
要将程序上传到Raspberry Pi上,可以使用 SSH连接到Pi ,使用以下行启动编辑器窗口:
下载:文件
复制代码
nano thermometer.py nano thermometer.py
,然后粘贴上面的代码,然后使用CTRL-保存文件x和Y。
配置和测试
该程序必须以超级用户身份运行,因此在终端中键入以下命令以启动该程序:
下载:文件
复制代码
sudo python thermometer.py sudo python thermometer.py
如果一切顺利,您将看到一系列读数,如下所示:
尝试将手指放在传感器上进行加热。
添加更多传感器
您可以并行添加其他DS18B20传感器-将所有传感器的VCC,数据和接地引脚连接在一起。使用一个4.7K电阻。您将看到多个 /sys/bus/w1/ devices/28-nnnnn 目录,每个目录都有唯一的序列号作为目录名。 python示例代码现在仅适用于一个传感器,因此如果您希望一次从不同的传感器读取它,则必须对其进行修改
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !