当前位置:   article > 正文

STM32CubMX_MQ135检测空气质量

mq135

一、MQ135简介

MQ135是测量空气污染情况常用的一个传感器,具有代表性,价格低,寿命长,敏感度也OK,主要用于测量空气中二氧化碳,氮氧化物,氨气,酒精,苯类等。这几样气体可以说都属于家用空气污染测定中的重要成份,因此用这个传感器刚刚好。

MQ135气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在污染气体时,传感器的电导率随空气中污染气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。

注: pm2.5的话要用另外类型的传感器,比如SDS011

  • 特点:

    • 在较宽的浓度范围内对有害气体有良好的灵敏度;
    • 对氨气、硫化物、苯系等气氛灵敏度高;
    • 长寿命、低成本;
    • 简单的驱动电路即可;
  • 应用:

    • 家庭用空气污染报警器;
    • 工业用空气污染报警器;
    • 便携式空气污染报警器;
  • MQ135传感器

  • 该传感器有两个输出口:
    • DO:输出信号数字,也就是对应单片机的电平高低;
    • AO:输出模拟信号,也就是ADC信号;

二、MQ135与STM32的接线

  • MQ135模块使用5V进行驱动,DO输出数字信号,AO输出模拟信号。
  • DO输出:就相当于一个开关电源,到了设定的值进行跳转,基本没啥用处。如果需要做一个气体上限报警装置,此时可以使用DO引脚。
  • AO输出:进行模拟量的输入和输出。
    • 注: 根据自己的设计需求,烟雾仅作为报警项,不需要测量具体气体的浓度,故选择数字量输出即可。

使用说明:

  • DOUT输出数字信号: TTL输出有效信号为低电平(输出低电平时信号灯亮);
  • AOUT输出数字信号: 模拟量输出随浓度增加而增加,浓度越高电压越高;
AOUT作为模拟信号输出引脚,直接将AOUT脚接STM32的AD转换的输入脚,ADC将采集到的模拟信号转换为数字信号。在正常环境中,即:没有被测气体的环境,设定传感器输出电压值为参考电压,这时,AOUT端的电压在1V左右,当传感器检测到被测气体时,电压每升高0.1v,实际被测气体的浓度增加20ppm(简单的说:1ppm=1mg/kg=1mg/l=1×10-6 常用来表示气体浓度,或者溶液浓度。),根据这个参数就可以在单片机里面将测得的模拟量电压值转换为浓度值。

注: 传感器通电后,需要预热20s左右,测量的数据才稳定,传感器发热属于正常现象,因为内部有电热丝,如果烫手就不正常了。输出浓度和电压关系的比值并非线性,而是趋于线性,所以测量值存在误差。


三、新建工程

1.打开STM32CubeMX软件,点击“新建工程”

2. 选择 MCU 和封装

3.配置时钟



具体学习可以参考:本人博客网站-RCC学习

4.配置调试模式

5.I2C配置
  • 初始化参数配置:
    Connectivity中选择I2C2设置,将其使能,其他配置默认。用以通过I2C协议连接OLED显示屏
6.ADC配置
  • 初始化参数配置:
    Analog中选择ADC1设置,仅以规则通道为例,开启通道0(IN0),将ADC1的通道0(IN0)对应的引脚(PA0)MQ135AO引脚用杜邦线连接起来,用以接收模拟量。
7.生成代码

输入项目名称和路径。(注:路径中不允许出现中文。)

选择应用的IDE,开发环境MDK-ARM V5

每个外设生成独立的 ’.c/.h’ 文件

  • 不勾: 所有初始化代码都生成在 main.c
  • 勾选: 初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

    点击 GENERATE CODE 生成代码

四、编写代码

main.c文件中,添加一下代码:

  • 定义变量:接收数据;
  /* USER CODE BEGIN 1 */
    float temp;
    int Val;
  /* USER CODE END 1 */
  • 1
  • 2
  • 3
  • 4
  • 对ADC进行代码具体操作:
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        HAL_ADC_Start(&hadc1);
  
        HAL_ADC_PollForConversion(&hadc1, 50);
        
        if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))
        {
            Val = HAL_ADC_GetValue(&hadc1);
        }
        temp = (float)Val*3.3 / 4096;
        
        OLED_ShowString(0,2,&Font_8x16,"ADC:%02d",Val);
        OLED_ShowString(0,4,&Font_8x16,"VOL:%02f",temp);
        
        HAL_Delay(1000);
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

五、实验结果:


参考资料:

谢谢阅读。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/684972
推荐阅读
相关标签
  

闽ICP备14008679号