✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

一、引言

在当今对环境质量关注度日益提高的背景下,空气质量监测变得尤为重要。MQ - 135空气质量传感器作为一种低成本、易使用的传感器,能够检测空气中多种有害气体,如氨气、苯、烟雾等,在智能家居、环境监测等领域有着广泛的应用。结合STM32微控制器强大的处理能力,可以实现对空气质量的实时监测和数据处理。本文将详细介绍MQ - 135传感器与STM32的连接、工作原理以及代码实现。

二、MQ - 135空气质量传感器工作原理

2.1 基本原理

MQ - 135传感器基于气敏材料的特性工作。其内部的气敏材料在接触到目标气体时,其电导率会发生变化。当环境中存在目标气体时,气体分子会吸附在气敏材料表面,导致材料内部的载流子浓度发生改变,从而引起传感器电阻值的变化。通过测量传感器电阻值的变化,就可以间接反映出目标气体的浓度。

2.2 输出特性

MQ - 135传感器有模拟输出和数字输出两种方式。模拟输出是一个与传感器电阻值相关的电压信号,该电压信号会随着目标气体浓度的变化而变化。数字输出则是一个经过阈值比较后的高低电平信号,可用于简单的气体有无检测。

三、硬件连接

3.1 引脚说明

MQ - 135传感器通常有四个引脚:

  • VCC:电源正极,一般接3.3V或5V电源。
  • GND:电源负极,接地。
  • DO:数字输出引脚,可用于简单的气体检测判断。
  • AO:模拟输出引脚,输出与气体浓度相关的模拟电压信号。

3.2 与STM32的连接

以STM32F103C8T6为例,将MQ - 135的VCC引脚连接到STM32的3.3V电源引脚,GND引脚连接到STM32的GND引脚。将AO引脚连接到STM32的一个ADC输入引脚,例如PA0引脚,用于采集模拟电压信号;将DO引脚连接到一个GPIO输入引脚,例如PA1引脚,用于读取数字输出信号。

四、基于STM32的软件编程

4.1 开发环境

使用Keil MDK开发环境,基于STM32标准库进行代码编写。

4.2 ADC初始化

#include "stm32f10x.h"

void ADC1_Init(void) {
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA和ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);

    // 配置PA0为模拟输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // ADC1配置
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 配置ADC1通道0
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);

    // 使能ADC1
    ADC_Cmd(ADC1, ENABLE);

    // 复位校准寄存器
    ADC_ResetCalibration(ADC1);
    // 等待复位校准寄存器完成
    while (ADC_GetResetCalibrationStatus(ADC1));
    // 开始校准
    ADC_StartCalibration(ADC1);
    // 等待校准完成
    while (ADC_GetCalibrationStatus(ADC1));
}

// 读取ADC值
uint16_t ADC1_Read(void) {
    // 启动ADC转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    // 等待转换完成
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    // 读取ADC转换结果
    return ADC_GetConversionValue(ADC1);
}

4.3 GPIO初始化(用于读取数字输出)

void GPIO_Init_DO(void) {
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA1为输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

// 读取数字输出信号
uint8_t Read_DO(void) {
    return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1);
}

4.4 主函数

int main(void) {
    uint16_t adc_value;
    uint8_t do_value;

    // 初始化ADC
    ADC1_Init();
    // 初始化GPIO用于读取数字输出
    GPIO_Init_DO();

    while (1) {
        // 读取模拟输出值
        adc_value = ADC1_Read();
        // 读取数字输出值
        do_value = Read_DO();

        // 可以在这里添加对数据的处理和显示代码
        // 例如将adc_value转换为气体浓度值
        // 或者根据do_value进行简单的判断和控制

        // 适当延时
        for (int i = 0; i < 1000000; i++);
    }
}

五、代码解释

5.1 ADC初始化部分

ADC1_Init函数用于初始化ADC1模块。首先使能GPIOA和ADC1的时钟,然后将PA0引脚配置为模拟输入模式。接着对ADC1进行一系列配置,包括工作模式、扫描模式、转换模式等。最后进行ADC校准操作,以提高测量精度。

5.2 ADC读取函数

ADC1_Read函数用于启动ADC转换并读取转换结果。通过软件触发ADC转换,等待转换完成后读取转换结果。

5.3 GPIO初始化部分

GPIO_Init_DO函数用于初始化PA1引脚为浮空输入模式,用于读取MQ - 135的数字输出信号。

5.4 主函数部分

在主函数中,首先调用ADC1_InitGPIO_Init_DO函数进行初始化。然后在无限循环中不断读取模拟输出值和数字输出值。可以根据实际需求对这些数据进行进一步处理,如将模拟值转换为气体浓度值,或者根据数字输出值进行简单的判断和控制。

六、注意事项

6.1 预热时间

MQ - 135传感器在通电后需要一定的预热时间(通常为2 - 5分钟)才能达到稳定的工作状态。在使用传感器时,需要确保传感器已经完成预热。

6.2 校准

由于MQ - 135传感器的输出会受到环境温度、湿度等因素的影响,为了提高测量精度,需要进行校准操作。可以在清洁空气中测量传感器的输出值,作为参考值,然后在实际测量中进行修正。

6.3 电源稳定性

为了保证传感器的正常工作,需要提供稳定的电源。电源波动可能会导致传感器输出不稳定,影响测量结果。

七、总结

通过以上介绍,我们了解了MQ - 135空气质量传感器的工作原理、硬件连接以及基于STM32的软件编程实现。通过采集传感器的模拟输出和数字输出信号,可以对空气质量进行初步的监测和判断。在实际应用中,可以根据具体需求对代码进行进一步优化和扩展,如添加数据存储、无线传输等功能,以实现更完善的空气质量监测系统。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐