当前位置: 首页 > 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…...

Tina Linux存储介质实战切换:从eMMC到SPI NAND的配置迁移与避坑指南

1. 为什么需要从eMMC迁移到SPI NAND&#xff1f; 在嵌入式系统开发中&#xff0c;存储介质的选择往往决定了产品的成本和性能表现。eMMC作为传统存储方案&#xff0c;具有容量大、读写速度快的特点&#xff0c;但随着芯片价格上涨和供应链波动&#xff0c;越来越多的开发者开始…...

机场混凝土道面摊铺车辆行驶控制【附方案】

✨ 长期致力于履带式车辆、滑模摊铺、道面边界检测、轨迹规划、行驶控制器研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;多模态道面边界检测与卡尔曼…...

PyVisionAI:基于视觉大模型的文档内容智能提取与理解工具

1. 项目概述&#xff1a;PyVisionAI&#xff0c;一个文档内容提取与视觉理解的瑞士军刀如果你经常需要从PDF、PPT、Word文档甚至网页中提取内容&#xff0c;并且希望AI能帮你“看懂”里面的图片和图表&#xff0c;那么PyVisionAI这个工具你应该了解一下。它本质上是一个Python工…...

AI自动化部署实战:用hermes-setup-skill解决Hermes Agent部署难题

1. 项目概述&#xff1a;让AI助手成为你的自动化部署专家 如果你和我一样&#xff0c;经常在本地或远程服务器上折腾各种AI Agent项目&#xff0c;那么对Hermes Agent这个名字一定不陌生。作为NousResearch推出的一个功能强大的多平台AI助手框架&#xff0c;它能把你的LLM能力…...

在Windows系统中快速配置Taotoken的Python调用环境

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Windows系统中快速配置Taotoken的Python调用环境 对于Windows平台的开发者而言&#xff0c;快速搭建一个能够调用多种大模型的环…...

Grav CMS 组合拳漏洞| CVE-2026-42613CVE-2026-42607复现研究

0x0 背景介绍 Grav是一个基于文件的Web平台。 在2.0.0-beta.2之前版本中&#xff0c;存在两个高危漏洞可导致组合利用权限提升漏洞->CVE-2026-42613 Grav的Login插件在处理用户注册请求时&#xff0c;未对请求数据中的groups/access字段进行服务端校验。当管理员在插件配置中…...

使用Hermes Agent框架时接入Taotoken自定义供应商的步骤详解

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Hermes Agent框架时接入Taotoken自定义供应商的步骤详解 对于使用Hermes Agent框架的开发者而言&#xff0c;将后端AI服务接入…...

多介质过滤器和活性炭过滤器的区别在哪?

做水处理设备选型快10年&#xff0c;我几乎每周都会遇到客户问&#xff1a;多介质过滤器和活性炭过滤器到底有啥区别&#xff1f;选型选错不仅花冤枉钱&#xff0c;还会直接影响整个水处理系统的寿命。先给大家总结核心结论&#xff1a;两者核心作用不同&#xff0c;多介质偏物…...

工业控制中自定义串行总线协议的设计与实现:DataView系统实战

1. 项目背景与核心需求&#xff1a;为什么需要自定一个串行总线&#xff1f;在工业控制领域&#xff0c;尤其是信号调理模块和开关电源这类产品里&#xff0c;我们常常会遇到一个看似简单、实则棘手的问题&#xff1a;如何在有限的成本、空间和算力下&#xff0c;为多个分散的模…...

微博图片智能采集器:一键构建你的专属视觉素材库

微博图片智能采集器&#xff1a;一键构建你的专属视觉素材库 【免费下载链接】weibo-image-spider 微博图片爬虫&#xff0c;极速下载、高清原图、多种命令、简单实用。 项目地址: https://gitcode.com/gh_mirrors/we/weibo-image-spider 还在为手动保存微博图片而烦恼吗…...