智能烧水壶(WIFI版)05——水温调节和灯光提示功能实现篇

前言

前面我们已经实现了烧水壶的按键功能,本文将实现烧水壶的煮沸、保温功能、灯光提示功能,同时实现按键触发烧水和煮沸。

一、智能烧水壶功能设定

  • 智能烧水壶的煮沸功能、保温功能、灯光指示以及按键控制功能设定如下:
功能说明
煮沸触摸按键1,触发方式:轻触。默认煮沸。
触摸按键控制煮沸键
app控制:煮沸
保温键触摸按键1,触发方式:轻触
轻触进入默认的自来水模式下的55度保温模式
指示灯按下煮沸键,煮沸灯亮,煮沸完成后灯灭。
按键保温键,温度未到(高于或低于)设定温度,保温键亮橙色;温度到设定温度,保温键亮绿色。
app设定保温,温度未到(高于或低于)设定温度,保温键亮橙色;温度到设定温度,保温键亮绿色。
按键提示按煮沸:按下红灯亮,松开灭。蜂鸣器滴一声提醒。
保温键:按下橙灯亮,松开灭。蜂鸣器滴一声提醒。
煮水模式app控制:纯净水模式,自来水模式。
默认自来水模式。
纯净水模式:直接加热到设定温度后恒温。
自来水模式:烧沸腾后凉值设定温度。
温度模式app控制。
恒温模式。
恒温模式:
可app设置温度45,55,70,90度(或者45-90度),选择后恒定在设定温度。默认55度。

二、水温调节及灯光指示的方案制定

1.加热方案

本案例使用继电器控制加热电阻加热,通过控制继电器的关断实现水温的温度控制。

  • 继电器控制电路如下:

在这里插入图片描述

通过控制P9引脚输出的高低电平控制继电器的关断。P9为高电平时,继电器闭合,烧水壶开始加热;P9为低电平时,继电器断开,烧水壶停止加热。

2.灯光提示功能设定

  • 提示灯有三个,分别为红色灯、绿色灯、橙色灯,灯的引脚设定如下

    led1	| P24	红色
    led2	| P26	橙色
    led3	| P6	绿色
    

    灯光提示设定:

烧水壶状态灯光显示
配网时绿灯闪烁 ,红、橙灯灭
加热时煮沸灯亮,煮沸完成后灯灭
保温时温度未到(高于或低于)设定温度,保温键亮橙色;温度到设定温度,保温键亮绿色
煮沸键灯光提示按键按下红灯亮、松开红灯灭
保温键灯光提示按键按下橙灯亮、松开橙灯灭

3. 按键触发功能设定

  • 按键触发功能设定:
按键触发功能
煮沸键正常按下按一下煮沸,再按一下取消煮沸
保温键正常按下按一下保温,再按一下取消保温
保温键长按5秒触发配网模式

具体的功能细节已经确定,现在我们开始实现这些功能。

三、功能实现

1.代码实现

1.继电器和led指示灯控制代码

  • 在之前开发的基础上增加程序,填充gpio_control.c文件,实现继电器控制和灯光控制,
── src	
|    ├── tuya_drive
|    |  	└── b3950
|    |    		└── b3950.c           //温度传感器驱动相关
|    |  	└── gpio_control
|    |    		└── gpio_control.c           //gpio 控制相关
|    |  	└── ts02n_key
|    |    		└── ts02n_key.c           //按键驱动
|    |  	└── timer
|    |    		└── timer.c           //定时器相关
|    ├── tuya_device.c             //应用层入口文件
|    └── kettle_app.c            //智能烧水壶主要应用文件
|
├── include				//头文件目录
|    ├── tuya_drive_h
|    |  	└── b3950_h
|    |    		└── b3950.h   
|    |  	└── gpio_control_h
|    |    		└── gpio_control.h          
|    |  	└── ts02n_key_h
|    |    		└── ts02n_key.h           //按键驱动
|    |  	└── timer_h
|    |    		└── timer.h           //定时器相关   
|    ├── tuya_device.h                
|    └── kettle_app.h       
|
└── output              //编译产物

gpio_control.c增加代码及说明如下:主要是继电器、LED以及蜂鸣器的引脚初始化和相关的控制函数,其中绿灯直接复用配网状态指示灯。在控制逻辑的代码中根据需求调用这些函数即可。

#define led1_pin 24
#define led2_pin 26
#define buzzer_pin  17
#define relay_pin  14
//gpio引脚初始化
void kettle_gpio_init()
{
    //led pin init
    tuya_pin_init(led1_pin, TUYA_PIN_MODE_OUT_PP_HIGH);
    tuya_pin_init(led2_pin, TUYA_PIN_MODE_OUT_PP_HIGH);
    //buzzer pin init
    tuya_pin_init(buzzer_pin, TUYA_PIN_MODE_OUT_PP_LOW);
    //relay pin init
    tuya_pin_init(relay_pin, TUYA_PIN_MODE_OUT_PP_LOW);
}
//控制红灯亮灭,为提高效率,如果设置状态和上一次一致则不需要操控IO
void led1_set(IN     BOOL_T bONOFF)
{
    static bool last_status = 0;
    if(last_status != bONOFF) {
        if(bONOFF == TRUE) {
        tuya_pin_write(led1_pin, TUYA_PIN_LOW);
        }else {
        tuya_pin_write(led1_pin, TUYA_PIN_HIGH);
        }
        last_status = bONOFF;
    }

}
//控制橙灯亮灭,为提高效率,如果设置状态和上一次一致则不需要操控IO
void led2_set(IN     BOOL_T bONOFF)
{
    static bool last_status = 0;
    if(last_status != bONOFF) {
        if(bONOFF == TRUE) {
        tuya_pin_write(led2_pin, TUYA_PIN_LOW);
        }else {
        tuya_pin_write(led2_pin, TUYA_PIN_HIGH);
        }
        last_status = bONOFF;
    }
}
//控制绿灯亮灭,直接使用配网提示灯的控制接口
void state_led_set(IN     BOOL_T bONOFF)
{
    static bool last_status = 0;
    if(last_status != bONOFF) {
        if(bONOFF == TRUE) {
        tuya_set_led_light_type(wifi_led_handle, OL_LOW, 0, 0); //Turn on indicator light
        }else {
        tuya_set_led_light_type(wifi_led_handle, OL_HIGH, 0, 0); //Turn off indicator light
        }
        last_status = bONOFF;
    }
}
//控制加热继电器开关
void relay_set(IN     BOOL_T bONOFF)
{
    static bool last_status = 0;
    if(last_status != bONOFF) {
        if(bONOFF == TRUE) {
        tuya_pin_write(relay_pin, TUYA_PIN_HIGH);
        }else {
        tuya_pin_write(relay_pin, TUYA_PIN_LOW);
        }
        last_status = bONOFF;
    }
}

2 .按键逻辑控制代码

代码思想:

水壶模式触发
boil(煮沸模式)按下煮沸键,煮沸灯亮,煮沸完成后灯灭。
水加热煮沸后,停止加热,同时切换到nature模式(即无操作)
keep_warm_mode1(自来水保温模式)加热到煮沸,关闭继电器,然后切换到keep_warm_mode2模式
keep_warm_mode2(纯净水保温模式)温度未到(高于或低于)设定温度,保温键亮橙色
温度到设定温度,保温键亮绿色。
为防止继电器在临界温度时频繁关断,所以保温温度会有范围波动
干烧报警温度高于105摄氏度,说明壶中缺水,蜂鸣器报警
  • 在kettle_app.c中添加逻辑控制代码
//创建主应用线程
rt = tuya_hal_thread_create(NULL, "app_kettle_thread", 512*4, TRD_PRIO_4, 		   app_kettle_thread, NULL);

if (rt != OPRT_OK) {
    PR_ERR("Create app_kettle_thread error!: %d", rt); 
    return;
}
//主应用线程代码,获取当前的水壶模式,然后进行相应的处理。
void app_kettle_thread(void)
{
    static int temp_work_status = 0;
    while(1)
    {
        temp_work_status = get_kettle_work_status();
        
        
        //According to the different Settings of the corresponding processing
        switch (temp_work_status) {
        
        case nature: {
                PR_DEBUG("nature");
                //Turn off the light when the temperature reaches the set value
                state_led_set(OFF);  
                //Turn off the light when the temperature reaches the set value
                led1_set(OFF);  

        }
        break;
        case boil: {
            if(get_water_temperature() >= Boil_Temperature) {
                set_kettle_work_status(nature); //Switch to cool mode
                relay_set(OFF);
                led1_set(OFF);
                led2_set(OFF);
                set_dp_boil_value(0);
                report_one_dp_status(DP_BOIL);
                PR_DEBUG("boil->nature");
            }else {
                relay_set(ON);
                led1_set(ON);
                led2_set(OFF);
                state_led_set(OFF);  
            }
        }
        break;
        //tap water keep warm
        case keep_warm_mode1: {

            state_led_set(OFF);
            if(get_water_temperature() >= Boil_Temperature) {
                set_kettle_work_status(keep_warm_mode2);
                relay_set(OFF);
                led1_set(OFF);
                led2_set(ON);
                state_led_set(OFF);  
                PR_DEBUG("keep_warm_mode1->keep_warm_mode2");
            }else {
                relay_set(ON);  
                led1_set(OFF);
                led2_set(ON);
                state_led_set(OFF);              
                PR_DEBUG("keep_warm_mode1 relay_set on");
            }

        }
        break;
        //clear water keep warm
        case keep_warm_mode2: {
        //cur_temp > set temper  close the heating
            if(get_water_temperature() > (get_keep_wram_temperature() - 5)) {  
                relay_set(OFF);
                led1_set(OFF);
                led2_set(ON);
                state_led_set(OFF);  
                PR_DEBUG("keep_warm_mode2 relay_set 0");
                //cur_temp < set temper  open the heating
                }else if(get_water_temperature() < (get_keep_wram_temperature() - 7)) { 
                relay_set(ON);
                led1_set(OFF);
                led2_set(ON);
                state_led_set(OFF);  
                PR_DEBUG("keep_warm_mode2 relay_set 1");
            }else {
            // cur_temp == set temper
            //It indicates that the temperature has reached the insulation value
                led1_set(OFF);
                led2_set(OFF);
                state_led_set(ON);  
                relay_set(OFF);
            }
        }
        break;
        default:
        break;
        }
        
        //干烧报警
        //Over temperature protection, Limiting_Temperature:105  lack water warning
        if(get_water_temperature() > Limiting_Temperature) {
            timer_init(); //buzzer on , Voice call the police
            set_dp_fault_status(TRUE); //app display warning
            report_one_dp_status(DP_FAULT);
            relay_set(OFF); //turn off relay
        }else {
            if(get_dp_fault_status() == TRUE) {
                set_dp_fault_status(FALSE);
                report_one_dp_status(DP_FAULT);
            }
        }
        
        tuya_hal_system_sleep(1000);

    }

}


  • 实现按键控制水壶模式切换
//煮沸按键:按下一次,水壶模式变为煮沸(boil),再按一下取消煮沸设定,水壶模式变为(nature)
void key1_cb_fun()
{   
    //Button press prompt
    led1_set(OFF);
    buzzer_flag = 1;
    //Button press prompt
    
    if(get_kettle_work_status() == boil) { //if current status is boil, close boiling 
        set_kettle_work_status(nature);
        set_dp_boil_value(FALSE);
        report_one_dp_status(DP_BOIL);
    }else {
        set_kettle_work_status(boil);
        set_dp_boil_value(TRUE);
        report_one_dp_status(DP_BOIL);
    }



}
//保温按键:按下一次,水壶模式变为保温模式(keep_warm_mode1/keep_warm_mode2),再按一下取消保温设定,水壶模式变为(nature)
void key2_cb_fun()
{
    //Button press prompt
    led2_set(OFF);
    buzzer_flag = 1;
    //Button press prompt
    if(get_kettle_work_status() == keep_warm_mode1) {//if current status is keep_warm_mode1,turn off insulation function
        set_kettle_work_status(nature);
        set_dp_keep_warm_switch(0);
        report_one_dp_status(DP_KEEP_WARM);
    }else {
        set_kettle_work_status(keep_warm_mode1);//离线保温默认水质为自来水
        //tap water warm mode :1.boil -> 2.keep warm 
        set_kettle_keep_warm_temper(Default_Warm_Temperature);//离线保温默认设置保温到55°
        set_dp_keep_warm_switch(1);
        report_one_dp_status(DP_KEEP_WARM);
        report_one_dp_status(DP_TEMP_SET);
    }

}
  • 此时烧水壶离线控制的基本功能已经实现,已经可以控制烧水和保温了;后面我们将实现云端控制功能。

下篇章节快速入口:
智能烧水壶(WIFI)06——云端控制篇

技术支持

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值