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

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

引言

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

加热功能:

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

保温功能呢?

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

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

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

本博客,修改完的代码工程:
跳转下载

https://wwyz.lanzoul.com/iGafK27o7b1i

功能实现步骤:

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

加热功能:

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

保温功能:

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

达温度即停模式实操:

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

c 复制代码
int water_temp;		//水温
int heat_temp_th;	//加热阈值

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

c 复制代码
Stop_On_Temp(water_temp, heat_temp_th);
c 复制代码
/**************************************************
函数名: 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;
}

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

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

保温功能模式实操:

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

我们传入水温和保温阈值

c 复制代码
KeepWarm(water_temp, KeepWarm_th);	

保温函数:

c 复制代码
/**************************************************
函数名: 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);//停止加热
	}	
}	

模式切换

所以我们分为三种情况:

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

c 复制代码
#define  STOP_HEATING	0		//停止加热
#define  HEATING_ON		1		//加热
#define  MAINTAIN_TEMP  2		//保温

我们使用heat_mode定义当前模式

c 复制代码
int heat_mode;		//加热模式

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

c 复制代码
switch(heat_mode)
{
	//关闭加热
	case STOP_HEATING:
		HEAT_water_Set(heat_water_OFF);
		break;
	//加热
	case HEATING_ON:
		water_temp = 26;	//读取水温
		//如果没达到温度, 模式还是 1, 如果达到温度, 则改变模式为 0
		heat_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)我们只需要加入一个控制加热的文件, 我们把达温即停和保温功能, 加入到其中, 然后其包含加热底层文件, 就可以控制加热了.

(3)复制黏贴代码

heat_stop.c

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

c 复制代码
#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

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, 如果达到温度, 则改变模式为 0
				heat_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;
		}
		
		
	}
}	

测试现象:

手动调试加热模式

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

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

手动调试保温模式

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

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

测试视频

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

相关推荐
blessing。。21 分钟前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
嵌新程2 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575
Lin2012302 小时前
STM32 Keil5 attribute 关键字的用法
stm32·单片机·嵌入式硬件
电工小王(全国可飞)2 小时前
STM32 RAM在Memory Map中被分为3个区域
stm32·单片机·嵌入式硬件
maxiumII2 小时前
Diving into the STM32 HAL-----DAC笔记
笔记·stm32·嵌入式硬件
美式小田5 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博5 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
时光の尘6 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣7 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再9 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件