BLDC风扇方案介绍-开发中遇到的问题

开发过程中的问题

本文主要介绍在实际开发过程中遇到的问题,以及如何解决的。

  1. 在板子上调节档位导致重启
    在开发完成后进行测试的情况下,发现在板子上快速转动旋转编码器会导致系统不受控制,然后重启,后来发现是因为旋转编码器使用的外部中断的方式导致的。由于一直转动编码器,导致系统一直处于外部中断中,其他任务无法正常执行,从而系统重启。
    解决办法:将编码器触发判断设置成任务的形式,定期去判断电平处理。这样处理完后,系统重启问题基本解决,但是有时多次连续触发判断不及时,但基本问题还好。
    解决问题的偷懒方法:
void key_rotary_task(void)
{
    INT8_T current_gear;

    while(1) {
        //得到当前档位
        current_gear = get_cur_gear();
        if((tuya_gpio_read(KEY_ROTARY_A) == FALSE) && (fan_state.on_off != FALSE)) {
            while(tuya_gpio_read(KEY_ROTARY_A) == FALSE);
            if(tuya_gpio_read(KEY_ROTARY_A) != tuya_gpio_read(KEY_ROTARY_B)) {
                PR_NOTICE("A != B"); //顺时针方向
                current_gear++;
                if (current_gear > (MAX_GEAR_NUMBER-1)) {
                    current_gear = (MAX_GEAR_NUMBER-1);
                }
                fan_state.speed = g_fan_speed_gear[current_gear];
            } else {
                PR_NOTICE("A == B"); //逆时针方向
                current_gear--;
                if (current_gear < 0) {
                    current_gear = 0;
                }
                fan_state.speed = g_fan_speed_gear[current_gear];
            }
            /* 改变风扇状态:风速,模式,LED */
            change_fan_state();
            write_flash_fan_state();
            
            PR_NOTICE("fan current_gear is : %d", current_gear);
        }
        tuya_hal_system_sleep(50);
    }
}

//在初始化函数里创建任务
VOID_T fan_key_init(VOID_T)
{
  ......
    tuya_hal_thread_create(NULL, "key_rotary_task", 512*4, TRD_PRIO_5, key_rotary_task, NULL);
}
  1. 设备有时候配网失败
    这个问题是在开发完成后,进行配网的时候发现有时候配网正常,有时候老是配网失败,特别是在某人一边玩的时候一边配网的情况下。
    这时候就猜测是因为配网过程中,由于对设备进行了操作,设备要上报DP点导致的问题,后面通过查看日志更加确认了这一点。于是便在上报函数中加了一点判断,立马好使!(便是下面判断是否连接到路由器那5行)
/**
 * @Function: hw_report_all_dp_status
 * @Description: 上报所有 dp 点
 * @Input: none
 * @Output: none
 * @Return: none
 * @Others: 
 */
VOID_T hw_report_all_dp_status(VOID_T)
{
    OPERATE_RET op_ret = OPRT_OK;

    INT_T dp_cnt = 0;
    dp_cnt = 4;

    /* 没有连接到路由器,退出 */
    GW_WIFI_NW_STAT_E wifi_state = STAT_LOW_POWER;
    get_wf_gw_nw_status(&wifi_state);
    if (wifi_state <= STAT_AP_STA_DISC || wifi_state == STAT_STA_DISC) {
        return;
    }

    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 = fan_state.dp_id_switch;
    dp_arr[0].type = PROP_BOOL;
    dp_arr[0].time_stamp = 0;
    dp_arr[0].value.dp_bool = fan_state.on_off;

    dp_arr[1].dpid = fan_state.dp_id_mode;
    dp_arr[1].type = PROP_ENUM;
    dp_arr[1].time_stamp = 0;
    dp_arr[1].value.dp_enum = fan_state.mode;

    dp_arr[2].dpid = fan_state.dp_id_speed;
    dp_arr[2].type = PROP_VALUE;
    dp_arr[2].time_stamp = 0;
    dp_arr[2].value.dp_value = fan_state.speed;

    dp_arr[3].dpid = fan_state.dp_id_bright;
    dp_arr[3].type = PROP_VALUE;
    dp_arr[3].time_stamp = 0;
    dp_arr[3].value.dp_value = fan_state.bright;

    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");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值