功能介绍:采用stm32单片机作为主控CPU,采用SGP30传感器采集CO2浓度,采用光敏传感器采集当前的光照强度,采用DHT11采集温湿度,并且将采集到的数据显示到OLED显示屏上面,当CO2浓度大于一定值(程序可调节),继电器打开风扇进行排气,当光照强度低于一定值时,蜂鸣器进行报警提醒,可以通过按键手动打开继电器进行风扇排气,文末有资料分享:
36-基于stm32单片机室内环境温湿度CO2光敏检测OLED显示(程序+原理图+PCB+元件清单全套资料)
程序打开办法:特别注意:下载资料包以后一定要先解压!!!(建议解压到桌面上,文件路径太深会导致程序打开异常),解压后再用keil5打开。
int main(void)
{
u32 sgp30_dat;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
delay_init();
uart_init(9600);
SGP30_Init(); //初始化SGP30
delay_ms(100);
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = (sgp30_dat & 0xffff0000) >> 16;
TVOCData = sgp30_dat & 0x0000ffff;
OLED_Init();
OLED_ColorTurn(0);
OLED_DisplayTurn(0);
OLED_ShowString(0,0,"TEMP:",16); OLED_ShowString(70,0,"C",16);
OLED_ShowString(0,16,"HUMI:",16); OLED_ShowString(70,16,"%",16);
OLED_ShowString(0,32," CO2:",16); OLED_ShowString(90,32,"PPM",16);
OLED_ShowString(0,48," LUX:",16);
OLED_Refresh();
DHT11_Init();
Adc_Init();
LED_Init();
LED=0;Q1=1;
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(500);
}
while(1)
{
gm=4096-Get_Adc_Average(ADC_Channel_1,10);
DHT11_Read_TempAndHumidity ( & DHT11_Data );//获取传感器湿度
SGP30_Write(0x20,0x08);
sgp30_dat = SGP30_Read();//读取SGP30的值
CO2Data = ((sgp30_dat & 0xffff0000) >> 16)-400;//取出CO2浓度值
TVOCData = sgp30_dat & 0x0000ffff; //取出TVOC值
printf("CO2:%dppm\r\nTVOC:%dppd\r\n",CO2Data,TVOCData);//蓝牙上传数据
OLED_ShowNum(50,0,DHT11_Data .temp_int,2,16);//显示温度数据
OLED_ShowNum(50,16,DHT11_Data .humi_int,2,16);//显示湿度
OLED_ShowNum(50,32,CO2Data,4,16);//显示CO2
OLED_ShowNum(50,48,gm,4,16);//显示gm
OLED_Refresh();
if(CO2Data>500) Q1=0;
else Q1=1;
if(CO2Data>500||gm<2000) LED=1;
else LED=0;
if(K1==0) Q1=0;
//delay_ms(500);
}
}
下面是原理图展示: