新闻  |   论坛  |   博客  |   在线研讨会
炎炎夏日,同事争着抢着用它!?
智能物联研习社 | 2021-05-08 16:05:22    阅读:1083   发布文章

立夏过后,气温逐升。“热”是每个人夏天的关键词之一,怎样清凉一夏?

 

“夏天空调开起来!”,凉意来的快,但“空调病”也来的快!家里老人、小孩更易出现感冒、头晕症状!

 

“换季真的很尴尬,开了空调太冷,关了太热!而且每个人对温度的承受力也不同,像我就更喜欢自然风的风扇。” 

 

听到隔壁老王和对面小李的谈话,涂鸦智能“攻城狮”小杨陷入沉思......

 

面对炎炎夏日,大家如何既健康又有效地降温呢?为造福办公室这帮“老铁们”,小杨灵机一动,欲 DIY 一款智能直流变频风扇,天时地利人和,撸起袖子就是干!

 

一顿操作猛如虎,小杨自制版智能直流变频风扇备受好评,因具备远程控制、风速随心调节等高实用价值,人人都抢着用!

 

如此有魅力的电风扇,你难道不想一探究竟吗?

 

废话不多,直接上“智能攻略”!

 

先奉上想破头皮的硬件设计思路图

 

戳以下链接,回复“风扇2”即可获取50元模组券以及开发者资料,手慢无!!!

https://www.wjx.cn/vj/wRUXLSS.aspx 

电路接线参考

 

 

  • Wi-Fi 模组及外围电路接线:

  • DC-DC 转换电路接线:

  • FU6832S 电机控制芯片及外围电路:

 

 

设备功能设计

 

 

功能设计详细说明
工作模式正常风
自然风:忽大忽小间隔 15 秒
睡眠风:每隔一小时自动降档,最后降到最低档
风速控制编码器旋转控制风扇,顺时针旋转风速 +,逆时针旋转风速 -
模式切换编码器按钮短按切换模式。
本地定时定时结束后自动关机,定时按键:无定时 -> 1 小时 -> 2 小时 -> 3 小时 -> 4 小时 -> 无定时。
指示灯显示 14 颗指示灯显示风速,4 颗指示灯指示 8 档风速,闪烁代表 1 档,常亮代表 2 档。4 颗指示灯还复用本地定时指示。
指示灯显示 2LED 有 8 颗,除指示风速 4 颗 LED 外,还有 4 颗指示灯。一颗 Wi-Fi 指示灯,指示 Wi-Fi 状态;其他三颗指示当前风扇模式。
电源电源按键,控制风扇的启动和断电状态
设备配网长按 Wi-Fi 按键,设备进入配网模式

指示灯调节

 

 

断电记忆

LED 指示灯亮度可通过 App 调整,正常亮度,较暗亮度

 

设备通电自动恢复

 

 

实物组装

 

 

电机驱动板和电压转换板:

 

 

Wi-Fi 模组控制板:

 

 

 

 

创建产品

 

下面是小杨通过涂鸦 IoT 开发平台,让直流变频风扇实现真正的联网和智能化。

戳以下链接,回复“风扇2”即可获取50元模组券以及开发者资料,手慢无!!!

https://www.wjx.cn/vj/wRUXLSS.aspx 

1、进入 涂鸦 IoT 平台的产品创建页面。

 

2、创建一款风扇产品,创建产品时,选择 小家电 > 风扇,开发方案确认为自定义方案,通讯方式选择为 Wi-Fi。

3、设置 DP 时,需要考虑您想要添加的风扇功能,与嵌入式开发的功能设置做一一映射。

4、选择面板后,进入硬件开发阶段,此时选择涂鸦标准模组 SDK 开发作为云端连接方式,并选择 CBU 模组为通信模组。

 

嵌入式功能开发

 

 

本次软件开发是基于涂鸦 IoT 云平台和目前主推的 CBU 模组,大家可以通过参加活动获取模组。 

戳以下链接,回复“风扇2”即可获取50元模组券以及开发者资料,手慢无!!!

https://www.wjx.cn/vj/wRUXLSS.aspx 

涂鸦的 SDK 编译一般是在 Linux 下进行编译开发的,需安装下虚拟机,Windows 下应该也是可以的,但编译速度有点慢。

 

开发过程中的问题

 

 

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);

}



 

2、设备偶尔配网失败

 

小杨说道:该问题一般是在开发完成后出现,经过一番分析确认,发现是在配网过程中,由于对设备进行了操作,设备要上报 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");

}


 

至此,我们的“攻城狮”小杨成功完成智能直流变频风扇的开发,虽然中间遇到些“疑难杂症”,但也都迎刃而解!

 

炎炎夏日,为家人朋友送去柔和健康的“智能风”竟如此简单,“吹走”因空调带来的重重困扰,你心动了吗?

 

注明:本文来源于涂鸦智能工程师杨杰,已授权转载,未经本人同意不得私自转载,不得用于其他用途。

 

戳以下链接,回复“风扇2”即可获取50元模组券以及开发者资料,手慢无!!!

https://www.wjx.cn/vj/wRUXLSS.aspx 


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客