还记得推上的那张曲线图嘛,越临近deadline
效率越高(雾
注:因社区编辑器限制,完整文章详见:【IOT应用创新大赛】基于 EVB_MX_Plus 的盆栽土壤监测
其实这阵子一直盯着专栏看投稿文章的方向性,印象里上周直至昨天还只有4
篇,今天突然就多了数十篇,看完大佬们已经提交的文章,感觉好多都是LoRa
相关的
虽然当初比赛申请的时候并不知道RoLa
是什么,但是看完大佬们的文章也算是明白了它的基本使用方法吧,传输距离比WiFi
远多了可是印象里最深刻的一点了
最后说回自己申请的32
板子,虽然是个半内行人但是拿到手也能看出这是一块好板子,拿到手之后真是爱不释手hhh
而且还能脱离数据线仅使用锂电池供电(毕竟主打的低功耗MCU
),不过某天晚上测试过一次不到8h
就没电了(推测主要原因是OLED的耗电量巨大……即使关闭OLED
显示再等到早上起来同样会没电)
配套的联网模块使用ESP8266
模组,这个用的再熟悉不过了,也赠送了RoLa
模组,但是在公开的覆盖图上并没有看到市内有覆盖,因此暂时仍旧使用前者
另外的拓展E51
模块足够使用,也没有额外购买其他型号的(
板子拿到手的那个周末就照着例程成功对接上了,见EVB_MX_Plus 对接腾讯云物联网开发平台,不得不说物联网开发平台
是真的方便(除了因自己没看好烧错例程无法对接之外),demo
程序可以实现云端控制灯的开关(顺便吐槽下这个灯真是巨亮无比)
然后去看板子上的其他传感器:另外在例程里也看到了温、湿、光
应有尽有,DHT11
的适配,估计找个PIN
接上就也能使用了
作为个人业余开发者,并没有接触过工业(商业)产品的经验。所以觉得应该致力于解决贴近自己现实生活中的需求
对于老生常谈的温湿度监控
已经基于NodeMCU
+DHT11
实现,这里就围绕着另一个「课题」进行方案落地
去年
tb
上买了一盆文竹,但是因为种种原因(懒)要么是好几天没浇水,要么是一浇就浇多了…… 本来刚拿到手的时候是绿绿的,到了现在已经变黄了,惨……
因此决定监测植物的湿度,于是立即去tb
购买传感器等相关配件
虽然确实是用了红包省钱卡
的5
元无门槛红包,但是其实也不是很贵的样子
拿到手后首先来看土壤湿度传感器
,这个传感器说到底还是国内的厂子自己生产的,引出的两根线接到另外一块比较器板子上
型号选的是4 PIN
的,即除了输入的电源和地之外,输出既有A
也有D
,数字量D
其实是依赖于LM358
来比较电压大小,因此可以手动调节板子上的滑动变阻器来改变开始输出的阈值
同时板子上除了电源有LED
指示之外,另一个LED
正是和D
口状态同步的,这里毕竟要看数值,因此选择A
口怼到开发板的ADC1
上来测量其实际电压
电压拿到手之后还需要映射到湿度范围上,虽然实际关系可能不是近似于线性,但是这里还是当做线性处理了
相对湿度的计算方法很简单,放空气中是4V
(0%
)左右,插水里面是1V
(100%
)左右
即:soil_humi = (4000 - adValue) / 30;
(请无视混用了下划线
和驼峰
命名法
然后就是小水泵了,这玩楞直接插5V
流速实在是太快了(主要还是花盆太小了),而且不清楚能不能加上负反馈调节(学过的《自动控制原理》还略有印象)
1m
长的水管拿到手发现巨长,于是拿小刀割出20cm
,足够使用了
回头去翻商品详情发现了这么一段话,没错绝对湿度值
并不适用于土壤
这水泵电流120mA
,直接拿单片机GPIO
口是驱动不了的,可以选择外接一个三极管搞定,并且不能长时间工作因为会影响到板子的供电?实测不大一会mqtt
通信就报错断开了,串口输出还能看到路径乱码???
目前的解决方法是,每次只接通3s
之后就断开,这个水量也足够一次短暂的补充了(花盆小
最后的水位传感器,是准备放在储水容器之中来测量剩余可用水量,目前并未实装(原因不仅在于需要寻找空余的GPIO
口,更在于又需要找5V
供电……
虽然买了一堆传感器可以直接把状态数据推到云上,但是每多一个传感器就需要多一处供电啊(
当然了,这个同样是输出模拟值,需要从GPIO
口进行ADC
采集来读取其电压值来判定水位线,基本思路是一样的
说到底还是C51
的基础不够,搞一个编译pass
都得排半天的错
来上云吧,进入控制台,印象里早在公测的时候就申请到了名额
比较实用的还有数据开发
功能,可以实现自己的逻辑
输出
部分的APP 推送
暂时还用不上,因此选择公众号推送
方式,即报警消息通过微信服务号推送给自己
处理
部分的数据过滤
其实就是判定条件,比如湿度低于70%
触发等等
输入
部分的设备数据
即传感器读取的湿度数据,设备事件
即通过event
上报的事件
,同理设备状态
也是类似的(都是在读传感器嘛
EVB_MX_Plus
出厂的开关位置控制了USB
接口插到PC
上为串口使用由CH340
驱动,烧录是用了另外的接口因此互不影响(这板子设计的真是妙啊
另外,如果接上ST-Link
的话,就无法使用物理开关控制断电了,它会强制供电,烧录完成之后可以按下板子上的复位键来重启,就不需要拔插ST-Link
了
而只接USB
线就可以使用物理开关,并且会给板子上的锂电池充电
源码自带小程序端,照着模板不到半小时就能预览出来(顺便发现代码里明文SECRET_ID
和SECRET_KEY
……这个还是得拿CAM
单独建个只读API
密钥
也可以使用腾讯连连
,从官方控制台配好UI
之后直接扫码就可以使用了,非常方便
这里的构想是通过数据同步
将数据存储至私有库中,并使用Grafana
之类的可视化工具查看
数据同步
即将设备通过MQTT
上报的数据以HTTP
形式发送至自己的云主机上,通过Flask
开一个接口接收并存储至MySQL
就搞定了
此构想其他项目已实现,暂未此处已实装
示例Flask
代码,上传接口未做来源验证,后期可以自行加个token
做双方校验
@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
接口进行访问
Grafana
里选好数据源就也可以进行可视化了
这里的构想是接入HomeAssistant
,可使用其进行查看,并配置HomeKit
对接IOS
家庭,即可用Siri
语音控制
方案一:结合上面的数据同步
,数据就触手可及了,自有源也不必担心消耗过多的请求量
HomeAssistant
里有一种sensor
平台是command_line
,即把执行shell
获取到的数据为数据来源,直接写个读MySQL
的shell
就ok
了
有这个command_line
就可以任意对接了,爽到(
方案二:连接到云上MQTT
……
此构想其他项目已实现,暂未此处已实装
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"
打开家庭可以同步看到传感器的状态,这里有个坑就是温度
传感器可以显示,但是湿度
不行,解决方法是自定义属性
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
总的来说收获还是巨大的(wx
群里都是巨佬,瑟瑟发抖……
未完待续……
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。