腾讯云实践案例:基于树莓派实现甲醛在线监测

本案例针对传统甲醛检测的问题进行优化,通过远程在线监测甲醛指标的方式,解决了已有方案中“需现场人工查看”、“检测限于单次”等问题。

本文主要用于流程说明,详细源码请参考 github/SensorOnTencentCloud

(预计耗时 - 1人/时:单人约1小时可完成搭建实践验证。)

1.效果展示

云端展示

腾讯云图 云端展示

终端展示

RapeberryPi 终端展示

2.物料准备

终端部分

  • Rpi(Rapspberry Pi 3B+)
  • Rpi操作系统( raspbian 使用 lite 版)
  • 传感器(UART 甲醛传感器)
  • OLED(I2C OLED屏)

软件部分

  • 腾讯云账号 ( 腾讯云 )

3.架构说明

逻辑架构图
技术方案架构图

4.搭建过程

此环节分为三个部分:

  • 终端搭建
  • 云端搭建
  • 终端上报云端联调

注1: 终端搭建完成后,即可进行本地监测

注2: 云端部分是通用接口,可按接口格式,上报并展示其它监测数据

4.1 终端搭建

4.1.1 Rpi系统安装与环境准备
  • 安装Rpi操作系统 安装指引
  • 完成基础配置,使可接入互联网 配置指引
  • clone 代码至 Rpi (路径可自定,此处示例为 /sotc 下同)
  • 执行 init.sh 安装依赖库
4.1.2 硬件接线与配置

a. RPI GPIO图示

RaspberryPi GPIO 示意图

b. 接线示意图

GPIO 硬件接线 示意图

c. 接线说明

传感器

Rpi

Pin4(5V)

Pin2(5V)

Pin3(GND)

Pin6(GND)

Pin6(UART-TxD)

Pin10(UART-RxD)

注:本次使用传感器,硬件接口是1.25mm端子,Rpi是2.5mm端子,使用了 7P1.25转2.5杜邦线,进行连接

OLED

Rpi

VCC

Pin1(3.3V)

SDA

Pin3(SDA)

SCL

Pin5(SCL)

GND

Pin9(GND)

d. 开启I2C接口

按下图示意打开I2C接口

代码语言:txt
复制
raspi-config
接口管理
I2C管理
确认开启

测试执行

代码语言:txt
复制
i2cdetect -y 1
查看设备

看到 3C 即识别硬件成功

注:UART默认开启,无需配置

4.1.3 本地监测与展示

a. 本地测试

执行脚本

代码语言:txt
复制
nptdate cn.ntp.org.cn
/sotc/getdata.py &
sleep 3
/sotc/flusholed.py &

此时OLED应有显示数据。

注1:必须及时对时,避免时间偏差,影响数据可用性

注2:电化学传感器有预热时间,预热时间内数据不稳定

b. 添加启动项

编辑 /etc/rc.local

代码语言:txt
复制
nptdate cn.ntp.org.cn
/sotc/getdata.py &
sleep 3
/sotc/flusholed.py &

c. 添加计划任务

编辑 /etc/crontab

代码语言:txt
复制
*/1 * * * * root /sotc/reload.sh

此部分用于进程异常中止后的拉起。

注:基于时间成本与应用环境考虑,未使用守护进程或服务形态

4.2 云端搭建

4.2.1 云数据库

访问 云数据库 控制台 建立库表

表结构

代码语言:txt
复制
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

CREATE TABLE sensordata (
id int(11) NOT NULL,
stime timestamp NULL DEFAULT NULL,
utype int(11) NOT NULL DEFAULT '0',
udata float NOT NULL,
sdata varchar(256) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE sensordata
ADD PRIMARY KEY (id);

ALTER TABLE sensordata
MODIFY id int(11) NOT NULL AUTO_INCREMENT;
COMMIT;

字段

说明

id

自增主键

stime

监测时间

udata

监测数据

utype

监测类型(用于后续扩展)

sdata

监测数据(用于后续扩展)

4.2.2 无服务器云函数

访问 云函数 控制台 建立函数服务

  • 新建服务
  • 配置代码 (录入 github/scf.py 代码)
  • 配置触发方式 (选择API网关触发)
  • 等待调用

注:由于后续使用API网关触发,可后续联调

4.2.3 云API网关

访问 API网关 控制台 配置网关服务,如由上节云函数部分配置触发,则API网关服务已经建立,仅需调整配置,以及下载使用API网关SDK。

具体操作可参考 client_package/readme.md

4.2.4 腾讯云图

访问 云图 控制台 配置展示部分

a. 使用说明

新建大屏 -> 拖选组件 -> 点击数据栏 -> 选择数据库 -> 填写SQL -> 开启自动更新 -> 预览 -> 发布

b. 操作示例图

腾讯云图 简要操作方式

c. 组件配置信息

  • 最新同步时间 - 通用文本
代码语言:txt
复制
select concat('最新同步时间 ',stime) as value from sensordata order by id desc limit 1
  • 国标系数比 - 水位图
代码语言:txt
复制
select round((udata)/0.08100, 2) as value from sensordata order by id desc limit 1
  • 实时读数 - 基本条形图
代码语言:txt
复制
select round(udata, 3) as x, '' as y from sensordata order by id desc limit 1
  • 10分钟数据 - 基本折线图
代码语言:txt
复制
select * from (select id, round(udata, 3) as y, date_format(stime, '%H:%i:%S') as x, utype as s from sensordata order by id desc limit 360) as t1 order by id asc
  • 7天数据 - 基本折线图
代码语言:txt
复制
select distinct (dt), round(AVG(udata),3) as y, dt as x, '0' as s from (select id, date_format(stime, '%Y-%m-%d %H') as dt, udata from sensordata order by id desc limit 604800) as t1 group by dt order by dt ASC

4.3 终端上报云端联调

a. 执行脚本

代码语言:txt
复制
/sotc/sync_apigw.py

此时云数据库应新增数据,云图应有展示。

注1:如积累数据量过大,API网关可能会有超时,但数据应该能正常录入。

注2:未进行分批上传的原因,也是时间成本与工作环境考量,可自行更改。

b. 添加计划任务

编辑 /etc/crontab

代码语言:txt
复制
/1 * * * * root /sotc/sync_apigw.py

此部分用于每分钟同步数据。

4.4 其它

本案例也将于 本周四(20190801) 在 腾讯技术工程直播间 进行直播分享。

欢迎提前预约直播。

腾讯技术工程直播间