基于腾讯云的智能灯
一、总体设计
本次有幸参与2021 TencentOS Tiny AIoT应用创新大赛,智能灯基于腾讯云和恩智浦联合推出的TencentOS Tiny EVB_AIoT开发套件,使用数字型光强度传感器监测环境亮度,并传输至腾讯云物联网开发平台,同时利用腾讯连连通过微信远程控制灯。
二、硬件设计
系统基于TencentOS Tiny AIoT开发套件,核心板采用的RT1062处理器属于i.MX RT系列MCU,是由NXP推出的跨界处理器,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理器,i.MX RT系列MCU则综合了两者的优势,既具备高频率(最高主频600M)、高处理性能,也具备中断响应迅速、实时性高的特点。此外,板载Type-C接口CMSIS DAP仿真器。
bh1750传感器有接近视觉灵敏度的光谱灵敏度特性,它支持I2CBUS接口,支持1.8v逻辑输入接口。传感器有两种可选的I2Cslave地址,无需其他外部件。光源依赖性弱,受红外线影响很小。传感器通过降低功率功能,实现低电流化。通过50Hz/60Hz除光噪音功能实现稳定的测定,最小误差变动在±20%.
外设 | 接口 | TencentOS Tiny AIoT引脚 |
---|---|---|
ESP8266 | UART | GPIO_AD_B0_12/GPIO_AD_B0_13 |
BH1750 | IIC | GPIO_AD_B1_00/GPIO_AD_B1_01 |
LED | PIN | GPIO_B1_15 |
恩智浦的MCU针脚识别对于新手不够友好,好在其MCUXpresso IDE提供了个有意思的模块PINS,可以比较方便的配置针脚,配置好以后选择点击“更新源代码”,生成的代码保存在pin_mux.c和pin_mux.h文件中。
三、软件实现
软件设计较简单,bh1750在Tiny的BSP中可以找到驱动程序bh1750_i2c_drv.c。通过TencentOS tiny 提供的丰富的物联网组件(选择了MQTT),快速接入腾讯云物联网平台IoT Explorer,通过注册MQTT事件,并且在订阅事件的回调函数中完成云端下发事件的处理。
上报数据代码:
while (1) {
bh1750_start(ONCE_H_MODE);
bh1750_read_lux(&lux);
memset(&msg, 0, sizeof(msg));
snprintf(report_buf, sizeof(report_buf), REPORT_DATA_TEMPLATE, lux);
msg.payload = (void *) report_buf;
error = mqtt_publish(client, "$thing/up/property/EXAMPLE/dev001", &msg);
MQTT_LOG_D("mqtt publish error is %#0x", error);
}
接受灯光控制处理代码:
cjson_root = cJSON_Parse((char*)msg->message->payload);
if (cjson_root == NULL) {
printf("report reply message parser failrn");
event_flag = report_fail;
goto exit;
}
cjson_method = cJSON_GetObjectItem(cjson_root, "method");
method = cJSON_GetStringValue(cjson_method);
if (cjson_method == NULL || method == NULL) {
printf("report reply status parser failrn");
event_flag = report_fail;
goto exit;
}
if (strstr(method, "control")) {
cjson_params = cJSON_GetObjectItem(cjson_root, "params");
cjson_switch = cJSON_GetObjectItem(cjson_params, "power_switch");
if (cjson_params == NULL || cjson_switch == NULL) {
printf("control data parser failrn");
cJSON_Delete(cjson_root);
return;
}
//control LED
power_switch = cjson_switch->valueint;
if (power_switch == 0) {
GPIO_PinWrite(GPIO2, 31, 0);
} else if (power_switch == 1) {
GPIO_PinWrite(GPIO2, 31, 1);
}
cJSON_Delete(cjson_root);
return;
}
MQTT接入的用户名密码信息需要一个python脚本生成,需要到github上下载mqtt_config_gen.py,执行脚本生成后更新源码的MQTT接入信息。
编译代码生成开发板固件:
四、腾讯云端(IoT Explorer)配置
端侧处理完毕后,接下来需要在腾讯云端(IoT Explorer)创建产品和设备,主要包括产品开发中的物模型建立,一个亮度用于上传云端环境亮度,一个开关用户云端控制LED。