基于STM32的城市低洼积水检测控制系统设计
摘要
随着城市化进程的加速,城市低洼地带积水问题日益突出,给居民生活和城市交通带来诸多不便。为了有效解决这一问题,本文设计了一种基于STM32单片机的城市低洼积水检测控制系统。该系统通过阻压式水位检测传感器实时监测水位变化,并通过液晶屏LCD1602和串口上位机显示水位高度。用户可以通过按键设置水位报警值,当水位低于设定的报警值时,蜂鸣器报警电路导通,蜂鸣器发出报警声。同时,拨动开关接通时,水泵转动抽水,以排除积水。系统默认监测到水位低于150cm时,蜂鸣器自动报警。实验结果表明,该系统具有检测精度高、实时性好、操作简便等优点,能够有效提高城市低洼地带积水检测与控制的自动化水平。
关键词
STM32单片机;阻压式水位检测传感器;LCD1602液晶屏;串口上位机;城市低洼积水检测
Abstract
With the acceleration of urbanization, the problem of water accumulation in low-lying areas of cities has become increasingly prominent, causing many inconveniences to residents' lives and urban traffic. In order to effectively solve this problem, this paper designs a city low-lying water accumulation detection and control system based on STM32 microcontroller. The system monitors water level changes in real-time through a resistance-pressure water level detection sensor and displays the water level height through an LCD1602 liquid crystal display and a serial port upper computer. Users can set the water level alarm value through buttons. When the water level is lower than the set alarm value, the buzzer alarm circuit is turned on and the buzzer sounds an alarm. At the same time, when the toggle switch is turned on, the water pump rotates to pump out water to remove the accumulated water. The system defaults to sound an alarm when the detected water level is below 150cm. Experimental results show that the system has the advantages of high detection accuracy, good real-time performance, and easy operation, and can effectively improve the automation level of water accumulation detection and control in low-lying areas of cities.
Keywords
STM32 microcontroller; resistance-pressure water level detection sensor; LCD1602 liquid crystal display; serial port upper computer; city low-lying water accumulation detection
目录
-
绪论
1.1 研究背景及意义
1.2 国内外研究现状
1.3 研究内容及方法 -
系统总体设计
2.1 系统功能需求
2.2 系统方案设计
2.3 系统硬件选型 -
系统硬件设计
3.1 STM32单片机模块
3.2 阻压式水位检测传感器模块
3.3 LCD1602液晶屏显示模块
3.4 串口上位机通信模块
3.5 报警及水泵控制模块 -
系统软件设计
4.1 主程序设计
4.2 水位检测及显示程序设计
4.3 报警值设置及报警程序设计
4.4 水泵控制程序设计
4.5 串口通信程序设计 -
系统调试与测试
5.1 硬件调试
5.2 软件调试
5.3 系统功能测试 -
实验结果与分析
6.1 水位检测精度测试
6.2 报警响应速度测试
6.3 水泵抽水效率测试 -
结论与展望
1. 绪论
1.1 研究背景及意义
随着城市化进程的加快,城市低洼地带积水问题日益凸显。特别是在雨季,强降雨往往导致城市低洼区域积水严重,不仅影响居民的正常生活,还可能引发交通堵塞、房屋受损等连锁反应。因此,实现对城市低洼地带积水的实时监测与有效控制,对于提高城市防洪排涝能力、保障居民生命财产安全具有重要意义。
1.2 国内外研究现状
目前,国内外在城市低洼积水检测与控制方面已经取得了一定的研究成果。国外一些发达国家较早地开展了相关研究,利用先进的传感器技术和自动化技术,实现了对城市低洼积水的实时监测和预警。国内也在积极跟进,但整体技术水平与发达国家相比仍有一定差距。特别是在传感器精度、系统实时性、操作简便性等方面,仍有较大的提升空间。
1.3 研究内容及方法
本文旨在设计一种基于STM32单片机的城市低洼积水检测控制系统。通过阻压式水位检测传感器实时监测水位变化,利用液晶屏LCD1602和串口上位机显示水位高度,并通过按键设置水位报警值。当水位低于设定的报警值时,蜂鸣器发出报警声,同时水泵启动抽水,以排除积水。研究方法主要包括理论分析、硬件设计、软件编程和系统调试等步骤。
2. 系统总体设计
2.1 系统功能需求
根据城市低洼积水检测与控制的实际需求,本系统应具备以下功能:
(1)实时监测水位变化,并将水位高度显示在液晶屏上。
(2)允许用户通过按键设置水位报警值。
(3)当水位低于设定的报警值时,蜂鸣器发出报警声。
(4)拨动开关接通时,水泵启动抽水,以排除积水。
(5)系统默认监测到水位低于150cm时,蜂鸣器自动报警。
2.2 系统方案设计
本系统采用STM32单片机作为核心控制器,通过阻压式水位检测传感器实时采集水位数据,并利用液晶屏LCD1602显示水位高度。同时,系统通过串口与上位机进行通信,实现数据的远程传输和监控。用户可以通过按键设置水位报警值,当水位低于设定的报警值时,蜂鸣器发出报警声。水泵的控制则通过拨动开关实现,当开关接通时,水泵启动抽水。
2.3 系统硬件选型
(1)STM32单片机:选用STM32F103系列单片机,具有高性能、低功耗、易于编程等优点。
(2)阻压式水位检测传感器:选用高精度、稳定性好的阻压式水位传感器,用于实时监测水位变化。
(3)LCD1602液晶屏:选用16×2字符型LCD1602液晶屏,用于显示水位高度和报警值等信息。
(4)串口上位机:选用PC机作为上位机,通过串口与STM32单片机进行通信,实现数据的远程传输和监控。
(5)蜂鸣器:选用高响度、低功耗的蜂鸣器,用于发出报警声。
(6)水泵:选用小型直流水泵,用于抽水排除积水。
3. 系统硬件设计
3.1 STM32单片机模块
STM32单片机模块是整个系统的核心,负责接收传感器采集的水位数据,进行处理并控制液晶屏显示、串口通信、报警及水泵等模块的工作。STM32F103系列单片机具有丰富的外设资源和强大的处理能力,能够满足本系统的需求。
3.2 阻压式水位检测传感器模块
阻压式水位检测传感器模块用于实时监测水位变化。传感器通过测量水位对传感器的压力变化,将其转换为电信号输出。STM32单片机通过ADC模块采集传感器的输出信号,并进行处理得到水位高度。
3.3 LCD1602液晶屏显示模块
LCD1602液晶屏显示模块用于显示水位高度和报警值等信息。STM32单片机通过并行接口或I2C接口与LCD1602进行通信,发送显示数据。LCD1602能够显示两行字符,每行16个字符,满足本系统的显示需求。
3.4 串口上位机通信模块
串口上位机通信模块用于实现STM32单片机与PC机之间的数据通信。STM32单片机通过UART接口与PC机连接,发送水位数据和报警信息等。PC机作为上位机,通过串口通信软件接收并显示这些数据,实现远程监控。
3.5 报警及水泵控制模块
报警及水泵控制模块包括蜂鸣器报警电路和水泵控制电路。当水位低于设定的报警值时,STM32单片机控制蜂鸣器发出报警声。同时,当拨动开关接通时,STM32单片机控制水泵启动抽水。蜂鸣器和水泵均通过GPIO口进行控制。
4. 系统软件设计
4.1 主程序设计
主程序负责初始化系统硬件、配置中断、循环检测水位数据并处理显示、报警及水泵控制等任务。主程序流程如图4-1所示。
plaintext复制代码
图4-1 主程序流程图 |
在主程序中,首先进行STM32单片机的系统初始化,包括时钟配置、GPIO口配置、ADC模块配置、UART模块配置等。然后,进入主循环,不断检测水位数据,并根据需要更新显示、报警及水泵控制等状态。
4.2 水位检测及显示程序设计
水位检测及显示程序负责采集阻压式水位检测传感器的输出信号,并进行处理得到水位高度,然后将水位高度显示在LCD1602液晶屏上。水位检测及显示程序流程如图4-2所示。
plaintext复制代码
图4-2 水位检测及显示程序流程图 |
在水位检测及显示程序中,首先配置ADC模块并启动采集。然后,读取ADC的转换结果,并根据传感器的特性曲线将其转换为水位高度。最后,将水位高度显示在LCD1602液晶屏上。
4.3 报警值设置及报警程序设计
报警值设置及报警程序负责接收用户通过按键输入的水位报警值,并在水位低于设定的报警值时触发报警。报警值设置及报警程序流程如图4-3所示。
plaintext复制代码
图4-3 报警值设置及报警程序流程图 |
在报警值设置及报警程序中,首先初始化按键输入功能。然后,循环检测按键状态,当用户按下设置键时,进入报警值设置模式,允许用户通过增加或减少键调整报警值。设置完成后,保存报警值并退出设置模式。在主循环中,不断检测当前水位高度,并与设定的报警值进行比较。如果水位低于报警值,则控制蜂鸣器发出报警声。
4.4 水泵控制程序设计
水泵控制程序负责检测拨动开关的状态,并在开关接通时控制水泵启动抽水。水泵控制程序流程如图4-4所示。
plaintext复制代码
图4-4 水泵控制程序流程图 |
在水泵控制程序中,首先初始化GPIO口以检测拨动开关的状态。然后,在主循环中不断检测拨动开关的状态。如果开关接通,则控制水泵启动抽水;如果开关断开,则停止抽水。同时,为了确保水泵在需要时能够及时启动,程序还设置了水泵启动的优先级,确保在水位低于报警值时水泵能够优先启动。
4.5 串口通信程序设计
串口通信程序负责实现STM32单片机与PC机之间的数据通信。串口通信程序流程如图4-5所示。
plaintext复制代码
图4-5 串口通信程序流程图 |
在串口通信程序中,首先初始化UART模块并配置波特率等参数。然后,在主循环中检测是否有数据需要发送。如果有数据需要发送,则通过UART接口将数据发送给PC机。同时,程序还负责接收PC机发送的指令或数据,并根据指令执行相应的操作或更新系统状态。
5. 系统调试与测试
5.1 硬件调试
硬件调试阶段主要对系统的硬件电路进行检查和测试,确保各模块连接正确、工作正常。首先检查电源电路是否稳定可靠,然后逐个测试各模块的功能是否正常。在测试过程中,使用示波器、万用表等工具对信号进行测量和分析,确保电路参数满足设计要求。
5.2 软件调试
软件调试阶段主要对系统的软件程序进行调试和优化,确保程序能够正确运行并实现预期功能。首先进行单元测试,逐个测试各模块的程序功能是否正常。然后进行集成测试,将各模块连接起来进行整体测试,确保系统能够正常工作。在测试过程中,使用调试器、逻辑分析仪等工具对程序进行调试和分析,查找并修复错误。
5.3 系统功能测试
系统功能测试阶段主要对系统的整体功能进行测试和验证,确保系统能够满足设计要求并实现预期目标。测试内容包括水位检测精度、报警响应速度、水泵抽水效率等方面。通过模拟实际使用场景进行测试,记录并分析测试结果,对系统进行优化和改进。
6. 实验结果与分析
6.1 水位检测精度测试
通过在不同水位高度下对系统进行测试,记录并比较实际水位高度与系统显示的水位高度之间的差异。实验结果表明,系统的水位检测精度较高,误差在允许范围内。这得益于阻压式水位检测传感器的高精度和STM32单片机的强大处理能力。
6.2 报警响应速度测试
通过模拟水位低于报警值的情况进行测试,记录并比较系统发出报警声的时间与实际水位低于报警值的时间之间的差异。实验结果表明,系统的报警响应速度较快,能够在短时间内发出报警声。这得益于STM32单片机的快速处理能力和蜂鸣器的高响度。
6.3 水泵抽水效率测试
通过模拟需要抽水的情况进行测试,记录并比较水泵启动后水位下降的速度与预期速度之间的差异。实验结果表明,水泵的抽水效率较高,能够在较短时间内将水位降低到安全范围内。这得益于水泵的高性能和控制程序的精确控制。
7. 结论与展望
本文设计了一种基于STM32单片机的城市低洼积水检测控制系统。系统通过阻压式水位检测传感器实时监测水位变化,并利用液晶屏LCD1602和串口上位机显示水位高度。用户可以通过按键设置水位报警值,并在水位低于设定的报警值时触发报警。同时,系统还具备水泵控制功能,能够在需要时启动水泵抽水排除积水。实验结果表明,系统具有检测精度高、实时性好、操作简便等优点,能够有效提高城市低洼地带积水检测与控制的自动化水平。
展望未来,可以进一步优化系统的硬件和软件设计,提高系统的稳定性和可靠性。同时,可以考虑增加无线通信模块,实现远程监控和数据传输功能,进一步提高系统的智能化水平。此外,还可以将系统应用于更广泛的场景,如河流、湖泊等水域的水位监测和控制领域,为水资源的合理利用和保护提供更加有力的技术支持。
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file adc.c
* @brief This file provides code for the configuration
* of the ADC instances.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "adc.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
ADC_HandleTypeDef hadc1;
/* ADC1 init function */
void MX_ADC1_Init(void)
{
/* USER CODE BEGIN ADC1_Init 0 */
/* USER CODE END ADC1_Init 0 */
ADC_ChannelConfTypeDef sConfig = {0};
/* USER CODE BEGIN ADC1_Init 1 */
/* USER CODE END ADC1_Init 1 */
/** Common config
*/
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
/** Configure Regular Channel
*/
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN ADC1_Init 2 */
/* USER CODE END ADC1_Init 2 */
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspInit 0 */
/* USER CODE END ADC1_MspInit 0 */
/* ADC1 clock enable */
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**ADC1 GPIO Configuration
PA1 ------> ADC1_IN1
*/
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
/* USER CODE BEGIN ADC1_MspInit 1 */
/* USER CODE END ADC1_MspInit 1 */
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle)
{
if(adcHandle->Instance==ADC1)
{
/* USER CODE BEGIN ADC1_MspDeInit 0 */
/* USER CODE END ADC1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_ADC1_CLK_DISABLE();
/**ADC1 GPIO Configuration
PA1 ------> ADC1_IN1
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1);
/* ADC1 interrupt Deinit */
HAL_NVIC_DisableIRQ(ADC1_2_IRQn);
/* USER CODE BEGIN ADC1_MspDeInit 1 */
/* USER CODE END ADC1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */