导语 扔掉小瓶盖,腾讯云带你体验在线甲醛监测系统!本文详述腾讯云多产品组合设计和体验报告 之 “树莓派+腾讯云=在线甲醛监测系统”。涉及腾讯云产品:API网关、无服务器云函数、云数据库、腾讯云图。
正文
身边朋友在装修新房,顺便来吐槽甲醛检测麻烦,比如 有检测无监测(一次性),比如测试复杂(现场+人工)等等。刚好做为云产品经理,经常想的就是如何了解和验证多云产品组合方案的可用性问题,索性结合一下,直接把这个需求上云,然后就有了这套系统。老规矩,先上结论。
系统概要
终端:终端组件
注:RaspberryPi后续简写为Rpi
云端:腾讯云产品
腾讯云图
终端组件
当前版本中,Rpi 使用wifi 连接互联网(也可使用有线网),故此处上云有网络依赖。
UART-CH2O传感器
设计与实现
设计过程中,也进行了产品生命周期的思考,尝试进行了产品长短期设计的分析与定义(暂不展开,后续有时间写一下)。
确认了形态目标后,遵循下面几个基本原则,进行具体技术设计:
从架构看来
4.本地实时展示+本地缓存+数据上云 +云端显示。
3.本地实时展示+本地缓存+数据上云。云图异常。
2.本地实时展示+本地缓存。上云通路异常。
1.本地实时展示。本地sqlite异常。
0.本地无展示。硬件故障或断电。
Rpi GPIO
GPIO
(General-purpose input/output)即通用IO接口,是一种常见的端口扩展器,树莓派使用的是40针的GPIO接口。
RPI GPIO图示
UART-CH2O
注:本次使用传感器,硬件接口是1.25mm端子,Rpi是2.5mm端子,使用了 7P1.25转2.5杜邦线,进行连接
OLED
接线方式(I2C协议)
打开I2C接口
raspi-config
按下图打开I2C接口
测试执行
i2cdetect -y 1
看到 3C 即识别硬件成功
本文暂仅放出关键代码(硬件操作部分),便于大家撸硬件。完整包(代码+配置) 稍后放出,请关注 github/DemoOnTencentCloud。
环境配置
ssh tunnel
此处使用 autossh 进行连接,autossh可完成建立通道与监控通道的工作,通道断开后,可自主重连。远端连接云主机,之后可以云主机为跳板,反向代理访问NAT环境Rpi设备。
bash autossh -M 监控端口 -R 远程通信端口:localhost:22 账号名@远程IP或域名 -p端口号 -i 账号KEY -o serveraliveinterval=60 -N -f
连接时,在云主机执行
bash ssh -p 远程通信端口 localhost
getdata.py
获取传感器读数代码(完整代码待放出 github/DemoOnTencentCloud)
import serial
from time import sleep
ser=serial.Serial("/dev/serial0",9600)
while True :
r_data = ser.read()
sleep(0.3)
data_left = ser.inWaiting()
r_data += ser.read(data_left)
if 9 != len(r_data):
print 'error length: %d'%len(r_data)
continue
else:
n=ord(r_data[4])*256+ord(r_data[5])
updatedata(n/1000.0) # ppm = n/1000.0
flusholed.py
依赖库安装
(基于 https://github.com/adafruit/Adafruit_Python_SSD1306)
sudo python -m pip install --upgrade pip setuptools wheel
sudo pip install Adafruit-SSD1306
下为功能伪代码。(完整代码待放出 github/DemoOnTencentCloud)
# 读取 cachefile 缓存文件
# 刷新 OLED 显示
sync.py
下为功能伪代码。(完整代码待放出 github/DemoOnTencentCloud)
# 访问 APIGW,获取最新记录时间戳
# 读本地sqlite库,获取增量数据
# 访问 APIGW,提交更新数据
Sqlite结构
表结构
CREATE TABLE "sensordata" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"utime" INTEGER NOT NULL,
"utype" INTEGER DEFAULT 0 NOT NULL,
"udata" REAL NOT NULL,
"sdata" TEXT
);
无服务器云函数
优先配置 无服务器云函数,参考 文档 建立并保存“函数代码”后,在管理页面的“触发方式”功能中,直接生成对应API网关。
(完整代码待放出 github/DemoOnTencentCloud)。
当前主要强调几个注意事项:
API网关
配置服务
参考 文档 ,以上“触发方式”中建立的API网关服务,由API网关的 服务 页面,点击相应服务名,选择“API管理”分页,点击“编辑”,然后配置“请求方法-POST”、“鉴权类型-密钥对”、“使用响应集成”,其它余配置按默认即可。
下载与使用SDK
API网关 控制台 -> 点击 服务名 -> 点击 API文档/SDK -> 点击 下载SDK
(完整配置待放出 github/DemoOnTencentCloud)
云数据库 Mysql
表结构
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;
云图配置
简要使用说明
拖选组件 -> 点击数据栏 -> 选择数据库 -> 填写SQL -> 开启自动更新 -> 预览 -> 发布
操作示例图
组件配置信息
select concat('最新同步时间 ',stime) as value from sensordata order by id desc limit 1
select round((udata)/0.08*100, 2) as value from sensordata order by id desc limit 1
select round(udata, 3) as x, '' as y from sensordata order by id desc limit 1
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
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
写在最后
关于丢数据(非守护进程)、脏数据(未较验数据唯一性)、缺乏系统监控告警(未接入云监控)等等待优化点,由于时间关系暂未展开,后面可以再行探讨。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有