【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项目功能详解

  1. DS18B20温度传感器检测水温
  2. PH传感器检测水的酸碱度
  3. 浊度传感器检测当前水的浑浊度
  4. 数据显示:0.96OLED屏幕显示全部的传感器数据以及传感器的阈值等数据。
  5. 接入云平台:系统通过ESP8266 WIFI联网后,接入机智云平台。
  6. App远程监控:通过App远程监控全部传感器数据
  7. 阈值数据设定:系统通过按键设定阈值

3.2元器件清单

  1. 主控采用STM32F103C8T6最小系统板
  2. PH传感器
  3. DS18B20水温传感器
  4. 浊度传感器
  5. TDS电导率传感器
  6. 继电器
  7. 蜂鸣器

四、主框图与软件流程图

主框图

流程图

五、硬件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 *)&currentDataPoint);//机智云协议处理
			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 *)&currentDataPoint);//机智云协议处理
		}
}

七、项目资料包内容

资料获取:查看主页介绍"充哥单片机设计"

相关推荐
wuk9984 小时前
基于STM32平台的ADS1292心电采集驱动程序
stm32·单片机·嵌入式硬件
gihigo19985 小时前
基于STM32F4系列MCU和CS5530 24位SDADC的称重传感器系统实现
stm32·单片机·嵌入式硬件
zhmc5 小时前
STM32的GPIOx_IDR 与 GPIOx_ODR
stm32·单片机·嵌入式硬件
黄毛火烧雪下6 小时前
51、STM32 与 ESP32 单片机全面对比:架构、性能与应用场景详解
stm32·单片机·嵌入式硬件
恒锐丰小吕8 小时前
EG1151 四开关升降压电源管理芯片技术解析
嵌入式硬件·硬件工程·1024程序员节
电鱼智能的电小鱼8 小时前
基于电鱼 ARM 工控机的井下设备运行状态监测方案——实时采集电机、电泵、皮带机等关键设备运行数据
arm开发·人工智能·嵌入式硬件·深度学习·机器学习·制造
HH小晴8 小时前
惠洋科技H5528K 100V高耐压2.5A 支持24V30V36V48V60V72V80V降压6V9V12V车灯供电恒流芯片IC 高低亮
单片机·嵌入式硬件
嵌入式老牛12 小时前
DrvBsp_I2C驱动_RTC(一)
单片机·嵌入式硬件·rtc
兆龙电子单片机设计14 小时前
【STM32项目开源】STM32单片机智能台灯系统
stm32·单片机·物联网·开源·毕业设计