【STM32项目开源】基于STM32的智能水质检测系统
目录
一、设计背景和意义
1.1设计背景
1.2设计意义
二、实物效果展示
2.1实物图片
2.2实物演示视频
三、硬件功能简介
3.1项目功能详解
3.2元器件清单
四、主框图与软件流程图
五、硬件PCB展示
六、软件程序设计
七、项目资料包内容
资料获取:查看主页介绍“充哥单片机设计”
一、设计背景和意义
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展示


六、软件程序设计
//=============================================================================
//文件名称: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) ;//显示phOLED_ShowCC(0,4,(unsigned char *)str);sprintf(str,"浊度:%03d PH:%.1f ",(int)turbidity,PH) ;//显示phstr[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时等于0turbidity_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);//机智云协议处理}
}
七、项目资料包内容

