找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1660|回复: 2
收起左侧

stm32f103单片机的智能家用空气质量监测系统源程序

[复制链接]
ID:802564 发表于 2020-7-13 15:14 | 显示全部楼层 |阅读模式
系统包括温湿度监测模块、烟雾监测模块、PM2.5监测模块、甲醛监测模块及显示报警模块,主要实现了对温湿度、PM2.5、甲醛和烟雾的实时监测。系统采用LCD液晶屏将各个传感器监测到的数据分别进行实时显示。当传感器监测值超出设定值范围时进行声光报警,并通过控制继电器来模拟加湿器、风扇、灭火装置的开关,对室内环境进行调节。注释有点乱码查看工程文件即可

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "dht11.h"        
  8. #include "adc.h"
  9. #include "beep.h"
  10. #include "jdq.h"
  11. #include "math.h"
  12. int main(void)
  13. {         
  14.         u8 t=0;       
  15.   int b;         
  16.         u8 temperature;              
  17.         u8 humidity;  
  18.   u16 adcx1;
  19.         u16 adcx;
  20.         u16 pm;
  21.         u16 ms;
  22.         float msk;
  23.         float temp;
  24.   double x,y;         
  25.         delay_init();                     //延时函数初始化          

  26.         uart_init(115200);                 //串口初始化为115200
  27.         LED_Init();                                  //初始化与LED连接的硬件接口
  28.         LCD_Init();                                   //初始化LCD  
  29.         Adc_Init1();       
  30.   Adc_Init2();
  31.         Adc_Init3();
  32.         BEEP_Init();
  33.   JDQ1_Init();
  34.         JDQ2_Init();
  35.         JDQ3_Init();
  36.         JDQ4_Init();
  37.         POINT_COLOR=RED;                //设置字体为红色        
  38.         LCD_ShowString(30,50,200,16,16,"DHT11");       
  39.         LCD_ShowString(30,130,200,16,16,"MQ2");
  40.         LCD_ShowString(30,220,200,16,16,"JQ: ");
  41.         POINT_COLOR=BLUE;//设置字体为蓝色
  42.         LCD_ShowString(30,150,200,16,16,"ADC_CH0_VAL:");             
  43.         LCD_ShowString(30,170,200,16,16,"ADC_CH0_VOL:0.000V");
  44.        
  45. while(DHT11_Init())        //DHT11初始化       
  46.         {
  47.                 LCD_ShowString(30,70,200,16,16,"DHT11 Error");
  48.                 delay_ms(200);
  49.                 LCD_Fill(30,70,239,130+16,WHITE);
  50.                 delay_ms(200);
  51.         }                                                                  
  52.         LCD_ShowString(30,70,200,16,16,"DHT11 OK");
  53.         POINT_COLOR=BLUE;//设置字体为蓝色
  54.         LCD_ShowString(30,90,200,16,16,"Temp:  C");         
  55.         LCD_ShowString(30,110,200,16,16,"Humi:  %");
  56.        

  57. while(1)
  58.         {          
  59.                 if(t%10==0)                        //每100ms读取一次
  60.                 {                                                                          
  61.                         DHT11_Read_Data(&temperature,&humidity);        //读取温湿度值       
  62.       temperature=temperature*0.9;
  63.                         humidity=humidity*0.9;
  64.                         LCD_ShowNum(30+40,90,temperature,2,16);        //显示温度                             
  65.                         LCD_ShowNum(30+40,110,humidity,2,16);                //显示湿度                   
  66.                 }                                  
  67.                  delay_ms(10);
  68.                 t++;
  69.                 if(t==20)
  70.                 {
  71.                         t=0;
  72.                        
  73.                 }
  74.           adcx1=Get_Adc1_Average(ADC_Channel_10,10);
  75.                 adcx1=adcx1*0.75;
  76.                 LCD_ShowxNum(126,150,adcx1,4,16,0);//显示ADC的值
  77.                
  78.                 temp=(float)adcx1*(3.3/4096);
  79.                
  80.                 adcx=temp;
  81.                 LCD_ShowxNum(126,170,adcx,1,16,0);//显示电压值
  82.                 temp-=adcx;
  83.                 temp*=1000;
  84.                 LCD_ShowxNum(142,170,temp,3,16,0X80); //减去整数部分,放大一千倍。显示小数部分
  85.                
  86.                 delay_ms(250);       
  87.                
  88.                 pm=Get_GP2Y_Average(20);
  89.                 LCD_ShowString(30,200,200,16,16,"PM2.5:");
  90.                 LCD_ShowxNum(80,200,pm,4,16,0);//显示ADC的值
  91.                
  92.                 delay_ms(250);
  93.                 LCD_ShowString(70,220,200,16,16,"0.000V");
  94.           ms=Get_Adc3_Average(ADC_Channel_13,5);
  95.                 //LCD_ShowxNum(80,220,ms,4,16,0);
  96.                 msk=(float)ms*(3.3/4096);
  97.                 ms=msk;
  98.                 x=(2.852*msk)-(0.210*msk*msk)-7.071;
  99.                 LCD_ShowxNum(70,220,ms,1,16,0);//显示电压值
  100.                 msk-=ms;
  101.                 msk*=1000;
  102.                 LCD_ShowxNum(86,220,msk,3,16,0X80);
  103.                
  104.                 y=exp(x);
  105.                 y=0.76*y;
  106.                 LCD_ShowString(80,240,200,16,16,"0.000");
  107.                 ms=y;
  108.                 LCD_ShowxNum(80,240,ms,1,16,0);
  109.                 y-=ms;
  110.                 y*=1000;
  111.                 LCD_ShowxNum(96,240,y,3,16,0X80);
  112.                
  113. for (b=0;b<3;b++)
  114.                 {
  115.                  if (pm>125)
  116.                         {
  117.                 BEEP=0;       
  118.     LED0=!LED0;                               
  119.                 delay_ms(300);//延时300ms          
  120.                 BEEP=1;  
  121.                 LED0=!LED0;
  122.                 delay_ms(300);
  123.                         }       
  124.                 }
  125. for (b=0;b<3;b++)
  126.                 {
  127.                  if (adcx1>1200)
  128.                         {
  129.                 BEEP=0;       
  130.     LED0=!LED0;                               
  131.                 delay_ms(200);//延时300ms          
  132.                 BEEP=1;  
  133.                 LED0=!LED0;
  134.                 delay_ms(200);
  135.                         }       
  136.                 }

  137.         if (adcx1>=1200)
  138.                 {
  139.                         JDQ1=1;
  140.                        
  141.                 }
  142.                 if (adcx1<1200)
  143.                 {
  144.                         JDQ1=0;
  145.                 }
  146.         if (temperature>26||ms>2000)
  147.                 {
  148.                         JDQ2=1;
  149.                        
  150.                 }
  151.                
  152.                 if (temperature<= 26&&ms<2000)
  153.                 {
  154.                         JDQ2=0;
  155.                 }
  156.        

  157.         if (humidity<40)
  158.                 {
  159.                         JDQ3=1;
  160.                        
  161.                 }
  162.                 if (humidity>50)
  163.                 {
  164.                         JDQ3=0;
  165.                 }
  166. if (pm>125)
  167.                 {
  168.                         JDQ4=1;
  169.                        
  170.                 }
  171.                 if (pm<100)
  172.                 {
  173.                         JDQ4=0;
  174.                 }
  175.         }
  176. }       
复制代码

所有资料51hei提供下载:
基于单片机的智能家用空气质量监测系统.7z (241.62 KB, 下载次数: 55)
回复

使用道具 举报

ID:1 发表于 2020-7-13 22:57 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:984253 发表于 2021-11-26 14:37 | 显示全部楼层
请问能够把仿真图发出来吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表