涂鸦智能暖风机软件实现之云端控制(完结)

Posted 三明治开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涂鸦智能暖风机软件实现之云端控制(完结)相关的知识,希望对你有一定的参考价值。


前言

前面我们已经实现了暖风机的离线按键控制、断电记忆等功能,本文将实现智能暖风机的最后一部分,为暖风机赋能实现app云端控制。


一、暖风机的云端控制功能点

  • 此次改装的智能暖风机可以通过APP远程进行智能控制,可以实现下班前提前开始暖风机加热到舒适温度,也可以在外地查看家中设备是否关闭,让家用电器实现智能化;本智能暖风机提供的云端控制功能点如下:
功能名称控制选项
开关开启/关闭
设置温度15-40摄氏度
灯光调节开(4种颜色)/关
档位三档可选
温度显示显示当前室温
云端定时开启时间自行设定
云端定时关闭时间自行设定
设备端倒计时显示显示设备倒计时关闭的时间

实现云端控制首先要实现dp数据触发的执行函数,下面我们将实现这些执行函数

1.实现开关设定的执行函数

开关设定执行函数可以设置暖风机的开关状态,开和关触发后要实现的具体功能如下:

开:
1.根据flash上次存储的dp的数据设置led状态灯显示
2.开启风扇
3.根据flash中上次存储的dp数据设置LED灯带运行模式
4.根据flash中上次存储的dp数据设置目标温度
5.根据设定的温度和当前室温的差值设置加热档位
6.触发面板显示线程,显示面板工作
关:
1.关闭加热档
2.关闭风扇
3.关闭灯光
4.关闭面板显示
5.清除本地定时关闭剩余倒计时时间
6.关闭摇头
整体:
每触发一次开关执行函数,进行一次断电记忆存储
  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_dp_process.c中增加执行函数
VOID_T user_switch_handle(IN BOOL_T bONOFF)
{
    BOOL_T bLastStatus ;
    int difference = 0;
    bLastStatus = switch_s.power;

    if( TRUE == bONOFF ) {
        switch_s.power = TRUE;
        //led_status_display
        if(dp_memory_s.status & 0x18){
            dp_memory_s.status &= 0xfe; 
            dp_memory_s.status |= 0x22; 
        }
        else{
            dp_memory_s.status |= 0x23; 
        }
        
        fan_motor_set(switch_s.power);
        led_handle(led_s.value);
        set_termper_handle(dp_memory_s.set_temper_value);
        difference = set_temper_s.value - temper_s.value;
        if(difference > 4)
        {
            relay_handle(2);
        }else if(difference > 0)
        {
            relay_handle(1);
        }else{
            relay_handle(0);
        }
        tuya_hal_semaphore_post(g_temper_binsemap);
    } 
    else {
        relay_handle(0);
        color_handle(0);
        shake_handle(0);
        tm1650_close();
        switch_s.power = FALSE;
        //clear timer close data
        dev_key_s.temp_time_count = 0;
        dev_key_s.timer_hour = 0;
        fan_motor_set(switch_s.power);
    }

    dp_memory_s.switch_bool = switch_s.power;
    PR_DEBUG("switch set:%d",switch_s.power);
    if(bONOFF == bLastStatus) {
        PR_DEBUG("the same switch set");
    }
    //更新dp数据到云端
    report_one_dp_status(DP_SWITCH);
    tuya_hal_semaphore_post(g_flash_binsemap);

}

此时开关状态设定函数已实现。

2.实现设定温度的函数

设定温度的函数是通过离线按键设定或者云端设定进行触发,触发后要实现的具体功能如下:

1.根据传入的设温值和室温做差值,根据差值控制加热档位
2.将设温值存入dp_memory_s中
3.每触发一次执行函数,进行一次断电记忆存储
  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_dp_process.c中增加执行函数
VOID_T set_termper_handle(int set_value)
{
    int difference = 0;
    difference = set_value - temper_s.value;
    if(difference > 4)
    {
        relay_handle(2);
    }else if(difference > 0)
    {
        relay_handle(1);
    }else{
        relay_handle(0);
    }
    set_temper_s.value = set_value;
    report_one_dp_status(DP_SET_TEMP);
    dp_memory_s.set_temper_value = set_temper_s.value;
    tuya_hal_semaphore_post(g_flash_binsemap);
}

此时温度设定函数已实现。

3.实现灯光模式设定函数

灯光模式设定函数是通过离线按键设定或者云端设定进行触发,触发后要实现的具体功能如下:

1.确认暖风机在开启状态,若未开启将不执行处理
2.根据传参进行LED控制
3.每触发一次执行函数,进行一次断电记忆存储
  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_dp_process.c中增加执行函数
VOID_T led_handle(IN int mode)
{

    if(switch_s.power == 1)
    {
    led_s.value = mode;
    dp_memory_s.led_mode = led_s.value;
    report_one_dp_status(DP_LED);
    color_handle(mode);
    tuya_hal_semaphore_post(g_flash_binsemap);
    }
}

此时灯光模式设定函数已实现。

4.实现暖风机档位设置函数

暖风机档位设置函数是通过离线按键设定或者云端设定进行触发,触发后要实现的具体功能如下:

1.确认暖风机在开启状态,若未开启将不执行处理
2.在室温低于设定温度值时,可以进行加热档位设定
3.根据档位切换改变led状态指示灯显示状态
  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_dp_process.c中增加执行函数
VOID_T relay_handle(IN int mode)
{
    if(dp_memory_s.switch_bool)
    {
    int bLastStatus ;
    bLastStatus = mode_s.value;
    mode_s.value = mode;
    relay_set(mode_s.value);
    if(mode == bLastStatus) {
        PR_DEBUG("the same mode set");
    }
    dp_memory_s.relay_mode = mode_s.value;
    switch (dp_memory_s.relay_mode){

    case 0:
        {
            dp_memory_s.status &= 0xa7;
            dp_memory_s.status |= 0x01;
        }
        break;
    case 1:
        {
            dp_memory_s.status &= 0x76;
            dp_memory_s.status |= 0x10;
        }
        break;
    case 2:
        {
            dp_memory_s.status &= 0x6e;
            dp_memory_s.status |= 0x08;
        }
        break;
        default:
        break;
    }
    //upload dp data
    report_one_dp_status(DP_MODE);
    tuya_hal_semaphore_post(g_temper_binsemap);
    }
}

此时暖风机档位设置函数已实现。

5.云端定时与温度云端显示说明

云端定时执行函数是通过云端设定进行触发,云端触发后,在设定时间到达时将会触发执行函数;温度云端显示功能在前面的温度采集文章已经实现,故不在说明。
云定时执行函数要实现的具体功能如下:

云定时开启:
1.执行上面实现的user_switch_handle(ON)函数
2.执行后将定时开启的状态清零
云定时关闭:
1.执行上面实现的user_switch_handle(OFF)函数
2.执行后将定时关闭的状态清零

  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_dp_process.c中增加执行函数
定时开启函数
VOID_T time_open_handle(IN int value)
{
    if(value == 1)
    {
    PR_DEBUG("TIMER_ON");
    user_switch_handle(TRUE);
    }
    time_to_open_s.power = 0;
    dp_memory_s.time_on_bool = time_to_open_s.power;
        //upload dp data
    report_one_dp_status(DP_TIME_ON);
}
//定时关闭函数
VOID_T time_off_handle(IN int value)
{
    if(value == 1)
    {
    PR_DEBUG("TIMER_OFF");
    user_switch_handle(FALSE);
    led_handle(0);
    }
    time_to_close_s.power = 0;
    dp_memory_s.time_off_bool = time_to_close_s.power;
    report_one_dp_status(DP_TIME_OFF);
}

此时暖风机档位设置函数已实现。

6.设备倒计时获取

本智能暖风机提供云定时和本地倒计时关闭功能,其中本地倒计时功能开启时,如果设备连上网时将会把剩余的倒计时时间上传到APP进行显示。
设备倒计时显示要实现的具体功能如下:

1.计算剩余倒计时时间
2.上传倒计时时间

  • 功能点已确定,下面我们开始进行代码实现:
    在tuya_thread.c中按键采集处理函数已经实现了按键定时功能,代码如下
//每10秒时基定时器会将timecount加一,一小时即timecount需要加360次
//dev_key_s.temp_time_count用来表示timecount到达此值时执行倒计时关闭功能
 case KEY2:
        {
            //timer close key
            if(dp_memory_s.switch_bool)
            {
                timer1_init();
                PR_DEBUG("key_value2");
                if(dev_key_s.last_time_count && ((timercount - dev_key_s.last_time_count) < 2)){
                    dev_key_s.timer_hour++;
                }
                dev_key_s.last_time_count = timercount;
                if(dev_key_s.timer_hour > 12){
                dev_key_s.timer_hour = 0;
                }
                //Avoid triggering the shutdown directly by pressing the timing button for the first time
                if(dev_key_s.timer_hour > 0){
                    dev_key_s.key_notice = 1;
                }else
                {
                    dev_key_s.key_notice = 0;
                }

                dev_key_s.temp_time_count = timercount + dev_key_s.timer_hour*360;
                timer2_init();
                display_num(dev_key_s.timer_hour);
                display_status(0x04);
            }
        }

在idle_task函数中会实时计算剩余的定时时间

void idle_task(void)
{

    static uint8_t wf_nw_led = 1;
    while(1)
    {
//计算剩余倒计时时间,分钟级显示
	    shutdown_time_s.value = ((dev_key_s.temp_time_count > timercount) && (0 < (dev_key_s.temp_time_count - timercount)/6 < 720)) ? (dev_key_s.temp_time_count - timercount)/6 : 0;
	    dev_key_s.timer_hour = shutdown_time_s.value/60;
	    if((timercount > dev_key_s.temp_time_count) && dev_key_s.temp_time_count && dev_key_s.key_notice){
	        PR_DEBUG("SHUTDOWN TIME");
	        time_off_handle(1);
	        dev_key_s.temp_time_count = 0;
	        dev_key_s.timer_hour = 0;
	        dev_key_s.key_notice = 0;
	        tuya_hal_system_sleep(1000);
	    }
	    //如果室温超过达到加热温度,关闭加热档
	    if((dp_memory_s.temperature_value >= dp_memory_s.set_temper_value) && dp_memory_s.relay_mode){
	        relay_handle(0);
	    }
	    if(wf_nw_led && dp_memory_s.switch_bool){
			.....//配网模式Led提示处理,前面文章已经说过,这里省略
	    }
}

此时倒计时时间已得到。

二、实现云端远程控制

上面已经实现了相应的执行函数,下面我们将实现app下发dp数据控制设备的功能。
在前面的暖风机产品创建以及嵌入式框架实现那篇文章我们以及构建了dp触发执行函数的框架,下面我们对他进行完善。

  • 目前整个工程的文件结构如下:此时整个工程的件已全部建立
├── src	
|    ├── tuya_drive
|    |  	└── b3950
|    |    		└── b3950.c           //温度传感器驱动相关
|    |  	└── tm1650
|    |    		└──  tm1650.c           
|    |  	└── rgb_led			//LED控制相关
|    |    		└──  led_color_set.c         
|    |  	└── tc309					//按键驱动相关
|    |    		└── tc309.c    
|    |  	└── interrupt				//外部中断
|    |    		└── interrupt.c    
|    |  	└── gpio_control		//gpio控制相关
|    |    		└── gpio_control.c    
|    |  	└── timer
|    |    		└── timer.c           //定时器相关
|    |  	└── soc_drive			//soc 驱动相关
|    |    		└── soc_flash.c           //soc闪存操作库
|    |    		└── soc_i2c.c           //soc_iic操作库
|    ├── tuya_device.c             //应用层入口文件
|    ├── tuya_thread.c             //主要线程处理文件
|    └── tuya_dp_process.c            //dp数据触发的主要应用文件
|
├── include				//头文件目录
|    ├── tuya_drive_h
|    |  	└── b3950_h
|    |    		└── b3950.h        
|    |  	└── tm1650_h
|    |    		└──  tm1650.h        
|    |  	└── rgb_led_h			//LED控制相关
|    |    		└──  led_color_set.h           
|    |  	└── tc309_h					
|    |    		└── tc309.h    
|    |  	└── interrupt_h				
|    |    		└── interrupt.h    
|    |  	└── gpio_control_h
|    |    		└── gpio_control.h        
|    |  	└── timer_h
|    |    		└── timer.h       
|    |  	└── soc_drive_h			//soc 驱动相关
|    |    		└── soc_flash.h           //soc闪存操作库
|    |    		└── soc_i2c.h           //soc_iic操作库
|    ├── tuya_device.h           
|    ├── tuya_thread.h       
|    └── tuya_dp_process.h       
|
└── output              //编译产物

  • 云端控制代码实现
//app下发命令后将会触发回调函数从而执行该函数,根据下发的DP_ID以及控制值执行相关函数
VOID_T deal_dp_proc(IN CONST TY_OBJ_DP_S *root)
{
    UCHAR_T dpid;
    dpid = root->dpid;
    
    switch (dpid){
    
    case DP_SWITCH:
        {
        user_switch_handle(root->value.dp_bool);
        }
        break;

    case DP_TEMPER:
        {
		//只上报dp,无需处理
        }
        break;

    case DP_SHAKE:
        {
        shake_handle(root->value.dp_bool);
        }
        break;

    case DP_MODE:
        {
        relay_handle(root->value.dp_enum);
        }
        break;

    case DP_LED:
        {
        led_handle(root->value.dp_value);
        }
        break;

    case DP_SET_TEMP:
        {
        set_termper_handle(root->value.dp_value);
        }
        break;

    case DP_TIME_ON:
        {
        time_open_handle(root->value.dp_value);
        }
        break;

    case DP_TIME_OFF:
        {
        time_off_handle(root->value.dp_value);
        }
        break;
    case DP_SHUTDOWN_TIME:
        {
		//只上报dp,无需处理
        }
        break;
    default:
    
        break;
    }

}

此时我们已经实现了智能暖风机的所有功能,从0到1一步步走来,将一个普通的暖风机改造成一个可以大大提高使用便捷性的智能产品。整体的功能设计和功能实现难免有些遗漏,欢迎大家提出问题或者提出你的想法,我们可以一同交流提高;后面也将推出更多有趣的、实用的智能化产品实现方案,欢迎大家去关注。


技术支持

您可以通过以下方法获得涂鸦的支持:

以上是关于涂鸦智能暖风机软件实现之云端控制(完结)的主要内容,如果未能解决你的问题,请参考以下文章

涂鸦智能暖风机软件实现之暖风机外设驱动实现

涂鸦智能暖风机软件实现之LED驱动和断电记忆功能

涂鸦智能暖风机软件实现之利用TC309实现触摸按键控制功能

涂鸦智能暖风机软件实现之利用TM1650实现显示功能

涂鸦智能暖风机软件实现之利用B3950实现温度采集功能

涂鸦智能烧水壶软件实现之水温调节和灯光提示