功能介绍:采用51单片机作为CPU主控,采用SGP30传感器采集甲醛浓度,采用LCD1602显示相关数据,采用按键设置报警值,当浓度大于设置值,蜂鸣器产生报警,并且甲醛浓度数据通过HC-05蓝牙模块上传到手机APP,文末有资料分享:
22-基于51单片机室内甲醛检测报警系统(程序+原理图+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=100;//设置报警值
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("TVOC:%dppd\r\n",TVOCData);
write1_1602(6, TVOCData%1000/100+0x30);
write1_1602(7, TVOCData%100/10+0x30);
write1_1602(8, TVOCData%10+0x30);
if(key1==0)
{
buf++;if(buf>999) buf=999;
}
if(key2==0)
{
buf--;if(buf<1) buf=1;
}
if(TVOCData>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);
}
}
void Uart_Isr() interrupt 4
{
if (RI)
{
下面是原理图和PCB展示