终于到 deadline 了草

0x00.前言

还记得推上的那张曲线图嘛,越临近deadline效率越高(雾

RT
RT

2020-4-23 23:35:25

点击此处 ← 查看折叠

本来想着直接在社区修改,结果预览的图片都403了……于是又转回来修改了

RT
RT

又想起来Coding Pages今晚突然莫名炸了博客也进不来了……

0%
0%

0x01.简介

其实这阵子一直盯着专栏看投稿文章的方向性,印象里上周直至昨天还只有4篇,今天突然就多了数十篇,看完大佬们已经提交的文章,感觉好多都是LoRa相关的
虽然当初比赛申请的时候并不知道RoLa是什么,但是看完大佬们的文章也算是明白了它的基本使用方法吧,传输距离比WiFi远多了可是印象里最深刻的一点了
最后说回自己申请的32板子,虽然是个半内行人但是拿到手也能看出这是一块好板子,拿到手之后真是爱不释手hhh
而且还能脱离数据线仅使用锂电池供电(毕竟主打的低功耗MCU),不过某天晚上测试过一次不到8h就没电了(推测主要原因是OLED的耗电量巨大……即使关闭OLED显示再等到早上起来同样会没电)

0x02.EVB_MX_Plus

配套的联网模块使用ESP8266模组,这个用的再熟悉不过了,也赠送了RoLa模组,但是在公开的覆盖图上并没有看到市内有覆盖,因此暂时仍旧使用前者
另外的拓展E51模块足够使用,也没有额外购买其他型号的(
板子拿到手的那个周末就照着例程成功对接上了,见EVB_MX_Plus 对接腾讯云物联网开发平台,不得不说物联网开发平台是真的方便(除了因自己没看好烧错例程无法对接之外),demo程序可以实现云端控制灯的开关(顺便吐槽下这个灯真是巨亮无比)
然后去看板子上的其他传感器:温、湿、光应有尽有,另外在例程里也看到了DHT11的适配,估计已经找个PIN给接上就也能使用了
2020-4-23 23:42:42
看到DHT11_BUS.c库还是忍不住把之前放在NodeMCU上的DHT11拔下来插到板子上了hhh

作为个人业余开发者,并没有接触过工业(商业)产品的经验。所以觉得应该致力于解决贴近自己现实生活中的需求
对于老生常谈的温湿度监控已经基于NodeMCU+DHT11实现,这里就围绕着另一个「课题」进行方案落地

去年tb上买了一盆文竹,但是因为种种原因(懒)要么是好几天没浇水,要么是一浇就浇多了……
本来刚拿到手的时候是绿绿的,到了现在已经变黄了,惨……

因此决定监测植物的湿度,于是立即去tb购买传感器等相关配件
虽然确实是用了红包省钱卡5元无门槛红包,但是其实也不是很贵的样子

6.94
6.94

拿到手后首先来看土壤湿度传感器,这个传感器说到底还是国内的厂子自己生产的,引出的两根线接到另外一块比较器板子上
型号选的是4 PIN的,即除了输入的电源和地之外,输出既有A也有D,数字量D其实是依赖于LM358来比较电压大小,因此可以手动调节板子上的滑动变阻器来改变开始输出的阈值
同时板子上除了电源有LED指示之外,另一个LED正是和D口状态同步的,这里毕竟要看数值,因此选择A口怼到开发板的ADC1上来测量其实际电压
电压拿到手之后还需要映射到湿度范围上,虽然实际关系可能不是近似于线性,但是这里还是当做线性处理了
相对湿度的计算方法很简单,放空气中是4V0%)左右,插水里面是1V100%)左右
即:soil_humi = (4000 - adValue) / 30;(请无视混用了下划线驼峰命名法

然后就是小水泵了,这玩楞直接插5V流速实在是太快了(主要还是花盆太小了),而且不清楚能不能加上负反馈调节(学过的《自动控制原理》还略有印象)
1m长的水管拿到手发现巨长,于是拿小刀割出20cm,足够使用了
回头去翻商品详情发现了这么一段话,没错绝对湿度值并不适用于土壤

绝对湿度值
绝对湿度值

这水泵电流120mA,直接拿单片机GPIO口是驱动不了的,可以选择外接一个三极管搞定,并且不能长时间工作因为会影响到板子的供电?实测不大一会mqtt通信就报错断开了,串口输出还能看到路径乱码???
目前的解决方法是,每次只接通3s之后就断开,这个水量也足够一次短暂的补充了(花盆小

0.12
0.12

2020-4-22 21:30:23

点击此处 ← 查看折叠

晚上挖掘E53_IA1.pdfE53_SC1.pdf原理图
首先要引入E51的概念,从原理图提供的信息可以得知这是国内自定的一个接口标准

E51
E51
实物对照
实物对照

正面左侧SHT30中间LED右侧PT4211E23EBH1750D2橙色?的二极管还是可以辨识出来的,光照传感器仔细看也能看见上面的采集框

E53_SC1 正面
E53_SC1 正面

背面ERRPROM,但是目前存储足够并没有需求使用

E53_SC1 背面
E53_SC1 背面

然后就发现了有电机(水泵)预留位……
因为图中标出了motor swmotor,这不明显的拿前者控制后者嘛,并且猜测是拉低motor sw导致motor接地(实物中D2那么大的二极管搁那放着的呢……结果看错图草

E53 Interface IA1
E53 Interface IA1

另,之前的基于TencentOS tiny开源项目的实践--从零开始快速打造IoT小应用.pdf介绍中拓展板E53_IA1是实装有电机和DHT11的,这也解释了为什么源码中有DHT11_BUS.c但是并没有SHT30的设备驱动

E53_SC1
E53_SC1

顺便吐槽下DHT11的湿度百分比竟然是个浮点数???之前一直都是只有整数位的……

湿度
湿度

最后的水位传感器,是准备放在储水容器之中来测量剩余可用水量,目前并未实装(原因不仅在于需要寻找空余的GPIO口,更在于又需要找5V供电……
虽然买了一堆传感器可以直接把状态数据推到云上,但是每多一个传感器就需要多一处供电啊(
当然了,这个同样是输出模拟值,需要从GPIO口进行ADC采集来读取其电压值来判定水位线,基本思路是一样的

0x03.代码

gh
说到底还是C51的基础不够,搞一个编译pass都得排半天的错

编译通过!
编译通过!

0x04.腾讯云物联网开发平台

来上云吧,进入控制台,印象里早在公测的时候就申请到了名额

物联网开发平台
物联网开发平台

这里有两个项目:智能灯那个是板子的示例项目,flower是自己新建的项目

开发中心-产品开发
开发中心-产品开发
数据模板
数据模板
设备开发
设备开发
交互开发
交互开发
面板配置
面板配置
设备调试
设备调试
设备信息
设备信息
下发指令
下发指令

比较实用的还有数据开发功能,可以实现自己的逻辑

画图
画图

输出部分的APP 推送暂时还用不上,因此选择公众号推送方式,即报警消息通过微信服务号推送给自己
处理部分的数据过滤其实就是判定条件,比如湿度低于70%触发等等
输入部分的设备数据即传感器读取的湿度数据,设备事件即通过event上报的事件,同理设备状态也是类似的(都是在读传感器嘛

EVB_MX_Plus出厂的开关位置控制了USB接口插到PC上为串口使用由CH340驱动,烧录是用了另外的接口因此互不影响(这板子设计的真是妙啊
另外,如果接上ST-Link的话,就无法使用物理开关控制断电了,它会强制供电,烧录完成之后可以按下板子上的复位键来重启,就不需要拔插ST-Link
而只接USB线就可以使用物理开关,并且会给板子上的锂电池充电

串口助手
串口助手

0x05.连线图

完整图
完整图

0x06.小程序

源码自带小程序端,照着模板不到半小时就能预览出来(顺便发现代码里明文SECRET_IDSECRET_KEY……这个还是得拿CAM单独建个只读API密钥

v0.2
v0.2

也可以使用腾讯连连,从官方控制台配好UI之后直接扫码就可以使用了,非常方便

flower
flower

0x07.实验室站

这里的构想是通过数据同步将数据存储至私有库中,并使用Grafana之类的可视化工具查看
数据同步即将设备通过MQTT上报的数据以HTTP形式发送至自己的云主机上,通过Flask开一个接口接收并存储至MySQL就搞定了
此构想其他项目已实现,暂未此处已实装

接收数据
接收数据

示例Flask代码,上传接口未做来源验证,后期可以自行加个token做双方校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@api.route('/IOT/flower', methods=['GET', 'POST'])
def IOT_flower():
if 'upload' in request.args:
data = json.loads(request.get_data(as_text=True))
seq = data.get('seq')
timestamp = data.get('timestamp')
topic = data.get('topic')
productid = data.get('productid')
devicename = data.get('devicename')
brightness = data.get('payload').get('params').get('brightness')
humidity = data.get('payload').get('params').get('humidity')
temperature = data.get('payload').get('params').get('temperature')
soil_humi = data.get('payload').get('params').get('soil_humi')
light_switch = data.get('payload').get('params').get('light_switch')
motor_switch = data.get('payload').get('params').get('motor_switch')
return upload(seq, timestamp, topic, productid, devicename, brightness, humidity, temperature, soil_humi,
light_switch, motor_switch)
elif 'devicename' in request.args:
devicename = request.args['devicename']
if devicename:
return get_multidata_from_mysql(devicename)
else:
return bad_request('参数值为空')
else:
return bad_request('非法参数')
数据预览
数据预览

即可用https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001接口进行访问

api
api

Grafana里选好数据源就也可以进行可视化了

datasources
datasources

0x08.HomeAssistant

这里的构想是接入HomeAssistant,可使用其进行查看,并配置HomeKit对接IOS家庭,即可用Siri语音控制
方案一:结合上面的数据同步,数据就触手可及了,自有源也不必担心消耗过多的请求量
HomeAssistant里有一种sensor平台是command_line,即把执行shell获取到的数据为数据来源,直接写个读MySQLshellok
有这个command_line就可以任意对接了,爽到(
方案二:连接到云上MQTT……
此构想其他项目已实现,暂未此处已实装

文档
文档
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sensor:
- platform: command_line
name: soil_humi
command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['soil_humi'])"
unit_of_measurement: "%"

- platform: command_line
name: yuangezhizao's room temperature
command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['temperature'])"
unit_of_measurement: "°C"

- platform: command_line
name: yuangezhizao's room humidity
command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['humidity'])"
unit_of_measurement: "%"

- platform: command_line
name: brightness
command: python3 -c "import requests; print(requests.get('https://lab.yuangezhizao.cn/api/v0.0.1/IOT/flower?devicename=dev001').json()['data']['brightness'])"
unit_of_measurement: "lx"
实际接入
实际接入

0x09.HomeKit

打开家庭可以同步看到传感器的状态,这里有个坑就是温度传感器可以显示,但是湿度不行,解决方法是自定义属性

1
2
3
4
5
6
7
8
9
10
11
12
13
sensor.soil_humi:
friendly_name: 土壤湿度
device_class: humidity

sensor.brightness:
friendly_name: 光照强度

sensor.yuangezhizao_s_room_humidity_2:
friendly_name: 房间湿度
device_class: humidity

sensor.yuangezhizao_s_room_temperature_2:
friendly_name: 房间温度
配置文件
配置文件
实际接入
实际接入

也可以召唤Siri

实际接入
实际接入
实际接入
实际接入

0x09.后记

总的来说收获还是巨大的(wx群里都是巨佬,瑟瑟发抖……
未完待续……