【STM32项目开源】STM32单片机多功能饮水机系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

[2.1 硬件清单:](#2.1 硬件清单:)

[2.2 功能介绍:](#2.2 功能介绍:)

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

[资料获取 查看主页介绍:兆龙电子单片机设计](#资料获取 查看主页介绍:兆龙电子单片机设计)


一、设计背景和意义

1.1设计背景:

在现代家庭、办公场所及公共场所的日常饮水管理中,饮水机的便捷性、安全性与智能化控制是核心需求。传统饮水机存在明显局限:一方面,高端智能饮水机(如商用大型智能饮水设备、品牌定制化饮水系统)功能虽全但成本高昂,安装调试复杂,依赖特定品牌售后支持,难以普及到普通家庭、小型办公室等场景,且设备兼容性差,更换或升级成本高,无法灵活满足不同人群的饮水习惯需求;另一方面,普通简易饮水机(如基础加热型、手动按键式)虽操作简单,但功能单一,仅能实现基础的加热或制冷,缺乏水质监测、水温精准控制、水量自动调节及安全预警等功能,无法满足现代化生活场景下对饮水健康、便捷管理的需求。

现有饮水机控制方案还存在功能割裂与集成度低的问题:部分高端饮水设备虽具备多模式控制与安全监测功能,但依赖复杂的电路设计与专业维护,后期使用成本高,难以覆盖预算有限的家庭或小型办公群体;而低成本饮水机又在功能完整性与智能化上存在欠缺,无法实现饮水数据与移动端 APP、智能提醒的联动,导致加热能耗浪费严重、水质安全无法保障,无法为用户饮水习惯分析及设备优化管理提供数据支撑。基于此,本设计以 STM32 单片机为核心,融合高精度参数采集模块(如水温传感器、水位传感器、TDS 水质传感器、水流传感器)、LCD 显示模块、数据存储模块及继电器控制与报警模块,构建低成本、高集成度的 STM32 单片机多功能饮水机系统,以解决传统饮水机设备功能单一、智能化程度低、能耗高及安全性不足的问题。

1.2设计意义:

本设计通过整合 STM32 单片机的高效数据处理能力与多模块协同工作机制,在智能饮水管理领域具有多重实用价值,具体体现在以下三方面:

从使用体验与管理效率角度,该系统突破了传统饮水机的局限:一是实现了多参数同步监测与多功能联动(如支持水温、水位、水质 TDS 值、水流速度等核心指标,联动加热模块、制冷模块、出水控制、自动补水等功能),无需人工频繁操作或查看状态,减少操作繁琐性;二是配备 LCD 实时显示模块,直观呈现当前水温、水位、水质状态及运行模式,同时支持数据自动存储(可通过 SD 卡或 WiFi 传输至手机 APP / 云端平台),方便用户长期追溯饮水数据与设备运行规律,为饮水健康分析与设备管理优化提供完整数据支撑;三是新增异常预警与自动调控功能,当监测到某项参数超出安全范围(如水温过高、水位过低、水质超标、干烧风险)时,系统自动触发声光报警,同时联动继电器切断加热电源、停止出水、启动补水等,无需人工干预即可及时处理异常,大幅提升了饮水管理的便捷性与安全性。

从技术实践与成本控制角度,本设计以 STM32 单片机为核心,充分利用其低功耗、高性价比的优势,搭配低成本的高精度参数传感器(如 DS18B20 水温传感器、HC-SR04 水位传感器、GP2Y0A21YK 水流传感器、TDS 水质检测模块)与通用外围模块,在保证数据精度(水温测量误差可控制在 ±0.5℃以内,水位检测响应时间可控制在 2 秒以内)的前提下,有效降低了系统整体成本,相比同功能的高端智能饮水机成本降低 40%-60%,更易普及到普通家庭、小型办公室及学校宿舍等场景。同时,系统支持模块化扩展(如后续可新增语音控制模块、远程预约功能),为后续功能升级预留了空间,具备良好的灵活性与可扩展性。

从应用场景与行业价值角度,该系统可广泛适配多类饮水场景:在普通家庭生活中,可作为家庭饮水的智能管理中心,实时调控水温、监测水质,保障饮水健康;在高校电子信息与自动化相关专业教学中,可作为单片机应用与智能设备控制的实践案例,帮助学生理解嵌入式系统与多种传感器协同工作原理;在小型办公室或出租房场景中,可为用户提供低成本的智能饮水方案,减少能耗浪费与设备维护成本,提升饮水体验。此外,本设计探索了 STM32 单片机在低成本智能饮水设备领域的应用方案,推动传统饮水机从 "单一加热、人工操作" 向 "多参数监测、智能控制、自动响应" 升级,为低成本智能化饮水设备的开发提供了可参考的集成思路,具有较好的实践应用与行业推广价值。

**二、**实物展示

下方为实物演示视频

点击下方链接跳转演示视频https://www.bilibili.com/video/BV119e1zkEmN/?spm_id_from=333.1387.upload.video_card.click&vd_source=2a672ca4e8794dca68cbe6d047b42ca5

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6
  • LCD1602液晶显示
  • 继电器控制电路
  • 水泵
  • 加热片
  • 声光报警
  • 红外传感器
  • 水位传感器
  • 蓝牙模块

2.2 功能介绍:

(1)使用STM32F103C8T6单片机做主控制器。
(2)使用LCD1602显示采集到的水温、模式、设置水温值
(3)使用DS18b20检测当前饮水机水温值
(4)使用水位传感器检测是否有水
(5)使用继电器控制加热片加热和水泵出水
(6)当无水的情况下,蜂鸣器进行声光报警提醒,并停止所有的功能,直到检测到有水
(7)四个按键分别对应:加热、出水,温度加、温度减的功能
(8)蓝牙模块与手机APP通信

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

复制代码
#include "sys.h"
#include "delay.h"
#include "lcd1602.h"
#include "ds18b20.h"
#include "timer.h"
#include "usart1.h"
#include "gpio.h"
#include "stdbool.h"
#include "stdio.h"
#include <stdlib.h>
#include "string.h"

#define STM32_RX1_BUF       Usart1RecBuf 
#define STM32_Rx1Counter    RxCounter
#define STM32_RX1BUFF_SIZE  USART1_RXBUFF_SIZE

#define FLASH_SAVE_ADDR  ((u32)0x0800F000)  				//设置FLASH 保存地址(必须为偶数)

bool Mode = 0;//0是自动模式,1是手动模式
unsigned char temp_hight = 35,temp_low = 10,setn=0;//温度上限下限
short temperature;//温度
bool flag = 0,Twinkle = 0;
unsigned char openTime = 2;//出水时间
unsigned char volume = 2;
bool openFlag = 0;//出水标志
bool closeFlag = 0;//关闭标志
bool sendFlag = 0;
unsigned char miao=0;
bool ssflag = 0;

void STM32_FlashWriteData(void)  //STM32 Flash写入数据
{
		u16 temp_buf[2];
	  STMFLASH_Write(FLASH_SAVE_ADDR + 0x03,temp_buf,2); //存入数据

}

void STM32_FlashReadData(void)  //STM32 Flash读出数据
{
		u16 temp_buf[2];

	  STM32F10x_Read(FLASH_SAVE_ADDR + 0x05,temp_buf,2); //读出数据
}

void STM32_FlashCheck(void) 
{
		STM32_FlashReadData();
}



void displayCursor()
{
		if(setn == 1)//显示设置页面
		{
				LCD_Write_Com(0x80+0x40+5);
				LCD_Write_Com(0x0f);
		}
		if(setn == 2)
		{
				LCD_Write_Com(0x80+0x40+14);
				LCD_Write_Com(0x0f);
		}
}

void keyscan()//按键扫描
{
 	if(key2 == 0)//加键按下
	{
	   delay_ms(20);
	   if(key2 == 0)
	   {
	   	  while(key2 == 0);
			  if(setn == 0)//调出水量(不在设置状态下)
				{
						if(volume < 5)volume++;
				}
			  if(setn == 1)
				{
						if(temp_hight - temp_low > 1)//上限必须大于下限,下限才能加
						{
							 temp_low++;	
						}	
						LCD_Write_Char(4,1,temp_low/10+48);//显示十位
						LCD_Write_Char(5,1,temp_low%10+48);//显示个位

						LCD_Write_Com(0x80+0x40+8);
					  LCD_Write_Com(0x0f);//光标闪烁
			  }
				if(setn == 2)
				{
						if(temp_hight < 99)
						{
							 temp_hight++;	
						}	
						LCD_Write_Char(13,1,temp_hight/10+48);//显示十位
						LCD_Write_Char(14,1,temp_hight%10+48);//显示个位

						LCD_Write_Com(0x80+0x40+2);
					  LCD_Write_Com(0x0f);//光标闪烁
			  }
	   }	
	}
	if(key3 == 0)//减键按下
	{
	   delay_ms(20);
	   if(key3 == 0)
	   {
	   	  while(key3 == 0);
			  if(setn == 0)//调出水量(不在设置状态下)
				{
						if(volume > 2)volume--;
				}
				if(setn == 1)
				{
						if(temp_low > 0)//下限最小到0
						{
							 temp_low--;	
						}	
						LCD_Write_Char(4,1,temp_low/10+48);//显示十位
						LCD_Write_Char(5,1,temp_low%10+48);//显示个位

						LCD_Write_Com(0x80+0x40+5);
					  LCD_Write_Com(0x0f);//光标闪烁
			  }
				if(setn == 2)
				{
						if(temp_hight - temp_low > 1)//上限必须大于下限,上限才能减
						{
							 temp_hight--;	
						}	
						LCD_Write_Char(13,1,temp_hight/10+48);//显示十位
						LCD_Write_Char(14,1,temp_hight%10+48);//显示个位

						LCD_Write_Com(0x80+0x40+14);
					  LCD_Write_Com(0x0f);//光标闪烁
			  }
	   }	
	}
	if(key1 == 0)//设置键按下
	{
	   delay_ms(20);
	   if(key1 == 0)
	   {
	   	  while(key1 == 0);//等待按键松开
			  beep = 0;
			  ssflag = 0;
        setn++;
			  if(setn > 2)//按下次数超过两次退出设置
				{
						setn = 0;
					  LCD_Write_Com(0x0c);//光标光标
					  LCD_Write_String(0,0,"Temperature:   C");
						LCD_Write_String(0,1,"                ");

					  STM32_FlashWriteData();//存储 
				}
				if(setn == 1)//显示设置页面
				{
					  LCD_Write_String(0,0,"  Set The Temp  ");
						LCD_Write_String(0,1,"T-L:00C  T-H:00C");

					  LCD_Write_Char(4,1,temp_low/10+48);//显示十位
						LCD_Write_Char(5,1,temp_low%10+48);//显示个位

						LCD_Write_Char(13,1,temp_hight/10+48);
						LCD_Write_Char(14,1,temp_hight%10+48);
				}
				displayCursor();
	   }	
	}

}
void chushui(bool flag)//显示Open
{
	  if(flag == 1)
		{
				LCD_Write_String(0,1,"      Open      ");
				relay2=1;//开启出水继电器
		}
		else
		{
				relay2=0;//关闭出水继电器
				LCD_Write_String(0,1,"                ");
		}
}

bool test=0;

int main(void)
{	
		delay_init();	    //延时函数初始化	  
		delay_ms(500);       //上电瞬间加入一定延时在初始化
	  STM32_FlashCheck();
	  DS18B20_GPIO_Init(); //ds18b20引脚初始化
	  DS18B20_Init();			//初始化DS18B20
	  uart1_Init(9600);
	  KEY_AND_RELAY_GPIO_Init();
		LCD_Init();         //屏幕初始化
	  LCD_Write_String(0,0,"Temperature:   C");
		LCD_Write_String(0,1,"Volume: 200ml   ");
	  LED1 = 1;
	  Mode = 0;//自动模式
	  miao=openTime;
	  memset(STM32_RX1_BUF,0,STM32_RX1BUFF_SIZE);
		STM32_Rx1Counter = 0;
	  TIM3_Init(499,7199);   //定时器初始化,定时50ms
		//Tout = ((arr+1)*(psc+1))/Tclk ; 
		//Tclk:定时器输入频率(单位MHZ)
		//Tout:定时器溢出时间(单位us)
		while(1)
		{  
			 keyscan();
			 if(setn ==0)
			 {
				   ///////显示温度
					LCD_Write_Char(13,0,temperature/10+48);
					LCD_Write_Char(14,0,temperature%10+48);
					if(closeFlag==1)//关闭出水继电器
					{
							closeFlag = 0;
						  openFlag = 0;
						  chushui(0);
					}


				  if(shuiwei == 1)//有水
					{
						  beep = 0;
							if(temperature <= temp_low){relay1=1;}//低于下限开启加热继电器
							if(temperature >= temp_hight){relay1=0;}//高于上限停止

							if(Mode == 0)//在自动模式下
							{
									if(key5 == 0 && HW==0)//出水按键,必须在检测到有杯子的情况下才有效
									{
											delay_ms(10);
											if(key5 == 0 && HW==0)
											{
													while(key5 == 0);//等待按键松开
												  chushui(1);//显示Open
												  miao=openTime;//时间赋值
												  openFlag = 1;
											}
									}
							}
							else//在手动模式下
							{
									if(key5 == 0&& HW==0)//出水按键,必须在检测到有杯子的情况下才有效
									{
											delay_ms(10);
											if(key5 == 0)
											{
													chushui(1);test=0;
											}
									}
									else 
									{
											if(test==0)chushui(0);
									}
									if(HW==1){chushui(0);test=0;}
							}
				  }
					else
					{
							relay1 = 0;//没有水关闭加热继电器
						  relay2=0;//关闭出水继电器
						  ssflag = 0;
						  beep = 1;//蜂鸣器提示报警
						  if(Twinkle == 0)
						  LCD_Write_String(0,1," Without Water! ");
							else
							LCD_Write_String(0,1,"                ");
					}
			 }
			 delay_ms(10);
		}	
}

void TIM3_IRQHandler(void)//定时器3中断服务程序,用于记录时间
{ 
	  static u16 timeCount1=0;
	  static u16 timeCount2=20;

		if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{ 
				TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志位  

			  timeCount1++;
			  if(timeCount1 >= 10)//500ms
				{
						timeCount1 = 0;
						Twinkle = !Twinkle;
				}

				timeCount2++ ;
				if(timeCount2 >= 20)//1秒
				{
						timeCount2 = 0;
            temperature=ReadTemperature();
						if(openFlag == 1)//出水标志
						{
								if(HW == 1){closeFlag=1;};

								if(miao > 0){miao--;}
								else {closeFlag=1;miao=openTime;}
						}
						sendFlag = 1;
				}
	  }
}

七、单片机实物资料

资料获取 查看主页介绍:兆龙电子单片机设计

相关推荐
王嘉俊9254 小时前
HarmonyOS 微服务与 OpenHarmony 开发:构建模块化与开源生态应用
微服务·开源·harmonyos·arkts·开发·鸿蒙
m0_555762905 小时前
STM32 的“内存划分”
stm32·单片机·嵌入式硬件
华清远见IT开放实验室5 小时前
STM32学习路线!软硬件兼修:裸机+RTOS+LVGL+硬件设计+项目实战 (STM32多核心开发板)
stm32·嵌入式·开发板·rtos·课程·软硬件·裸机开发
RT-Thread物联网操作系统5 小时前
RT-Thread Studio 正式支持GD32H7高性能系列MCU | 技术集结
驱动开发·单片机·嵌入式硬件
猫林老师5 小时前
HarmonyOS物联网设备连接与管理实战
物联网·华为·harmonyos
蓬荜生灰6 小时前
第6章—手动移植创建STM32工程
stm32·单片机·嵌入式硬件
赋能大师兄6 小时前
单片机跑飞原因及解决方法
单片机·独立看门狗·窗口看门狗·硬件级防护策略·软件级防护策略
GalaxySpaceX7 小时前
STM32-SPI协议
stm32·单片机·嵌入式硬件·1024程序员节
单片机专业性7 小时前
硬件电路LRC串联谐振分析
单片机·嵌入式硬件·电路设计