现如今由于新冠疫情影响,疫情催生着在线教育,让很多学习场景从学校、教室转移至家庭、宿舍。作为开学即隔离的学生党感受颇深QAQ,每天的网课和作业对用眼需求更大,昏暗的宿舍和巨亮的屏幕更是增大了眼睛的压力。于是就有了开发此demo的想法,同时感谢TencentOS团队提供的这次机会开启了我学习嵌入式操作系统,以及学习NXP系列MCU的旅程。
通过HC-SR04超声波模块实时检测使用者与台灯之间的距离判断坐姿,提醒使用者调整坐姿。
再也不会忘记太阳落山时开灯了。。。
现在市面的大多数台灯都只是分几档亮度,拥有无极调光的台灯价格都不太友好。于是增加了PWM无极调光,光线柔和变换,减轻用眼负担。
TencentOS-Tiny作为物联网操作系统依托腾讯强大的物联网云平台可以让项目更简单的接入微信小程序,不用下载第三方APP即可做到远程遥控。
HC-SR04 超声波测距模块可提供 2cm-400cm 的非接触式距离感测功能,测距精度可达高到 3mm;模块包括超声波发射器、接收器与控制电路。
I/O连接如下:
有源蜂鸣器一枚,低电平触发。
I/O连接如下:
BH1750环境光传感器内置16位的模数转换器,通过IIC接口能够直接输出一个数字信号,不需要再做复杂的计算。能够直接通过光度计来测量。光强度的单位是流明"lux"。当物体在均匀的光照下它能够在每平方米获得1lux的光通量,它们的光强度是1lux。量程为 1-65535lux。
I/O连接如下:
ESP8266系列无线模块是一个经济高效的WIFI SOC模块,支持标准IEEE802.11b/g/n协议,内置完整的TCP/IP协议栈。 用户可以使用此系列模块向现有设备添加网络功能,也可以构建独立的网络控制器。
I/O连接如下:
软件开发使用了MCUXpresso Config Tools v10和Keil MDK进行了开发,MCUXpresso Config Tools是NXP的一款类似STM32CubeMX的配置工具,但它的功能要更加强大,可以直接生成一些SDK工程,可以快速学习一些外设和库函数的使用方法,可以极大的提高开发效率。
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-tiny\tools" 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 %d\r\n",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 success\r\n");
}else if (match_flag == report_fail){
printf("report to Tencent IoT Explorer fail\r\n");
}
tos_task_delay(2000);
}
}
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;
}
}
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("%d\n",distance);
}
}
腾讯云物联网平台提供了交互开发的功能,可以直接在腾讯连连小程序中开发标准面板,也可以自己写H5上传自定义面板,这里我使用了标准面板。标准面板在调试时非常方便,后期可以自制H5面板。
本着学习嵌入式操作系统参加了此次活动,有幸进入初赛获得EVB-AIoT开发板。通过这次活动我学习到了很多新的知识,也通过其他大佬的作品了解了很多之前不了解的技术和规范(比如在单片机部署AI模型、清晰的项目概况、分析问题的方法),对我未来的学习提供了丰富的资源。感谢TencentOS-Tiny团队和NXP提供的学习资料以及直播课程,让我从基本0基础学习了NXP RT系列单片机的开发以及TencentOS-Tiny的移植和使用。虽然活动中途出现了些小插曲(自己修核心板QAQ)没有做成最初设想的作品,但还是算基本完成了任务。
不积跬步无以至千里,通过这次活动初步了解了嵌入式操作系统,今后将继续深入学习TencentOS-Tiny。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。