树莓派+PowerBI DIY自己的温湿度IoT实时监控平台
笔者将在本文中详细介绍如何通过树莓派和Office 365的PowerBI组件打造自己的温湿度IoT实时监控平台。
选择这一主题是因为树莓派应该是最适合DIY的IT单品了,只要插插线,输入几行代码,就可以轻松实现一系列看似繁琐的功能。而且喜欢研究树莓派的爱好者很多,在网上可以轻易找到一系列资源,真正需要自定义的东西并不多。而PowerBI作为Office 365中的重要组件,因其在数据可视化方面的超强功能而在企业中广泛受到重视。
我要实现的功能就是一个简单的IoT场景,即实现某一特定环境的温度湿度监控,同时通过动态实时的方式将数据展现出来。这里引用百度百科,给大家简单科普一下IoT也就是“物联网”的概念。
物联网(The Internet of Things,简称IOT)是指通过 各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化 学、生物、位置等各种需要的信息,通过各类可能的网络接入,实现物与物、物与人的泛在连接,实现对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络 。
需要准备的材料
树莓派
淘宝上的3代树莓派开发板一个,一般是200多块钱,可以自己选择配件,比如外壳、电源、TF卡、散热风扇等等。
杜邦线/面包线
非必需品,只是为了测试方便,特别是树莓派上插线过多的情况。
温湿度传感器
树莓派上可以应用的温湿度传感器其实有不少,比如DT11,DT22,DS18B20等等,淘宝上的价格从几元到几十元不等。我这里买的是精度较高的BME280,这是一款集成温度、湿度、气压,三位一体的环境传感器。具有高精度,多功能,小尺寸等特点。DFRobot Gravity I2C BME280环境传感器采用Gravity-I2C接口设计,同时预留预留SPI接口,可以方便快捷的搭建产品原型,应用于环境监测,楼层高度检测,物联网控制等各种应用场景。Gravity I2C BME280环境传感器使用BOSCH最新MEMS微机电传感器,具备良好的稳定性。气压测量在整个温区非常稳定的,偏置温度系数±1.5 pa/k,当温度变化时,1摄氏度的温度变化导致的误差仅在12.6厘米。这种稳定性,连同其多功能的特点,使得BME280可以适用于各种应用场景。
O365/PowerBI
如果是O365的企业用户就可以直接使用了,个人用户可以去官网免费试用。
树莓派的安装
首先就是给树莓派安装操作系统,推荐直接到官网下载,下载地址。我这里下载的是标准版RASPBIAN。
RASPBERRY还包括完整版和轻量版,我选择下载了完整版,下载完整可以验证SHA-256保证数据完整性。
下面就是拿出TF卡烧录系统了,我是购买的闪迪的16GB TF卡,RASPBIAN裸系统也就2GB左右。
选择镜像文件,对应的读卡器所在盘符,等待写入完成。
然后将TF卡装到树莓派开发板中。
考虑到这个检测装置长期使用,我还加装了风扇。
连接方法可以参照下图,红线接4针脚,黑线接6针脚。
接好后如图。
另外选用了一个黑色的树莓派硬壳,将风扇用螺丝固定在外壳上,连线太长打了个结。
然后再将外壳扣上去,就很完美了。
连接传感器
下面是连接BME280的传感器,实物非常小巧。
按照下图的方法依次将几根不同颜色的彩线连接到树莓派的接线板上。
最后的结果是这样的,注意板上有几个口是同样的用途,如果树莓派上连接了多个设备,也可以酌情替换。
树莓派的基本配置
可以通过树莓派的HDMI口连接显示器,树莓派有图形化系统,使用很方便。
可以通过Putty以SSH的方式连接22端口,实现远程。
我的习惯,先安装VNC,然后再远程实现控制。具体方法这里就不赘述了,请自行百度。
这里要用到GPIO口的I2C,这里简单介绍一下I2C。
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向:如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,则主机器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机主要是负责产生定时时钟和终止数据传送。
首先就开启I2C口。
命令行界面输入以下命令。
sudo raspi-config
按照下列截图依次进入选项。
回车开启ARM I2C口。
输入命令检查I2C是否已被开启:可见红框中圈出的位置说明已被开启
lsmod
然后输入以下命令安装工具查看设备是否正常连接。
sudo apt-get install i2c-tools
sudo i2cdetect -y 1
如此说明传感器已经正确连接。
通过wget的方法下载bme280的Python程序:
wget -0 bme280.py http://bit.ly/bme280py
为了给大家看清楚代码,我用文本编辑器打开。
可以看到默认的端口地址是0x76,这里要按照之前的结果改为0x77。
尝试运行一下这个Python程序,可以看到能够正确获取到温度、湿度和气压的数据了。
上传数据到PowerBI
数据已经拿到了,随后就是考虑如何上传到Power BI中动态显示了。
首先下载这一代码,这里是通过DT22传感器获取数据上传到Power BI,将代码稍加改动即可。
下面演示一下如何获取Power BI中的API。
登录Power BI的网页界面,然后选择Streaming Datasets。
选择右上角新建New streaming dataset -> API
然后,输入以下信息:
需要以下数值:timestamp显示当前日期时间,temperature显示温度,pressure显示大气压,humidity显示湿度,后三个都是数值型数据。
创建完成后会有一个推送的Push URL,格式见下图。
之后我们给它添加定制化的动态显示效果。
这里选择Line chart,也就是最简单的折线图。
横轴就是我们的时间戳timestamp,纵轴是大气压。重复这一操作添加二张折线图分别显示温度和湿度。
我们来看看之前下载的代码,分类说明一下:
import bme280
import urllib, urllib2, time
from datetime import datetime
# REST API endpoint, given to you when you create an API streaming dataset
# Will be of the format: https://api.powerbi.com/beta//datasets/< dataset id>/rows?key=
REST_API_URL = "https://api.powerbi.com/beta/5d2d3f03-286e-4643-8f5b-10565608e5f8/datasets/885bc12f-ce3f-412b-8fcf-587d06468653/rows?key=FPYnCSWcE3Wt4neoA24GGQQWHUH%2F2aVa7KwaRo5CM9vc9b76C7bX3M"
# Gather temperature and sensor data and push to Power BI REST API
while True:
try:
# read and print out humidity and temperature from sensor
temperature,pressure,humidity = bme280.readBME280All()
# ensure that timestamp string is formatted properly
now = datetime.strftime(datetime.now(), "%Y-%m-%dT%H:%M:%S%Z")
# data that we're sending to Power BI REST API
data = '[{{ "timestamp": "{0}", "temperature": "{1:0.1f}", "pressure": "{2:0.1f}", "humidity": "{3:0.1f}" }}]'.format(now, temperature, pressure, humidity)
# make HTTP POST request to Power BI REST API
req = urllib2.Request(REST_API_URL, data)
response = urllib2.urlopen(req)
print("POST request to Power BI with data:{0}".format(data))
print("Response: HTTP {0} {1}n".format(response.getcode(), response.read()))
time.sleep(1)
except urllib2.HTTPError as e:
print("HTTP Error: {0} - {1}".format(e.code, e.reason))
except urllib2.URLError as e:
print("URL Error: {0}".format(e.reason))
except Exception as e:
print("General Exception: {0}".format(e))
关键就是REST_API_URL要改成自己之前创建的DataSet的API地址。随后代码就可以利用Python中的urllib2类向API发送数据。
运行python之后如果发觉HTTP返回的数值是200,这就说明发送成功了,如图:
回到PowerBI的网页上,就可以看到实时显示温湿度气压的效果。我们办公室里的环境还是非常适宜的,温度非常稳定。
动态呈现的效果大概是这样的:
为了防止断电或者操作系统意外,我需要将这个Python程序设置为自动运行,方法可以参见我之前的文章最后的内容。此外还可以增加其他定制内容,比如温度湿度异常的时候通过邮件通知等等。
如果我将这个树莓派带到机房里,就可以实时监测机房里的环境情况;然后我放个大显示屏在机房外面,打开PowerBI的网页实时动态呈现效果,领导肯定要夸我机灵又能干,年终奖必然要翻番啊!

大佬,我想问,那种传感器的python都从哪里弄的
一样的,操作其实就是把手环当做cuid卡写入数据
朋友按pn532搜出来的都是烧录门禁的东西啊
温湿度还有大气压的那个啊
就搜pn532,按销量排,全套价格在三十几块,买散装的价格便宜,自己接线就可以啦
来个关键词
不会啊,一般不到30,你按销量排个续
老哥 你的模块我搜了下要100?
机器自身发热影响不大么,需要考虑温度补偿矫正算法么
powerbi是有手机app的
我租的房间还真这么搞得
暑假不常住,悟空m1正对监控,看看温湿度和甲醛
不麻烦,可以摄像头记录历史回放
为什么你能发语音
能接入米家或阿里APP吗?
树莓派 重了,esp32就行了
我现在是香蕉派用ha+esphome
搞这么复杂。。。。arduino加几个模块,一百以内搞定。
esp32,你值得拥有
设计鬼才!
嘿!你他娘还真是个天才
你特娘真是个人才
能干事的人都是打工的命,能说话的人才能当领导。
现在i2c协议都不要自己写了吗?
为啥要领导夸,自己当领导啊
服务器上写好命令,定时把CPU温度,占用率,内存的也post上去,明年升你做经理
风扇用久了会积灰尘,然后会卡住不转,然后就更热了
果然是猪头先生的,大家一会儿都知道大本营了啊
那你树莓派应该刷win10 iot 才算全微软方案
同感,看完文章,我也感觉这样解决就好想到