当前位置: 首页 > news >正文

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能

引言

​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了.

加热功能:

我们拓展一下, 我们可以为用户提供一个水温阈值, 让用户设置, 然后当我们开启加热的时候, 饮水机就会一直检测水温, 如果温度达到用户设置温度, 就会停止加热。那么这个就是我们所说的加热功能。只开启一次加热功能, 下次开启加热,需用户手动确认。

保温功能呢?

和加热功能类似, 但是保温功能, 因为毕竟保温是需要把水保温到能喝的程度, 比如 有一个笑话就是, 你喜欢和岩浆还是烫水? 回答:我喜欢和42度热水。

所以保温温度, 最好是 室温的26-50度以内。

所谓保温, 一方面是, 保温壶,另一方面,就是使用水温检测器, 检测水温, 然后如果水温没达到, 就开启加热。可以重复开启加热.

本博客,修改完的代码工程:
跳转下载
https://wwyz.lanzoul.com/iGafK27o7b1i

功能实现步骤:

上述我们也描述了, 加热和保温的功能。

加热功能:

具体实现流程, 就是 检测水温, 判断水温与用户设置的加热阈值是否符合, 小于阈值, 则继续加热. 达到温度, 则停止加热, 然后关闭自动加热(达到温度后, 就不在开启加热)

image-20240817115740281

保温功能:

检测用户设置的水温阈值, 是否符合, 小于阈值, 则开启加热,达到温度则停止加热, 如果等一段时间, 再次低于阈值, 则重复开启加热。为了安全性,保温温阈值, 保持在 26 - 50 度之间(我们需要设置合法性判断)。

image-20240817120531413

达温度即停模式实操:

我们检测水温, 就可以知道当前加热到的温度, 从而可以及时的进行, 关闭加热, 同时我们用户需要设置一个加热的水温阈值

int water_temp;		//水温
int heat_temp_th;	//加热阈值

我们通过传入水温阈值和水温, 通过对比判断, 如果水温没达到阈值, 就开启加热, 如果水温达到阈值, 就关闭加热(注意,我们底层写的有判断开关加热的状态, 所以不会重复开关器件)

Stop_On_Temp(water_temp, heat_temp_th);
/**************************************************
函数名: Stop_On_Temp
功  能: 达温即停
参  数: (1)int now_water_temp:(2)int set_heat_temp_th:
返回值: int set_mode: 要设置的模式, 达到阈值, 则返回设置关闭模式没达到阈值, 仍然设置加热模式
**************************************************/
int Stop_On_Temp(int now_water_temp, int set_heat_temp_th)
{int set_mode;if(now_water_temp < set_heat_temp_th){HEAT_water_Set(heat_water_ON);//开启加热set_mode = HEATING_ON;	//继续加热}else{HEAT_water_Set(heat_water_OFF);//关闭加热set_mode = MAINTAIN_TEMP;	//停止加热}return set_mode;
}

通过传回的结果,切换模式:

image-20240817200332880

我们这里返回判断结果, 是因为我们达温即停, 第一次加热到所需温度后, 我们就返回温度达到的信号, 然后就要切换模式了。 就是为了避免, 当水冷却后 , 再次检测判断而进入加热状态。所以我们要传回达温即停的信号。

保温功能模式实操:

通过达温即停功能, 我们就可以明白, 保温功能, 实现的方法和达温即停差不多, 只是保温功能, 不用切换模式, 保温功能, 在用户没有主动关闭或切换保温模式, 就会一直检测, 所以不用回传判断结果.

我们传入水温和保温阈值

KeepWarm(water_temp, KeepWarm_th);	

image-20240817200900795

保温函数:

/**************************************************
函数名: KeepWarm
功  能: 保温函数
参  数: (1)int now_water_temp:传入的当前水温(2)int set_KeepWarm_th:传入的当前设置的保温阈值
返回值: 无
**************************************************/
void KeepWarm(int now_water_temp, int set_KeepWarm_th)
{if(now_water_temp < set_KeepWarm_th){HEAT_water_Set(heat_water_ON);//继续加热}else{HEAT_water_Set(heat_water_OFF);//停止加热}	
}	

模式切换

所以我们分为三种情况:

加热系统关闭模式、达温即停模式和保温模式。

#define  STOP_HEATING	0		//停止加热
#define  HEATING_ON		1		//加热
#define  MAINTAIN_TEMP  2		//保温

我们使用heat_mode定义当前模式

int heat_mode;		//加热模式

使用switch来根据每次判断调控的heat_mode , 来挑选, 应该处于哪种模式。

switch(heat_mode)
{//关闭加热case STOP_HEATING:HEAT_water_Set(heat_water_OFF);break;//加热case HEATING_ON:water_temp = 26;	//读取水温//如果没达到温度, 模式还是 1, 如果达到温度, 则改变模式为 0heat_mode = Stop_On_Temp(water_temp, heat_temp_th);	//达温度计停break;//保温case MAINTAIN_TEMP:water_temp = 42;	//读取水温		KeepWarm(water_temp, KeepWarm_th);	break;default: HEAT_water_Set(heat_water_OFF);break;
}

代码复制黏贴实操:

(1)我们在加热和开水解耦工程的基础上进行开发

饮水机功能构建指导思想以及最小试验

点击下载工程代码

(2)我们只需要加入一个控制加热的文件, 我们把达温即停和保温功能, 加入到其中, 然后其包含加热底层文件, 就可以控制加热了.

image-20240817204524573

(3)复制黏贴代码

heat_stop.c

#include "heat_stop.h"/**************************************************
函数名: Stop_On_Temp
功  能: 达温即停
参  数: (1)int now_water_temp:(2)int set_heat_temp_th:
返回值: int set_mode: 要设置的模式, 达到阈值, 则返回设置关闭模式没达到阈值, 仍然设置加热模式
**************************************************/
int Stop_On_Temp(int now_water_temp, int set_heat_temp_th)
{int set_mode;if(now_water_temp < set_heat_temp_th){HEAT_water_Set(heat_water_ON);set_mode = HEATING_ON;	//继续加热}else{HEAT_water_Set(heat_water_OFF);set_mode = MAINTAIN_TEMP;	//停止加热}return set_mode;
}/**************************************************
函数名: KeepWarm
功  能: 保温函数
参  数: (1)int now_water_temp:传入的当前水温(2)int set_KeepWarm_th:传入的当前设置的保温阈值
返回值: 无
**************************************************/
void KeepWarm(int now_water_temp, int set_KeepWarm_th)
{if(now_water_temp < set_KeepWarm_th){HEAT_water_Set(heat_water_ON);//继续加热}else{HEAT_water_Set(heat_water_OFF);//停止加热}	
}	

heat_stop.h

#ifndef _HEAT_STOP_H_
#define _HEAT_STOP_H_//单片机头文件
#include "stm32f10x.h"
#include "heat.h"#define  STOP_HEATING	0		//停止加热
#define  HEATING_ON		1		//加热
#define  MAINTAIN_TEMP  2		//保温int Stop_On_Temp(int now_water_temp, int set_heat_temp_th);
void KeepWarm(int now_water_temp, int set_KeepWarm_th);#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "heat.h"
#include "out_water.h"
#include "heat_stop.h"int water_temp;		//水温int heat_temp_th;	//加热阈值
int KeepWarm_th;	//保温阈值
int heat_mode;		//加热模式int main(void)
{//加热初始化HEAT_water_Init();//开水初始化OUT_water_Init();water_temp = 26;		//水温heat_temp_th = 100;	//加热阈值KeepWarm_th = 42;	//保温阈值heat_mode = 2;		//加热模式	while(1){switch(heat_mode){//关闭加热case STOP_HEATING:HEAT_water_Set(heat_water_OFF);break;//加热case HEATING_ON:water_temp = 26;	//读取水温//如果没达到温度, 模式还是 1, 如果达到温度, 则改变模式为 0heat_mode = Stop_On_Temp(water_temp, heat_temp_th);	//达温度计停break;//保温case MAINTAIN_TEMP:water_temp = 42;	//读取水温		KeepWarm(water_temp, KeepWarm_th);	break;default: HEAT_water_Set(heat_water_OFF);break;}}
}	

测试现象:

手动调试加热模式

通过手动修改水温阈值和水温, 来观察加热模式开关

温度达到, 就会自动切换为关闭加热模式

image-20240817205200305

手动调试保温模式

通过修改水温与保温阈值, 来观察保温模式的加热开关

image-20240817214659799

水温达到, 关闭加热, 水温不到,加热保温

image-20240817205307203

测试视频

加热和保温功能调试现象_单机游戏热门视频 (bilibili.com)

相关文章:

加热系统加入达温即停和保温功能

加热系统加入达温即停和保温功能 引言 ​ 我们前一节, 是通过控制io口, 直接控制加热的开关, 但是这太简单粗暴了, 如果只是那样, 和普通的家居电器,是没区别的, 我们想要更智能一点, 就是像咱们自己家的热水壶那样, 水烧滚了(水温达到100摄氏度), 就自动停止了. 加热功能&a…...

C++_2_ inline内联函数 宏函数(2/3)

C推出了inline关键字&#xff0c;其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数&#xff1a; 宏函数 现有个需求&#xff1a;要求你写一个Add(x,y)的宏函数。 正确的写法有一种&#xff0c;错误的写法倒是五花八门&#xff0c;我们先来“见不贤而自省也。” // …...

ROS执行多个节点报错(遥控运动及SLAM建图)

今天在实体机器人中同时执行多个ROS节点: roslaunch rei_robot_base oryxbot_base.launchroslaunch robot_joy robot_joy.launchroslaunch oryxbot_slam oryxbot_slam_local.launch结果全部报错退出了 现在换一种执行方式: roscoreroslaunch rei_robot_base oryxbot_base.la…...

Spring Boot项目中实现文件的上传、下载和预览功能

在Spring Boot项目中实现文件的上传、下载和预览功能&#xff0c;可以通过使用Spring MVC的MultipartFile接口来处理文件上传&#xff0c;并使用HttpServletResponse或Resource来实现文件下载和预览。下面是如何实现这些功能的完整示例。 1. 引入依赖 确保在pom.xml中引入了S…...

【JAVA入门】Day21 - 时间类

【JAVA入门】Day21 - 时间类 文章目录 【JAVA入门】Day21 - 时间类一、JDK7前的时间相关类1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、JDK8新增的时间相关类2.1 Date 相关类2.1.1 ZoneId 时区2.1.2 Instant 时间戳2.1.3 ZoneDateTime 带时区的时间 2.2 DateTimeFormat 相关…...

SQL server数据库备份和还原

新手小白都懂的sql server数据库备份和还原 一、备份 1.打开sql server数据库找到 2.展开找到对应的数据库文件 鼠标右击—任务–备份 3.复制名称 4.复制完点击添加 5.点击添加完之后再次点击查找路径 6.分别两个路径 原路径和新路径 &#xff08;新路径是找到原路径新建了一…...

B站搜索建库架构优化实践

前言 搜索是B站的重要基础功能&#xff0c;需要对包括视频、评论、图文等海量的站内优质资源建立索引&#xff0c;处理来自用户每日数亿的检索请求。离线索引数据的正确、高效产出是搜索业务的基础。我们在这里分享搜索离线架构整体的改造实践&#xff1a;从周期长&#xff0c;…...

XSS反射实战

目录 1.XSS向量编码 2.xss靶场训练&#xff08;easy&#xff09; 2.1第一关 2.2第二关 方法一 方法二 2.3第三关 2.4第四关 2.5第五关 2.6第六关 2.7第七关 第一种方法&#xff1a; 第二种方法&#xff1a; 第三个方法&#xff1a; 2.8第八关 1.XSS向量编码 &…...

远程消息传递的艺术:NSDistantObject在Objective-C中的妙用

标题&#xff1a;远程消息传递的艺术&#xff1a;NSDistantObject在Objective-C中的妙用 引言 在Objective-C的丰富生态中&#xff0c;NSDistantObject扮演着至关重要的角色&#xff0c;特别是在处理分布式系统中的远程消息传递。它允许对象之间跨越不同地址空间进行通信&…...

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么?

指向派生类的基类指针、强转为 void* 再转为基类指针、此时调用虚函数会发生什么&#xff1f; 1、无论指针类型怎么转&#xff0c;类对象内存没有发生任何变化&#xff0c;还是vfptr指向虚函数表&#xff0c;下面是成员变量&#xff0c;这在编译阶段就已经确定好了&#xff1b…...

操作系统(Linux实战)-进程创建、同步与锁、通信、调度算法-学习笔记

1. 进程的基础概念 1.1 进程是什么&#xff1f; 定义&#xff1a; 进程是操作系统管理的一个程序实例。它包含程序代码及其当前活动的状态。每个进程有自己的内存地址空间&#xff0c;拥有独立的栈、堆、全局变量等。操作系统通过进程来分配资源&#xff08;如 CPU 时间、内…...

react的setState中为什么不能用++?

背景&#xff1a; 在使用react的过程中产生了一些困惑&#xff0c;handleClick函数的功能是记录点击次数&#xff0c;handleClick函数被绑定到按钮中&#xff0c;每点击一次将通过this.state.counter将累计的点击次数显示在页面上 困惑&#xff1a; 为什么不能直接写prevStat…...

2.2算法的时间复杂度与空间复杂度——经典OJ

本博客的OJ标题均已插入超链接&#xff0c;点击可直接跳转~ 一、消失的数字 1、题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 2、题目分析 &#xff08;1&#xff09;numsS…...

【CentOS 】DHCP 更改为静态 IP 地址并且遇到无法联网

文章目录 引言解决方式标题1. **编辑网络配置文件**&#xff1a;标题2. **确保配置文件包含以下内容**&#xff1a;特别注意 标题3. **重启网络服务**&#xff1a;标题4. **检查配置是否生效**&#xff1a;标题5. **测试网络连接**&#xff1a;标题6. **检查路由表**&#xff1…...

Linux 操作系统 --- 信号

序言 在本篇内容中&#xff0c;将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑&#xff0c;好像我在使用 Linux 的过程中并没有接触过信号&#xff0c;这是啥呀&#xff1f;其实我们经常遇到过&#xff0c;当我们运行的进程当进程尝试访问非法内存地址时…...

黑马前端——days09_css

案例 1 页面框架文件 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…...

【Python爬虫】技术深度探索与实践

目录 引言 第一部分&#xff1a;Python爬虫基础 1.1 网络基础 1.2 Python爬虫基本流程 第二部分&#xff1a;进阶技术 2.1 动态网页抓取 2.2 异步编程与并发 2.3 反爬虫机制与应对 第三部分&#xff1a;实践案例 第四部分&#xff1a;法律与道德考量 第五部分&#x…...

智启万象|挖掘广告变现潜力,保障支付安全便捷

谷歌致力于为开发者提供 先进的广告变现与支付解决方案 一起回顾 2024 Google 开发者大会 了解如何利用谷歌最新工具和功能 提高变现收入&#xff0c;优化用户体验&#xff0c;保障交易安全 让变现更上一层楼 广告检查器是谷歌 AdMob 平台最新推出的高级测试工具&#xff0c;开…...

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…...

Springboot3 整合swagger

一、pom.xml <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-api</artifactId><version>2.1.0</version></dependency> 二、application.yml # SpringDoc配置 # springdoc:swa…...

LSTM电池SOC估计最基本方法及全包代码:包含两个数据集、预处理代码、模型代码与估计结果

LSTM做电池SOC估计&#xff0c;最基本的方法&#xff0c;入门必学&#xff0c;包括两个数据集&#xff0c;及其介绍、预处理代码、模型代码、估计结果等&#xff0c;这是我见过最全的一个SOC估计代码包&#xff0c;总共文件大概有70个左右最近在折腾电池SOC估计&#xff0c;发现…...

OpenClaw+GLM-4.7-Flash:智能读书笔记生成

OpenClawGLM-4.7-Flash&#xff1a;智能读书笔记生成 1. 为什么需要自动化读书笔记 作为一名技术从业者&#xff0c;我常年保持每周至少阅读两本专业书籍的习惯。但最困扰我的不是阅读本身&#xff0c;而是如何高效整理书中精华内容。过去我尝试过各种笔记工具&#xff0c;从…...

别再为IP冲突头疼!YOLOv5+海康威视摄像头组网与实时检测的完整避坑指南

工业视觉组网实战&#xff1a;YOLOv5与海康威视摄像头的智能协同方案 在智能制造与安防监控领域&#xff0c;将AI算法与专业摄像设备结合已成为技术标配。但当工程师真正着手部署时&#xff0c;往往会陷入网络配置的泥潭——IP冲突导致设备失联、RTSP流媒体断断续续、多网卡环…...

从实验室到产品:脑机接口(BCI)开发中,EEG实时预处理流程设计与避坑指南

从实验室到产品&#xff1a;脑机接口(BCI)开发中EEG实时预处理流程设计与避坑指南 在咖啡馆见到那位渐冻症患者用脑电波操控机械臂喝咖啡时&#xff0c;我意识到脑机接口技术正从实验室走向真实世界。但鲜有人提及的是&#xff0c;这套酷炫系统背后藏着怎样的信号处理炼狱——当…...

OpenClaw任务编排:GLM-4.7-Flash复杂流程设计

OpenClaw任务编排&#xff1a;GLM-4.7-Flash复杂流程设计 1. 为什么需要任务编排 去年我接手了一个市场分析项目&#xff0c;需要每周手动收集竞品动态并生成报告。重复性的复制粘贴和格式调整消耗了大量时间&#xff0c;直到发现OpenClaw可以通过编排GLM-4.7-Flash模型实现全…...

这次终于选对了!盘点2026年圈粉无数的AI论文网站

一天写完毕业论文在2026年已不再是天方夜谭。这是2026年最炸裂、实测能大幅提速的AI论文网站&#xff0c;覆盖选题、写作、查重、排版全流程&#xff0c;真正帮你高效搞定论文。 一、全流程王者&#xff1a;一站式搞定论文全链路&#xff08;一天定稿首选&#xff09; 这类工具…...

如何用ChatALL实现AI智能协同:一次提问,多模型对比的解决方案

如何用ChatALL实现AI智能协同&#xff1a;一次提问&#xff0c;多模型对比的解决方案 【免费下载链接】ChatALL Concurrently chat with ChatGPT, Bing Chat, Bard, Alpaca, Vicuna, Claude, ChatGLM, MOSS, 讯飞星火, 文心一言 and more, discover the best answers 项目地…...

快充、便携、安全兼备,Anker能量盒到底香不香?

随着无线互联网时代的到来&#xff0c;移动设备的续航问题成为人们的新烦恼。无论是频繁出差、旅行&#xff0c;还是移动办公&#xff0c;充电宝几乎已经成为随身必备的装备。 然而&#xff0c;传统充电宝往往存在充电速度慢、体积笨重、功能单一&#xff0c;甚至安全认证不完善…...

Go-Gin-API跨域处理终极指南:5分钟配置CORS中间件

Go-Gin-API跨域处理终极指南&#xff1a;5分钟配置CORS中间件 【免费下载链接】go-gin-api xinliangnote/go-gin-api 是一个用于快速构建 Go 语言 API 的框架。适合在Go语言开发的Web应用中使用&#xff0c;提供丰富的中间件和模块化架构。特点是提供了简洁的API、自动化API文档…...

Deepfake Offensive Toolkit安全认证考试结果申诉处理流程

Deepfake Offensive Toolkit安全认证考试结果申诉处理流程 【免费下载链接】dot The Deepfake Offensive Toolkit 项目地址: https://gitcode.com/gh_mirrors/dot/dot Deepfake Offensive Toolkit&#xff08;以下简称dot&#xff09;作为一款专业的深度伪造工具&#x…...