【STM32项目开源】STM32单片机多功能饮水机系统
目录
一、设计背景和意义
1.1设计背景:
1.2设计意义:
二、实物展示
三、硬件功能介绍
2.1 硬件清单:
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(); //初始化DS18B20uart1_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);//显示Openmiao=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! ");elseLCD_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;}}
}
七、单片机实物资料

