【基于LORA的水质检测系统】

整体框架

本次系统主要有硬件和软件两个部分组成。硬件部分由STM32F103RCT6单片机最小系统单元,温度检测电路单元,水质检测单元报警单元,人机交互单元,电源单元,液晶显示器单元组成,在设计上硬件需要考虑到系统的稳定性以及可靠性。系统以STM32单片机作为主控单元,通过不断对水浊传感器、pH传感器、等进行A/D采样,并将采集的数据进行滤波、转换等处理后,通过无线通信模块将数据上传到上位机,上位机对数据进行处理,实时显示水质检测结果,从而极大提高水质检测的自动化水平与检测效率。
在这里插入图片描述

整体框图

oled模块

使用野火官方的oled库中的STM32F103RCT6的例程,删除不需要的语句,显示变量可以通过这两个语句:

			sprintf((char*)dis_buf,"T:%d ",tds_level);//浊度
			OLED_ShowStr(0,5,dis_buf,2);

这是最基本的显示函数。
具体细节:VCC和GND分别与单片机VCC和GND相连接,SCL和SDA分别连接PB6和PB7。因为我有一块大二买的4PIN引脚0.96寸OLED显示屏,所以就直接拿来用了,市面上也有7PIN引脚的,其中4pin引脚是基于IIC协议,7PIN是SPI协议,我也在蓝桥杯嵌入式比赛的时候对IIC和EEPROM比较熟悉。

DS18B20温度传感器模块

  1. 连接:红色VCC,黄色数据线,黑色GND,将黄色连接PC0即可;
  2. 使用的是野火官方的DS18B20传感器模块的例程,只需要将需要移植的代码文件直接进行移植即可,我使用的是MINI开发板的串口显示温度例程,将黄色数据线连接PC0即可。
    温度传感器与单片机相连接图
//	printf("\r\n OLED初始化成功,OLED正在工作! \r\n");
	while( DS18B20_Init() )	
	printf("\r\n no ds18b20 exit \r\n");	
//	printf("\r\n ds18b20 exit \r\n");
	DS18B20_ReadId ( ucDs18b20Id  );           // 读取 DS18B20 的序列号
	
	printf("\r\nDS18B20的序列号是: 0x");
	for ( uc = 0; uc < 8; uc ++ )             // 打印 DS18B20 的序列号
	printf ( "%.2x", ucDs18b20Id [ uc ] );

浊度传感器模块

浊度传感器其实只要开一个adc测电压即可,因为浊度传感器的原理就是将测量信号转换成电压信号,自行设计浊度等级即可。这里使用的是PC1引脚,将采集到的电压分成几个等级即可。我采用的算法是,将采集到的电压/0.3,可以分成十个等级。
浊度传感器连接图

tds_level = ADC_ConvertedValueLocal[1]/0.3;//浊度等级划分
sprintf((char*)dis_buf,"TDS:%.1f ",10-tds_level);//浊度
if(tds_level<1)
{
	BEEP( ON ); 
	printf("\r\n 水质浑浊! \r\n");
}
else
{
	BEEP( OFF );
}

PH模块

PH模块和浊度模块一样,用ADC测电压再使用其算法即可算出PH,但前面需要校准,校准方法例程都有,这里不再赘述。
我在这里开的双adc,一个浊度一个PH。浊度A(模拟量)连接PC1,PH上的P0引脚连接PC4。PH传感器与最小系统板连接图

// 取出ADC1数据寄存器的高16位,这个是ADC2的转换数据
	temp0 = (ADC_ConvertedValue[0]&0XFFFF0000) >> 16;//temp0是PH
	// 取出ADC1数据寄存器的低16位,这个是ADC1的转换数据
	temp1 = (ADC_ConvertedValue[0]&0XFFFF);	//temp1是浊度
ADC_ConvertedValueLocal[0] =(float) temp0/4096*3.3;
ADC_ConvertedValueLocal[1] =(float) temp1/4096*3.3;


				PH = ADC_ConvertedValueLocal[0];
				PH = -5.7541*PH+16.654;
printf("\r\n 当前水质PH = %.1f  \r\n",PH);

蜂鸣器报警

由于最小系统板上面没有蜂鸣器,我正好手上多了一块,直接开A9通过高低电平控制当蜂鸣器即可。

LORA一对一通信

两块LORA在连接到电脑后进行配对,在1对1接收模式中,出了本身地址和目的地址相反之外,其余配置均相同。配置完成后写入参数后重启。配置如图:在这里插入图片描述
配置好后,一块LORA与通过转232模块与电脑进行连接,另一块与单片机串口相连接,值得注意的是LORA在和单片机以及转TTL接口时,必须RX-TX交叉连接。
其实LORA和蓝牙一样,在单片机上就是通过修改串口的数据,去进行一个无线传输,但是LORA通信距离远,模式多,可以一对多模式去进行一个更强大的功能,而且LORA在空旷距离可以传输10KM左右,传输距离很远。

最小系统

我的毕设的整体框架就是这样,自己画的最小系统板还没有到,等到嘉立创的快递到了,可以试一下自己PCB能不能正常跑程序,如果可以的话,就把我毕设放在这块板子上,这里放一下我最小系统的PCB图,这也是从原理图到PCB到器材选购全由我自己独立完成的第一块板子。C8T6最小系统板
主程序整体代码:

int main(void)
{
	unsigned char i;
	LED_GPIO_Config();
	USART_Config();
	LED_BLUE;		 
	BEEP_GPIO_Config();	
	
	SysTick_Init();   //初始化延迟函数
	I2C_Configuration();//配置CPU的硬件I2C
	OLED_Init();    //初始化OLED
	ADCx_Init();
	printf("\r\n 这是基于LoRa的水质检测系统! \r\n");
//	printf("\r\n OLED初始化成功,OLED正在工作! \r\n");
	while( DS18B20_Init() )	
	printf("\r\n no ds18b20 exit \r\n");	
//	printf("\r\n ds18b20 exit \r\n");
	DS18B20_ReadId ( ucDs18b20Id  );           // 读取 DS18B20 的序列号
	
	printf("\r\nDS18B20的序列号是: 0x");
	for ( uc = 0; uc < 8; uc ++ )             // 打印 DS18B20 的序列号
	printf ( "%.2x", ucDs18b20Id [ uc ] );
	
	OLED_Fill(0x00);//全屏灭
	while(1)
	{
		for(i=0;i<4;i++)
		{
			OLED_ShowCN(22+i*16,0,i);									//显示中文“水质检测”
		}
		tds_level = ADC_ConvertedValueLocal[1]/0.3;//浊度等级划分
		sprintf((char*)dis_buf,"TDS:%.1f ",10-tds_level);//浊度
		if(tds_level<1)
		{
			BEEP( ON ); 
			printf("\r\n 水质浑浊! \r\n");
		}
		else
		{
			BEEP( OFF );
		}
		OLED_ShowStr(0,3,dis_buf,1);

		printf ( "\r\n当前水质温度: %.1f\r\n", DS18B20_GetTemp_MatchRom ( ucDs18b20Id ) );		// 打印通过 DS18B20 序列号获取的温度值
		printf (" \r\n当前水质浊度: %.1f\r\n",10-tds_level); 		
		
		sprintf((char*)dis_buf,"TEMP:%.1f ",DS18B20_GetTemp_MatchRom ( ucDs18b20Id ));//温度
		OLED_ShowStr(0,5,dis_buf,1);
		sprintf((char*)dis_buf,"PH:%.1f ",PH);//温度
		OLED_ShowStr(0,7,dis_buf,1);
		Delay_ms(1000);		/* 1s 读取一次温度值 */


    // 取出ADC1数据寄存器的高16位,这个是ADC2的转换数据
		temp0 = (ADC_ConvertedValue[0]&0XFFFF0000) >> 16;//temp0是PH
		// 取出ADC1数据寄存器的低16位,这个是ADC1的转换数据
		temp1 = (ADC_ConvertedValue[0]&0XFFFF);	//temp1是浊度
		
		ADC_ConvertedValueLocal[0] =(float) temp0/4096*3.3;
		ADC_ConvertedValueLocal[1] =(float) temp1/4096*3.3;
		

						PH = ADC_ConvertedValueLocal[0];
						PH = -5.7541*PH+16.654;
		printf("\r\n 当前水质PH = %.1f  \r\n",PH);
						
						

						
	} 
}

未来方向

在本次毕设中,我觉得我进一步掌握了一些传感器的应用,以及LORA模块的使用,在这里是一对一模式。主要完成了一下模块的移植,以及最小系统板的绘制,绘制板子花了我三天,对单片机外围电路也有了一个比较明确的认识,对于32单片机也更加熟练。
这里我的毕设就告一段落,后面手头有很多LORA,想的是去做一下Lora节点动态组网,比如从协议层怎么实现,还有更深入地去了解嵌入式,去做一下uCOS系统的移植,如果后面到毕业答辩没什么事的话,应该会去重点学习这两个方面的知识。
如果有人需要程序源码,可以加q:2874160799联系我,可以公开。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
水质检测系统是一种用于监测水体质量的技术,可以实时监测水体中的各种物质,包括有害物质和营养物质等。目前,水质检测系统在国内外得到了广泛的研究和应用。 1. 国内研究现状 在国内,水质检测系统的研究主要集中在传感器技术、数据处理技术和网络通信技术等方面。 传感器技术方面,研究者主要探索了各种传感器的设计和制备方法,如基于光纤传感器的水质检测系统、基于纳米材料的水质传感器和基于生物传感器的水质检测系统等。 数据处理技术方面,研究者主要探索了各种数据处理算法和模型,如基于人工神经网络的水质检测系统、基于贝叶斯网络的水质检测系统和基于支持向量机的水质检测系统等。 网络通信技术方面,研究者主要探索了各种无线传输技术和云计算平台,如基于LoRa无线技术的水质检测系统和基于云计算平台的水质监测系统等。 2. 国外研究现状 在国外,水质检测系统的研究主要集中在传感器技术、数据处理技术和智能化监测技术等方面。 传感器技术方面,研究者主要探索了各种新型传感器的设计和制备方法,如基于纳米材料的水质传感器、基于光学传感器的水质检测系统和基于生物传感器的水质检测系统等。 数据处理技术方面,研究者主要探索了各种数据处理算法和模型,如基于机器学习的水质检测系统、基于神经网络的水质检测系统和基于时间序列分析的水质检测系统等。 智能化监测技术方面,研究者主要探索了各种人工智能技术的应用,如基于深度学习的水质检测系统、基于机器视觉的水质检测系统和基于自然语言处理的水质检测系统等。 总的来说,水质检测系统在国内外得到了广泛的研究和应用,未来随着科技的发展和技术的不断创新,水质检测系统将会更加智能化和高效化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值