3-基于stm32单片机水位检测测量报警LCD1602显示程序源码原理图元件清单

功能介绍:采用stm32单片机+电位器+LCD1602显示屏+蜂鸣器+按键,通过电位器来模拟当前的水位高度,通过扭转电位器来改变水位高度,并且显示到屏幕上,通过按键设置上限值和下限值,超过值蜂鸣器进行报警,STM32 ADC是一种高精度、高性能的模拟信号采集器。它能够将外部的模拟信号转换成数字信号,然后进行数字信号处理。STM32 ADC采用的是逐次逼近式转换(SAR)技术,这种技术的采集速度相比其他采样技术更快,动态性能更高。全部资料都经过实物验证,程序有中文注释,新手容易看懂,资料分享下载链接:设计资料合集

3-基于stm32单片机水位检测测量报警LCD1602显示(程序+原理图+元件清单+演示视频)

//程序中文注释,新手容易看懂
void PWM_DAC_Set(u16 vol)
{
	float temp=vol;
	temp/=100;
	temp=temp*256/3.3;
	TIM_SetCompare1(TIM1,temp);
}



 int main(void)
 {	 
	u16 adcx,b,adcx1;

	u8 temperature=20;  	    
	u8 humidity=80;  	
		delay_init();	    	 //延时函数初始化	  
		LED_Init();			     //LED端口初始化
	  TIM3_Int_Init(4999,7199);   
		LCD1602_Init();
	 	KEY_Init();				  //KEY初始化
		Adc_Init();		  		//ADC初始化
	while(1)
	{	
if(KEY0==0)
{
temperature++;
	if(temperature>49) temperature=1;
}
if(KEY1==0)
{
humidity++;
	if(humidity>99) humidity=50;
}
		adcx=Get_Adc_Average(ADC_Channel_8,10);  		//得到ADC转换值	  
		adcx=(float)adcx*(3.3/4096)*33;
if(adcx>100) adcx=100;
		LCD_Write_Command(0x80);//第一行的首地址


			LCD_Write_Date(' ');
			LCD_Write_Date(' ');
			LCD_Write_Date(' ');
			LCD_Write_Date(' ');
			LCD_Write_Date('H');
			LCD_Write_Date('=');
			 LCD_Write_Date(adcx%1000/100+0x30);	//显示水位百位	

			 LCD_Write_Date(adcx%100/10+0x30);    //显示水位十位

			 LCD_Write_Date(adcx%10+0x30);        //显示水位个位

			 LCD_Write_Date('c');
			 LCD_Write_Date('m');

		
		
		
		LCD_Write_Command(0x80+0x40);//显示第二行
		LCD_Write_Date('D');
		LCD_Write_Date(':');
		LCD_Write_Date(temperature%100/10+0x30);
		LCD_Write_Date(temperature%10+0x30);
		LCD_Write_Date('c');
		LCD_Write_Date('m');
		LCD_Write_Date(' ');
		LCD_Write_Date(' ');

		LCD_Write_Date('G');
		LCD_Write_Date(':');
		LCD_Write_Date(humidity%100/10+0x30);
		LCD_Write_Date(humidity%10+0x30);
		LCD_Write_Date('c');
		LCD_Write_Date('m');

if(adcx<temperature||adcx>humidity)
{
	LED0=1;
	BEEP=0;
}
else 
{
	LED0=0;
	BEEP=1;
}

}		
	
 }

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
		buf++;
			if(buf>2)
			{
				buf=0;
				if(s==0)//1个小时计时
				{
				t++;
				}
				
			if(s==1)//5分钟倒计时
			{
			t--;
			if(t<0) t=0;
			}

stm32单片机最小系统讲解:
电源
电就是MCU要吃的饭,不吃饭,stm32芯片肯定不能工作。
stm32最小系统板需要5v和3.3v两种电压,一般可以直接通过USB提供5v电压,也可以用电源适配器提供5V电压。而3.3v电压可以通过稳压芯片如ASM1117-3.3v等,把5v电压降为3.3v输出。


USB接口,提供的5v电压经过ASM1117-3.3v后降为3v3,(10*10^4pF=0.1u)用于电源滤波,高频滤波用小电容,低频滤波用大电容。D3是一个led用以指示电源工况,其上的510R即510.0Ω用以限流,防止led灯烧坏。
USB接口,提供5v电压,同时它也是一个模拟串口,其D-和D+引脚与ch340相应引脚连接构成一个串口设备。
stm32吃的是3v3将其VDD和VSS引脚分别连接到3v3和GND,就解决了stm32的吃饭问题。

注意:VBAT是stm32芯片的备用3.3v电源输入端,当没有备用电源是也需要将VBAT接到VDD上去。
VDDA和VSSA是模拟电源输入口,用以给stm32芯片内部ADC,复位电路供电因此必须分别接到VDD和VSS上。

复位电路
人工作久了容易自闭、精神恍惚,这时需要睡一觉就以重新焕发活力。stm32工作久了也容易“精神恍惚”————程序跑飞,也需要复位。


stm32的NRST引脚是复位信号接收引脚与RESET相连,芯片低电平复位。如上图所示,当芯片刚上电时,电容充电导通,此时RESET=0,芯片复位;当按下复位按钮时,RESET接地,芯片复位。

晶振电路
晶振是芯片的心跳,每一次脉冲激励芯片执行一条指令,因此晶振的重要性不言而喻。


stm32的晶振电路,8M无源晶振,其中(1M)用于稳定晶振的脉冲波形,(20P)和(20P)一方面构成晶振起振的必要回路,另一方面匹配电容,同时还具有调节晶振电路频率的作用。

注意:OSC32IN是外部32.768K晶振输入口,可以直接接时钟信号,也可以不洁作IO用。OSCIN是外部系统时钟输入信号,可以接时钟信号,也可以不接做IO口用,此时stm32用芯片内部的RC电路起振产生时钟信号。

<think>好的,我需要帮用户设计一个基于STM32单片机、HC-SR04超声波模块和LCD1604显示屏的智能水箱水位控制系统。首先,我得理清系统的主要组成部分和各模块之间的连接方式。 首先,STM32单片机是整个控制系统的核心,负责处理传感器数据、控制执行机构以及显示信息。用户提到的HC-SR04超声波传感器用来测水位,而LCD1604用于显示当前水位状态和控制信息。可能还需要其他组件,比如继电器控制水泵,以及可能的报警模块。 接下来,硬件选型方面,用户已经指定了STM32,HC-SR04和LCD1604。需要确认这些模块的接口是否兼容。STM32的GPIO、定时器、ADC等资源需要合理分配。例如,HC-SR04需要至少两个GPIO口,一个触发信号,一个接收回波信号。而LCD1604通常使用并行或I2C接口,如果是并行的话,可能需要多个GPIO,而I2C则更节省引脚。 然后是软件设计部分。HC-SR04的工作原理是发送超声波脉冲,然后测量回波时间来计算距离。这通常需要精确的定时器配置,比如使用输入捕获功能来测量高电平持续时间。用户提到的参考引用[2]中提到了HT66F2390的配置,但这里用的是STM32,所以需要查阅STM32的定时器配置方法,可能参考CubeMX来生成初始化代码LCD1604的驱动需要根据其通信协议来编写。如果是I2C接口,可能需要使用STM32的I2C外设,并编写相应的发送函数。如果是并行接口,则需要配置多个GPIO为输出,并按照时序图控制使能、读写等信号。 控制系统逻辑方面,需要设定一个目标水位范围,当检测到当前水位低于下限时启动水泵注水,高于上限时关闭水泵。同时,LCD显示当前水位状态,可能还需要报警功能,比如水位异常时通过蜂鸣器或LED提示。 此外,用户可能还需要考虑电源管理,特别是水泵的驱动可能需要较大的电流,因此继电器模块的正确使用和隔离很重要,避免单片机受到干扰。参考引用[1]中提到使用继电器控制水泵,这里需要确认继电器的控制信号是否与STM32的GPIO兼容,可能需要三极管或MOS管驱动。 在软件流程上,主程序可能包括初始化各外设,进入循环检测水位,处理控制逻辑,更新显示,以及可能的通信模块(虽然用户没有提到,但引用[1]中有Wi-Fi模块,用户可能未来会扩展)。中断服务程序可能需要处理超声波传感器的回波信号,确保及时测量。 测试和调试部分,需要分模块验证。先测试HC-SR04是否能正确返回距离数据,再测试LCD显示是否正常,接着是继电器控制水泵的开关,最后整合整个系统,调整控制参数如水位阈值,响应时间等。 可能遇到的问题包括超声波传感器的测量误差,比如水面波动或泡沫影响读数,可能需要软件滤波,比如多次测量取平均。另外,LCD的驱动代码是否正确,通信是否稳定,继电器的响应延迟等都需要考虑。 最后,用户可能需要扩展功能,比如加入远程监控,可以参考引用[1]中的Wi-Fi模块,但当前需求暂时不需要。确保设计方案具备可扩展性,方便后续升级。 综上所述,设计方案需要分硬件连接、外设配置、控制逻辑、软件实现以及测试调试几个部分,确保每个模块正常工作后整合系统,实现智能水位控制。</think>### 基于STM32的智能水箱水位控制系统设计方案 #### 一、系统组成与硬件连接 1. **核心控制器** - 使用STM32F103C8T6微控制器(其他型号需调整引脚配置),负责传感器数据处理、逻辑控制、显示驱动等[^1]。 2. **水位检测模块** - **HC-SR04超声波传感器** - 工作原理:发送超声波脉冲,通过回波时间计算距离 - 计算公式:$D = \frac{v \cdot t}{2}$,其中$v$为声速(约340m/s),$t$为往返时间 - 硬件连接: ```c Trig引脚 -> PA1(GPIO输出) Echo引脚 -> PA0(定时器输入捕获) ``` 3. **显示模块** - **LCD1604显示屏** - 接口选择:4位并行模式(节省GPIO资源) - 连接方式: ```c RS -> PB0, RW -> GND, E -> PB1 D4-D7 -> PB4-PB7 ``` 4. **执行机构** - 继电器控制水泵: - 控制引脚 -> PA4(GPIO输出) - 需添加三极管驱动电路隔离负载 #### 二、软件设计 1. **开发环境配置** - 使用STM32CubeMX初始化: - 配置时钟树(72MHz主频) - 启用TIM2输入捕获(Echo信号测量- 配置GPIO输出模式(Trig、LCD控制) 2. **关键代码模块** - **超声波驱动** ```c void HC_SR04_StartMeasure(void) { HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_SET); delay_us(20); HAL_GPIO_WritePin(Trig_GPIO_Port, Trig_Pin, GPIO_PIN_RESET); } // 定时器输入捕获中断回调函数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { static uint32_t t1, t2; if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { t1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING); } else { t2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); distance_cm = (t2 - t1) * 0.034 / 2; // 计算结果存入全局变量 } } ``` - **LCD1604显示驱动** ```c void LCD_SendCommand(uint8_t cmd) { HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, GPIO_PIN_RESET); // 发送高4位 HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, (cmd >> 4) & 0x01); ... // 设置D5-D7 HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, GPIO_PIN_SET); delay_us(1); HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, GPIO_PIN_RESET); // 发送低4位(类似操作) } ``` 3. **控制逻辑实现** - 设定水位阈值: ```c #define LEVEL_LOW 20 // 单位:cm #define LEVEL_HIGH 80 ``` - PID控制算法(简化版): ```c void WaterLevel_Control(float current_level) { if (current_level < LEVEL_LOW) { HAL_GPIO_WritePin(Pump_GPIO_Port, Pump_Pin, GPIO_PIN_SET); // 启动水泵 } else if (current_level > LEVEL_HIGH) { HAL_GPIO_WritePin(Pump_GPIO_Port, Pump_Pin, GPIO_PIN_RESET); // 关闭水泵 } } ``` #### 三、系统优化建议 1. **抗干扰设计** - 添加软件滤波:对超声波测量值进行滑动平均滤波 - 硬件RC滤波电路:在Echo信号线串联100Ω电阻并联100pF电容 2. **安全保护机制** - 水泵连续运行超时保护(如持续运行>5分钟自动关闭) - 水位突变报警(通过蜂鸣器或LED提示) 3. **扩展功能** - 通过串口连接上位机实现数据记录 - 添加Wi-Fi模块(如ESP8266)实现远程监控[^1] #### 四、测试方案 1. 分模块测试: - 使用逻辑分析仪验证超声波时序 - 通过串口打印调试信息 2. 系统联调: - 模拟水位变化测试控制响应速度 - 连续24小时运行稳定性测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值