news 2026/7/28 9:12:53

基于ESP32与多传感器的DIY空气质量检测器全流程实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ESP32与多传感器的DIY空气质量检测器全流程实现

1. 项目概述:为什么我们需要一个自己的空气质量检测器?

最近几年,空气质量成了大家茶余饭后、甚至日常决策里绕不开的话题。无论是新家装修后担心甲醛残留,还是办公室密闭导致二氧化碳飙升让人昏昏欲睡,又或是秋冬季节的雾霾天,我们都需要一个客观的“裁判”来告诉我们,呼吸的这口空气到底怎么样。市面上的空气质量检测设备不少,从几十块的“玩具”到几千上万的“专业仪器”都有,但用久了你会发现痛点:便宜的精度堪忧,数据看看就好;专业的又太贵,而且功能固定,想加个远程查看或者数据长期记录,要么没有,要么得加钱买云服务。

所以,自己动手做一个“空气质量检测器”的想法就冒出来了。这不仅仅是一个DIY手工,更是一个融合了传感器技术、嵌入式开发和数据可视化的综合性项目。它的核心目标是:用可控的成本,获得可靠、透明且可扩展的空气质量监测能力。你可以把它放在儿童房监测甲醛和TVOC(总挥发性有机物),放在书房监测二氧化碳和PM2.5,甚至集成到智能家居系统中,当空气质量变差时自动开启空气净化器或新风机。

这个项目适合谁?如果你是电子爱好者、创客、智能家居玩家,或者单纯是对身边环境数据好奇、愿意动手的技术控,那么这个项目会给你带来巨大的乐趣和实用价值。它不要求你有极高的电子工程背景,但需要你有一点焊接和编程的耐心。接下来,我会把我从选型、组装到调试、优化的全过程,以及踩过的坑和收获的经验,毫无保留地分享给你。

2. 核心设计思路与方案选型

自己搭建一个检测器,第一步不是急着买零件,而是想清楚:我要测什么?精度要求多高?数据怎么呈现?预算多少?想明白了这些,方案自然就清晰了。

2.1 检测目标与传感器选型解析

空气质量的指标很多,我们需要抓住最核心、与健康和生活品质最相关的几项:

  1. 颗粒物(PM2.5/PM10):这是雾霾的“元凶”。检测原理主流是激光散射法。传感器方面,攀藤(PMS)系列夏普(GP2Y1010AU0F)是经典选择。攀藤的如PMS5003、PMS7003,通过串口输出数字信号,精度和稳定性在消费级里很不错,是首选。夏普的传感器输出的是模拟电压,需要单片机进行AD转换和公式计算,受环境影响大一些,但价格更低。
  2. 挥发性有机物与甲醛(TVOC/HCHO):主要来自装修材料、家具。这里要特别注意,甲醛传感器非常昂贵且寿命短。市面上几百块的“甲醛检测仪”用的多是电化学式VOC传感器,它对多种有机气体都有反应,将其读数标定为“甲醛等效浓度”。虽然不精准,但用于判断“有无污染”和“污染趋势”是足够的。常见的如炜盛科技的ZE08-CH2O(专门测甲醛)SGP30、SGP40(测TVOC和eCO2)。SGP30这类金属氧化物(MOX)传感器性价比高,通过I2C通信,非常容易集成。
  3. 二氧化碳(CO2):浓度过高直接导致困倦、注意力下降。最准的是NDIR(非分散红外)原理传感器。SenseAir S8MH-Z19B是代表产品,后者价格亲民,通过串口或PWM输出,精度能满足室内监测需求(误差±50ppm + 3%读数)。注意,有些传感器(如SCD30)也能测CO2,但价格更高。
  4. 温湿度:这是环境基本参数,而且温湿度数据能帮助解读其他传感器读数(例如,高温高湿可能加剧VOC释放)。DHT22或更精确的SHT31是绝佳选择,数字接口,使用简单。

选型心得:对于DIY项目,我强烈推荐“数字接口”优先。像PMS5003(PM2.5)、MH-Z19B(CO2)、SGP30(TVOC)、SHT31(温湿度)都是通过UART或I2C输出已经处理好的数字信号,极大减少了模拟电路设计和信号调理的麻烦,把精力集中在数据处理和逻辑上。

2.2 主控单元与系统架构设计

传感器确定了,就需要一个“大脑”来读取数据、处理并展示。

  1. 主控芯片选择

    • Arduino Uno/Nano:入门最简单,生态丰富,但性能有限,同时接多个串口传感器可能比较吃力,且网络功能需要外加模块(如ESP8266)。
    • ESP32这是本项目的最优解。理由很充分:它自带Wi-Fi和蓝牙,性能强大,有多个硬件串口,能轻松同时驱动PMS5003和MH-Z19B;丰富的GPIO和I2C接口可以连接其他传感器;还能运行简单的Web服务器,实现无线数据传输和网页显示。性价比极高。
    • 树莓派 Pico W:性能也不错,有Wi-Fi,但生态相对ESP32稍弱,在传感器库的支持广度上略逊一筹。
  2. 显示与交互方案

    • 本地显示:一块OLED显示屏(SSD1306, 0.96寸)足以显示核心数据。它体积小、功耗低、接口简单(I2C),非常适合嵌入式设备。
    • 远程查看:这是ESP32的强项。我们可以让它连接家庭Wi-Fi,定期将数据发送到:
      • 私有服务器:如部署在本地或云主机上的InfluxDB(时序数据库)+ Grafana(数据可视化),实现专业级的仪表盘。
      • 开源物联网平台:如Home Assistant,通过MQTT协议接入,直接融入智能家居生态。
      • 简易Web服务器:ESP32自身可以托管一个简单的网页,在手机或电脑浏览器输入设备IP就能看到实时数据图表。
  3. 供电与结构设计

    • 供电首选5V USB,方便且稳定。如果要做成电池供电的便携式,则需要考虑低功耗设计(如让传感器间歇性工作),并使用锂电池和充放电管理模块。
    • 结构上,需要为传感器设计合理的风道。特别是激光PM传感器,需要空气自然对流或通过小风扇引导气流经过检测腔,否则数据会不准。外壳可以使用3D打印,或者找一个合适尺寸的塑料盒钻孔改造。

我的最终方案定为:ESP32作为主控,集成PMS5003(PM2.5)、SGP30(TVOC/eCO2)、SHT31(温湿度)和OLED显示屏,数据通过Wi-Fi上传至本地Home Assistant,并显示在OLED屏上。MH-Z19B(CO2)作为可选升级项,因为SGP30估算的eCO2在室内人员稳定情况下有一定参考性,若需高精度CO2再额外添加。

3. 硬件连接与电路详解

方案定了,接下来就是把它们正确地连接起来。这一步看似是简单的连线,但细节决定成败。

3.1 元器件清单与引脚分配

以下是核心元器件清单:

元器件型号接口用途说明
主控板ESP32 DevKit V1-核心处理单元,提供Wi-Fi
颗粒物传感器攀藤 PMS5003UART (RX/TX)检测PM1.0, PM2.5, PM10
气体传感器Sensirion SGP30I2C (SDA/SCL)检测TVOC和等效CO2 (eCO2)
温湿度传感器Sensirion SHT31I2C (SDA/SCL)检测温度、湿度
显示屏OLED SSD1306 (128x64)I2C (SDA/SCL)本地数据显示
二氧化碳传感器(可选)Winsen MH-Z19BUART (RX/TX)高精度检测CO2浓度

ESP32的引脚非常多,我们需要合理分配,避免冲突。最重要的一点是:硬件串口(UART)的分配。

  • PMS5003:需要一组硬件UART。我们可以使用UART2,对应ESP32的引脚GPIO16 (RX2)GPIO17 (TX2)。连接时,ESP32的RX2接传感器的TX, ESP32的TX2接传感器的RX
  • MH-Z19B(如果选用):也需要一组硬件UART。可以使用UART1(引脚GPIO9 (RX1)/GPIO10 (TX1)),但注意这些引脚在有些ESP32板子上可能用于内部Flash,使用前需确认。更稳妥的方法是使用UART2以外的其他引脚通过“软件串口(SoftwareSerial)”库模拟,但这会占用CPU资源。如果只用一个串口传感器,就简单多了。
  • I2C总线:SGP30、SHT31、OLED可以共享一组I2C。ESP32的默认I2C引脚是GPIO21 (SDA)GPIO22 (SCL)。将它们全部并联到这两根线上即可,每个设备有唯一的I2C地址,不会冲突。
    • SHT31地址:0x44 或 0x45(取决于ADDR引脚电平)
    • SGP30地址:0x58(固定)
    • SSD1306地址:0x3C(常见)

3.2 电路连接图与焊接注意事项

由于无法绘制图形,我用文字描述连接关系:

  1. 电源部分:将所有设备的VCC(或Vin)连接到ESP32开发板的5V3.3V引脚。务必查阅每个传感器的数据手册!PMS5003和MH-Z19B通常是5V供电,但它们的串口信号电平可能是3.3V兼容的。SGP30、SHT31、OLED一般是3.3V设备。最安全的做法是:所有传感器都使用3.3V供电。如果传感器只支持5V(并确认其TX输出为5V电平),则需要在ESP32的RX引脚前加一个简单的电平转换电路(如分压电阻),防止损坏ESP32的3.3V GPIO。
  2. 地线(GND):将所有设备的GND与ESP32的GND连接在一起,共地是电路正常工作的基础。
  3. 信号线连接
    • PMS5003:TX->GPIO16 (RX2);RX->GPIO17 (TX2);VCC->3.3V;GND->GND.
    • SGP30:SDA->GPIO21;SCL->GPIO22;VCC->3.3V;GND->GND.
    • SHT31:SDA->GPIO21;SCL->GPIO22;VCC->3.3V;GND->GND.
    • OLED:SDA->GPIO21;SCL->GPIO22;VCC->3.3V;GND->GND.

焊接与布线实操心得

  1. 杜邦线测试:在最终焊接前,务必用杜邦线连接所有部件进行功能测试,确认每个传感器都能正常读数。这能避免焊接后发现问题,拆焊麻烦。
  2. 电源去耦:在ESP32的3.3V输出引脚附近,焊接一个10uF的电解电容和一个0.1uF的陶瓷电容到地,可以平滑电源,减少因传感器功耗波动导致的系统复位或读数异常。
  3. I2C上拉电阻:ESP32的内部上拉电阻可能不够强,尤其是当总线较长或设备较多时。建议在SDASCL线上各接一个4.7kΩ的外部上拉电阻到3.3V,确保信号稳定。
  4. 传感器摆放:PM传感器进气口周围不能有遮挡,要预留至少2-3厘米的空间。气体传感器(SGP30)应避免正对通风口,以免气流过快影响检测。

4. 软件编程与核心逻辑实现

硬件搭好了,接下来就是赋予它灵魂的软件部分。我们将使用Arduino IDE进行开发,因为它对ESP32和各类传感器库的支持非常好。

4.1 开发环境搭建与库文件安装

首先,确保你的Arduino IDE已安装ESP32开发板支持。

  1. 打开Arduino IDE,点击文件->首选项,在“附加开发板管理器网址”中输入:https://espressif.github.io/arduino-esp32/package_esp32_index.json
  2. 打开工具->开发板->开发板管理器,搜索“esp32”,安装“Espressif Systems”的ESP32平台。
  3. 安装必要的库。点击项目->加载库->管理库...,搜索并安装以下库:
    • Adafruit SGP30 Sensor(用于SGP30)
    • Adafruit SHT31 Library(用于SHT31)
    • Adafruit SSD1306Adafruit GFX Library(用于OLED)
    • PMS LibrarybyMikal Hart(用于PMS5003, 这个库很好用)
    • WiFiWebServer(ESP32内置,无需额外安装)
    • 如果使用MQTT,安装PubSubClient

4.2 主程序结构与数据读取逻辑

程序的核心逻辑是:初始化 -> 连接Wi-Fi -> 循环读取各传感器数据 -> 本地显示 -> 远程发送。下面分解关键代码段。

初始化与传感器对象创建:

#include <Wire.h> #include <Adafruit_SGP30.h> #include <Adafruit_SHT31.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <PMS.h> // 定义引脚 #define PMS_RX_PIN 16 #define PMS_TX_PIN 17 // 创建传感器对象 PMS pms(Serial2); // 使用ESP32的Serial2 (UART2) PMS::DATA data; Adafruit_SGP30 sgp; Adafruit_SHT31 sht31 = Adafruit_SHT31(); Adafruit_SSD1306 display(128, 64, &Wire, -1); // OLED对象 // 传感器数据全局变量 float temperature, humidity; uint16_t tvoc, eco2; uint16_t pm1_0, pm2_5, pm10; void setup() { Serial.begin(115200); // 用于调试输出 Wire.begin(21, 22); // 初始化I2C,指定SDA=21, SCL=22 // 初始化OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for(;;); // 死循环,阻止继续执行 } display.clearDisplay(); display.setTextSize(1); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println("Air Monitor Init..."); display.display(); // 初始化SHT31 if (!sht31.begin(0x44)) { Serial.println("Could not find SHT31"); while (1) delay(1); } // 初始化SGP30 if (!sgp.begin()){ Serial.println("SGP30 not found"); while (1) delay(1); } // SGP30需要初始基线值,首次运行需要一段“预热”时间 Serial.print("SGP30 Serial #"); Serial.println(sgp.serialnumber[0], HEX); Serial.println(sgp.serialnumber[1], HEX); // 初始化PMS传感器 Serial2.begin(9600, SERIAL_8N1, PMS_RX_PIN, PMS_TX_PIN); // 初始化UART2 pms.passiveMode(); // 设置为被动模式,由我们主动请求数据 // 连接Wi-Fi connectToWiFi(); }

循环读取数据:loop()函数中,我们需要错开读取不同传感器的时间,因为有些传感器(如SGP30)的读取需要间隔,且避免同时进行I2C和UART操作可能带来的微小冲突。

void loop() { unsigned long currentMillis = millis(); // 每2秒读取一次SHT31(温湿度) static unsigned long shtTimer = 0; if (currentMillis - shtTimer >= 2000) { shtTimer = currentMillis; temperature = sht31.readTemperature(); humidity = sht31.readHumidity(); if (isnan(temperature) || isnan(humidity)) { Serial.println("Failed to read from SHT31!"); } } // 每1秒读取一次SGP30(TVOC/eCO2) static unsigned long sgpTimer = 0; if (currentMillis - sgpTimer >= 1000) { sgpTimer = currentMillis; if (sgp.IAQmeasure()) { tvoc = sgp.TVOC; eco2 = sgp.eCO2; } else { Serial.println("SGP30 read failed"); } // 每30秒测量一次原始信号,用于基线计算(长期稳定性) static unsigned long sgpBaselineTimer = 0; if (currentMillis - sgpBaselineTimer >= 30000) { sgpBaselineTimer = currentMillis; uint16_t baselineCO2, baselineTVOC; if (sgp.getIAQBaseline(&baselineCO2, &baselineTVOC)) { // 可以将基线值保存到EEPROM,下次上电后调用sgp.setIAQBaseline()来恢复 } } } // 每5秒请求并读取一次PMS数据 static unsigned long pmsTimer = 0; if (currentMillis - pmsTimer >= 5000) { pmsTimer = currentMillis; pms.requestRead(); if (pms.readUntil(data)) { pm1_0 = data.PM_AE_UG_1_0; pm2_5 = data.PM_AE_UG_2_5; pm10 = data.PM_AE_UG_10_0; } } // 更新OLED显示 updateDisplay(); // 发送数据到服务器(例如每10秒一次) static unsigned long uploadTimer = 0; if (currentMillis - uploadTimer >= 10000) { uploadTimer = currentMillis; sendDataToServer(); } delay(10); // 短暂延时,释放CPU控制权 }

4.3 数据上传与远程访问实现

数据上传有两种主流方式:HTTP POST到自定义API,或者通过MQTT发布到主题。这里以MQTT接入Home Assistant为例,因为它更轻量、实时。

  1. MQTT配置:你需要一个MQTT Broker,Home Assistant内置的Mosquitto插件就很好用。
  2. ESP32端PubSubClient库编程
#include <PubSubClient.h> #include <WiFi.h> const char* mqtt_server = "192.168.1.100"; // 你的MQTT服务器IP WiFiClient espClient; PubSubClient client(espClient); void reconnectMQTT() { while (!client.connected()) { if (client.connect("ESP32_AirMonitor")) { // 客户端ID client.publish("airmonitor/status", "online"); Serial.println("MQTT Connected"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5s"); delay(5000); } } } void sendDataToServer() { if (!client.connected()) { reconnectMQTT(); } client.loop(); // 维持MQTT连接 // 构建JSON格式数据 String payload = "{"; payload += "\"temperature\":" + String(temperature, 1) + ","; payload += "\"humidity\":" + String(humidity, 1) + ","; payload += "\"tvoc\":" + String(tvoc) + ","; payload += "\"eco2\":" + String(eco2) + ","; payload += "\"pm25\":" + String(pm2_5) + ","; payload += "\"pm10\":" + String(pm10); payload += "}"; // 发布到MQTT主题 client.publish("airmonitor/sensors", payload.c_str()); }

在Home Assistant的configuration.yaml中配置MQTT传感器,就可以自动发现并显示这些数据了。

5. 校准、调试与性能优化

设备跑起来了,但数据准不准?稳不稳定?这才是项目从“能用”到“好用”的关键。

5.1 传感器校准与基线管理

  • SGP30的基线(Baseline):这是影响SGP30长期读数稳定性的关键。传感器在洁净空气中运行12-24小时后,会计算出稳定的基线值。代码中我们每30秒获取一次(sgp.getIAQBaseline())。关键操作是:将稳定运行后的基线值保存到ESP32的EEPROM或Flash中。下次开机时,先调用sgp.setIAQBaseline(baselineCO2, baselineTVOC),再开始测量。这能保证重启后数据快速恢复准确,而不是重新经历漫长的预热漂移。
  • PMS5003的校准:激光PM传感器一般出厂已校准,无需用户操作。但其读数受湿度影响。在湿度极高(>70%)时,水蒸气可能被误判为颗粒物,导致读数虚高。可以在软件端做一个简单的湿度补偿(需查找该传感器的补偿公式或系数),或者直接注明高湿环境下数据仅供参考。
  • MH-Z19B的零点和跨度校准:如果需要极高精度,可以按说明书进行手动校准,但通常室内应用,其出厂精度已足够。

5.2 数据稳定性处理与滤波算法

传感器原始数据常有微小跳动。直接显示会让人眼花缭乱,我们需要滤波。

  1. 移动平均滤波:最简单有效。例如,为每个数据维护一个数组,存储最近N次读数,求平均值作为输出。这能平滑掉随机噪声。
    #define FILTER_SIZE 5 float pm25Buffer[FILTER_SIZE]; int bufferIndex = 0; float filteredPM25(float newValue) { pm25Buffer[bufferIndex] = newValue; bufferIndex = (bufferIndex + 1) % FILTER_SIZE; float sum = 0; for (int i = 0; i < FILTER_SIZE; i++) { sum += pm25Buffer[i]; } return sum / FILTER_SIZE; }
  2. 一阶低通滤波(指数加权平均):更节省内存,公式为filteredValue = alpha * newValue + (1 - alpha) * filteredValuealpha是滤波系数(0<alpha<1),越小越平滑,但响应越慢。
  3. 阈值判断:对于突变异常值(如PM2.5瞬间从10跳到500又回来),可以设置一个合理的最大变化率,超过此变化率则视为干扰,丢弃或用上次有效值代替。

5.3 功耗优化与长期运行稳定性

如果考虑电池供电,功耗至关重要。

  1. 深度睡眠模式:ESP32可以配置为定时唤醒。例如,让设备每5分钟唤醒一次,读取所有传感器数据,通过Wi-Fi上传,然后立即重新进入深度睡眠。这能极大降低平均功耗。但注意,Wi-Fi重新连接耗时且耗电,需要权衡。
  2. 传感器供电控制:对于功耗较大的传感器(如PMS5003,工作电流约100mA),可以通过MOSFET或三极管开关电路,由ESP32的GPIO控制其电源,仅在需要测量时上电。
  3. OLED屏控制:显示一段时间后自动关闭背光。
  4. 软件看门狗:使用ESP32的硬件看门狗或软件定时器复位功能,防止程序跑飞导致死机。

长期运行心得:我的设备是7x24小时插电运行的。最大的稳定性挑战来自Wi-Fi连接。网络波动可能导致MQTT断开。我的解决方案是:在loop()中加强重连逻辑,并在Wi-Fi断开时,在OLED屏上显示错误状态。另外,定期重启是个“笨”但有效的方法。可以设置设备每运行24小时,自动重启一次,清理内存碎片,防止潜在的内存泄漏问题。这可以通过在loop()里判断millis()是否超过设定时间来实现。

6. 外壳制作与部署实践

一个裸露的电路板既不安全也不美观,更影响传感器采样。一个好的外壳是项目的最后一步,也是点睛之笔。

6.1 3D打印外壳设计与风道考量

我使用Fusion 360设计了外壳。设计要点:

  1. 分体结构:分为底盖和上盖,方便安装和维修。用螺丝柱固定ESP32和传感器小板。
  2. PM传感器风道:在PMS5003的进气口和出气口对应位置设计格栅。关键点:进气格栅面积要足够,内部空间要能让空气自然对流。有人会加一个小型静音风扇(5V)制造微弱气流,这样数据响应更快,尤其是监测突然的污染源(如点烟)时。风扇可以接在ESP32的GPIO上,用PWM控制转速。
  3. 气体传感器开孔:SGP30等气体传感器需要接触空气,但不能直接对着风口。在外壳侧面开一些小孔即可。
  4. 屏幕开窗:为OLED屏设计透明亚克力板或直接开窗。
  5. 线材管理:内部预留走线槽或扎线孔,让接线整洁。

将设计好的STL文件用3D打印机(如PLA材料)打出,然后进行组装。

6.2 部署位置选择与数据解读

设备做好了,放哪里也有讲究:

  • 避免位置:不要放在墙角、窗帘后、空调出风口正对面、厨房油烟机附近、窗户边(受室外影响剧烈波动)。
  • 理想位置:放在房间中央的桌面上,或离地1-1.5米高的墙面上(这是人体呼吸区高度)。确保周围空气流通,但无强风直吹。
  • 数据解读
    • PM2.5:室内优良应小于35μg/m³。炒菜、吸烟时会瞬间飙升。
    • TVOC:浓度低于0.6mg/m³为佳。新家具、油漆后会升高,通风后下降。
    • eCO2 (或CO2):室外约400ppm。室内低于1000ppm感觉舒适,超过1500ppm会感到闷、困倦。是判断是否需要开窗通风的极佳指标。
    • 温湿度:结合其他数据看。高温高湿可能让体感更闷,也可能加速污染物散发。

部署好后,你就可以在Home Assistant的仪表盘上,看到漂亮的历史曲线图,设置自动化(如CO2>1000ppm自动开窗通风),真正让数据服务于生活。

7. 常见问题排查与进阶玩法

即使按照步骤来,也可能会遇到问题。这里汇总一些我踩过的坑和解决办法。

7.1 硬件连接与通信故障

问题现象可能原因排查步骤
OLED不显示电源接反/没接;I2C地址错误;接线松动1. 检查VCC/GND。2. 用I2C扫描程序确认地址(通常是0x3C或0x3D)。3. 按压接线头。
SGP30/SHT31读数失败I2C上拉电阻问题;供电不足;传感器损坏1. 在SDA/SCL上加4.7k上拉电阻。2. 确保使用3.3V稳定供电,可并联一个电容。3. 运行I2C扫描,看地址是否出现。
PMS5003无数据串口引脚接反;波特率不对;模式不对1. 确认TX/RX交叉连接。2. 确认波特率为9600。3. 代码中是否调用了pms.wakeUp()pms.requestRead()
ESP32无法连接Wi-Fi密码错误;路由器设置(如MAC过滤);信号太弱1. 用Serial打印Wi-Fi连接状态。2. 检查路由器日志。3. 尝试将ESP32靠近路由器。
数据上传失败(MQTT)MQTT服务器地址/端口错;网络不通;客户端ID冲突1.ping一下MQTT服务器IP。2. 检查防火墙设置。3. 更换一个唯一的客户端ID。

7.2 软件与数据异常

  • 数据偶尔跳变到极大或极小值:这是典型的读数未完成或校验失败就使用了数据。务必在每次sgp.IAQmeasure()pms.readUntil(data)返回true(成功)后,才使用对应的数据变量。
  • SGP30读数长时间不变或变化缓慢:这是正常的。MOX气体传感器需要预热,初始几十小时读数可能不准且变化慢。持续通电运行,并正确保存/加载基线后,会逐渐稳定和灵敏。
  • ESP32频繁重启:可能是电源带载能力不足(所有传感器同时工作峰值电流大),或代码中有内存泄漏(如频繁动态分配字符串未释放)。确保使用足额(如2A)的5V USB电源,并检查代码中字符串处理部分。

7.3 项目扩展与进阶思路

这个基础平台有很大的扩展潜力:

  1. 增加更多传感器:如二氧化碳(MH-Z19B)甲醛(ZE08-CH2O)大气压(BMP280),甚至噪音传感器
  2. 本地告警:增加一个蜂鸣器或RGB LED灯。当PM2.5超标时红灯闪烁,CO2过高时黄灯亮起。
  3. 多房间组网:制作多个节点,分别放在客厅、卧室、书房。每个节点通过ESP-NOW(一种低功耗的ESP间直接通信协议)将数据汇总到一个“主节点”,再由主节点统一上传,节省每个节点都连Wi-Fi的配置和功耗。
  4. 太阳能供电:搭配小太阳能板和锂电池,实现完全无线化、户外部署,监测阳台或小院的空气质量。
  5. 数据分析与预测:将长期数据导出,用Python分析不同时间、天气、活动(如做饭、聚会)下的空气质量变化规律,甚至可以尝试简单的预测模型。

这个自制的空气质量检测器,带给你的不仅仅是一组数字,更是一种对生活环境的感知力和掌控感。从挑选传感器时对比参数的纠结,到焊接第一根线时的小心翼翼,从代码调试成功看到第一行数据时的喜悦,到将它放在家中默默守护时的安心,整个过程充满了创造的乐趣。它可能没有商业产品外观精致,但它的每一行代码、每一个数据你都了如指掌,这种透明和可定制性,正是DIY项目的魅力所在。希望我的这份详细记录,能帮你少走弯路,更快地享受到自己动手的成果。如果在制作中遇到任何问题,随时可以带着你的现象和代码来交流,很多时候,一个细节的调整就能让一切变得不同。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 9:12:13

MATLAB实现谬勒-莱尔错觉的视觉仿真与量化分析

1. 谬勒-莱尔错觉的理论基础与视觉机制 谬勒-莱尔错觉&#xff08;Mller-Lyer Illusion&#xff09;是心理学中最经典的视错觉现象之一&#xff0c;由德国精神病学家弗朗茨谬勒-莱尔在1889年首次描述。这个错觉表现为&#xff1a;当两条长度完全相同的线段分别附加向外或向内的…

作者头像 李华
网站建设 2026/7/28 9:11:56

one-properties-children-items

one-properties-children-items 【免费下载链接】jsonschema2md Convert Complex JSON Schemas into Markdown Documentation 项目地址: https://gitcode.com/gh_mirrors/js/jsonschema2md any of http://example.com/schemas/threehttp://example.com/schemas/two ###…

作者头像 李华
网站建设 2026/7/28 9:10:50

Ping命令原理与网络诊断实战指南

1. Ping命令的本质与网络诊断价值 当你在命令行输入"ping www.example.com"时&#xff0c;这个看似简单的操作背后隐藏着计算机网络通信的核心机制。作为最基础却又最强大的网络诊断工具&#xff0c;ping通过发送ICMP回显请求&#xff08;Echo Request&#xff09;报…

作者头像 李华
网站建设 2026/7/28 9:08:41

行空板Python入门:零基础硬件交互与传感器数据读取实战

1. 项目概述&#xff1a;为什么选择行空板作为Python入门的第一块板子&#xff1f;如果你刚刚接触编程&#xff0c;或者想从软件世界迈入硬件交互的奇妙领域&#xff0c;面对树莓派、Arduino、ESP32这些琳琅满目的开发板&#xff0c;是不是有点无从下手&#xff1f;树莓派功能强…

作者头像 李华
网站建设 2026/7/28 9:08:16

智能体AI技术爆发:2026年关键转折与应用解析

1. 智能体AI技术爆发背景解析 2026年被业界普遍视为智能体AI技术爆发的关键转折点&#xff0c;这背后是多项技术突破与市场需求的共同作用。从技术层面看&#xff0c;大模型能力的持续进化使得智能体具备了更接近人类水平的理解与决策能力。以Transformer架构为基础的模型参数量…

作者头像 李华