演示视频
PPT
一. 设计背景
现如今由于新冠疫情影响,疫情催生着在线教育,让很多学习场景从学校、教室转移至家庭、宿舍。作为开学即隔离的学生党感受颇深QAQ,每天的网课和作业对用眼需求更大,昏暗的宿舍和巨亮的屏幕更是增大了眼睛的压力。于是就有了开发此demo的想法,同时感谢TencentOS团队提供的这次机会开启了我学习嵌入式操作系统,以及学习NXP系列MCU的旅程。
二. 项目功能
坐姿检测
通过HC-SR04超声波模块实时检测使用者与台灯之间的距离判断坐姿,提醒使用者调整坐姿。
暗环境开灯提醒
再也不会忘记太阳落山时开灯了。。。
柔和调光
现在市面的大多数台灯都只是分几档亮度,拥有无极调光的台灯价格都不太友好。于是增加了PWM无极调光,光线柔和变换,减轻用眼负担。
小程序控制
TencentOS-Tiny作为物联网操作系统依托腾讯强大的物联网云平台可以让项目更简单的接入微信小程序,不用下载第三方APP即可做到远程遥控。
三. 硬件部分
EVB-AIoT 开发板
- 核心板采用的RT1062处理器属于i.MX RT 系列 MCU,是由 NXP 推出的跨界处理器,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理器,i.MX RT 系列 MCU 则综合了两者的优势,既具备高频率(最高主频600M)、高处理性能,也具备中断响应迅速、实时性高的特点。
- 1M RAM 16M SDRAM 64MB qspi flash 128MB spi flash。
- 板载Type-C接口CMSIS DAP仿真器。
- 板载PCIE接口,可扩展4G类物联网模组。
- 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组。
- 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器。
- 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头。
- 板载RGB显示接口,可转换HDMI输出。
- 板载高性能音频解码芯片,可做语音识别测试。
- 预留SD卡、用户按键、SPI Flash。
HC-SR04超声波传感器
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
- 采用 I/O 口 TRIG 触发测距,给最少 10us 的高电平信呈
- 模块自动发送 8个40khz 的方波,自动检测是否有信号返回
- 有信号返回,通过I/O口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2
I/O连接如下:
蜂鸣器模块
有源蜂鸣器一枚,低电平触发。
I/O连接如下:
BH1750环境光传感器
BH1750环境光传感器内置16位的模数转换器,通过IIC接口能够直接输出一个数字信号,不需要再做复杂的计算。能够直接通过光度计来测量。光强度的单位是流明"lux"。当物体在均匀的光照下它能够在每平方米获得1lux的光通量,它们的光强度是1lux。量程为 1-65535lux。
I/O连接如下:
ESP8266 WiFi模块
ESP8266系列无线模块是一个经济高效的WIFI SOC模块,支持标准IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。 用户可以使用此系列模块向现有设备添加网络功能,也可以构建独立的网络控制器。
I/O连接如下:
四. 软件部分
软件开发使用了MCUXpresso Config Tools v10和Keil MDK进行了开发,MCUXpresso Config Tools是NXP的一款类似STM32CubeMX的配置工具,但它的功能要更加强大,可以直接生成一些SDK工程,可以快速学习一些外设和库函数的使用方法,可以极大的提高开发效率。
mqttclient_task
代码语言:javascript复制void mqttclient_task(void)
{
int error;
mqtt_client_t *client = NULL;
mqtt_message_t msg;
k_event_flag_t match_flag;
char host_ip[20];
uint16_t lux;
memset(&msg, 0, sizeof(msg));
esp8266_sal_init(HAL_UART_PORT_2);
esp8266_join_ap("*******", "*******");//WiFi SSID, WiFi Password
bh1750_init();
mqtt_log_init();
client = mqtt_lease();
tos_event_create(&report_result_event, (k_event_flag_t)0u);
/* Domain Format: <your product ID>.iotcloud.tencentdevices.com */
tos_sal_module_parse_domain("7VIN7U0AXQ.iotcloud.tencentdevices.com",host_ip,sizeof(host_ip));
/*
These infomation is generated by mqtt_config_gen.py tool in "TencentOS-tinytools" directory.
*/
mqtt_set_port(client, "1883");
mqtt_set_host(client, host_ip);
mqtt_set_client_id(client, "7VIN7U0AXQdev001");
mqtt_set_user_name(client, "7VIN7U0AXQdev001;21010406;12365;4294967295");
mqtt_set_password(client, "8d5dfc28d97785d5b0b57fcfd449485c18a0a998;hmacsha1");
mqtt_set_clean_session(client, 1);
error = mqtt_connect(client);
MQTT_LOG_D("mqtt connect error is %#0x", error);
error = mqtt_subscribe(client, "$thing/down/property/7VIN7U0AXQ/dev001", QOS0, tos_topic_handler);
MQTT_LOG_D("mqtt subscribe error is %#0x", error);
while (1) {
bh1750_start(ONCE_H_MODE);
tos_task_delay(160);
bh1750_read_lux(&lux);
printf("bh1750 lux is %drn",lux);
memset(&msg, 0, sizeof(msg));
snprintf(report_buf, sizeof(report_buf), REPORT_DATA_TEMPLATE,lux);
/*光亮度数据参考:
*晚上: 0.001-0.02;
*月夜: 0.02-0.3;
*多云室内: 5-50;
*多云室外: 50-500;
*晴天室内: 100-1000;
*阅读书籍时的照明度:50-60;
*家庭录像标准照明度:1400
*/
if(lux <= 50){
GPIO_PinWrite(GPIO3, 2, 1);
}else{
GPIO_PinWrite(GPIO3, 2, 0);
}
msg.qos = QOS0;
msg.payload = (void *) report_buf;
error = mqtt_publish(client, "$thing/up/property/7VIN7U0AXQ/dev001", &msg);
MQTT_LOG_D("mqtt publish error is %#0x", error);
tos_event_pend(&report_result_event,
report_success|report_fail,
&match_flag,
TOS_TIME_FOREVER,
TOS_OPT_EVENT_PEND_ANY | TOS_OPT_EVENT_PEND_CLR);
if (match_flag == report_success) {
printf("report to Tencent IoT Explorer successrn");
}else if (match_flag == report_fail){
printf("report to Tencent IoT Explorer failrn");
}
tos_task_delay(2000);
}
}
blink_task
代码语言:javascript复制void blink_entry(void *arg){
while(1){
if(lastbrightness < brightness){
for(temp = lastbrightness ; temp < brightness ; temp ){
PWM_UpdatePwmDutycycle(PWM4, kPWM_Module_3, kPWM_PwmA, kPWM_SignedCenterAligned, temp);//更新占空比
PWM_SetPwmLdok(PWM4,kPWM_Control_Module_3, true);
tos_task_delay(5);
}
}else if(lastbrightness > brightness){
for(temp = lastbrightness ; temp > brightness ; temp--){
PWM_UpdatePwmDutycycle(PWM4, kPWM_Module_3, kPWM_PwmA, kPWM_SignedCenterAligned, temp);//更新占空比
PWM_SetPwmLdok(PWM4,kPWM_Control_Module_3, true);
tos_task_delay(5);
}
}
lastbrightness = brightness;
}
}
distance_task
代码语言:javascript复制void Distance_judge_entry(void *arg){
int distance_flag;
while(1){
Distance_measurement();//超声波测距
if(distance < 1000){
distance_flag ;
}
if(distance_flag >= 10){
GPIO_PinWrite(GPIO2, 29, 0U);
delay_us(500000);
distance_flag = 0;
}
else if(distance_flag < 10){
GPIO_PinWrite(GPIO2, 29, 1U);
}
PRINTF("%dn",distance);
}
}
五. 小程序部分
腾讯云物联网平台提供了交互开发的功能,可以直接在腾讯连连小程序中开发标准面板,也可以自己写H5上传自定义面板,这里我使用了标准面板。标准面板在调试时非常方便,后期可以自制H5面板。
六. 活动总结
本着学习嵌入式操作系统参加了此次活动,有幸进入初赛获得EVB-AIoT开发板。通过这次活动我学习到了很多新的知识,也通过其他大佬的作品了解了很多之前不了解的技术和规范(比如在单片机部署AI模型、清晰的项目概况、分析问题的方法),对我未来的学习提供了丰富的资源。感谢TencentOS-Tiny团队和NXP提供的学习资料以及直播课程,让我从基本0基础学习了NXP RT系列单片机的开发以及TencentOS-Tiny的移植和使用。虽然活动中途出现了些小插曲(自己修核心板QAQ)没有做成最初设想的作品,但还是算基本完成了任务。
不积跬步无以至千里,通过这次活动初步了解了嵌入式操作系统,今后将继续深入学习TencentOS-Tiny。