前言

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

一、智能烧水壶功能设定

  • 智能烧水壶的煮沸功能、保温功能、灯光指示以及按键控制功能设定如下:
功能 说明
煮沸 触摸按键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 inittuya_pin_init(led1_pin, TUYA_PIN_MODE_OUT_PP_HIGH);tuya_pin_init(led2_pin, TUYA_PIN_MODE_OUT_PP_HIGH);//buzzer pin inittuya_pin_init(buzzer_pin, TUYA_PIN_MODE_OUT_PP_LOW);//relay pin inittuya_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 processingswitch (temp_work_status) {case nature: {PR_DEBUG("nature");//Turn off the light when the temperature reaches the set valuestate_led_set(OFF);  //Turn off the light when the temperature reaches the set valueled1_set(OFF);  }break;case boil: {if(get_water_temperature() >= Boil_Temperature) {set_kettle_work_status(nature); //Switch to cool moderelay_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 warmcase 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 warmcase keep_warm_mode2: {//cur_temp > set temper  close the heatingif(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 valueled1_set(OFF);led2_set(OFF);state_led_set(ON);  relay_set(OFF);}}break;default:break;}//干烧报警//Over temperature protection, Limiting_Temperature:105  lack water warningif(get_water_temperature() > Limiting_Temperature) {timer_init(); //buzzer on , Voice call the policeset_dp_fault_status(TRUE); //app display warningreport_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 promptled1_set(OFF);buzzer_flag = 1;//Button press promptif(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 promptled2_set(OFF);buzzer_flag = 1;//Button press promptif(get_kettle_work_status() == keep_warm_mode1) {//if current status is keep_warm_mode1,turn off insulation functionset_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——云端控制篇

技术支持

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

  • 涂鸦智能IoT平台
  • Demo中心
  • 涂鸦智能开发者平台

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

  1. 智能烧水壶(WIFI版)04——TS02N触摸按键驱动篇

    前言 本文主要内容是实现烧水壶的触摸按键驱动,触摸按键芯片选用TS02N. 一.智能烧水壶按键功能设定 智能烧水壶的按键功能设定如下,实现功能之前,我们首先要实现按键采集芯片的驱动. 功能 说明 煮沸 ...

  2. 智能烧水壶(WIFI版)01——硬件设计篇

    一.概述 烧可饮用热水应该是大部分人生活中必不可少的一部分,但往往会发生想喝的时候来不及烧,烧完之后长时间未饮用,水变凉的尴尬情况.这时候如果拥有一款智能恒温烧水壶,可远程控制,支持保温模式还可支持预 ...

  3. 智能烧水壶(Bluetooth LE版)——硬件设计篇

    一.概述 前面已经设计了一款Wi-Fi控制的智能烧水壶,为了满足不同使用群体的需求,又设计了一款蓝牙控制的智能烧水壶,硬件电路上兼容,只需要把Wi-Fi模块换成Bluetooth LE模块即可. 1. ...

  4. 微型计算机智能体重评测,华为智能体脂秤WiFi版评测:17项身体指标秒知道 与肥胖生活断舍离...

    压力测试 现代人正处于高压的社会工作环境下,作为曾经体验过华为手环压力测试的小编我,惊喜的发现华为智能体脂秤WiFi版竟然支持压力检测! 这项功能是华为与中国科学院心理研究所联合研发,基于心率变异性( ...

  5. 微型计算机智能体重评测,荣耀智能体脂秤WiFi版评测:17项身体指标 比你更懂你...

    本帖最后由 艾玛伍兹122 于 2019-8-16 16:45 编辑 2.不正经搞机社-660x200.jpg (104.36 KB, 下载次数: 0) 2019-8-16 16:25 上传 现代生活 ...

  6. wifi卡慢延迟高_健康生活好助手:华为智能体脂秤 WiFi 版 体验评测

    点击右上角关注我们,每天给您带来最新最潮的科技资讯,让您足不出户也知道科技圈大事! 为了让自己严格执行减肥计划,一台体脂秤是肯定少不了的,只有时刻记住那个沉重的数字,管住嘴.迈开腿才会有动力. 不过随 ...

  7. 十分钟开发物联网:智能加湿器(Wifi版)

    智能加湿器设备集成了温湿度传感器.加湿器控制单元.以及Wifi传输模块,ShineBlink万能核心板采集温湿度传感器数据,并将它们上传至机智云,然后我们就可以在远程通过手机App或者Web网页端来访 ...

  8. WT588F02KD-24SS语音芯片(数码管显示驱动ic)在多功能烧水壶的应用设计方案

    WT588F02KD-24SS语音芯片(数码管显示驱动ic)在多功能烧水壶的应用设计方案 现代人除了写字楼及个别家庭在使用饮水机消费纯净水或蒸馏水外,大多数的家庭仍然是饮用烧开的自来水.而早前流行于欧 ...

  9. 智能恒温水壶系统设计_如何安装和设置Ecobee智能恒温器

    智能恒温水壶系统设计 A smart thermostat is a great accessory to have in your house, not only to be able to adj ...

最新文章

  1. Android逆向之路---脱壳360加固
  2. 一个实验教会你配置IPv6地址
  3. python-ConfigParser模块【读写配置文件】
  4. 8idmp导入oracle 11g,11g导入8i的dmp文件问题
  5. SSH整合中,使用父action重构子类action类.(在父类中获取子类中的泛型对象)
  6. 老司机教你分析日志:分析用户的地理位置信息
  7. C++:构造函数的重载
  8. php7.0 freetype_php7.0.5安装教程
  9. tp中自定义跳转页面
  10. 排序算法-冒泡排序(入门级别)
  11. Hibernate.cfg.xml 整理
  12. Intel HM55 AHCI 驱动 安装指南
  13. 财会法规与职业道德【2】
  14. 立锜1.2V~5.5V稳压芯片RT9078-33GJ5
  15. 推荐学习法——思维导图
  16. Soul源码总结-01-20
  17. node.js使用puppeteer来html生成pdf
  18. SPOOL_INTERNAL_ERROR
  19. iReport学习一:中文字体显示
  20. 中国书法艺术会消亡吗?

热门文章

  1. C++学习——memset函数详解
  2. 花生壳免费实现Linux主机的内网穿透,可通过SSH、SCP远程访问
  3. bbsxp8.0.4不能用netbox浏览之问题解决
  4. SQL FOREIGN KEY
  5. ci框架中引入css,php ci框架中加载css和js文件失败的原因和解决方法
  6. 2022年智慧社区整体设计建设解决方案(ppt可编辑)
  7. java中抽象类(abstract class)
  8. 安卓Activity生命周期相关
  9. 如何搭建一个推荐系统
  10. 浅谈斜率优化(例题特别行动队)