目录
一、设计背景和意义
1.1设计背景
水质安全问题直接关系到人类健康与生态环境的可持续发展。随着水资源污染情况日益严峻,尤其是在农村饮水、城市河道、水产养殖、农业灌溉等领域,迫切需要建立一套高效、实时、智能的水质监控系统,以提升水环境治理与风险预警的能力。传统水质检测主要依赖人工定时采样与实验室分析,不仅耗时耗力,而且难以满足连续监测与远程管理的需求。同时,现有部分工业级水质监控系统价格昂贵、体积庞大,限制了其在中小型场景中的推广应用。
1.2设计意义
本课题以STM32F103C8T6单片机为核心控制单元,集成温度传感器(DS18B20)、PH值传感器和TDS-300b浊度传感器,实现对水体关键参数的实时采集,并通过ESP8266模块接入"机智云"物联网平台,实现手机APP远程查看、报警阈值设置与历史数据管理。系统在水质异常时能主动发出声光报警提示,从而实现智能化、人性化、高响应的水质管理模式。项目在成本、结构与功能上具备高度集成与实际落地能力,特别适合在中小型环境中推广应用。
二、实物效果展示
2.1实物图片

2.2实物演示视频
【开源】基于STM32的智能水质监测系统
三、硬件功能简介
3.1项目功能详解
- DS18B20温度传感器检测水温
- PH传感器检测水的酸碱度
- 浊度传感器检测当前水的浑浊度
- 数据显示:0.96OLED屏幕显示全部的传感器数据以及传感器的阈值等数据。
- 接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台。
- App远程监控:通过App远程监控全部传感器数据
- 阈值数据设定:系统通过按键设定阈值
3.2元器件清单
- 主控采用STM32F103C8T6最小系统板
- PH传感器
- DS18B20水温传感器
- 浊度传感器
- TDS电导率传感器
- 继电器
- 蜂鸣器
四、主框图与软件流程图
主框图

流程图

五、硬件PCB展示


六、软件程序设计
cpp
//=============================================================================
//文件名称:KEY
//功能概要:按键服务
//参数说明:无
//函数返回:VOID
//=============================================================================
void key(void)
{
if(KEY1==0)
{
DelayMs(5);
if(KEY1==0)//
{
while(KEY1==0);
switch(mod)
{
case 0://待机
mod = 1 ;//切换到菜单设置
set_f = 0;
OLED_CLS();//清屏
break;
case 1://参数设置
if(set_f>5) set_f = 0;
else set_f++;
break;
}
}
}
//////////////////////////////////////////++
if(KEY2==0)
{
DelayMs(5);
if(KEY2==0)//
{
while(KEY2==0);
switch(mod)
{
case 1://设置参数
switch(set_f)
{
case 1:
set_code[set_f]++;
if(set_code[set_f]>80) set_code[set_f] = 0;
break;
case 2:
set_code[set_f] = set_code[set_f] + 10;
if(set_code[set_f]>=2000) set_code[set_f] = 0;
break;
case 3:
set_code[set_f]++;
if(set_code[set_f]>14) set_code[set_f] = 1;
break;
case 4:
set_code[set_f]++;
if(set_code[set_f]>14) set_code[set_f] = 1;
break;
case 5:
set_code[set_f] = set_code[set_f]+10;
if(set_code[set_f]>999) set_code[set_f] = 10;
break;
}
break;
}
}
}
//////////////////////////////////////////--
if(KEY3==0)
{
DelayMs(5);
if(KEY3==0){
while(KEY3==0);
switch(mod)
{
case 1://设置参数
switch(set_f)
{
case 1:
if(set_code[set_f]==0) set_code[set_f] = 80;
else set_code[set_f] = set_code[set_f] - 1;
break;
case 2:
if(set_code[set_f]<=0) set_code[set_f] = 2000;
else set_code[set_f] = set_code[set_f]-10;
break;
case 3:
if(set_code[set_f]==0) set_code[set_f] = 14;
else set_code[set_f] = set_code[set_f]-1;
break;
case 4:
if(set_code[set_f]==0) set_code[set_f] = 14;
else set_code[set_f] = set_code[set_f]-1;
break;
case 5:
if(set_code[set_f]==0) set_code[set_f] = 1000;
else set_code[set_f] = set_code[set_f]-10;
break;
}
break;
}
}
}
//////////////////////////////////////////返回
if(KEY4==0)
{
DelayMs(5);
if(KEY4==0)//
{
while(KEY4==0);
switch(mod)
{
case 1://参数设置
Writeflash(0,set_code,0,20);//写入初始化数据
mod = 0 ;//切换到菜单设置
OLED_CLS();//清屏
break;
}
}
}
}
void display(void)
{
int i;
switch(mod)
{
case 0://待机界面
OLED_ShowCC(0,0,"==水质检测系统==");//显示标题
sprintf(str,"水温:%02d.%d℃ ",(u16)temperature/10,(u16)temperature%10);//显示温湿度数据
OLED_ShowCC(0,2,(unsigned char *)str);
sprintf(str,"TDS :%03dppm ",(int)TDS_DAT) ;//显示ph
OLED_ShowCC(0,4,(unsigned char *)str);
sprintf(str,"浊度:%03d PH:%.1f ",(int)turbidity,PH) ;//显示ph
str[16] = '\0';
OLED_ShowCC(0,6,(unsigned char *)str);
break;
///////////////////////////////////////////////////////////////////////////
case 1://参数设置界面
OLED_ShowCC(0,0,"====参数设置====");//显示标题
sprintf(str,"水温:%02d℃ TDS ",(int)set_code[1]) ; //显示水温参数
if(set_f==1) i = 3; else i = 0;
OLED_ShowCC_S(0,2,(unsigned char *)str,6,i);//根据设置参数的位置反白
sprintf(str,"浊度:%04d %04d ",(int)set_code[2],(int)set_code[5]) ;//显示浊度参数
if(set_f==2) {i = 4;}
else if(set_f==5) i = 4;
else i = 0;
OLED_ShowCC_S(0,4,(unsigned char *)str,6+(set_f-2)*1.7,i);//根据设置参数的位置反白
sprintf(str,"PH_L:%02d PH_H:%02d",(int)set_code[3],(int)set_code[4]) ;//显示PH值下限 与上限
if((set_f>=3)&(set_f<=4)) i = 2; else i = 0;
OLED_ShowStr_S(0,6,(unsigned char *)str,6+(set_f-3)*8,i,2);//根据设置参数的位置反白
break;
}
}
void run(void)
{
if(turbidity>set_code[2])
{
eer_f = 10;//高于设定值响10声
}
else if(temperature > set_code[1]*10)
{
eer_f = 10;//高于设定值响10声
}
else if((PH<=set_code[3])||(PH>=set_code[4]))
{
eer_f = 10;
}
else if(TDS_DAT > set_code[5])
{
eer_f = 10;
}
else
{
eer_f = 0;//解除报警
}
}
//=============================================================================
//文件名称:main
//功能概要:主函数
//参数说明:无
//函数返回:int
//=============================================================================
// RCC_ClocksTypeDef get_rcc_clock;//定义一个结构体检查系统时钟
int main(void)
{
u8 i;
DelayInit();//系统延时函数初始化
DelayMs(500);
usart2_init(9600);//串口2初始化
ADC1_DMA_Config();
Gizwits_Init();//机智云初始化
Key_Init();//按键引脚初始化
TIM2_Int_Init(10000,3600);//输出话定时器 这边用到定时器2作为0.5秒钟中断发生源
TIM_Cmd(TIM2, ENABLE);//开启定时器2
OLED_Init();//OLED屏幕初始化
OLED_CLS();//清屏
mod = 0;//开机显示开机界面
DS18B20_Init();//初始化温湿度传感器
Readflash(set_code,0,20); //读取内部保存数据
DelayMs(10);
while(smart_config)//配网标志
{
gizwitsHandle((dataPoint_t *)¤tDataPoint);//机智云协议处理
if(KEY2 == 0) smart_config = 0;
if(KEY3 == 0)
{
OLED_CLS();//清屏
OLED_ShowStr(0,0,"===Device Starting===",1);
OLED_ShowStr(0,1,"==WIFI smart_config==",1);
OLED_ShowStr(0,2,"WIFI_SOFTAP_MODE",1);
OLED_ShowStr(0,3,"SSID:XPG-GAgne- ",1);//热点名称
OLED_ShowStr(0,4,"password:123456789",1);//连接的热点WiFi密码
OLED_ShowStr(0,5,"Operation on app",1);
}
if(KEY4 == 0)
{
OLED_CLS();//清屏
OLED_ShowStr(0,0,"===Device Starting===",1);
OLED_ShowStr(0,1,"==WIFI smart_config==",1);
OLED_ShowStr(0,2,"WIFI_AIRLINK_MODE",1);
OLED_ShowStr(0,3,"Distribution network",1);
OLED_ShowStr(0,4," by broadcasting",1);
OLED_ShowStr(0,5,"Operation on app",1);
}
OLED_ShowStr(i*8,6,">",1);
i++;
if(i>=15){OLED_ShowStr(0,6," ",1);i = 0;}
DelayMs(500);
}
userInit();
OLED_CLS();//清屏
while (1)
{
PH = (float)ADCConvertedValue[1]; //PH对应的AD值
PH = PH * (3.3/4096) * 2;//PH数据处理
PH = PH * (-5.7541) + 16.654;
//PH = PH * (-5.7541) + 16.654 +15 ; //PH数据处理
//if ((PH > 14) || (PH <= 0))//PH数据判断是否在此范围 超过PH=7
//PH = 7;
if(PH > 14.0) PH = 14.0;
if(PH < 0) PH = 0.0;
PH_temp = PH ;//赋值给临时变量
turbidity = (float)ADCConvertedValue[0]*3.3/4096;//浊度对应的AD值 数据处理
turbidity = turbidity_K - turbidity*865.68;
// turbidity = 100 - turbidity;//数据转化
turbidity = turbidity-200;//数据转化
if(turbidity<35) turbidity = 0; //浊度小于0时等于0
turbidity_temp = turbidity;//赋值给临时变量
TDS_DAT = (ADCConvertedValue[2]/4095.0)*3.3;
TDS_DAT = 66.71*TDS_DAT*TDS_DAT*TDS_DAT-127.93*TDS_DAT*TDS_DAT+428.7*TDS_DAT;
if(TDS_DAT<20) TDS_DAT = 0;
temperature = DS18B20_Get_Temp();//读取温湿度
temperature_temp = (float)temperature/10;//赋值给临时变量
display();//显示程序
key();//按键程序
if(mod==0)run();//逻辑控制
userHandle(); //用户数据采集
gizwitsHandle((dataPoint_t *)¤tDataPoint);//机智云协议处理
}
}
七、项目资料包内容
