基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信
1 系统功能介绍
本设计是一套 基于51单片机的环境监测系统,能够实时采集环境光照、PM2.5、温湿度等参数,并通过 2.4G无线模块 NRF24L01 实现数据传输。系统具备本地显示与报警功能,可通过按键设置各类阈值和时间,方便用户进行环境管理与监控。系统综合应用了传感器技术、无线通信技术和液晶显示技术,适用于家庭、办公室以及小型公共场所的环境监控。
系统主要功能包括:
- 温湿度监测功能:通过 DHT11 传感器采集环境温度和湿度值,并在 LCD12864 上显示。
- 粉尘浓度检测功能:利用 GP2Y1050AU0F PM2.5 传感器实时采集空气粉尘浓度,显示在液晶屏上,同时支持超标报警。
- 光照强度监测功能:采用 BH1750FVI 光强传感器获取环境光照强度,并直观显示在 LCD12864 上。
- 无线通信功能:系统通过 NRF24L01 模块实现与远端主控系统的数据通信,可上传实时监测数据,便于远程管理。
- 阈值报警功能:通过按键设置温湿度上下限和 PM2.5 上限,当测量值超出设定范围时,蜂鸣器报警并 LED 指示灯点亮提示。
- 时间与日期设置功能:用户可通过按键调整系统时间和日期,确保数据记录准确。
- 人机交互功能:采用 LCD12864 显示中文信息,清晰显示各项监测数据,并配合按键实现参数设置,操作直观方便。
该系统将传感器数据采集、无线通信、数据显示和报警控制结合在一起,实现了环境监测的智能化和远程管理能力。
2 系统电路设计
本系统由多个功能模块组成,各模块相互协作,完成数据采集、处理、显示、报警和无线通信。以下对每个模块进行详细介绍。
2.1 单片机最小系统
-
核心芯片:STC89C52 单片机,基于 8051 内核,具有丰富的 I/O 口和定时器资源。
-
功能:
- 接收来自各类传感器的数据信号;
- 执行阈值判断、报警逻辑以及无线数据发送;
- 驱动 LCD12864 显示监测数据和设置界面;
- 控制蜂鸣器和 LED 指示灯。
-
设计要点:
- 外接晶振电路,保证单片机稳定运行;
- 上电复位电路确保系统可靠启动。
2.2 LCD12864 液晶显示模块
-
功能:以中文形式显示环境监测数据,包括温度、湿度、PM2.5、光照强度、时间及日期等信息。
-
显示设计:
- 第一屏显示温湿度及其上下限;
- 第二屏显示 PM2.5 浓度及光照强度;
- 可动态切换显示设置界面。
-
电路特性:
- 采用 8 位并口与单片机通信;
- 外接电位器调节对比度。
2.3 温湿度传感器 DHT11
-
功能:采集环境温度和湿度。
-
接口:单线接口,单片机通过定时读取数据。
-
设计注意:
- 添加上拉电阻保证数据传输稳定;
- 采集周期根据应用需求设置,一般 2 秒更新一次。
2.4 PM2.5 粉尘传感器 GP2Y1050AU0F
-
功能:采集空气中粉尘浓度,并输出模拟电压。
-
电路设计:
- 通过单片机的 ADC 输入读取电压值;
- 采用稳压电源和滤波电路提高信号精度。
-
注意事项:在使用过程中需要定时清理传感器入口,确保数据准确。
2.5 光照传感器 BH1750FVI
-
功能:检测环境光照强度(单位 lux)。
-
接口:I2C 总线与单片机通信,节省 I/O 资源。
-
电路设计:
- SDA 和 SCL 通过上拉电阻接 VCC;
- 稳定电源供电,避免光照值测量波动。
2.6 按键模块
-
功能:用于设置温湿度上下限、PM2.5 上限、日期时间等参数。
-
设计方式:
- 多按键组合实现加、减、确认、切换功能;
- 单片机内部上拉电阻,按键按下输入低电平;
- 软件防抖处理确保稳定操作。
2.7 蜂鸣器与 LED 报警模块
-
蜂鸣器功能:超标报警提示。
-
LED 功能:超标时点亮,提供直观指示。
-
电路设计:
- 蜂鸣器为有源类型,由单片机 I/O 口驱动;
- LED 通过限流电阻连接,保证安全工作电流。
2.8 NRF24L01 无线模块
-
功能:实现 2.4G 无线数据传输,发送环境数据到远端接收端。
-
接口:SPI 总线,与单片机通信。
-
设计要点:
- 电源要求稳定 3.3V,防止模块重启;
- 天线方向对准远端接收器,保证通信距离与稳定性;
- 需要对通信地址和频道进行配置,避免干扰。
3 程序设计
系统程序采用模块化设计,主要包括初始化、数据采集、显示、按键处理、阈值判断、报警控制和无线通信等模块。
3.1 系统初始化
#include <reg52.h>
#include "lcd12864.h"
#include "dht11.h"
#include "bh1750.h"
#include "pm25.h"
#include "nrf24l01.h"unsigned int temp, hum;
unsigned int pm25_value;
unsigned int lux;
unsigned int temp_upper=30, temp_lower=20;
unsigned int hum_upper=70, hum_lower=40;
unsigned int pm25_upper=150;void System_Init(void){LCD12864_Init();DHT11_Init();BH1750_Init();PM25_Init();NRF24L01_Init();LCD12864_ShowString(0,0,"Env Monitor Init...");
}
3.2 温湿度采集模块
void Read_TempHum(void){DHT11_Read(&temp,&hum);
}
3.3 PM2.5 采集模块
void Read_PM25(void){pm25_value = PM25_Read();
}
3.4 光照采集模块
void Read_Light(void){lux = BH1750_Read();
}
3.5 LCD 显示模块
void Display_Data(void){LCD12864_Clear();LCD12864_ShowString(0,0,"Temp:");LCD12864_ShowNum(6,0,temp,2);LCD12864_ShowString(10,0,"C");LCD12864_ShowString(0,1,"Hum:");LCD12864_ShowNum(4,1,hum,2);LCD12864_ShowString(8,1,"%");LCD12864_ShowString(0,2,"PM2.5:");LCD12864_ShowNum(6,2,pm25_value,3);LCD12864_ShowString(0,3,"Light:");LCD12864_ShowNum(6,3,lux,4);
}
3.6 按键设置模块
void Key_Scan(void){if(KEY_SET == 0){// 进入设置模式}if(KEY_ADD == 0){// 增加当前参数}if(KEY_SUB == 0){// 减少当前参数}
}
3.7 阈值判断与报警模块
sbit BEEP = P2^0;
sbit LED = P2^1;void Alarm_Control(void){if(temp>temp_upper || temp<temp_lower || hum>hum_upper || hum<hum_lower || pm25_value>pm25_upper){BEEP=0; // 报警LED=0;} else {BEEP=1;LED=1;}
}
3.8 NRF24L01 数据传输模块
void Wireless_Upload(void){char buf[32];sprintf(buf,"T:%d,H:%d,PM:%d,L:%d",temp,hum,pm25_value,lux);NRF24L01_Send(buf);
}