ESP32驱动BMP280和MQ4传感器

news2025/3/30 20:49:48

文章目录

前言

一、硬件准备

所需组件

连接方式:

二、软件实现

1.所需库

2.代码实现

效果演示

 三、上传Qt端


前言

在物联网和环境监测应用中,传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器和MQ4甲烷气体传感器


一、硬件准备

所需组件

  • ESP32开发板(如NodeMCU-32S、WROOM等)
  • BMP280温度气压传感器模块
  • MQ4甲烷气体传感器模块
  • 面包板和连接线
  • USB数据线

BMP280大气压力传感器

MQ4甲烷气体传感器

连接方式:

BMP280连接:

  • VCC → ESP32 3.3V
  • GND → ESP32 GND
  • SCL → ESP32 GPIO 22 (I2C时钟线)
  • SDA → ESP32 GPIO 21 (I2C数据线)

MQ4连接:

  • VCC → ESP32 3.3V或5V(根据传感器型号)
  • GND → ESP32 GND
  • AO → ESP32 GPIO 34 (模拟输入)
  • DO → ESP32 GPIO 35 (数字输入,可选)

二、软件实现

1.所需库

在Arduino IDE中,需要安装以下库:

  • Adafruit BMP280 Library
  • Adafruit Unified Sensor Library

可以通过Arduino IDE的库管理器直接安装即可。

2.代码实现

/*
 *BMP280 + MQ4 多传感器实时数据采集系统
 * 功能:同时读取 BMP280 的温度、气压、海拔数据和 MQ4 的甲烷浓度数据,并通过串口输出
 * 连接方式:
 *   BMP280 VCC -> ESP32 3.3V
 *   BMP280 GND -> ESP32 GND
 *   BMP280 SCL -> ESP32 GPIO 22 (SCL)
 *   BMP280 SDA -> ESP32 GPIO 21 (SDA)
 *   
 *   MQ4 VCC -> ESP32 3.3V 或 5V (根据传感器型号)
 *   MQ4 GND -> ESP32 GND
 *   MQ4 AO  -> ESP32 GPIO 34 (模拟输入)
 *   MQ4 DO  -> ESP32 GPIO 35 (数字输入,可选)
 */

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <driver/adc.h>
#include <math.h>

// 定义引脚
#define I2C_SDA 21
#define I2C_SCL 22
#define MQ4_ANALOG_PIN 34  // 模拟输入引脚
#define MQ4_DIGITAL_PIN 35 // 数字输入引脚
#define LED_PIN 2          // 内置LED,用于警报指示

// 甲烷浓度阈值
#define METHANE_THRESHOLD 1000

// 采样参数
const unsigned long SAMPLE_INTERVAL = 950;  // 采样间隔(毫秒)
unsigned long lastSampleTime = 0;

// 创建BMP280对象
Adafruit_BMP280 bmp;

// MQ4传感器校准参数
const float R0 = 10.0;  // 传感器在洁净空气中的电阻值
const float RL = 10.0;  // 负载电阻值10k

// 移动平均滤波
const int FILTER_SAMPLES = 10;
int filterIndex = 0;
int filterValues[FILTER_SAMPLES];
int filterSum = 0;

// bmp280的状态标志位
bool bmpSensorOK = false;



float temperature = 0.0;
float pressure = 0.0;
float altitude = 0.0;
float ppm = 0.0;

void setup() {
  // 初始化串口,波特率115200
  Serial.begin(115200);
  while(!Serial) delay(10);
  

  
  // 初始化I2C
  Wire.begin(I2C_SDA, I2C_SCL);
  
  // 初始化BMP280传感器
  if (!bmp.begin(0x76)) {  // bmp280地址:0x76地址
    Serial.println("无法连接BMP280");
    bmpSensorOK = false;
  } else {
    // 配置BMP280
    bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     // 工作模式
                    Adafruit_BMP280::SAMPLING_X2,     // 温度过采样
                    Adafruit_BMP280::SAMPLING_X16,    // 压力过采样
                    Adafruit_BMP280::FILTER_X16,      // 滤波器
                    Adafruit_BMP280::STANDBY_MS_500); // 待机时间
    
    Serial.println("BMP280初始化成功");
    bmpSensorOK = true;
  }
  
  // 初始化MQ4引脚
  pinMode(MQ4_ANALOG_PIN, INPUT);
  pinMode(MQ4_DIGITAL_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  
  // 初始化滤波器数组
  for (int i = 0; i < FILTER_SAMPLES; i++) {
    filterValues[i] = 0;
  }
  
  // 预热提示
  Serial.println("MQ4传感器预热中...");
  delay(3000);  //设置预热时间

}

void loop() {
  unsigned long currentTime = millis();
  
  // 每隔1s采样一次
  if (currentTime - lastSampleTime >= SAMPLE_INTERVAL) {
    lastSampleTime = currentTime;
    
    String status = "正常";
    
    // 读取BMP280传感器数据
    if (bmpSensorOK) {
      temperature = bmp.readTemperature();
      pressure = bmp.readPressure() / 100.0F; // 转换为hPa
      altitude = bmp.readAltitude(1013.25);   // 使用标准大气压
    }
    
    // 读取MQ4传感器数据
    int rawValue = analogRead(MQ4_ANALOG_PIN);
    bool digitalValue = digitalRead(MQ4_DIGITAL_PIN);
    
    // 应用移动平均滤波
    filterSum = filterSum - filterValues[filterIndex] + rawValue;
    filterValues[filterIndex] = rawValue;
    filterIndex = (filterIndex + 1) % FILTER_SAMPLES;
    int filteredValue = filterSum / FILTER_SAMPLES;
    
    // 计算电压值
    float voltage = filteredValue * (3.3 / 4095.0);
    
    // 计算传感器电阻比
    float rs = ((3.3 - voltage) / voltage) * RL;
    float ratio = rs / R0;
    
    // 计算甲烷浓度
    ppm = 1000 * pow(ratio, -2.95);
    
    // 检查是否超过阈值
    if (ppm > METHANE_THRESHOLD) {
      status = "警报";
      digitalWrite(LED_PIN, HIGH);  // 点亮LED作为警报
    } else {
      digitalWrite(LED_PIN, LOW);   // 关闭LED
    }
    
    Serial.print("温度:");
    if (bmpSensorOK) {
      Serial.print(temperature, 1);
      Serial.print("°C ");
    } else {
      Serial.print("未连接 ");
    }
    
    Serial.print("气压:");
    if (bmpSensorOK) {
      Serial.print(pressure, 1);
      Serial.print("hPa ");
    } else {
      Serial.print("未连接 ");
    }
    
    Serial.print("海拔:");
    if (bmpSensorOK) {
      Serial.print(altitude, 1);
      Serial.print("m ");
    } else {
      Serial.print("未连接 ");
    }
    
    Serial.print("甲烷:");
    Serial.print(ppm, 1);
    Serial.print("ppm ");
    
    Serial.print("状态:");
    Serial.println(status);
  }
}

在MQ4获取的数据中,我使用移动平均滤波来时数据更平滑,窗口大小为10,大家如果只是想要数据的话可以不用滤波。


效果演示

如下运行后的效果图:

 三、上传Qt端

 在esp32获取到数据时,通过udp数据打包发送到同一子网下的Qt服务端程序接收并显示,效果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQTT协议笔记

消息格式 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息协议&#xff0c;专为低带宽、高延迟或不可靠的网络设计&#xff0c;广泛应用于物联网&#xff08;IoT&#xff09;设备之间的通信。MQTT消息体的结构遵循MQTT协议规范&#xff0…

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…

VSCode 生成HTML 基本骨架

在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

【大模型基础_毛玉仁】3.4 Prompt 技巧

目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1&#xff09;任务说明要明确2&#xff09;上下文丰富且清晰3&#xff09;输出格式要规范4&#xff09;排版要清晰 3.4.2 合理归纳提问1&#xff09;复杂问题拆解2&#xff09;追问 3.4.3 适时使用CoT1&#xff09;何时使用CoT2&…

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…

wokwi arduino mega 2560 - 键盘与LCD显示

截图&#xff1a; 链接&#xff1a; https://wokwi.com/projects/414520193913760769 代码&#xff1a; //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库&#xff0c;用于LCD显示 #include <Keypad.h> // 引入Keypad库&#xff0c;用于键盘输…

Linux设置SSH免密码密钥登录

文章目录 设置SSH免密码密钥登录第一步&#xff1a; 生成SSH密钥对&#xff08;在客户端操作&#xff09;方式一&#xff1a;Windows 10/11 内置的 OpenSSH 客户端&#xff08;推荐&#xff09;常用选项&#xff1a;密钥算法选择建议生成秘钥 方式二&#xff1a;借用Xshell工具…

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

GPU算力哪家好?GpuGeek推出高性能GPU云服务

在人工智能和深度学习领域&#xff0c;GPU算力租赁已成为推动技术创新的关键因素。随着越来越多的企业和个人开发者投身于AI研究和应用开发&#xff0c;如何高效、灵活地获取GPU算力成为了一个亟待解决的问题。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其独特的优势&am…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…

组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)

一、什么是组态软件 组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域&#xff0c;用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具&#xff0c;使…

《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、背景信息 在ubuntu 22.04中&#xff0c;pam_tally2模块已被弃用&#xff0c;取而代之的是pam_faillock模块。因此&#xf…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播&#xff0c;计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求&#xff0c;小程序开通直播需要注册主体具备互联网直播的资质&#xff0c;普通企业需要《信息网络传播视听节目许可证》&#xff0c;表演性质的直播需要《网络文化经营许可证》&#xff0c;政府主体需要《社会信用代码》及…

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…