序
7月25日晚,TEG王者荣耀大赛正式开打,首局比赛,“深圳湾一号业主”爆冷摧残了“祖国的花朵”。
作为“祖国的花朵”队的替补,我内心其实挺满意这个结果,但表面还是要和团队一样心如刀割。
“为什么这样对我们?你们平常不种花的吗?”
“没办法啊,房子太大,每天浇花得走好久。”
“哼!总有一天我会让你们明白!”
比赛失利后我打开了邮箱,突然看到了“IoT迷你赛”,内心的小宇宙悄悄地点燃。我可是“IoT小能手”呀,必须要让“深圳湾一号业主”明白,要让他们明白,房子再大也是可以轻松浇花的!
1 方案简介
说干就干,小能手决定做一个物联网浇花器,随时随地打开微信小程序就可以查看盆栽的土壤情况,并且进行远程浇花。这样,长期出差的朋友,以及阳台路程达10分钟的业主们,都得以轻松呵护自己的花花草草。
1.1 总体架构
总体系统架构先放这边,接下来具体说说。
1.2 关于节点功能的考虑
小米曾经出了一款“花花草草检测仪”,可以检测光照、酸碱度、温湿度,采集数据指导小白用户如何更好地种花。这个产品是很好,但是它终于是单向的,只能检测,不能输出,就是说你看到小花快渴死了,但仍做不了什么。
所以小能手希望做一个能远程浇花的设备,不如就叫它“花花草草守护仪”。
另外结合网上热心网友的反馈,我决定砍掉光照、酸碱度、温度这几个非刚需的传感器,采用湿度传感器长期监控土壤的情况。
1.3 关于联网方式的考虑
深圳湾一号的套均建筑面积得有三四百平了吧,这要是用普通的 WiFi,业主们肯定还是会受到覆盖不足的困扰。贴心的小能手自然想到了对策,那便是目前物联网领域最火的技术 LoRa,低功耗远距离,真是别墅物联网应用的不二之选。
而且南山整个区域,已被我大鹅厂做了LoRa网络覆盖,点此链接了解我鹅厂在LoRa产业下的功夫,业主们不用架设 LoRa 网关便可接入。
2 详细设计方案及实现
有了上面的初步构思之后,接下来描述详细设计方案及相应的实现。
2.1 浇花器硬件设计
硬件直接采用 Tencent OS EVB_MX 开发板,外加一个 LoRa 模组。外设部分,从网上购买了水泵和土壤湿度采集器。其中水泵只需要一个IO操作即可,湿度采集器可使用AD采集。
Tencent OS EVB_MX 引脚 | 接口 | 外设 |
---|---|---|
UART_PORT_0 | 串口 | LoRa 串口模组 |
PA0 | GPIO1 | 水泵 |
PC2 | AD1_IN3 | 土壤湿度传感器 |
硬件连接部分有个要注意的,在电源部分,水泵这种大功率设备如果直接接到开发板会引起电源波动,会影响 LoRa 射频的信号接收,因此我是单独给水泵再供电5V。
2.2 浇花器软件设计
软件主体设计,是基于 Tencent OS Tiny。在通信侧,OS 现在帮大家实现了 异步的 AT 框架,以前开发者需要自己费力地去实现异步收发操作,现在可以很便利地操作 LoRa 模组。
代码语言:txt复制at_event_t rhf76_at_event[] = {
{ " CMSGHEX: PORT:", rhf76_incoming_data_process },
};
软件应用层代码如下,在这边我做了点优化,增加了应用层异步接收的。如代码所示的 McpsIndication 函数即 LoRa 应用层接收函数,开发者只需在这里解析自己的应用数据即可。
我的协议设计比较简单,且LoRa应用也建议使用精简的应用数据,我在发送时使用一个字节,采集土壤湿度的百分比;接收时也使用一个字节,0表示关泵,1表示开泵。
代码语言:txt复制static void McpsIndication(uint8_t* data, uint8_t len)
{
printf("McpsIndication len=%d data[0]=%dn", len, data[0]);
if (data[0] == 1) {
Flower_SetPump(ON);
} else {
Flower_SetPump(OFF);
}
}
void lorawan_demo(void)
{
int count = 1;
extern int rhf76_lora_init(hal_uart_port_t uart_port);
uint8_t humi;
rhf76_lora_init(HAL_UART_PORT_0);
tos_lora_module_recv_register(McpsIndication);
tos_lora_module_join();
while (1) {
if (count % 20 == 0) {
humi = Flower_ReadHumi();
printf("## Flower_ReadHumit is %d rn", humi);
tos_lora_module_send(&humi, 1);
}
count ;
osDelay(500);
}
}
外设部分,ADC / GPIO 操作也不难,具体代码见下方:
代码语言:txt复制void Flower_SetPump(PUMP_Status_ENUM onoff)
{
HAL_GPIO_WritePin(PUMP_GPIO_Port, PUMP_Pin, onoff == ON ? GPIO_PIN_RESET : GPIO_PIN_SET );
}
uint8_t Flower_ReadHumi(void)
{
uint16_t advalue;
uint8_t humi;
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
advalue = (uint16_t)HAL_ADC_GetValue(&hadc1);
humi = (4000 - advalue)/15;
if (humi > 100) {
humi = 100;
}
return humi;
}
对函数中的 AD 换算公式做个简单的说明,虽然我大鹅厂员工平均月薪七万二,但本能手还是勤俭节约,到网上买了十来块钱的土壤湿度传感器。这玩意不能探测绝对湿度,于是本能手做了一些实测,根据干燥空气以及浸没水中的 AD 数值情况,得到了一个简易的公式,来测量土壤的含水量 0% ~ 100%。
烧写固件后,整个版本开始周期性上报土壤湿度数据。
代码语言:txt复制[10:36:59.591]收←◆## Flower_ReadHumit is 33
AT CMD:
AT CMSGHEX="21"
[10:37:01.763]收←◆----------> LOG: DEBUG 2112764 LORA RX, 500900000, SF12, 125KHz
[10:37:02.762]收←◆----------> LOG: DEBUG 2113763 LORA RX, 505300000, SF12, 125KHz
[10:37:03.951]收←◆----------> LOG: DEBUG 2114950 LORA RX, 60BB2509262083008DDE8D58, -32, 5
----------> CMSGHEX: ACK Received
----------> CMSGHEX: RXWIN2, RSSI -32, SNR 5.0
----------> CMSGHEX: Done
2.3 LoRa 核心网的应用及设备处理
终端设备通过LoRa模组及LoRa网关之后,数据便会到达 LoRa 核心网。腾讯的 LoRa 核心网目前在内测中,预计会在后面一两个月和公众见面,我就先不进行截图。
2.4 云端 IoT Explorer 产品及设备处理
云平台服务采用 腾讯云物联网开发平台(IoT Explorer) ,尤其是其中的数据模板,应该是物联网从业者比较喜欢的一个功能,通过定义通用的数据模版,统一应用协议,将会极大减少应用开发的工作量。尤其是腾讯目前在智慧城市等领域的一些项目落地,更依赖这类归一化的应用协议,来增强应用系统的可复用性。
这边给“花花草草守护仪”定义了自己的数据模板。
2.5 LoRa 核心网 与 Explorer 协议桥接方案
LoRa 核心网 与 Explorer 协议桥接 是整个方案中工作量比较大的一环,需要实现一个 MQTT Relay,而且需要注意其中的应用数据转码,将 LoRa Payload 转化成 数据模板的应用协议。
这边选择了基于 iot-sdk 来做具体的开发,如下方日志所展示的,LoRa Explorer Bridge 向 LoRa 核心网订阅了相关 topic,一旦收到数据后,会做转码处理,并发送给 IoT Explorer。
2.6 微信小程序
OS 已经帮助大家做好了现成的小程序 DEMO,目录为 TencentOS_tiny/tools/Mini_Program/,因此我就偷个懒在上面修改下,主要功能是实现开泵浇水以及土壤湿度的查看。
3 成果展示
再添加一个动图。
深圳湾一号的伙伴们,大声告诉我,现在是不是可以来养花啦?
4 小结 - 谈谈对腾讯云IoT系列产品的试用感受
Tencent OS tiny
不管外界各种 OS 的新闻满天飞,我还是很看好 Tencent OS tiny,它是众多嵌入式设备接入腾讯云 IoT 系列产品的重要载体。除了上文提到的 OS 的异步 AT 框架,我还听 OS 的伙伴讲到他们后续将推出的 FOTA、低功耗管理 等功能,这些都是比较刚需的功能,相信会有更多 IoT 从业者来使用 Tencent OS tiny。
关于 LoRa 部分,目前 OS 已经帮开发者完全打通了,我也在 lora_demo 上贡献了一点代码,主要是增加了异步的 LoRa 应用接收处理,后面的伙伴开发 LoRa 应用应该会更轻松一点。
IoT Explorer
IoT Explorer 使用下来,对其中的数据模板印象深刻。通过定义通用的数据模版,统一应用协议,将会极大减少应用开发的工作量。尤其是腾讯目前在智慧城市等领域的一些项目落地,更依赖这类归一化的应用协议,来增强应用系统的可复用性。目前公开的数据模版貌似只有智能灯,相信随着品类丰富,应用开发会更简单。
另外对 IoT Explorer 有个小建议,目前是提供 HTTP API,而一些报警类的应用需要再通知到其他一些应用端,例如小程序。目前的做法只能进行重复查询,这样比较消耗网络资源。建议后续能提供 MQTT,尤其是 MQTT over websocket,这样小程序之类的就可以直接收到一些紧急的上行消息。
最后推荐大家关注两个腾讯 IoT 的公众号,可以及时地了解腾讯 IoT 的动向。