码农教你1小时搭个在线甲醛检测系统!

2019-07-22 16:28:05 浏览数 (1)


【导语】扔掉小瓶盖,腾讯云带你体验在线甲醛监测系统!本文详述腾讯云多产品组合设计和体验报告之 “树莓派 腾讯云=在线甲醛监测系统”。涉及腾讯云产品:API网关、无服务器云函数、云数据库、腾讯云图。

身边朋友在装修新房,顺便来吐槽甲醛检测麻烦,比如有检测无监测(一次性),比如测试复杂(现场 人工)等等。刚好做为云产品经理,经常想的就是如何了解和验证多云产品组合方案的可用性问题,索性结合一下,直接把这个需求上云,然后就有了这套系统。

系统概要

>> 系统组成

终端:硬件组件

  • RaspberryPi 3B (raspbian-stretch-lite/GPIO接口/python2.7)
  • UART-CH2O传感器(UART接口)
  • 128X32 OLED屏 SSD1306芯片(I2C接口)

云端:腾讯云产品

  • 腾讯云 API网关
  • 腾讯云无服务器云函数
  • 腾讯云云数据库 Mysql
  • 腾讯云腾讯云图

>> 效果展示

腾讯云图

终端组件

当前版本中,Rpi 使用wifi 连接互联网(也可使用有线)

设计实现

>> 概要架构图

  • 分级可用:避免单环故障,系统全面崩溃
  • 读写分离:便于后续调试、优化、更新版本
  • 远程维护:避免出现场处理异常。由于云产品的能力提供了各种便利,学习和搭建成本很低。

>> 云端开发与配置

无服务器云函数

优先配置无服务器云函数,参考官网文档建立并保存“函数代码”后,在管理页面的“触发方式”功能中,直接生成对应API网关。

注意事项:

  1. 自动提交:连接数据库必须使用“autocommit = True,”参数,否则由于事务隔离,DB链接重新连接前,查询结果不变。
  2. 返回头:API网关开启“响应集成”时,云函数返回值需结合返回信息,指定"Content-Type",否则出现 "transfer closed with outstanding read data     remaining" 错误。
  3. 验证连接:云函数实例可长期存在,但一定时间未操作mysql链接时,mysql将释放链接,所以代码中需要进行验证链路可用性。

API网关

1. 配置服务

参考官方文档 ,在“触发方式”中建立的API网关服务,点击相应服务名,选择“API管理”分页,点击“编辑”,配置“请求方法-POST”、“鉴权类型-密钥对”、“使用响应集成”,其它配置默认即可。

2.下载与使用SDK

API网关控制台 -> 点击 服务名 -> 点击 API文档/SDK -> 点击 下载SDK

云数据库 Mysql

表结构

SET SQL_MODE ="NO_AUTO_VALUE_ON_ZERO";

SET AUTOCOMMIT =0;

START TRANSACTION;

SET time_zone =" 00:00";

CREATETABLE `sensordata` (

`id`int(11) NOT NULL,

`stime`timestampNULL DEFAULT NULL,

`utype`int(11) NOT NULL DEFAULT '0',

`udata` float NOT NULL,

`sdata`varchar(256) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTERTABLE`sensordata`

  ADD PRIMARYKEY (`id`);

ALTERTABLE`sensordata`

  MODIFY `id`int(11) NOT NULLAUTO_INCREMENT;

COMMIT;

云图配置

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

组件配置信息

  • 最新同步时间     - 通用文本
代码语言:javascript复制
select concat('最新同步时间 ',stime)as value from sensordata order by id desc limit 1
  • 国标系数比     - 水位图
代码语言:javascript复制
select round((udata)/0.08*100, 2) as value fromsensordata order by id desc limit 1
  • 实时读数 - 基本条形图
代码语言:javascript复制
select round(udata, 3) as x, '' as y from sensordataorder by id desc limit 1
  • 10分钟数据 - 基本折线图
代码语言:javascript复制
select * from (select id, round(udata, 3) as y,date_format(stime, '%H:%i:%S') as x, utype as s from sensordata order by iddesc limit 360) as t1 order by id asc
  • 7天数据 - 基本折线图
代码语言:javascript复制
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 fromsensordata order by id desc limit 604800) as t1 group by dt order by dt ASC

>> 硬件接线与打开系统接口

Rpi GPIO

GPIO (General-purpose input/output)即通用IO接口,是一种常见的端口扩展器,树莓派使用的是40针的GPIO接口。

UART-CH2O:接线方式(UART协议)。注:本次使用的传感器,硬件接口是1.25mm端子,Rpi是2.5mm端子,使用了 7P1.25转2.5杜邦线,进行连接。

OLED:接线方式(I2C协议)

1. 打开I2C接口

raspi-config

2. 测试执行

i2cdetect -y 1

看到 3C 即识别硬件成功

>> 本地开发与配置

本文暂仅放出关键代码(硬件操作部分),便于大家撸硬件。完整包(代码 配置) 稍后放出,请关注 github/DemoOnTencentCloud。

环境配置

  • 启动对时:rc.local     增加 nptdata cn.ntp.org.cn。避免重启后时间错位,监测错位。
  • 启动拉起:getdata.py     oled.py 需持续在线。
  • 定时检测:getdata.py     oled.py cron每分钟判断活性,进程挂掉即拉起。
  • 定时同步:sync.py     cron每分钟执行
  • 远程维护:使用ssh     tunnel 的 Remote Port Forwarding 模式,进行反向代理。

ssh tunnel

此处使用 autossh 进行连接,autossh可完成建立通道与监控通道的工作,通道断开后,可自主重连。远端连接云主机,之后可以云主机为跳板,反向代理访问NAT环境Rpi设备。

autossh -M 监控端口 -R 远程通信端口:localhost:22 账号名@远程IP或域名 -p端口号 -i 账号KEY -o serveraliveinterval=60 -N -f

连接时,在云主机执行

ssh -p 远程通信端口 localhost

getdata.py

获取传感器读数代码(完整代码待放出 github/DemoOnTencentCloud)

import serial

from time import sleep

ser=serial.Serial("/dev/serial0",9600)

whileTrue :

    r_data =ser.read()

    sleep(0.3)

    data_left =ser.inWaiting()

    r_data =ser.read(data_left)

if9!=len(r_data):

print'errorlength: %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

sync.py

下为功能伪代码。(完整代码待放出 github/DemoOnTencentCloud)

# 访问 APIGW,获取最新记录时间戳

# 读本地sqlite库,获取增量数据

# 访问 APIGW,提交更新数据

Sqlite结构

CREATETABLE "sensordata" (

"id"INTEGERPRIMARYKEY AUTOINCREMENT,

"utime"INTEGERNOT NULL,

"utype"INTEGER DEFAULT 0NOT NULL,

"udata"REALNOT NULL,

"sdata"TEXT

);


附录| 涉及产品介绍

  • 腾讯云 API网关

API 网关(APIGateway)是 API 托管服务。提供 API 的完整生命周期管理,包括创建、维护、发布、运行、下线等。您可使用 API Gateway 封装自身业务,将您的数据、业务逻辑或功能安全可靠的开放出来,用以实现自身系统集成、以及与合作伙伴的业务连接。

  • 腾讯云无服务器云函数

无服务器云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助用户在无需购买和管理服务器的情况下运行代码。用户只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。

  • 腾讯云云数据库 Mysql

腾讯云数据库 MySQL(TencentDB for MySQL)让用户可以轻松在云端部署、使用 MySQL 数据库。MySQL 是世界上最流行的开源关系数据库,通过云数据库 MySQL,您在几分钟内即可部署可扩展的 MySQL 数据库实例。不仅经济实惠,而且可以弹性调整硬件容量的大小而无需停机。云数据库 MySQL 提供备份回档、监控、快速扩容、数据传输等数据库运维全套解决方案,为您简化 IT 运维工作,让您能更加专注于业务发展。

  • 腾讯云腾讯云图

腾讯云图(Tencent Cloud Visualization,TCV)是一站式数据可视化展示平台,旨在帮助用户快速通过可视化图表展示海量数据,10 分钟零门槛打造出专业大屏数据展示。精心预设多种行业模板,极致展示数据魅力。采用拖拽式自由布局,无需编码,全图形化编辑,快速可视化制作。腾讯云图支持多种数据来源配置,支持数据实时同步更新,同时腾讯云图基于 WEB 页面渲染,可灵活投屏多种屏幕终端。

0 人点赞