【基于STM32的水质检测系统设计】

这篇具有很好参考价值的文章主要介绍了【基于STM32的水质检测系统设计】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于STM32的水质检测系统设计

最近参加校赛做的基于STM32的水质检测系统设计,进行一些简单记录吧

一、题目要求

基于stm32的水质检测,DIY作品,stm32,单片机,arm

说明:(溶解氧浓度的硬件太贵就没做这个)
功能如下:
1.通过TFT屏实现实时各数据,可进行多级菜单切换
2.可以通过按键进行温度、PH、采集频率调节
3.可以通过语音控制温度、PH、采集频率的调节(SU-03T语音模块)
4.通过ESP8266将采取的数据上传到Onenet云端
5.采取的数据超过设置阈值会进行报警提示
6.大气压采取BMP180模块
成品展示

基于stm32的水质检测,DIY作品,stm32,单片机,arm

二、硬件材料

STM32F103C8T6最小系统一块 x1
语音模块(SU-03T) x1
ESP8266wifi模块 x1
BMP180大气压模块 x1
DS18B20温度传感器带探针 x1
蜂鸣器 x1
TFT3.5显示屏 x1
TDS传感器水电导率 x1
不可充式电极探头PH传感器 x1
杜邦线 若干
按键 x4
STM32F103C9T6最小系统

基于stm32的水质检测,DIY作品,stm32,单片机,arm

SU-03T语音模块

基于stm32的水质检测,DIY作品,stm32,单片机,arm

PH传感器模块(这个相对来说比较贵60几吧)

基于stm32的水质检测,DIY作品,stm32,单片机,arm

ESP8266模块

基于stm32的水质检测,DIY作品,stm32,单片机,arm

TDS传感器

基于stm32的水质检测,DIY作品,stm32,单片机,arm

BMP180大气压传感器

基于stm32的水质检测,DIY作品,stm32,单片机,arm

DS18B20温度传感器

基于stm32的水质检测,DIY作品,stm32,单片机,arm

TFT显示屏

基于stm32的水质检测,DIY作品,stm32,单片机,arm

蜂鸣器

基于stm32的水质检测,DIY作品,stm32,单片机,arm

三、部分代码

/*-----------------------main.c------------------*/
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "lcd_init.h"
#include "beep.h"
#include "time.h"
#include "ds18b20.h"
#include "adc.h"
#include "bmp180.h"
#include "iic.h"

//外设层
#include "oled.h"
#include "usart.h"
#include "esp8266.h"
//网络协议层
#include "onenet.h"

//网络设备
#include "esp8266.h"
//c库
#include "string.h"

/*---------------------------------水质检测系统-----------------------------------*
Author:slow-walker
Date:2022-10-26
功能:
1.实时数据显示TFT屏 2.OneNet云平台数据显示(ESP8266远端传输) 3.ST-03T语音控制  4.按键调节

----------------------------------------------------------------------------------*/

/*--------------------------------------全局变量定义--------------------------------*/
unsigned int set_time = 1;                 //设置刷新数据的频率默认500ms 1s 2s
unsigned char time_flag = 0;                //定时器开始标志
unsigned char display_flag = 0;                    //刷新标志
float temper = 15.0;                       //温度数据变量
float max_temper = 40.0,min_temper = 0.0,PH_Set = 7.0;										//温度设置阀值 0-50 默认为最大值
unsigned char key_value = 0,key = 0;
unsigned char Index = 0,flag_function = 0;                    //界面索引
float ph, tds,p;         //ph 浊度 大气压
unsigned char buzzer_flag = 0;//警报标志
/*-------------------------------------界面显示函数---------------------------------*/

/*-------------------------------功能操作界面--------------------------*/

void Init_Interface(void)
{  
		static unsigned int i = 0;
		LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
		LCD_ShowString(90,40,(unsigned char *)"Author:Slow-Walker",RED,GREEN,32,0);
		LCD_ShowString(110,80,(unsigned char *)"Date:2022-10-26",RED,GREEN,32,0);
		LCD_ShowString(140,240,(unsigned char *)"WIFI",RED,GREEN,32,0);
		LCD_ShowChinese(220,240,(unsigned char *)"加载中",RED,GREEN,32,0);
	 while(i*8 < 472)
		{
			 LCD_ShowString(i*8,280,(unsigned char *)".",RED,	WHITE,32,0);
				delay_ms(50);	
				i++;
		}
		delay_ms(500);
		//LCD_ShowChinese(140,240,(unsigned char *)"加载成功",RED,GREEN,32,0);		
		//LCD_Init();
}

void Interface1(void)
{
	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
	LCD_ShowChinese(150,120,(unsigned char *)"参数查看",RED,GREEN,32,0);
	LCD_ShowChinese(150,160,(unsigned char *)"参数设置",RED,GREEN,32,0);
}


void Interface2(void)
{

	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
	LCD_ShowChinese(120,80,(unsigned char *)"温度阈值:",RED,GREEN,32,0);
  	LCD_ShowFloatNum1(320,80,max_temper,4,RED,GREEN,32);								 
  	LCD_ShowChinese(120,120,(unsigned char *)"当前温度:",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,120,temper,4,RED,GREEN,32);			
	LCD_ShowChinese(120,160,(unsigned char *)"当前",RED,GREEN,32,0);
	LCD_ShowString(200,160,(unsigned char *)"PH",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,160,ph,4,RED,GREEN,32);	
	LCD_ShowChinese(120,200,(unsigned char *)"大气压值:",RED,GREEN,32,0);
	LCD_ShowIntNum(320,200,bmp180.p,6,RED,GREEN,32);	
	LCD_ShowChinese(120,240,(unsigned char *)"水电导率:",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,240,tds,6,RED,GREEN,32);		
}

void Interface3(void)
{
	
	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
	LCD_ShowChinese(120,80,(unsigned char *)"温度阈值",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,80,max_temper,4,RED,GREEN,32);	
	LCD_ShowString(120,120,(unsigned char *)"PH",RED,GREEN,32,0);	
	LCD_ShowChinese(200,120,(unsigned char *)"阈值",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,120,PH_Set,4,RED,GREEN,32);
	LCD_ShowChinese(120,160,(unsigned char *)"刷新频率:",RED,GREEN,32,0);
	LCD_ShowIntNum(320,160,set_time,1,RED,GREEN,32);	
}

void Interface4(void)
{
	
	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
	LCD_ShowChinese(120,120,(unsigned char *)"温度阈值",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,120,max_temper,4,RED,GREEN,32);	
}
void Interface5(void)
{
	
	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);	
	LCD_ShowString(120,120,(unsigned char *)"PH",RED,GREEN,32,0);	
	LCD_ShowChinese(200,120,(unsigned char *)"阈值",RED,GREEN,32,0);
	LCD_ShowFloatNum1(320,120,PH_Set,4,RED,GREEN,32);
}
void Interface6(void)
{
	
	LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用水质监测系统",RED,Q_BLUE,32,0);
	LCD_ShowChinese(120,120,(unsigned char *)"刷新频率:",RED,GREEN,32,0);
	LCD_ShowIntNum(320,120,set_time,1,RED,GREEN,32);	
}

/*----------------------------------按键操作函数--------------------------------------*/
unsigned char Key_Mode(void)
{
	key_value = KEY_Scan(); //按键1来进行模式的切换
	//按键每按一下蜂鸣器响200ms然后关掉 按键提示音
	if(key_value)
	{
		LCD_Init(); 
	}
	if(key_value == 1) //判断按键1是否被按下
	{ 
		Index++;
		BEEP_ON();
		delay_ms(200);
		BEEP_OFF();
		delay_ms(200);
	}	
	if(key_value == 2) //判断按键1是否被按下
	{
		Index--;
		BEEP_ON();
		delay_ms(200);
		BEEP_OFF();
		delay_ms(200);
	}
		switch(Index)
		{	
			case 1:	Interface1();break;
			case 2:	Interface2();break;
			case 3:	Interface3();break;
			case 4:	Interface4();flag_function = 3;break;
			case 5:	Interface5();flag_function = 4;break;
			case 6:	Interface6();flag_function = 5;break;		
			default:break;
		}
		key_value = 0;
	return flag_function; //返回功能函数的标志位
}

void Param_Set(void)
{
	 unsigned char keyvalue = 0;
	 keyvalue = KEY_Scan(); //按键1来进行模式的切换
		//按键每按一下蜂鸣器响200ms然后关掉 按键提示音
	if(flag_function == 3)
	{
	 if(keyvalue == 3)
	 {
		 	BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
	
		 max_temper += 2;
		 if(max_temper >= 50)
		 {
				max_temper = 50;
		 }
	 }
	 if(keyvalue == 4)
	 {
		 	BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
		 max_temper -= 2;
		 if(max_temper == 0)
		 {
				max_temper = 0;
		 }		 
	 }
 }
	else if(flag_function == 4)
	{
		if(keyvalue == 3)
	 {
			BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
		 PH_Set += 1;
	 }
	 if(keyvalue == 4)
	 {
		 	BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
		 PH_Set -= 1;
		 	 
	 }
	}
	else if(flag_function == 5)
	{
	if(keyvalue == 3)
	 {
			BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
		 	set_time += 1;
		  if(set_time > 3)
			{
				set_time = 3;
			}
	 }
	 if(keyvalue == 4)
	 {
		 	BEEP_ON();
			delay_ms(200);
			BEEP_OFF();
		 set_time -= 1;
		 if(set_time == 1)
		 {
			 set_time = 1;
		 } 	 
	 }
	}
	flag_function = 0;
	keyvalue = 0;
}




/*-------------------------------------主函数-----------------------------------------*/
int main(void)
 {	

	unsigned char *dataPtr = NULL;
	 
	unsigned short timeCount = 0;	//发送间隔变量
	 
	delay_init();	    	   //延时函数初始化	  
	NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
 	Led_Init();			      //LED端口初始化
	Adc_Init();           //adc初始化
	KEY_Init();           //按键初始化
	Beep_Init();          //蜂鸣器初始化
	Time_Init();          //定时器2初始化
	DS18B20_Init();
	BMP_Init();
	BMP_ReadCalibrationData();	
  	delay_ms(50);
	uart_init(9600);//串口1初始化
	uart3_init(115200); //串口3初始化
	 
	LCD_Init();            //LCD初始化
	LCD_Fill(0,0,LCD_W,LCD_H,GREEN);             //LCD屏颜色初始化  
  	Init_Interface();       //初始界面显示


	ESP8266_Init();					//初始化ESP8266
	printf("8266_INIT_END\n");	 
	while(OneNet_DevLink())			//接入OneNET
	delay_ms(500);
	printf("接入onenet成功");
	LCD_ShowString(140,240,(unsigned char *)"WIFI",RED,GREEN,32,0);
	LCD_ShowChinese(220,240,(unsigned char *)"加载成功",RED,GREEN,32,0);	
	delay_ms(500);	
	while(1) 
	{		
	
		if(display_flag)
		{
			display_flag = 0;	
			temper = DS18B20_GetTemperture();             //读取温度
			Get_PH_and_TUR();                             //获取PH这里没有读取浊度
			Get_TDS();                                    //TDS 水电导率
			BMP_UncompemstatedToTrue();	                  //大气压
		}	
		//测量的温度不在温度范围内进行蜂鸣器报警
		if( temper > max_temper)
		{
			buzzer_flag = 1;
			BEEP_ON();
			delay_ms(300);
			BEEP_OFF();
			delay_ms(300);
		}
		else
		{
			buzzer_flag = 0;
			BEEP_OFF();	
		}
		//PH超出阈值后报警
		if( ph > PH_Set)
		{
			buzzer_flag = 1;
			BEEP_ON();
			delay_ms(300);
			BEEP_OFF();
			delay_ms(300);
		}
		else
		{
			buzzer_flag = 0;
			BEEP_OFF();	
		}
//	
		//printf("PH = %.1f TDS = %.2f Temper = %.2f Press:%ld\r\n",ph,tds,temper,bmp180.p);
		//delay_ms(200);
		//key = Key_Mode();
	//	printf( "OneNet_SendData\r\n");//通过串           口1发送提示信息(要开始发送数据了)				
		OneNet_SendData();//发送数据给onenet			
	//	printf("send_data_end\n");
		delay_ms(100); 		
		ESP8266_Clear();		
		dataPtr = ESP8266_GetIPD(0);//获取平台返回的数据
		if(dataPtr != NULL)//如果返回数据不为空
		OneNet_RevPro(dataPtr);//平台返回数据检测		
		delay_ms(100); 		
	}
}


/*-----------------------100ms定时器中断处理---------------------*/
void TIM2_IRQHandler(void) //TIM2 中断
{
	static unsigned char count = 0,t = 0;
		if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查 TIM2 更新中断发生与否
		{
			count++;
			t++;
			if(count >= set_time)   //set_time 通过按键来改变
			{
				display_flag = 1;
				count = 0;           //计数清零
			}
  		if(t == 10)
			{
				Key_Mode();
				Param_Set();
				t = 0;
			}
		
			TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除 TIM2 更新中断标志
		}
}


/*-------------------------------串口中断服务函数-------------------------*/
void USART1_IRQHandler(void)
{
	char cmd = 0,Alarm = 0;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
	{
		cmd = USART_ReceiveData(USART1);
		//printf("%c",cmd);
		if(cmd == 0xAA)
		{
				max_temper++;
		}
		else if(cmd == 0xBB)
		{
			max_temper--;
		}
		else if(cmd == 0xCC)
		{
			PH_Set++;
		}
		else if(cmd == 0xDD)
		{
			PH_Set--;
		}
		else if(cmd == 0xEE)
		{
			for(Alarm =0;Alarm<8;Alarm++)
			{
				BEEP_ON();
				delay_ms(300);
				BEEP_OFF();
				delay_ms(300);
			}
		}
		else if(cmd == 0xFF)
		{
			//Alarm = 0;
			BEEP_OFF();
		}		
		else if(cmd == 0xCD)
		{
			set_time = 1; //500ms
		}	
		
		else if(cmd == 0xDE)
		{
			set_time = 2;//2s
		}	
		
		else if(cmd == 0xEF)
		{
			set_time = 3; //3.5s
		}	
		USART_ClearFlag(USART1, USART_FLAG_RXNE);
	}
}

四、工程链接

链接: https://pan.baidu.com/s/1EGRi3mnxnXVd18pKNUYZJA?pwd=bqqg 提取码: bqqg 复制这段内容后打开百度网盘手机App,操作更方便哦 
--来自百度网盘超级会员v5的分享

现在不开源了哦,有需要完整资料可私,创作不易拒绝白嫖文章来源地址https://www.toymoban.com/news/detail-727283.html

到了这里,关于【基于STM32的水质检测系统设计】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机课程设计:基于STM32的心率血氧检测报警系统

      本文使用搭载STM32F103VET6主控芯片的野火指南者、野火3.2寸LCD屏幕和MAX30102心率血氧传感器实现心率血氧采集并显示的效果。 (文末附完整程序下载链接)   1.可以通过MAX30102心率血氧传感器对用户的心率血氧进行采集,并用实时显示在LCD液晶屏上;   2.可以设定一个固

    2024年02月14日
    浏览(48)
  • 84、基于STM32单片机的心率MAX102血氧浓度脉搏检测系统设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、硬件框图 七、流程图  八、程序源码  九、 资料包括 血氧饱和度是人体生理参数检测的一个重要指标。但是传统的血氧监测仪造价成本太高,只

    2024年02月07日
    浏览(76)
  • 70、基于STM32单片机的蓝牙智能热水器控制系统设计温度温控水温水位检测

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、硬件框图 七、程序源码 八、资料包括 随着社会的发展,人类科技的进步,各行各业都在使自己的产品智能化、数字化,因老式的热水器使用煤气

    2024年02月05日
    浏览(107)
  • 基于单片机水质检测系统的设计与实现

       功能介绍 以STM32单片机作为主控系统; 液晶显示当前参数; PH模块采集当前水质PH酸碱度; DS18B20温度传感器采集当前水体温度; TDS传感器采集当前水体TDS值; 浊度传感器采集当前水体浑浊度; 按键设置PH、温度、TDS上下限超过阈值报警; 当其中任何参数表报警,OLED液

    2024年02月09日
    浏览(41)
  • stm32c8t6+dht11+MQ系列环境检测模块+oled显示屏(基于物联网的家庭环境检测系统设计)

    元件清单: stm32f103c8t6、mq2 检测烟雾浓度(模拟量输出)、mq7 检测一氧化碳浓度、mq135 检测空气质量、OLED屏幕(四引脚仅支持iic协议通信)、dht11检测温湿度(数字量输出)、风扇模块、无源蜂鸣器、两引脚按键、WH-NB73-B5、ttl-usb 接线图:  0:实现了dht11的温湿度以及mq2烟雾

    2024年02月02日
    浏览(49)
  • stm32毕业设计 空气质量检测系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于STM32的空气质量检测仪 大家可用于 课程设计 或 毕业设计 选题指导,项目分享: https://gitee.com/yaa-dc/warehouse-1/blob/master/iot/README.md 如今人们大约 80%的时间是在室内度过的, 室内空气质量与我们每个人的工作和生活都息息

    2024年02月02日
    浏览(45)
  • 基于STM32的物联网智能温湿度检测系统

    Windows10+ 系统电脑一台 可发射WiFi信号设备一台(手机即可) STM32F103核心板 STM32仿真器 ESP8266-01模块(需要刷OneNet固件) Wifi模块刷入OneNet固件 - 每日书库 ESP8266-01 WIFI模块刷入OneNet固件,使用MQTT连接方式接入OneNet,以及AT固件的介绍 https://www.tao-space.top/2023/04/24/Wifi%E6%A8%A1%E5%9

    2024年02月19日
    浏览(46)
  • STM32基于毫米波雷达的生命体征检测系统

    毫米波雷达我选择的了Seeedstudio企业的淘宝官方店铺,毫米波雷达包含有呼吸心跳检测雷达,人体存在感应雷达,睡眠呼吸等等,其单个模块并非只有单一功能,需要开发者根据原始数据分析解析。   由于毫米波模块是默认输出的,一直在不停歇的发送数据,所以或者原始数

    2024年01月16日
    浏览(43)
  • 基于STM32的水质浑浊度和PH值监测系统设计(仿真+程序+讲解)

    基于STM32的水质浑浊度和PH值监测系统设计(仿真+程序+讲解) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0077 基于STM32的水质浑浊度和PH值监测系统设计(仿真+程序+讲解) 结合实际情况,基于STM32F103单片机设计一个电子水质检测系统。该系统应满足的功能要

    2024年04月09日
    浏览(50)
  • STM32的光敏检测自动智能窗帘控制系统proteus设计

    ( proteus仿真+程序+演示视频) 仿真图proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0074 结合实际情况,基于STM32单片机设计一个自动智能控制窗帘系统。该系统应满足的功能要求为: 光敏传感器,运行状态LCD1602显示、L298驱动电机控制、自动控制。 具体功能: ①电

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包