MQ-135空气质量传感器(STM32)
目录
一、介绍
二、传感器原理
1.原理图
2.引脚描述
3.工作原理介绍
三、程序设计
main.c文件
mq135.h文件
mq135.c文件
四、实验效果
五、资料获取
项目分享
一、介绍
MQ-135空气质量传感器属于MQ系列气体传感器,广泛用于检测有害气体、新鲜空气中的烟雾等。可检测或测量氨气、苯、硫磺、二氧化碳、烟等有害气体。工作原理是基于半导体气敏元件的电阻变化。当气体进入传感器时,它会与气敏元件表面的敏感材料发生化学反应,导致电阻值发生变化。通过测量电阻值的变化,可以推断出污染气体浓度的大小

以下是MQ-135空气质量传感器的参数:
| 型号 | MQ-135 |
| 工作电压 | DC 5V |
| 工作电流 | 150mA |
| 检测气体 | NH3、酒精、NOx、苯、CO2等 |
| 检测浓度 | 300~10000ppm(可燃气体) |
| 输出 | AO/DO |
哔哩哔哩视频链接:
MQ-135空气质量传感器(STM32)
(资料分享见文末)
二、传感器原理
1.原理图

DO输出: TTL数字量0和1(0.1和5V)
AO输出: 0.1-0.3V(相对无污染),高浓度电压4V左右
注: DO有效信号为低电平,输出有效时信号指示灯亮起
2.引脚描述

模块中蓝色的电位器是用于调节阀值,顺时针旋转,阈值会越大,逆时针越小
| 引脚名称 | 描述 |
| VCC | 供给电压DC 5V |
| GND | 地线 |
| DO | 开关信号 |
| AO | 模拟信号 |
3.工作原理介绍
使用MQ-135型空气质量传感器属于二氧化锡(SnO2)半导体气敏材料,属于表面离子式N型半导体。处于200~3000摄氏度时,二氧化锡表面吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从面使其电阻值增加。当与敏感气体接触时,如果晶粒间界处的势垒收到调至面变化,就会引起表面导电率的变化。利用这一点就可以获得空气质量的信息。污染气体浓度越大导电率越大,输出电阻越低,则输出的模拟信号就越大。

主要应用:
家庭用气体泄漏报警器
工业用可燃气体报警器
便携式危险气体检测器
三、程序设计
1.使用STM32F103C8T6读取MQ-135空气质量传感器采集的数据,通过串口发送至电脑
2.将读取得到的空气质量信息数据同时在OLED上显示
| MQ-135 | PA0 |
| OLED_SCL | PB11 |
| OLED_SDA | PB10 |
| 串口 | 串口1 |
注意:传感器通电后,需要先预热约60s后测量的数据才稳定。通电后传a感器会出现正常的轻度发热现象,因为内部有电热丝。
main.c文件
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "mq135.h"
#include "adcx.h"/*****************辰哥单片机设计******************STM32* 项目 : MQ-135空气质量传感器实验 * 版本 : V1.0* 日期 : 2024.8.23* MCU : STM32F103C8T6* 接口 : 参看mq135.h * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥 **********************BEGIN***********************/u16 value;
u8 buff[30];//参数显示缓存数组
float ppm;int main(void)
{ SystemInit();//配置系统时钟为72M delay_init(72);LED_Init();LED_On();MQ135_Init();USART1_Config();//串口初始化OLED_Init();printf("Start \n");delay_ms(1000);OLED_Clear();//显示“空气质量:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);OLED_ShowChinese(48,0,3,16,1);OLED_ShowChar(64,0,':',16,1);while (1){LED_Toggle();value = MQ135_GetData(); printf("空气质量: %d\r\n",value);OLED_ShowNum(80,0,value,4,16,1);ppm = MQ135_GetData_PPM();sprintf((char*)buff, "%.2fppm ",ppm);OLED_ShowString(48,16,buff,16,1);// if(value)
// {
// OLED_ShowChinese(48,32,4,16,1); //异
// OLED_ShowChinese(64,32,6,16,1); //常
// }
// else
// {
// OLED_ShowChinese(48,32,5,16,1); //正
// OLED_ShowChinese(64,32,6,16,1); //常
// }delay_ms(200);}}
mq135.h文件
#ifndef __MQ135_H
#define __MQ135_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"/*****************辰哥单片机设计******************STM32* 文件 : MQ-135空气质量传感器h文件 * 版本 : V1.0* 日期 : 2024.8.23* MCU : STM32F103C8T6* 接口 : 见代码 * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥**********************BEGIN***********************/#define MQ135_READ_TIMES 10 //MQ-135传感器ADC循环读取次数//模式选择
//模拟AO: 1
//数字DO: 0
#define MODE 1/***************根据自己需求更改****************/
// MQ-135 GPIO宏定义
#if MODE
#define MQ135_AO_GPIO_CLK RCC_APB2Periph_GPIOA
#define MQ135_AO_GPIO_PORT GPIOA
#define MQ135_AO_GPIO_PIN GPIO_Pin_0
#define ADC_CHANNEL ADC_Channel_0 // ADC 通道宏定义#else
#define MQ135_DO_GPIO_CLK RCC_APB2Periph_GPIOA
#define MQ135_DO_GPIO_PORT GPIOA
#define MQ135_DO_GPIO_PIN GPIO_Pin_1 #endif
/*********************END**********************/void MQ135_Init(void);
uint16_t MQ135_GetData(void);
float MQ135_GetData_PPM(void);#endif /* __ADC_H */
mq135.c文件
#include "mq135.h"/*****************辰哥单片机设计******************STM32* 文件 : MQ-135空气质量传感器c文件 * 版本 : V1.0* 日期 : 2024.8.23* MCU : STM32F103C8T6* 接口 : 见代码 * BILIBILI : 辰哥单片机设计* CSDN : 辰哥单片机设计* 作者 : 辰哥**********************BEGIN***********************/void MQ135_Init(void)
{#if MODE{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (MQ135_AO_GPIO_CLK, ENABLE ); // 打开 ADC IO端口时钟GPIO_InitStructure.GPIO_Pin = MQ135_AO_GPIO_PIN; // 配置 ADC IO 引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置为模拟输入GPIO_Init(MQ135_AO_GPIO_PORT, &GPIO_InitStructure); // 初始化 ADC IOADCx_Init();}#else{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd (MQ135_DO_GPIO_CLK, ENABLE ); // 打开连接 传感器DO 的单片机引脚端口时钟GPIO_InitStructure.GPIO_Pin = MQ135_DO_GPIO_PIN; // 配置连接 传感器DO 的单片机引脚模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入GPIO_Init(MQ135_DO_GPIO_PORT, &GPIO_InitStructure); // 初始化 }#endif}#if MODE
uint16_t MQ135_ADC_Read(void)
{//设置指定ADC的规则组通道,采样时间return ADC_GetValue(ADC_CHANNEL, ADC_SampleTime_55Cycles5);
}
#endifuint16_t MQ135_GetData(void)
{#if MODEuint32_t tempData = 0;for (uint8_t i = 0; i < MQ135_READ_TIMES; i++){tempData += MQ135_ADC_Read();delay_ms(5);}tempData /= MQ135_READ_TIMES;return tempData;#elseuint16_t tempData;tempData = !GPIO_ReadInputDataBit(MQ135_DO_GPIO_PORT, MQ135_DO_GPIO_PIN);return tempData;#endif
}float MQ135_GetData_PPM(void)
{#if MODEfloat tempData = 0;for (uint8_t i = 0; i < MQ135_READ_TIMES; i++){tempData += MQ135_ADC_Read();delay_ms(5);}tempData /= MQ135_READ_TIMES;float Vol = (tempData*5/4096);float RS = (5-Vol)/(Vol*0.5);float R0=6.64;float ppm = pow(11.5428*R0/RS, 0.6549f);return ppm;#endif
}
四、实验效果

五、资料获取
项目分享
相关文章:
MQ-135空气质量传感器(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq135.h文件 mq135.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-135空气质量传感器属于MQ系列气体传感器,广泛用于检测有害气体、新鲜空气中的烟…...
动手学深度学习(pytorch)学习记录27-深度卷积神经网络(AlexNet)[学习记录]
目录 创建模型读取数据集训练AlexNet AlexNet 是由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 在 2012 年提出的深度卷积神经网络,它在当年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中取得了显著的成绩,从而引起了深度…...
zookeeper是啥?在kafka中有什么作用
一、Zookeeper是啥 问AI,它是这么说: ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发,用于解决大型分布式系统中的协调问题,特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集,封…...
华为手机集大成之作?带你看全球首款三折叠手机 Mate XT 非凡大师
北京时间9月10日14:30分,华为终端在深圳召开了华为见证非凡品牌盛典及鸿蒙智行新品发布会。这次发布会最受瞩目的莫过于非凡大师系列的新品、全球首款三折叠手机Mate XT 非凡大师。 三折叠形态,内外铰链存于一体 尽管三折叠的概念被提出来的时间并不算…...
构建安全畅通的道路网络:EasyCVR视频汇聚平台在道路监控中的创新应用
随着城市化进程的加速和交通流量的不断增加,道路监控已成为确保交通安全、维护社会秩序的重要手段。道路上的监控摄像头多种多样,大致可以分为这几类:交通道路监控、治安监控、路口违章监控,以及车辆测速监控等。基于智慧交通的需…...
Mac M1安装Hive
一、下载解压Hive 1.官网地址 https://dlcdn.apache.org/hive/ 2.选择对应版本进行下载,这里我以3.1.3为例; 3.下载好后,进行解压,并重命名为hive-3.1.3,放到资源库目录下; 二、配置系统环境 1.打开~/…...
shader 案例学习笔记之绘制圆
环境搭建:参考glsl vscode环境搭建 先上代码 #ifdef GL_ES precision mediump float; #endifuniform vec2 u_resolution;void main(){vec2 st gl_FragCoord.xy/u_resolution.xy;st - 0.5;st.x * u_resolution.x/u_resolution.y;float r length(st);float d ste…...
c++的模板编程技术及其发展历程
C模板编程技术及其发展历程 一、早期阶段(C98及之前) 在C98标准中,模板是首次被引入的关键特性之一。模板允许开发人员编写参数化的类型或函数,从而创建通用的算法和数据结构。这种通用性不仅提高了代码的复用性,还确…...
Unity 一个比较适合学习的FSM状态机(汉化和功能简述)
该轮子由网络资源而来,遵从作者开源意愿,仅作免费学习和分享,不作任何商业行为 ,本文不支持任何交易行为,侵权删!!! 至于我为什么不将此文章设置为转载,是因为该代码所在…...
25、Wpf之App资源应用
开发平台:Win10 64位 开发环境:VS2022(64位) Preview .NET Framework:.NET 6 文章目录 一 Resources1.1 Application中定义资源1.2 样式(Styles)1.3 模板(Templates)1.4 数据转换器(…...
【深度好文】反模式:10种滥用设计模式案例分析
Hello,大家好,我是V哥。很多文章都在介绍设计模式怎么用,讲解设计模式的原理等等,设计模式的思想是编程中的精髓,用好了可以让代码结构利于维护和扩展,同时代码风格也更加优雅,V 哥也写过这样一…...
OkHttp Interceptor日志上报
最近为了做一些网络上的优化,所以就得提前埋点,为后续网络优化提供数据支持。 主要是对发起请求埋点,请求错误埋点,客户端请求耗时埋点。 事件上报到阿里云,接入的是阿里的应用实时监控服务。 网络请求使用的是OhHttp…...
高性能反向代理--HAProxy
文章目录 Web架构负载均衡介绍为什么使用负载均衡负载均衡类型 HAProxy简介应用场景HAProxy是什么HAProxy功能 脚本安装HAProxy基础配置global多进程和线程HAProxy日志配置项 Proxies配置-listen-frontend-backendserver配置 frontendbackend配置实例子配置文件 HAProxy调度算法…...
数据结构应用实例(四)——最小生成树
Content: 一、问题描述二、算法思想三、代码实现四、两种算法的比较五、小结 一、问题描述 利用 prim 算法和 kruskal 算法实现最小生成树问题; 二、算法思想 首先判断图是否连通,只有在连通的情况下才进行最小树的生成; 三、代…...
为OneAPI配置MySQL数据库及设置开机启动
OneAPI启动时,如果发现没有数据库他会在项目根目录自动创建SqlLit,为提高OneAPI的性能及管理,这里给出一个使用MySQL数据库的案例,同时本文介绍如何在源码部署的情况下,设置OneAPI的开机自动启动。 OneAPI的源代码安装…...
完整的k8s搭建服务器流程
一、准备 1、禁用selinux #临时禁用 setenforce 0 #永久禁用 sed -i s/enforcing/disabled/ /etc/selinux/config #检查selinux是否已禁用 sestatus 2、禁用交换分区 #命令行临时禁用 swapoff -a #永久禁用 vim /etc/fstab 注释掉有swap字样的那行,重启 3、允许…...
【Petri网导论学习笔记】Petri网导论入门学习(一)
Petri 网导论 如需学习转载请注明原作者并附本帖链接!!! 如需学习转载请注明原作者并附本帖链接!!! 如需学习转载请注明原作者并附本帖链接!!! 发现网上关于Petri网的学习…...
Zabbix监控自动化
监控在运维工作中所占的比例为 30%左右,监控做得好,会省很多事,让工作能有序地进行。理想的监控应该是自动化的,只需要配置规则,即可自动完成所有的事情,比如主机的自动添加和注册、模板的自动添加、分组的…...
pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi 定制SVI目标和培训循环,变更推理
定制SVI目标和培训循环 Pyro支持各种基于优化的贝叶斯推理方法,包括Trace_ELBO作为SVI(随机变分推理)的基本实现。参见文件(documents的简写)有关各种SVI实现和SVI教程的更多信息I, 二,以及罗马数字3了解SVI的背景。 在本教程中…...
Openeuler22 部署 RackTables0.22.0
目录 0、前言 一、部署lamp环境,lamp环境测试 1、部署Apache,apache环境测试 2、部署php、mysql,php环境测试 二、放文件 三、配置mysql 四、安装racktables 第一步、点击proceed继续 第二步、点击proceed 第三步、根据提示进行操作…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
