涂鸦智能烧水壶软件实现之水温调节和灯光提示
Posted 三明治开发社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了涂鸦智能烧水壶软件实现之水温调节和灯光提示相关的知识,希望对你有一定的参考价值。
智能烧水壶软件实现之水温调节和灯光提示
前言
前面我们已经实现了烧水壶的按键功能,本文将实现烧水壶的煮沸、保温功能、灯光提示功能,同时实现按键触发烧水和煮沸。
一、智能烧水壶功能设定
- 智能烧水壶的煮沸功能、保温功能、灯光指示以及按键控制功能设定如下:
功能 | 说明 |
---|---|
煮沸 | 触摸按键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);
}
}
- 此时烧水壶离线控制的基本功能已经实现,已经可以控制烧水和保温了;后面我们将实现云端控制功能。
技术支持
您可以通过以下方法获得涂鸦的支持:
- 开发者中心:https://developer.tuya.com
- 帮助中心: https://support.tuya.com/help
- 技术支持工单中心: https://service.console.tuya.com
以上是关于涂鸦智能烧水壶软件实现之水温调节和灯光提示的主要内容,如果未能解决你的问题,请参考以下文章