功能介绍:采用51单片机作为CPU主控,采用SGP30传感器采集二氧化碳浓度,采用LCD1602显示相关数据,采用按键设置报警值,当浓度大于设置值,蜂鸣器产生报警,并且二氧化碳浓度数据通过HC-05蓝牙模块上传到手机APP,文末有资料分享:
23-基于51单片机室内CO2检测报警系统 (程序+原理图+PCB+元件清单全套资料)
下面是程序部分展示,有中文注释,新手容易看懂
部分程序展示,有中文注释,新手容易看懂
void Uart_Init(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI=1;
ES = 1;
EA = 1;
}
void main(void)
{
u16 buf=600;//设置报警值
u32 sgp30_dat;
u16 CO2Data,TVOCData;//定义CO2浓度变量与TVOC浓度变量,
beep=1;
Uart_Init();
init();//LCD初始化
SGP30_Init(); //初始化SGP30
delay_ms(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;
TVOCData = sgp30_dat & 0x0000ffff;
//SGP30模块开机需要一定时间初始化,在初始化阶段读取的CO2浓度为400ppm,TVOC为0ppd且恒定不变,因此上电后每隔500ms读取一次
//SGP30模块的值,如果CO2浓度为400ppm,TVOC为0ppd,发送“正在检测中...”,直到SGP30模块初始化完成。
//初始化完成后刚开始读出数据会波动比较大,属于正常现象,一段时间后会逐渐趋于稳定。
//气体类传感器比较容易受环境影响,测量数据出现波动是正常的,可自行添加滤波函数。
while(CO2Data == 400 && TVOCData == 0)
{
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
TVOCData = sgp30_dat & 0x0000ffff; //取出TVOC值
printf("...\r\n");//正在检测中
delay_ms(100);
}
while(1)
{
SGP30_Write(0x20,0x08);
(u32)sgp30_dat = (u32)SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;//取出CO2浓度值
// TVOCData = sgp30_dat & 0x0000ffff; //取出TVOC值
// printf("CO2:%dppm\r\nTVOC:%dppd\r\n",CO2Data,TVOCData);
printf("CO2:%dppd\r\n",CO2Data);
write1_1602(6, CO2Data%1000/100+0x30);
write1_1602(7, CO2Data%100/10+0x30);
write1_1602(8, CO2Data%10+0x30);
if(key1==0)
{
buf++;if(buf>999) buf=999;
}
if(key2==0)
{
buf--;if(buf<1) buf=1;
}
if(CO2Data>buf)
{
beep=0;
printf("ERROR\r\n");
}
else beep=1;
write_1602(6, buf%1000/100+0x30);
write_1602(7, buf%100/10+0x30);
write_1602(8, buf%10+0x30);
下面是原理图和PCB展示: