此前,树莓派实验室发布过一个开源项目 Pi Dashboard,该项目可以很直观地展示树莓派系统运行的各种实时数据,包括CPU、内存、磁盘占用、网络使用等数据。
这些主要是综合了树莓派本身的信息进行展示,对于外部数据,例如通过外接传感器获取被监测点的环境数据是否能有一个框架,只需要修改少量代码甚至无需修改就能马上用起来呢?
下面要介绍的是“Pi Dashboard DAQ 框架”,这套方案就能实现这个需求。
本项目分为几个部分
1、数据采集程序(后端采集部分,基于 MCC 的 daqhats 库)
2、仪表盘WebUI(前端展现部分,PHP 程序)
文中用到的传感器均使用模拟信号输出,经由 MCC118 扩展板采集得到电信号
为什么使用 MCC118 扩展板呢?我可以选择不使用它吗?
我们选择 MCC118 扩展板是权衡了通用与专业性、易用性和性价比三方面因素的。这款扩展板支持 -10V ~ +10V 电信号采集,支持12位分辨率8通道采集,单片总吞吐量100KS/s,能对接常用的各类传感器。官方还专门为树莓派提供了一套程序库大大提高了二次开发效率和易用性。在满足前两方面的同级别产品中,其价格也具有一定优势。
因项目属于程序框架性质,我们鼓励大家通过修改将它应用在各种实际的项目中,例如你仅仅只需要用到某些数字输出的传感器,那么当然可以自行编写数据采集程序直接,从传感器获取数据、再将结果以符合框架所用的 JSON 格式输出即可。同样,如果你对所用传感器的模拟输出实时性要求并不高,也可以采用更低成本的 ADC 模块来读取传感器信号。
数据采集程序
这部分主要功能是读取传感器的电压或数值,并用 JSON 格式输出。使用了 web.py 框架,因为用到了 MCC118 读取模拟信号,所以用到了 daqhats 库。
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import web import json from time import sleep from sys import stdout from daqhats_utils import select_hat_device, enum_mask_to_string from daqhats import mcc118, OptionFlags, HatIDs, HatError # Constants CURSOR_BACK_2 = '\x1b[2D' ERASE_TO_END_OF_LINE = '\x1b[0K' urls = ( '/(.*)', 'hello' ) app = web.application(urls, globals()) options = OptionFlags.DEFAULT low_chan = 0 high_chan = 7 mcc_118_num_channels = mcc118.info().NUM_AI_CHANNELS # Get an instance of the selected hat device object. address = select_hat_device(HatIDs.MCC_118) hat = mcc118(address) class hello: def GET(self, name): pyDict = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0} global hat try: # Read a single value from each selected channel. for chan in range(low_chan, high_chan + 1): value = hat.a_in_read(chan, options) print('{:12.5} V'.format(value), end='') pyDict[chan] = value except KeyboardInterrupt: # Clear the '^C' from the display. print(CURSOR_BACK_2, ERASE_TO_END_OF_LINE, '\n') web.header('Content-Type', 'application/json') web.header("Access-Control-Allow-Origin", "*") return json.dumps(pyDict) if __name__ == "__main__": try: # Get an instance of the selected hat device object. global address global hat print(' Function demonstrated: mcc118.a_in_read') print(' Channels: {0:d} - {1:d}'.format(low_chan, high_chan)) print(' Options:', enum_mask_to_string(OptionFlags, options)) try: input("\nPress 'Enter' to continue") except (NameError, SyntaxError): pass print('\nAcquiring data ... Press Ctrl-C to abort') except (HatError, ValueError) as error: print('\n', error) app.run()
仪表盘 WebUI
1、安装 DAQ 依赖
安装 DAQHATs 库以及 Webserver 所依赖的组件。
sudo apt-get update #如果已安装过 git 客户端可以跳过下一行 sudo apt-get install git cd ~ git clone https://github.com/mccdaq/daqhats.git cd ~/daqhats sudo ./install.sh pip install dash dash-renderer dash-html-components dash-core-components
安装 web 框架,命令如下:
pip install web.py
2、安装 Nginx 和 PHP7
在 Pi 的终端运行以下命令。
sudo apt-get update sudo apt-get install nginx php7.0-fpm php7.0-cli php7.0-curl php7.0-gd php7.0-mcrypt php7.0-cgi sudo service nginx start sudo service php7.0-fpm restart
如果安装成功,可通过 http://树莓派IP
访问到 Nginx 的默认页。Nginx 的根目录在 /var/www/html
。
进行以下操作来让 Nginx 能处理 PHP。
sudo nano /etc/nginx/sites-available/default
将其中的如下内容
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
替换为
location / { index index.html index.htm index.php default.html default.htm default.php; } location ~\.php$ { fastcgi_pass unix:/run/php/php7.0-fpm.sock; #fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Ctrl + O 保存再 Ctrl + X 退出。
sudo service nginx restart
最后重启 Nginx 即可。
通过 GitHub 来下载 Pi Dashboard DAQ 到 Pi 上会相当方便。
cd /var/www/html sudo git clone https://github.com/spoonysonny/pi-dashboard-daq.git
即可通过 http://树莓派IP/pi-dashboard-daq
访问部署好了的 Pi Dashboard DAQ。
同样如果页面无法显示,可以尝试在树莓派终端给源码添加运行权限,例如你上传之后的路径是 /var/www/html/pi-dashboard-daq
,则运行。
cd /var/www/html sudo chown -R www-data pi-dashboard-daq
注意,到这一步只能显示树莓派基本信息,通过数据采集到的传感器数据还不会更新。请继续阅读下面步骤进一步了解如何启动数据采集功能。
3、配置
修改 /var/www/html/pi-dashboard-daq/config.php 中 SENSOR_API_URL 常量的值,将树莓派的IP地址替换其中 IP。
define('SENSOR_API_URL', 'http://192.168.1.42:8080/?ajax=true');

Web 仪表盘将获取到的 JSON 中解析出 0-6 这7个数值,默认情况下,分别对应于仪表盘上的土壤湿度、雨水、火焰、霍尔、光线、温度、声音传感器。这里可根据自己的实际需要增减和调整,修改 assets/js/dashboard.js 中相应的部分即可。
$("#sensor-sound").text(window.dashboard_sensor[6]); $("#sensor-temp").text(window.dashboard_sensor[5]); $("#sensor-light").text(window.dashboard_sensor[4]); $("#sensor-hall").text(window.dashboard_sensor[3]); $("#sensor-fire").text(window.dashboard_sensor[2]); $("#sensor-rain").text(window.dashboard_sensor[1]); $("#sensor-soil-humidity").text(window.dashboard_sensor[0]);
传感器连接
作为实验项目,我们用面包板和跳线把传感器和DAQ连接起来。

所有传感器和树莓派共地、VCC 均与树莓派的 3V3 引脚相连。

每个传感器的 AO 模拟输出端接到 MCC118 HAT 上的 CH0 ~ CH6。


运行
首先运行安装目录下 api/main.py 启动数据采集主程序。
sudo python /var/www/html/pi-dashboard-daq/api/main.py &
然后就可以在PC浏览器打开 http://树莓派IP地址/pi-dashboard-daq/ 查看仪表盘了。

传感器数值说明
目前仪表盘没有对传感器数据做转换,直接从 JSON 获得电压数值,并通过简单的处理将数值转换成 0-330 之间的值,程序逻辑如下。
for(i=0;i<8;i++){ data[i] = Math.round(330-(data[i])*100,0); }
你可以针对特定传感器修改这里的数值转换逻辑,将电压数值转换成所希望的物理量单位来显示。
购买
这里提供了包含树莓派和 MCC118 扩展板在内的全套实验材料:
树莓派3B+一块
MCC118 扩展板一块
5V/3A电源适配器一个
16G microSD卡一张
实验面包板一块
实验跳线一扎
土壤湿度、雨水、火焰、霍尔、光线、温度、声音传感器包
来搭建自己的环境数据监控站吧,猛击购买。
GitHub: https://github.com/spoonysonny/pi-dashboard-daq