【STM32项目开源】STM32单片机智能饮水机控制强大的系统
目录
一、设计背景和意义
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 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: //按键2
switch(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_max*10)
{
JR = 0;
}
if(YW1 == 1)
{
JS = 1;Beep=1;
}
else
Beep=0;
if(YW2 ==0)
{
JS = 0;
}
}
}
else
Beep=0;
}
else //设置界面
{
JS = 0;
JR = 0;
}
}
七、单片机实物资料


浙公网安备 33010602011771号