Predix之玩转树莓派(2) 从传感器采集数据
作者:唐翊国,开发者生态资深经理,GE数字集团
23年工作经验,长期在杜邦、欧文斯科宁、庄信万丰等从事制造业信息化工作,规划、实施了大量MES、SAP ERP、LIMS、BPM等项目,积累了丰富的制造业数字化转型经验。
如果您还没有Predix试用帐号,请访问
https://supportcentral.ge.com/esurvey/GE_survey/takeSurvey.html?form_id=18446744073709715720申请。请务必准确提供您的信息,我们会以邮件方式通知您注册结果。
如果您使用Windows操作系统,请参考http://blog.****.net/predixcn/article/details/53967673 系列文章设置您的开发环境。
如果您使用Linux操作系统,请参考http://blog.****.net/predixcn/article/details/54093234 系列文章设置您的开发环境。
话说上篇文章http://blog.****.net/predixcn/article/details/70244037 中我们已经准备了一个崭新的树莓派及Raspbian操作系统,本文会介绍如何用树莓派采集传感器数据。
本文使用的是一台2016年初发布的树莓派3代ModelB,给它取个名叫Pi3。用SmarTTY连接它:
Pi3的CPU是Broadcom BCM2837 64bit ARMv8 quad core Cortex A53 处理器,其自带有温度传感器。Pi3上运行命令行
vcgencmd measure_temp
可以得到当前的CPU温度:
Raspbian默认是安装了Python的,可以验证一下,
python --version
现在我们改用一段Python程序readcputemp.py来获取CPU温度。
import os
def getCPUtemperature():
result = os.popen('vcgencmd measure_temp').readline()
return(result.replace("temp=","").replace("'C\n",""))
print getCPUtemperature()
运行它,
python readcputemp.py
我们已经成功地读取了CPU的温度,我们再用一个外置的温度传感器来获取环境温度。
停掉Pi3并准备如下的小部件:
1. 一个防水的DS18B20 数字温度传感器
2. 一个 4.7K 电阻作为上拉电阻
3. 一些杜邦线
本文使用一个开源的工具 - Fritzing 来设计树莓派的连接布局:
按照如下方式连接GPIO针脚
TS18B20 针脚 VCC (红色线) ------ 树莓派的针脚 1(正极3.3V) ------ 同时并连电阻
TS18B20针脚Data (黄色线) ------树莓派的针脚37 (GPIO 26) ------同时并连电阻
TS18B20 针脚 GND (黑色线) ------树莓派的针脚39(负极接地)
从2015年1月起,Raspbian操作系统默认使用设备树(Device Tree,DT)来管理外部设备如传感器等。因此,Pi3上电后,要启用one-wire接口。这可以通过修改/boot/config.txt来达到目的。
sudo nano /boot/config.txt
就是修改最后一行,由于使用了针脚37,要说明对应的GPIO26,同时由于使用了外接上拉电阻,要使用w1-gpio-pullup(参考/boot/overlays/ README文件)
dtoverlay=w1-gpio-pullup,gpiopin=26
修改完成后,重启Pi3。
一旦Pi3再次启动,运行
lsmod
我们就可以看到一个w1_therm进程,它是TS18B20的驱动程序。
现在运行下面的命令
cd /sys/bus/w1/devices
ls
我们会发现出现了一个28-***的文件,这个奇怪的文件名其实是这个TS18B20温度传感器的唯一***。
如果我们列出它的内容
cat/sys/bus/w1/devices/28-8000002705fe/w1_slave
就得到当前环境温度是22062/1000 = 22.06摄氏度。
注意:第一次列出内容时,通常会显示85000,所以要忽略它。
现在我们结合前面的Python代码,用一个Python程序read18b20.py从TS18B20获取环境温度(参考修改了https://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/software)
import datetime
import time
import os
import glob
import sys
try:
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
device_file = '/sys/bus/w1/devices/28-8000002705fe/w1_slave'
defgetCPUtemperature():
result = os.popen('vcgencmd measure_temp').readline()
cpu_temp =float(result.replace("temp=","").replace("'C\n",""))
return cpu_temp
defread_temp():
f= open(device_file, 'r')
lines = f.readlines()
f.close()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
f = open(device_file, 'r')
lines = f.readlines()
f.close()
pos = lines[1].find('t=')
if pos != -1:
temp_string = lines[1][pos+2:]
return float(temp_string) / 1000.0
while True:
print datetime.datetime.now(),"Current Env temperature is:%.2f" %read_temp()
print "Current CPU temperature is: %.2f" %getCPUtemperature()
time.sleep(1)
except:
print '=================== error ================='
finally:
print '=================== stop =================='
sys.exit(1)
至此,我们成功地读取了树莓派内部温度传感器的数据和一个外接温度传感器的数据。
在使用中您有任何问题,请访问我们的论坛http://bbs.****.net/forums/GEPredix
GE数字集团的技术专家们会在线回答您的问题。
也请访问我们在****的Predix专区http://predix.****.net/ 了解更多Predix的内容和相关活动。