多功能智能感应台灯设计(嵌入式)

多功能智能感应台灯设计(嵌⼊式)
⼀、产品创建
进⼊,点击创建产品,选择照明->氛围照明->台灯。
选择⾃定义⽅案,输⼊产品名称,选择通讯协议为WIFI+蓝⽛,点击创建产品。
根据要实现的设备功能,创建好DP功能点。
高压灌注机设定完功能点后,下⼀步点击设备⾯板,选择app的⾯板样式。推荐选择开发调试⾯板,⽐较直观,且可以开到dp数据包的接收和发送,⽅便开发阶段调试使⽤。
⾄此,产品的创建基本完成,可以正式开始嵌⼊式软件部分的开发。
⼆、软件⽅案介绍
嵌⼊式代码基于BK7231n平台,使⽤涂鸦通⽤Wi-Fi SDK进⾏SOC开发,具体代码可下载查看demo例程。
本demo完整例程:
1.应⽤层⼊⼝
打开demo例程,其中的apps⽂件夹内就是demo的应⽤代码。应⽤代码结构如下:
├── src
|    ├── app_driver
|    |    ├── lamp_pwm.c          //台灯PWM驱动相关⽂件
碳化硅石墨坩埚|    |    ├── sh1106.c            //OLED屏驱动相关⽂件
|    |    ├── bh1750.c            //光照强度传感器驱动相关⽂件
|    |    └── app_key.c            //触摸按键相关代码⽂件
|    ├── app_soc                  //tuya SDK soc层接⼝相关⽂件
|    ├── tuya_device.c            //应⽤层⼊⼝⽂件
|    ├── app_lamp.c            //主要应⽤层
|    └── lamp_control.c            //按键相关逻辑
|
├── include    //头⽂件⽬录
|    ├── app_driver
|    |    ├── lamp_pwm.h
|    |    ├── sh1106.h
|    |    ├── bh1750.h
|    |    └── app_key.h
|    ├── app_soc
|    ├── tuya_device.h
|    ├── app_lamp.h
|    └── lamp_control.h
|
└── output              //编译产物
打开tuya_device.c⽂件,到device_init函数
OPERATE_RET device_init(VOID_T)
{
OPERATE_RET op_ret = OPRT_OK;
TY_IOT_CBS_S wf_cbs = {
status_changed_cb,\
gw_ug_inform_cb,\
南瓜加工
卷绕电池gw_reset_cb,\
dev_obj_dp_cb,\
dev_raw_dp_cb,\
dev_dp_query_cb,\
NULL,
};
op_ret = tuya_iot_wf_soc_dev_init_param(WIFI_WORK_MODE_SEL, WF_START_SMART_FIRST, &wf_cbs, NULL, PRODECT_ID, DEV_SW_VERSION) ;
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
return op_ret;
}
op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
return op_ret;
}
op_ret = app_lamp_init(APP_LAMP_NORMAL);
if(OPRT_OK != op_ret) {
PR_ERR("app init err!");
return op_ret;
}
return op_ret;
}
在BK7231平台的SDK环境中,该函数为重要的应⽤代码⼊⼝,设备上电后平台适配层运⾏完⼀系列初始化代码后就会调⽤该函数来进⾏应⽤层的初始化操作。
该函数做了三件事:
调⽤tuya_iot_wf_soc_dev_init_param()接⼝进⾏SDK初始化,配置了⼯作模式、配⽹模式,同时注册了各种回调函数并存⼊了PID(代码中宏定义为PRODECT_KEY)。
TY_IOT_CBS_S wf_cbs = {
status_changed_cb,\
gw_ug_inform_cb,\
gw_reset_cb,\
dev_obj_dp_cb,\
dev_raw_dp_cb,\
dev_dp_query_cb,\
NULL,
};
op_ret = tuya_iot_wf_soc_dev_init_param(WIFI_WORK_MODE_SEL, WF_START_SMART_FIRST, &wf_cbs, NULL, PRODECT_ID, DEV_SW_VERSION );
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_wf_soc_dev_init_param error,err_num:%d",op_ret);
return op_ret;
}
调⽤tuya_iot_reg_get_wf_nw_stat_cb()接⼝注册设备⽹络状态回调函数。
op_ret = tuya_iot_reg_get_wf_nw_stat_cb(wf_nw_status_cb);
if(OPRT_OK != op_ret) {
PR_ERR("tuya_iot_reg_get_wf_nw_stat_cb is error,err_num:%d",op_ret);
return op_ret;
}
调⽤应⽤层初始化函数
染料废水op_ret = app_lamp_init(APP_LAMP_NORMAL);
if(OPRT_OK != op_ret) {
PR_ERR("app init err!");
return op_ret;
}
2.应⽤结构
本demo应⽤代码主要分三层来实现:
最底层为⼀些外设、传感器的驱动代码,例如光照传感器、OLED屏幕、微波雷达、触摸按键、灯板等,封装出常⽤接⼝;
第⼆层为控制逻辑部分的代码,调⽤驱动层的各类接⼝,实现各个组件的控制逻辑,封装出数据处理轮询接⼝;
第⼀层为主要应⽤层,创建应⽤任务调⽤第⼆层的接⼝,同时处理DP点数据的上报和接受解析。
第⼀层就是在app_lamp.c⽂件中实现的,⼤致内容如下:
app_lamp_init() 调⽤第⼆层封装出的设备初始化接⼝,创建应⽤任务;
OPERATE_RET app_lamp_init(IN APP_LAMP_MODE mode)
{
OPERATE_RET op_ret = OPRT_OK;
if(APP_LAMP_NORMAL == mode){
lamp_device_init();
//create ADC sensor data collection thread
tuya_hal_thread_create(NULL,"thread_data_get",512*4, TRD_PRIO_4, sensor_data_get_thread,NULL);
tuya_hal_thread_create(NULL,"thread_data_deal",512*4, TRD_PRIO_4, sensor_data_deal_thread,NULL);
tuya_hal_thread_create(NULL,"key_scan_thread",512*4, TRD_PRIO_4, key_scan_thread,NULL);
tuya_hal_thread_create(NULL,"thread_data_report",512*4, TRD_PRIO_4, sensor_data_report_thread,NULL); }else{
//not factory test mode
}
return op_ret;
}
app_report_all_dp_status()⽤于上报所有DP数据:
VOID app_report_all_dp_status(VOID)
{
OPERATE_RET op_ret = OPRT_OK;
INT_T dp_cnt =0;
dp_cnt =5;
TY_OBJ_DP_S *dp_arr =(TY_OBJ_DP_S *)Malloc(dp_cnt*SIZEOF(TY_OBJ_DP_S));
if(NULL== dp_arr){
PR_ERR("malloc failed");
return;
}
memset(dp_arr,0, dp_cnt*SIZEOF(TY_OBJ_DP_S));
dp_arr[0].dpid = DPID_DELAY_OFF;
dp_arr[0].type = PROP_BOOL;
dp_arr[0].time_stamp =0;
dp_arr[0].value.dp_value = lamp_ctrl_data.Lamp_delay_off;
dp_arr[1].dpid = DPID_LIGHT_MODE;
dp_arr[1].type = PROP_ENUM;
dp_arr[1].time_stamp =0;
dp_arr[1].value.dp_value = lamp_ctrl_data.Light_mode;
dp_arr[2].dpid = DPID_SIT_REMIND;
鞋帮加工
dp_arr[2].type = PROP_BOOL;
dp_arr[2].time_stamp =0;
dp_arr[2].value.dp_value = lamp_ctrl_data.Sit_remind;
dp_arr[3].dpid = DPID_AUTO_LIGHT;
dp_arr[3].type = PROP_BOOL;
dp_arr[3].time_stamp =0;
dp_arr[3].value.dp_value = lamp_ctrl_data.Auto_light;
dp_arr[4].dpid = DPID_LOW_POW_ALARM;
dp_arr[4].type = PROP_BOOL;
dp_arr[4].time_stamp =0;
dp_arr[4].value.dp_value = lamp_ctrl_data.Low_pow_alarm;
op_ret =dev_report_dp_json_async(NULL,dp_arr,dp_cnt);
Free(dp_arr);
if(OPRT_OK != op_ret){
PR_ERR("dev_report_dp_json_async relay_config data error,err_num",op_ret);
}
PR_DEBUG("dp_query report_all_dp_data");
return;
}
任务函数,任务内循环调⽤的lamp_get_sensor_data()、lamp_key_poll()、lamp_ctrl_handle()都是第⼆层的接⼝,实现在lamp_control.c ⽂件中,分别负责传感器数据的采集,触摸按键扫描轮询及数据处理和功能逻辑实现轮询:

本文发布于:2024-09-21 20:40:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/284493.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:代码   选择   创建   函数   传感器   逻辑   按键   驱动
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议