你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32项目设计:温湿度空气质量报警器, 分享源码、PCB

[复制链接]
STMCU小助手 发布时间:2022-8-15 19:28
一、课题
1、用 DHT11 温湿度传感器获取温湿度信息,显示到OLED屏上
2、用 MQ-135 空气质量传感器获取空气质量信息,显示到OLED屏上
3、设计一个报警系统,可以设置温湿度与空气质量的上限,超过这个值蜂鸣器发出声响报警

二、准备材料

(一)、主控芯片stm32f103c8t6核心板
ea0b8d636d36456cae10a36409e687fd.png

(二)DHT11温湿度传感器

6dc8a43a7a954d2098830f6047a4c8c8.png

(三)mq135空气质量传感器

7d57198aa0ec42ddbd71700d263fee68.png

(四)4针IIC OLED

096b8756ce57439e99ef101e96d02625.png

三、原理图与PCB设计
(一)原理图设计

718cfde32b354fc7b24f1934c00f33e0.png

(二)PCB设计

aee032adfbed4b5eb4e9443eb51738be.png

四、程序设计
(一)DHT11驱动
DHT11.c

  1. #include "DHT11.h"
  2. #include "delay.h"



  3. //???DHT11
  4. //??:??????(????)
  5. u8 DHT11_Init()
  6. {
  7.         GPIO_InitTypeDef GPIO_InitStruce;
  8.         RCC_APB2PeriphClockCmd(DHT11_DQ_RCC,ENABLE);                //????PA0
  9.         
  10.         GPIO_InitStruce.GPIO_Pin = DHT11_DQ_PIN;
  11.         GPIO_InitStruce.GPIO_Mode = GPIO_Mode_Out_PP;
  12.         GPIO_InitStruce.GPIO_Speed = GPIO_Speed_50MHz;
  13.         GPIO_Init(DHT11_DQ_PORT,&GPIO_InitStruce);

  14.         DHT11_Rst();
  15.         
  16.         return DHT11_Check();
  17. }




  18. //??DHT11
  19. void DHT11_Rst(void)           
  20. {                 
  21.     DHT11_IO_OUT();         //SET OUTPUT
  22.     DHT11_DQ_OUT=0;         //??DQ
  23.     delay_ms(20);            //????18ms
  24.     DHT11_DQ_OUT=1;         //DQ=1
  25.     delay_us(30);             //????20~40us
  26. }



  27. //??DHT11???
  28. //??1:????DHT11???
  29. //??0:??
  30. u8 DHT11_Check(void)            
  31. {   
  32.    u8 retry=0;
  33.    DHT11_IO_IN();//SET INPUT         
  34.    while (DHT11_DQ_IN&&retry<100)//DHT11???40~80us
  35.    {
  36.                 retry++;   
  37.                 delay_us(1);
  38.    };         
  39.    if(retry>=100)return 1;
  40.    else retry=0;
  41.    while (!DHT11_DQ_IN&&retry<100)//DHT11????????40~80us
  42.    {
  43.        retry++;  
  44.            delay_us(1);
  45.    };
  46.    if(retry>=100)return 1;            
  47.    return 0;
  48. }


  49. //?DHT11?????   
  50. //???:1/0
  51. u8 DHT11_Read_Bit(void)                          
  52. {
  53.       u8 retry=0;
  54.       while(DHT11_DQ_IN&&retry<100)//???????
  55.       {
  56.              retry++;   
  57.              delay_us(1);
  58.        }
  59.       retry=0;
  60.       while(!DHT11_DQ_IN&&retry<100)//??????
  61.        {
  62.               retry++;        
  63.               delay_us(1);
  64.          }
  65.       delay_us(40);//??40us
  66.       if(DHT11_DQ_IN)
  67.                   return 1;
  68.       else
  69.                   return 0;                  
  70. }



  71. //?DHT11??????
  72. //???:?????
  73. u8 DHT11_Read_Byte(void)   
  74. {        
  75.     u8 i,dat;
  76.     dat=0;
  77.    for (i=0;i<8;i++)
  78.   {
  79.       dat<<=1;
  80.      dat|=DHT11_Read_Bit();
  81.     }                                    
  82.     return dat;
  83. }



  84. //?DHT11??????
  85. //temp:???(??:0~50?     humi:???(??:20%~90%)
  86. //???:0,??;1,????
  87. u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
  88. {        
  89.     u8 buf[5];
  90.     u8 i;
  91.     DHT11_Rst();
  92.     if(DHT11_Check()==0)
  93.    {
  94.           for(i=0;i<5;i++)//??40???
  95.                 {
  96.                         buf<i>=DHT11_Read_Byte();
  97.                 }
  98.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  99.                 {
  100.                         *humi=buf[0];
  101.                         *temp=buf[2];
  102.                 }
  103.         }else return 1;
  104.         return 0;            
  105. }
  106. </i>
复制代码

DHT11.h

  1. #ifndef __DHT11_H
  2. #define __DHT11_H   
  3. #include "sys.h"

  4. #define DHT11_IO_IN()  {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8<<20;}
  5. #define DHT11_IO_OUT() {GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=3<<20;}

  6.                                                             
  7. #define        DHT11_DQ_OUT PAout(5)
  8. #define        DHT11_DQ_IN  PAin(5)  

  9. #define DHT11_DQ_RCC   RCC_APB2Periph_GPIOA
  10. #define DHT11_DQ_PIN   GPIO_Pin_5
  11. #define DHT11_DQ_PORT  GPIOA

  12. u8 DHT11_Init(void);
  13. u8 DHT11_Read_Data(u8 *temp,u8 *humi);
  14. u8 DHT11_Read_Byte(void);
  15. u8 DHT11_Read_Bit(void);
  16. void DHT11_Rst(void);
  17. u8 DHT11_Check(void);

  18. #endif
复制代码

(二)MQ-135驱动,由于用的是ADC,直接上ADC代码

  1. #include "adc.h"
  2. #include "delay.h"
  3.            
  4. //初始化ADC
  5. //这里我们仅以规则通道为例
  6. //我们默认将开启通道0~3                                                                                                                                          
  7. void  Adc_Init(void)
  8. {         
  9.         ADC_InitTypeDef ADC_InitStructure;
  10.         GPIO_InitTypeDef GPIO_InitStructure;

  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟


  12.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M

  13.         //PA1 作为模拟通道输入引脚                        
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚
  16.         GPIO_Init(GPIOA, &GPIO_InitStructure);        

  17.         ADC_DeInit(ADC1);  //复位ADC1

  18.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
  19.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
  20.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
  21.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动
  22.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
  23.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
  24.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   


  25.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
  26.         
  27.         ADC_ResetCalibration(ADC1);        //使能复位校准  
  28.          
  29.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束
  30.         
  31.         ADC_StartCalibration(ADC1);         //开启AD校准

  32.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束

  33. //        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能

  34. }                                 
  35. //获得ADC值
  36. //ch:通道值 0~3
  37. u16 Get_Adc(u8 ch)   
  38. {
  39.           //设置指定ADC的规则组通道,一个序列,采样时间
  40.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采样时间为239.5周期                                      

  41.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的软件转换启动功能        
  42.          
  43.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束

  44.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果
  45. }

  46. u16 Get_Adc_Average(u8 ch,u8 times)
  47. {
  48.         u32 temp_val=0;
  49.         u8 t;
  50.         for(t=0;t<times;t++)
  51.         {
  52.                 temp_val+=Get_Adc(ch);
  53.                 delay_ms(5);
  54.         }
  55.         return temp_val/times;
  56. }         
复制代码

(三)主程序

main.c部分代码

  1. int main(void)
  2. {        
  3.           u16 key;
  4.                 int adc,cnt=0;
  5.                 float volt;
  6.                 delay_init();                     
  7.                 NVIC_Configuration();         
  8.                 BEEP_Init();
  9.                 OLED_Init();                        
  10.                 OLED_Clear();
  11.                 uart_init(115200);
  12.                 printf("欢迎使用化作尘健康小工具\r\n");
  13.                 KEY_Init();
  14.                 LED_Init();
  15.                 TIM3_Int_Init(500-1,720-1);
  16.                
  17.                 DEV_Init();
  18.          
  19.                
  20.                 OLED_Clear();
  21.                 OLED_Dis_Menu();
  22.         while(1)               
  23.         {               
  24.                 if(cnt++ ==1000)
  25.                 {
  26.                         cnt = 0;
  27.                         LED0=!LED0;
  28.                         adc =        Get_Adc_Average(0,5);
  29.                         volt = adc*3.3/4096;
  30.                         air = pow((3.4880*10*volt)/(5-volt),(1.0/0.3203));
  31.                         printf("air :%d\r\n",air);
  32.                         //获取温湿度
  33.                         DHT11_Read_Data( &temp, &humi);
  34.                         if(last_temp!=temp || last_humi!=humi)
  35.                         {
  36.                                 OLED_Dis_DHT(temp,humi,air);
  37.                         }
  38.                 }
  39.                 key = Key_GetValue();          //按键扫描
  40.                 if(key)
  41.                 DealKeyVal(key);
  42.                 if(!KEY1_IO())
  43.                 {
  44.                                 printf("%d\r\n",GetTime());
  45.                 }
  46.                 if(temp>Max_temp || humi>Max_humi || air>Max_air)
  47.                 {
  48.                         if(cnt<500)BEEP=1;
  49.                         else if(cnt<1000)BEEP=0;
  50.                 }else BEEP=0;
  51.                
  52.                
  53.                 delay_ms(1);
  54.         }         
  55.         
  56. }
复制代码





收藏 评论0 发布时间:2022-8-15 19:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版