设计项目实例98-基于STM32的水质监测系统(PH传感器、浊度传感器、温度、TDS、阿里云)

设计项目实例98-基于STM32的水质监测系统(PH传感器、浊度传感器、温度、TDS、阿里云)

前提说明

电子开发合作请私信联系,商业/非商业项目均可洽谈,价格友好,负责可靠。
目前已开发项目三百余单,不限时售后,直到项目完结。
在这里插入图片描述

需知

对此项目有需求请私信联系我,备注对应项目名称号(非免费,伸手党勿扰,价格公道,售后负责)
所有项目均有个人验证无误后发出,保证不坑害任何一位朋友,个人有接单渠道,不缺钱,随缘分享案例+和有需求的朋友合作。

项目设计要求

1)各项水质数据的采集、处理及显示:采用所需要传感器对当前水质质量进行实时检测,如ph传感器、浊度传感器、温度传感器,TDS传感器等,并把模拟量转化为数字量,交给单片机系统处理,计算出当前的相对数据,并在显示模块上显示出来。
2)超限报警:可以通过键盘手动设置各个所需检测数值的期望值,通过对采集到的数据进行处理和分析,可以得出水质的关键指标值,并对其进行评估。如果水质指标超出设定范围,系统会立即发出警报,提醒管理人员采取相应措施。同时,系统需要将监测数据通过无线传输模块上传到阿里云平台,以便实现远程监控和水质数据的共享。另外需要通过android创建一个手机app进行同步监测和控制。

项目提供资料

1、原理图源文件(嘉立创标准版,可导为专业版)

2、PCB源文件(嘉立创标准版,可导为专业版)

3、代码(有注释,规范设计,详情可看我其他单模块设计实例,keil5 MDK)

4、售后(分单资料售卖或售后指导设计两种,不同的价格,优质的服务提供给想设计出来这款作品的朋友们)

main.c代码

/************************************************************
DS18B20温度传感器:PA11
浊度传感器:PA0
水质传感器:PA1
TDS传感器:PA7
OLED屏幕:SCL:PA5,SDA:PA6
ESP01S引脚:ESP_TXD:PA3,ESP_RXD:PA2,ESP_RST:PA4
蜂鸣器控制位:PB0
按键控制位:CHANGE:PB15,SET:PB14,ADD:PB13,REDUCE:PB12
************************************************************/
int main(void) 
{
	Delay_Init();                   //延时功能初始化           
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级	
	Usart1_Init(9600);              //串口1功能初始化,波特率9600
	Usart2_Init(115200);            //串口2功能初始化,波特率115200
	
	Init_adc();                     //初始化ADC接口
	KEY_Init();                     //按键扫描初始化	
	BEEP_Init();                    //蜂鸣器初始化
	
	OLED_Init();			              //初始化OLED  
	OLED_Clear();                   //OLED清零 
	canshu_view();                  //启动界面	
 	while(DS18B20_Init())	   //DS18B20初始化	
	{
 		delay_ms(200);
	}				
	WiFi_ResetIO_Init();            //初始化WiFi的复位IO
  MQTT_Buff_Init();               //初始化接收,发送,命令数据的 缓冲区 以及各状态参数
	AliIoT_Parameter_Init();	      //初始化连接阿里云IoT平台MQTT服务器的参数		
	TIM3_Int_Init(999,71);          //1ms定时,执行特定指令程序
	TIM4_Init(300,7200);            //TIM4初始化,定时时间 300*7200*1000/72000000 = 30ms 
	while(1)
	{				  	
		if(Connect_flag==1){     
				if(MQTT_TxDataOutPtr != MQTT_TxDataInPtr){                //if成立的话,说明发送缓冲区有数据了
				if((MQTT_TxDataOutPtr[1]==0x10)||((MQTT_TxDataOutPtr[1]==0x82)&&(ConnectPack_flag==1))||(SubcribePack_flag==1)){    
					u1_printf("发送数据:0x%x\r\n",MQTT_TxDataOutPtr[1]);  //串口提示信息
					MQTT_TxData(MQTT_TxDataOutPtr);                       //发送数据
					MQTT_TxDataOutPtr += BUFF_UNIT;                       //指针下移
					if(MQTT_TxDataOutPtr==MQTT_TxDataEndPtr)              //如果指针到缓冲区尾部了
						MQTT_TxDataOutPtr = MQTT_TxDataBuf[0];            //指针归位到缓冲区开头
				} 				
			}//处理发送缓冲区数据的else if分支结尾
			if(MQTT_RxDataOutPtr != MQTT_RxDataInPtr){  //if成立的话,说明接收缓冲区有数据了														
				u1_printf("接收到数据:");
				if((MQTT_RxDataOutPtr[0]==4)&&(MQTT_RxDataOutPtr[1]==0x20)){             			
				    switch(MQTT_RxDataOutPtr[4]){					
						case 0x00 : u1_printf("CONNECT报文成功\r\n");                            //串口输出信息	
								    ConnectPack_flag = 1;                                        //CONNECT报文成功,订阅报文可发
									break;                                                       //跳出分支case 0x00                                              
						case 0x01 : u1_printf("连接已拒绝,不支持的协议版本,准备重启\r\n");     //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x01   
						case 0x02 : u1_printf("连接已拒绝,不合格的客户端标识符,准备重启\r\n"); //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x02 
						case 0x03 : u1_printf("连接已拒绝,服务端不可用,准备重启\r\n");         //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接
									break;                                                       //跳出分支case 0x03
						case 0x04 : u1_printf("连接已拒绝,无效的用户名或密码,准备重启\r\n");   //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接						
									break;                                                       //跳出分支case 0x04
						case 0x05 : u1_printf("连接已拒绝,未授权,准备重启\r\n");               //串口输出信息
									Connect_flag = 0;                                            //Connect_flag置零,重启连接						
									break;                                                       //跳出分支case 0x05 		
						default   : u1_printf("连接已拒绝,未知状态,准备重启\r\n");             //串口输出信息 
									Connect_flag = 0;                                            //Connect_flag置零,重启连接					
									break;                                                       //跳出分支case default 								
					}				
				}			
				else if((MQTT_RxDataOutPtr[0]==5)&&(MQTT_RxDataOutPtr[1]==0x90)){ 
						switch(MQTT_RxDataOutPtr[5]){					
						case 0x00 :
						case 0x01 : u1_printf("订阅成功\r\n");            //串口输出信息
												SubcribePack_flag = 1;                //SubcribePack_flag置1,表示订阅报文成功,其他报文可发送
												Ping_flag = 0;                        //Ping_flag清零
						            ping_count=0;
						            low_speed_status=1;
												high_speed_status=0;
									break;                                //跳出分支                                             
						default   : u1_printf("订阅失败,准备重启\r\n");  //串口输出信息 
												Connect_flag = 0;                     //Connect_flag置零,重启连接
									break;                                //跳出分支 								
					}					
				}
				else if((MQTT_RxDataOutPtr[0]==2)&&(MQTT_RxDataOutPtr[1]==0xD0)){ 
					u1_printf("PING报文回复\r\n"); 		  //串口输出信息 
					if(Ping_flag==1){                     //如果Ping_flag=1,表示第一次发送
						 Ping_flag = 0;    				  //要清除Ping_flag标志
					}else if(Ping_flag>1){ 				  //如果Ping_flag>1,表示是多次发送了,而且是2s间隔的快速发送
						Ping_flag = 0;     				  //要清除Ping_flag标志
						ping_count=0;
						low_speed_status=1;
						high_speed_status=0;
					}				
				}	
				else if((MQTT_RxDataOutPtr[1]==0x30)){ 
					u1_printf("服务器等级0推送\r\n"); 		   //串口输出信息 
					MQTT_DealPushdata_Qs0(MQTT_RxDataOutPtr);  //处理等级0推送数据
				}				
								
				MQTT_RxDataOutPtr += BUFF_UNIT;                     //指针下移
				if(MQTT_RxDataOutPtr==MQTT_RxDataEndPtr)            //如果指针到缓冲区尾部了
					MQTT_RxDataOutPtr = MQTT_RxDataBuf[0];          //指针归位到缓冲区开头                        
			}		
			/*-------------------------------------------------------------*/
			/*                     处理命令缓冲区数据                      */
			/*-------------------------------------------------------------*/
			if(MQTT_CMDOutPtr != MQTT_CMDInPtr)
			{                             //if成立的话,说明命令缓冲区有数据了			
				u1_printf("命令:%s\r\n",&MQTT_CMDOutPtr[1]);                 //串口输出信息
				
				MQTT_CMDOutPtr += BUFF_UNIT;                             	 //指针下移
				if(MQTT_CMDOutPtr==MQTT_CMDEndPtr)           	             //如果指针到缓冲区尾部了
					MQTT_CMDOutPtr = MQTT_CMDBuf[0];          	             //指针归位到缓冲区开头				
			}//处理命令缓冲区数据的else if分支结尾	
		}//Connect_flag=1的if分支的结尾	
		else{ 
			u1_printf("需要连接服务器\r\n");                 //串口输出信息
			TIM4_ENABLE_status=0;
			ping_count=0;
			low_speed_status=0;
			high_speed_status=0;
			WiFi_RxCounter=0;                                //WiFi接收数据量变量清零                        
			memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);          //清空WiFi接收缓冲区 
			if(WiFi_Connect_IoTServer()==0){   			     //如果WiFi连接云服务器函数返回0,表示正确,进入if
				u1_printf("建立TCP连接成功\r\n");            //串口输出信息
				Connect_flag = 1;                            //Connect_flag置1,表示连接成功	
				WiFi_RxCounter=0;                            //WiFi接收数据量变量清零                        
				memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE);      //清空WiFi接收缓冲区 
				MQTT_Buff_ReInit();                          //重新初始化发送缓冲区 
				TIM2_ENABLE_30S();			
			}				
		}	
	}
}

项目3D图

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值