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

【STM32项目开源】STM32单片机智能饮水机控制系统

目录

一、设计背景和意义

1.1设计背景:

1.2设计意义:

二、实物展示

三、硬件功能介绍

2.1 硬件清单:

2.2 功能介绍:

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

七、单片机实物资料

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


一、设计背景和意义

1.1设计背景:

在物联网与智慧家居快速发展的当下,传统饮水机控制系统存在诸多局限。多数饮水机设备仍依赖手动操作,缺乏水质监测与智能化控制能力,既无法根据水质状况和用户需求自动调节,也难以满足精细化饮水需求。随着人们对使用体验、能耗控制要求提升,单一控制模式已不适用。

现有智能饮水机方案常存在功能割裂问题,远程调控、水质监测、使用场景适配等功能未能有效整合,且成本较高难以普及。基于此,本设计以 STM32F103C8T6 为核心,融合多传感器与语音控制技术,构建低成本、高集成度的智能语音饮水机控制系统,以解决传统饮水机控制的智能化不足问题。

1.2设计意义:

本设计通过整合多种监测与语音调控技术,具有多重实用价值。从使用体验看,提供远程、按键、APP、语音指令等多元控制方式,满足不同场景下的饮水需求,尤其使用场景适配与自动调节功能提升了使用便捷性。

从节能角度,借助水质监测与用户使用习惯实现按需运行,避免无效能耗,符合绿色家居理念。从技术层面,探索了 STM32 微控制器与语音识别模块协同工作的实现方式,为低成本智能饮水机系统开发提供了可参考的集成方案,推动智能饮水机技术的普及应用,具有较好的实践与推广价值。

二、实物展示

下方为实物演示视频

【开源】基于STM32单片机智能饮水机系统

下方为实物展示图片

三、硬件功能介绍

2.1 硬件清单:

  • STM32F103C8T6最小系统
  • OLED显示
  • DHT11温湿度传感器
  • 继电器控制电路
  • 水泵
  • 加热片
  • 非接触式水位传感器
  • JDY-31-SPP蓝牙模块

2.2 功能介绍:

(1)使用STM32F103C8T6最小系统板作为主控单元
(2)自动模式下,防水式DS18B20监测水温,温度小于设置最小值,进行自动加热,直到加热到最大值时停止
(3)自动模式下,液位传感器检测水位,如果水位低于最低的,则启动水泵加水,直到加到高水位触发模块
(4)按键设置温度上下限
(5)在手动模式下,按键可以手动开启或关闭水泵,加热
(6)OLED显示屏显示测量值,当前模式
(7)手机APP,通过蓝牙接收温度数据以及手动控制加热和加水操作

四、软件设计流程图

五、硬件PCB展示

六、软件主函序展示

#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "oled.h"
#include "usart.h"
#include "ds18b20.h"
#include "Timer.h"/**********************************
变量定义
**********************************/
uint8_t key_num = 0;									//按键扫描标志位	
uint8_t flag_display = 0;							//显示界面标志位
uint32_t time_num = 0;								//10ms计时
short  temp_value = 0;									//温度值
u16  temp_max = 40;									  //温度最大值
u16  temp_min = 25;									  //温度最小值
extern uint8_t usart1_buf[256];				//串口1接收数组
char display_buf[32];									//显示缓存区
u8 flag_mode = 0;      //模式标志位
u8 JS_flag=0,JR_flag=0;
volatile uint32_t timer_tick = 0;
u8 Set_display=0;//设置显示
unsigned char SendString[10];		//向蓝牙发送的显示信息
extern uint8_t Serial_RxFlag;
unsigned char Tim_flag=0;
/**********************************
函数声明
**********************************/
void Key_function(void);							//按键函数
void Monitor_function(void);					//监测函数
void Display_function(void);					//显示函数
void Manage_function(void);						//处理函数/****
*******	主函数 
*****/
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置中断优先分组
Delay_Init();	    	 								//延时初始化	  
Gpio_Init();		  									//IO初始化
Key_Init();		  										//按键初始化
Oled_Init();		  									//OLED初始化
Oled_Clear_All();										//清屏
Usart1_Init(9600);    							//串口1初始化
Timer_Init();												//定时器初始化
while(1){
Key_function();										//按键函数
Monitor_function();								//监测函数
Display_function();								//显示函数
Manage_function();								//处理函数time_num++;												//计时变量+1
Delay_ms(10);
if(time_num %10 == 0)LED_SYS = ~LED_SYS;
if(time_num >= 5000){time_num = 0;}}
}
void TIM2_IRQHandler(void)
{
static uint16_t ms100 =0;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){timer_tick++;ms100++;if (ms100 >= 500){ms100 = 0;Tim_flag = 1;}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}
/****
*******按键函数
*****/
void Key_function(void)
{key_num = Chiclet_Keyboard_Scan(0);		//按键扫描
if(key_num != 0)											//有按键按下{
switch(key_num){
case 1:								            //按键1,切换设置界面
if(Set_display==0){	LED=~LED;flag_display++;
if(flag_display >= 2){flag_display = 0;}
if(flag_display == 1){JS = 0;JR = 0;}
Oled_Clear_All();					      //清屏}
else{Set_display++;
if(Set_display>2)Set_display=1;}break;case 2:											      //按键2
if(Set_display==0){
switch(flag_display){
case 0:									      //界面0:break;		
case 1:												//界面1:JS_flag++;JS_flag%=2;break;
default:
break;}}
else{
switch(Set_display){
case 1:				
if(temp_max < 99)temp_max++;break;
case 2:				
if(temp_min < temp_max)temp_min++;break;
default:
break;}}
break;case 3:											      //按键2
if(Set_display==0){
switch(flag_display){
case 0:									      //界面0:break;case 1:												//界面1:JR_flag++;JR_flag%=2;break;default:
break;}}
else{
switch(Set_display){
case 1:				
if(temp_max > temp_min+1)temp_max --;break;
case 2:				
if(temp_min > 0)temp_min --;break;
default:
break;}}
break;
case 11:								            //按键1,切换设置界面Set_display=1;	
Oled_Clear_All();					      //清屏	
break;
case 12:								            //按键1,切换设置界面
if(Set_display!=0){Set_display=0;	
Oled_Clear_All();					      //清屏}				
break;
/*case 2:											      //按键2switch(flag_display){case 0:									      //界面0:break;case 1:												//界面1:if(temp_max < 99)temp_max++;break;case 2:												//界面2:if(temp_min < temp_max)temp_min++;break;default:break;}break;case 3:														//按键3switch(flag_display){case 0:									      //界面0:break;case 1:												//界面1:if(temp_max > temp_min+1)temp_max --;break;case 2:												//界面2:if(temp_min > 0)temp_min --;break;default:break;}break;*/
default:break;}}
}/****
*******监测函数
*****/
void Monitor_function(void)
{
if(flag_display == 0)									//测量界面{
if(time_num % 10 == 0)							//获取数据{temp_value = DS18B20_Get_Temp();}			}
}/****
*******显示函数
*****/
void Display_function(void)
{if(Set_display==1){
Oled_ShowCHinese(1,0,"设置温度最大值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",temp_max);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}}else if(Set_display==2){Oled_ShowCHinese(1,0,"设置温度最小值");
if(time_num % 5 == 0){
sprintf(display_buf,"%d  ",temp_min);
Oled_ShowString(2, 7, display_buf);}
if(time_num % 10 == 0){
Oled_ShowString(2, 7, "    ");}}
else{switch(flag_display)									//根据不同的显示模式标志位,显示不同的界面{
case 0:									      			//界面0:Oled_ShowCHinese(1, 1, "智能饮水机系统");
Oled_ShowCHinese(2, 0, "模式:自动");
Oled_ShowCHinese(3, 0, "温度:");
sprintf(display_buf,"%d.%dC  ",temp_value/10,temp_value%10);				//显示温度的值
Oled_ShowString(3, 6, display_buf);
break;case 1:									      //界面0:
Oled_ShowCHinese(1, 1, "智能饮水机系统");
Oled_ShowCHinese(2, 0, "模式:手动");
Oled_ShowCHinese(3, 0, "水泵:");
Oled_ShowCHinese(4, 0, "加热:");
if(JS_flag==1){
Oled_ShowCHinese(3, 3, "开");JS = 1;}	
else{
Oled_ShowCHinese(3, 3, "关");JS = 0;}
if(JR_flag==1){
Oled_ShowCHinese(4, 3, "开");JR = 1;}	
else{
Oled_ShowCHinese(4, 3, "关");JR = 0;}		
break;	
default:break;}}
}/****
*******处理函数
*****/
void Manage_function(void)
{
if(Set_display==0){
if(flag_display == 0)                  //测量界面{
if(flag_mode == 0)					//自动模式{		
if(temp_value < temp_min*10){JR = 1;}
else if(temp_value > temp_max*10){JR = 0;}if(YW1 == 1) {JS = 1;Beep=1;}
elseBeep=0;
if(YW2 ==0){JS = 0;}}}
elseBeep=0;}
else													         //设置界面{JS = 0;JR = 0;}
}

七、单片机实物资料

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


文章转载自:

http://RKPw0WVM.cwzzr.cn
http://XCN4OliK.cwzzr.cn
http://DMOl3SZd.cwzzr.cn
http://KuWMFKHq.cwzzr.cn
http://6Si2q2JE.cwzzr.cn
http://Rbo5Jkv2.cwzzr.cn
http://MAIW4qES.cwzzr.cn
http://jWrr1jsV.cwzzr.cn
http://ZUSsUJil.cwzzr.cn
http://kzPGsnpm.cwzzr.cn
http://rX58TPza.cwzzr.cn
http://GViDFeew.cwzzr.cn
http://5DIoekIV.cwzzr.cn
http://dqIhXWLN.cwzzr.cn
http://Y3kLtpnf.cwzzr.cn
http://SBCnLKDj.cwzzr.cn
http://tyMYiLpx.cwzzr.cn
http://pyUwQbSO.cwzzr.cn
http://pWgXqF6H.cwzzr.cn
http://3wpcKubR.cwzzr.cn
http://Yme6YnTk.cwzzr.cn
http://tW5Iowh5.cwzzr.cn
http://V1KOXVhQ.cwzzr.cn
http://kkyf5vFl.cwzzr.cn
http://83p9kJkY.cwzzr.cn
http://zHH6ltkj.cwzzr.cn
http://BH8buaKb.cwzzr.cn
http://9fUneG1P.cwzzr.cn
http://JxiEmIuY.cwzzr.cn
http://JqxyE1X4.cwzzr.cn
http://www.dtcms.com/a/385205.html

相关文章:

  • 新质生产力背景下基于“开源链动2+1模式+AI智能名片+S2B2C商城小程序”的商业机会挖掘研究
  • html隐藏文本利用原理,实现点击隐藏功能
  • Java vs Python Web 开发深度对比:从传统同步到现代异步的全面演进
  • Redis 不只是缓存:深入解析 Redis Stack 与实时 AI 推理
  • IPv4地址类型
  • Deepin 25 系统安装 Docker:完整教程 + 常见问题解决
  • 虚拟机因网络导致域名解析出现问题
  • 群内靶机-Next
  • 【系统分析师】2025年上半年真题:论文及解题思路
  • 绿色出行新选择:圆梦交通联合卡的环保实践
  • 协程+连接池:高并发Python爬虫的底层优化逻辑
  • 深入理解 CAS:并发编程的原子操作基石
  • 矿用本安三电车变频器绝缘监测
  • 如何录制带解说的教学视频?屏幕录制工具推荐ASCOMP Screencapt Pro
  • 多模态视频理解领域 Benchmark 与 Leaderboard 整理
  • 《投资-54》元宇宙
  • OpenLayers数据源集成 -- 章节十四:WKT图层详解:标准几何文本格式的精确解析与渲染方案
  • U8g2 库驱动oled
  • 【NTC热敏电阻】NTC电阻测温电路与ADC换算
  • Gradle深度解析:从构建工具到开发生态系统
  • 本地搭建redis-cluster开发环境
  • 优化浏览体验:4个设置让Google Chrome更好用!
  • V100 部署qwen2.5-vl
  • 企业能源管控联网管理解决方案:为企业节能增效
  • [Dify] 实现“多知识库切换”功能的最佳实践
  • AI大模型开发(多模态+提示词)
  • 专项智能练习(行为主义学习理论)
  • Java 大视界 -- Java 大数据实战:618 精准发券核销率 15%→42%(含生产级代码 + 避坑指南)
  • HarmonyOS 5.0应用开发——V2装饰器@local的使用
  • Redis数据结构:ZipList与Listpack