MQ-135空气质量传感器(STM32)
✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进
❤欢迎关注我的知乎:对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_Init和GPIO_Init_DO函数进行初始化。然后在无限循环中不断读取模拟输出值和数字输出值。可以根据实际需求对这些数据进行进一步处理,如将模拟值转换为气体浓度值,或者根据数字输出值进行简单的判断和控制。
六、注意事项
6.1 预热时间
MQ - 135传感器在通电后需要一定的预热时间(通常为2 - 5分钟)才能达到稳定的工作状态。在使用传感器时,需要确保传感器已经完成预热。
6.2 校准
由于MQ - 135传感器的输出会受到环境温度、湿度等因素的影响,为了提高测量精度,需要进行校准操作。可以在清洁空气中测量传感器的输出值,作为参考值,然后在实际测量中进行修正。
6.3 电源稳定性
为了保证传感器的正常工作,需要提供稳定的电源。电源波动可能会导致传感器输出不稳定,影响测量结果。
七、总结
通过以上介绍,我们了解了MQ - 135空气质量传感器的工作原理、硬件连接以及基于STM32的软件编程实现。通过采集传感器的模拟输出和数字输出信号,可以对空气质量进行初步的监测和判断。在实际应用中,可以根据具体需求对代码进行进一步优化和扩展,如添加数据存储、无线传输等功能,以实现更完善的空气质量监测系统。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)