1. 系统功能概述
本项目设计的是一套基于51单片机的水塔水箱液位监控与报警系统,主要功能是实时监测水塔水位变化,并通过WiFi无线方式将液位状态从主机端传输至从机端,从机端接收到信息后进行蜂鸣器报警以及状态灯指示,若主从机之间通信中断,还能自动进行离线提示。整个系统的设计具有结构清晰、功能实用、响应迅速、远程通信的特点,特别适用于农村用水塔、水厂液位监控等场景。
系统共分为主机和从机两部分:
功能说明:
- 主机通过液位传感器检测水箱液位,判断是否达到预设的最高液位或最低液位。
- 检测到临界液位时,通过ESP8266模块发送状态信息至从机。
- 从机接收到状态后启动蜂鸣器报警,并通过三色LED状态指示灯显示液位状态。
- 若主从通信中断或掉线,指示灯全部熄灭,仅黄灯闪烁提示。
- 主从机ESP8266配置不同,程序及逻辑不可互换。
2. 电路系统设计
2.1 主机电路模块设计
2.1.1 STC89C52单片机控制核心
STC89C52作为主机的核心控制器,具备良好的稳定性与丰富的IO资源,能够高效完成液位数据采集、判断与WiFi通信。其内部集成的定时器、串口通信模块使得数据采集和发送更为简便可靠。
2.1.2 液位传感器电路
液位传感器选用导电式或浮球式液位开关,分别设置在最低液位和最高液位点。当水位到达传感器位置时,导通或断开相应的输入口,形成高低电平信号。主控芯片通过IO口采集这些电平判断当前水位状态。
2.1.3 ESP8266 WiFi通信模块
ESP8266模块采用AT指令集,通过串口与STC89C52通信。主机配置为TCP客户端模式,负责向从机建立连接并发送状态数据。为了保证通信稳定,系统内配置了周期重发机制及掉线重连机制。
2.1.4 电源电路
整个主机供电通过稳压芯片AMS1117将5V转换为3.3V供ESP8266使用,同时提供5V供单片机与液位传感器工作。电源部分加入了滤波电容,防止干扰。
2.2 从机电路模块设计
2.2.1 STC89C52单片机控制核心
与主机相同,STC89C52单片机作为核心控制器,用于接收来自主机的液位状态,并控制蜂鸣器及LED指示灯。同时,内置定时器用于掉线检测和指示灯状态闪烁控制。
2.2.2 蜂鸣器报警电路
使用NPN三极管进行驱动控制,当液位状态为最低或最高时,单片机输出高电平控制三极管导通,从而驱动蜂鸣器发出声音报警。
2.2.3 LED三色状态指示灯
使用红灯、绿灯、黄灯三色LED表示当前状态:
- 红灯:表示液位过高;
- 绿灯:表示液位正常;
- 黄灯闪烁:表示通信掉线或异常。
2.2.4 ESP8266 WiFi模块
从机端ESP8266模块配置为TCP服务器,接收主机的连接请求并接受液位状态信息,解析后做出相应处理。此部分是整个通信链路的核心。
2.2.5 电源电路
与主机类似,通过AMS1117稳压芯片供电,并在电源输入处加入保护二极管与滤波电容,确保电压稳定。
3. 程序系统设计
3.1 主机程序设计
主机程序主要完成液位采集、状态判断、串口通信、WiFi连接等功能。
3.1.1 液位采集程序模块
液位传感器接入P3.0与P3.1口,对应最低和最高液位点,通过读取IO电平进行状态判断。
bit low_level = 0;
bit high_level = 0;
void check_water_level() {
low_level = P3^0;
high_level = P3^1;
}
3.1.2 WiFi通信模块
主机使用串口0与ESP8266通信,初始化WiFi模块,建立TCP连接后发送液位信息。
void send_to_slave(char* status) {
UART_SendString("AT+CIPSTART="TCP","192.168.4.1",8080rn");
delay_ms(200);
sprintf(tx_buf, "AT+CIPSEND=%drn", strlen(status));
UART_SendString(tx_buf);
delay_ms(100);
UART_SendString(status);
}
3.1.3 主循环程序
在主循环中周期性检测液位,判断状态后通过WiFi发送信息。
void main() {
UART_Init();
ESP8266_Init();
while (1) {
check_water_level();
if (low_level == 0) {
send_to_slave("LOWn");
} else if (high_level == 0) {
send_to_slave("HIGHn");
} else {
send_to_slave("NORMALn");
}
delay_ms(3000);
}
}
3.2 从机程序设计
从机程序主要完成WiFi接收、蜂鸣器控制、LED状态指示、通信中断检测等功能。
3.2.1 WiFi接收模块
从机通过串口接收ESP8266传来的数据,分析液位状态并处理。
void parse_status(char* data) {
if (strstr(data, "LOW")) {
current_status = 1;
} else if (strstr(data, "HIGH")) {
current_status = 2;
} else if (strstr(data, "NORMAL")) {
current_status = 3;
}
receive_flag = 1;
}
3.2.2 蜂鸣器与LED控制模块
根据状态值控制蜂鸣器和LED灯状态。
void update_output() {
switch (current_status) {
case 1: // 低液位
BUZZER = 0;
RED_LED = 0;
GREEN_LED = 1;
YELLOW_LED = 1;
break;
case 2: // 高液位
BUZZER = 0;
RED_LED = 1;
GREEN_LED = 1;
YELLOW_LED = 1;
break;
case 3: // 正常
BUZZER = 1;
RED_LED = 1;
GREEN_LED = 0;
YELLOW_LED = 1;
break;
}
}
3.2.3 通信中断检测模块
利用定时器定期检查是否长时间未收到主机数据,若超时则判定掉线。
unsigned int timeout_counter = 0;
void Timer0_ISR(void) interrupt 1 {
timeout_counter++;
if (timeout_counter >= 3000) {
// 进入通信中断状态
RED_LED = 1;
GREEN_LED = 1;
YELLOW_LED = !YELLOW_LED; // 闪烁
BUZZER = 1;
}
}
3.2.4 主循环程序
主循环中判断是否有接收到主机数据,并更新显示与报警输出。
void main() {
UART_Init();
Timer0_Init();
while (1) {
if (receive_flag) {
update_output();
timeout_counter = 0;
receive_flag = 0;
}
}
}
4. 总结
本设计实现了一套实用的水塔液位远程监控与报警系统,具备以下优点:
- 液位实时监控,报警及时;
- WiFi通信无线传输,布线简便;
- 系统分主从架构,结构清晰;
- 状态指示直观,掉线提示可靠;
- 硬件成本低,适合推广应用。
通过STC89C52与ESP8266的结合,系统能够轻松实现远程液位监测和报警提示,为小型水利工程与家庭供水系统提供了一种可靠的解决方案。
237