当前位置: 首页 > article >正文

ESP32驱动BMP280和MQ4传感器

文章目录

前言

一、硬件准备

所需组件

连接方式:

二、软件实现

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() {// 初始化串口,波特率115200Serial.begin(115200);while(!Serial) delay(10);// 初始化I2CWire.begin(I2C_SDA, I2C_SCL);// 初始化BMP280传感器if (!bmp.begin(0x76)) {  // bmp280地址:0x76地址Serial.println("无法连接BMP280");bmpSensorOK = false;} else {// 配置BMP280bmp.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; // 转换为hPaaltitude = 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服务端程序接收并显示,效果如下:

 

相关文章:

ESP32驱动BMP280和MQ4传感器

文章目录 前言 一、硬件准备 所需组件 连接方式&#xff1a; 二、软件实现 1.所需库 2.代码实现 效果演示 三、上传Qt端 前言 在物联网和环境监测应用中&#xff0c;传感器是获取环境数据的关键组件。本文将详细介绍如何使用ESP32微控制器同时驱动BMP280大气压力传感器…...

洛谷题单1-B2002 Hello,World!-python-流程图重构

题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 无输出 #1 Hello,World!方式-print() 代码 class Solut…...

MQTT协议笔记

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

CentOS系统下安装tesseract-ocr5.x版本

CentOS系统下安装tesseract-ocr5.x版本 安装依赖包&#xff1a; yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC&#xff08;因系统默认安装的GCC版本比较…...

“征服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…...

【字符设备驱动开发–IMX6ULL】(二)Linux 设备号

【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号 文章目录 【字符设备驱动开发–IMX6ULL】&#xff08;二&#xff09;Linux 设备号1 设备号的组成2.设备号的分配 1 设备号的组成 为了方便管理&#xff0c;Linux 中每个设备都有一个设备号&#xff0c;设…...

【大模型基础_毛玉仁】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…...

sql2022 复制 事务级别发布后无法删除

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission. 用SA用户登录执行下列语句 USE [xxxxx] GO EXEC dbo.sp_changedbowner loginame Nsa, …...

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…...

蓝桥杯算法实战分享

蓝桥杯算法实战分享 蓝桥杯是国内知名的程序设计竞赛&#xff0c;涵盖算法、数据结构、编程技巧等多个领域。本文将从实战角度分享蓝桥杯算法竞赛的常见题型、解题思路和优化技巧&#xff0c;帮助参赛者更好地备战。 1. 常见题型与解题思路 蓝桥杯的题型主要包括以下几类&…...

【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)

掌握高效决策的核心思想&#xff01;今日深入解析贪心算法的底层逻辑&#xff0c;聚焦区间调度与最优选择两大高频场景&#xff0c;结合大厂真题与严谨证明&#xff0c;彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法&#xff08;Greedy Algorit…...

构建稳健的机器学习系统:应对数据偏移挑战

构建稳健的机器学习系统&#xff1a;应对数据偏移挑战 1. 引言&#xff1a;数据偏移类型与挑战 在机器学习系统从实验室到生产环境的转变过程中&#xff0c;数据偏移&#xff08;Data Shift&#xff09;是最常见也最具挑战性的问题之一。所谓数据偏移&#xff0c;指的是训练数…...

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

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

3个版本的Unity项目的异同

根据搜索结果&#xff0c;以下是关于 SPR 3D Sample Scene(URP)、SPR Universal 3D 和 3D(Built-In Render Pipeline) 的定义及区别分析&#xff1a; 1. 定义与用途 SPR 3D Sample Scene(URP) 是基于 Universal Render Pipeline (URP) 的 3D 示例场景&#xff0c;专为展示 URP …...

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

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

Linux系统perf命令使用介绍,如何用此命令进行程序热点诊断和性能优化

Linux perf 命令使用指南&#xff1a;程序热点诊断与性能优化 perf 是 Linux 系统上一个强大的性能分析工具&#xff0c;它能够帮助开发者进行程序热点诊断和性能优化。下面详细介绍 perf 的使用方法。 1. perf 简介 perf (Performance Event Counters) 是 Linux 内核提供的…...

《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课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...

Spring MVC 深度解析:原理、源码剖析与实战

Spring MVC 深度解析&#xff1a;原理、源码剖析与实战 在 Spring 体系中&#xff0c;Spring MVC 作为 Web 层的核心框架&#xff0c;承担着请求处理、参数解析、视图渲染等关键任务。今天&#xff0c;我们将深入剖析 Spring MVC 的执行流程&#xff0c;结合 源码分析&#xf…...

347 前k个高频元素

步骤1&#xff1a;统计元素频率 使用哈希表&#xff08;unordered_map&#xff09;统计每个元素的出现次数&#xff0c;时间复杂度为 O(n)。 步骤2&#xff1a;构建最小堆维护Top K 优先队列&#xff08;最小堆&#xff09;&#xff1a;用priority_queue维护当前频率最高的k…...

BUUCTF-web刷题篇

1.EASYSQL破解密码 万能公式&#xff1a; 1 and 11 1 and 11 1 or 11 1 or 11 解释&#xff1a;payload SELECT * FROM tables WHERE username1 or 11 and password1 or 11 优先级排序&#xff1a;and 优先级高于 or&#xff0c;所以要计算 and 然后再计算 or username1…...