news 2026/5/25 23:44:58

基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于ESP32与MQTT的家庭环境监测系统:从传感器选型到数据可视化实战

1. 项目概述与核心价值

最近几年,我身边越来越多的朋友开始关注家里的空气质量、温湿度这些看不见摸不着,但又实实在在影响生活舒适度和健康的环境指标。从新装修的房子担心甲醛,到有老人小孩的家庭在意PM2.5和二氧化碳浓度,再到南方回南天对湿度的“深恶痛绝”,家庭环境监测的需求其实非常具体且迫切。市面上的智能家居单品不少,但往往功能单一,数据分散在各个APP里,难以形成一个整体的家庭环境画像。于是,自己动手搭建一套集成的、数据可追溯、甚至能联动其他智能设备的家庭环境监测系统,就成了一个既有趣又实用的极客项目。

这个项目的核心,就是利用一些开源硬件和传感器,将家庭中关键的环境参数进行数字化采集、集中显示,并为进一步的智能控制提供数据基础。它不像商业产品那样追求极致的工业设计,但胜在灵活、透明和可深度定制。你可以清楚地知道每一个数据从哪里来、如何计算,也可以根据自己的需求增减传感器,甚至将数据接入更强大的智能家居平台(如Home Assistant)来实现自动化场景。无论是物联网的初学者想练手,还是有一定经验的开发者希望打造一个完全符合自己需求的环境中枢,这个项目都能提供一条清晰的路径。接下来,我就结合自己的搭建经验,从设计思路、硬件选型、软件实现到实际部署中的坑点,为你完整拆解如何构建一个可靠的家庭环境监测系统。

2. 系统整体设计与架构解析

2.1 核心监测参数与传感器选型

一个完整的家庭环境监测系统,监测哪些参数是首要问题。这直接决定了系统的实用性和成本。经过实际居住体验的考量,我认为以下几个参数是核心:

  1. 温湿度:这是最基础的环境参数。温度影响体感和能耗,湿度则直接关系到体感舒适、家具保养以及霉菌滋生。推荐使用DHT22SHT31这类数字温湿度传感器。DHT22成本低、够用,但响应稍慢;SHT31精度和响应速度更好,价格也稍高。对于大多数家庭,DHT22完全足够。
  2. 空气质量(TVOC与eCO2):这是提升系统价值的关键。TVOC(总挥发性有机物)可以反映装修污染、家具释放、烹饪油烟等综合气体污染情况;eCO2(等效二氧化碳)浓度则能有效反映室内通风状况和人员密集度。SGP30SGP40传感器是极佳选择,它们通过金属氧化物半导体技术检测多种气体,通过算法输出TVOC和eCO2值,且体积小巧,非常适合嵌入式项目。
  3. 颗粒物(PM2.5/PM10):对于临近马路、常有灰尘或关心空气净化的家庭很重要。PMS5003SDS011激光粉尘传感器是主流选择。它们通过激光散射原理计数,精度远高于传统的红外传感器。需要注意的是,这类传感器需要风扇持续吸气,有一定功耗和噪音,安装位置需考虑。
  4. 气压:气压传感器(如BMP280)不仅能测气压,还能通过气压换算海拔高度(虽然家庭内变化不大),更重要的是,气压数据可用于简单的天气趋势预测(如气压持续下降可能预示降雨)。
  5. 光照与噪声(可选):光照传感器(如BH1750)可用于判断室内光线强度,联动窗帘或灯光;噪声传感器则可用于评估环境安静程度。

注意:传感器选型时,务必关注其通信接口。I2C和UART是嵌入式项目中最友好的接口,接线简单,编程方便。尽量避免使用需要复杂模拟电路或专用驱动芯片的传感器。

2.2 系统架构与核心组件

确定了监测目标后,就需要设计系统的骨架。一个典型的、可扩展的系统架构包含以下层次:

  1. 传感层:由上述各种传感器组成,负责原始数据采集。它们是系统的“感官”。
  2. 核心处理层:负责读取传感器数据、进行必要的校准和计算、管理网络连接、并将数据发送出去。这是系统的“大脑”。最常见的选择是ESP32开发板。理由很充分:它自带Wi-Fi和蓝牙,性能足够强大,功耗控制得当,有丰富的GPIO口支持多种传感器,并且拥有庞大的开源社区(Arduino、MicroPython、ESP-IDF),资源丰富。
  3. 数据传输层:负责将处理后的数据从设备端发送到服务器或显示端。对于家庭内网项目,MQTT协议是事实上的标准。它是一种轻量级的发布/订阅消息协议,非常适合物联网设备间歇性上报数据的场景。设备(发布者)将数据发送到MQTT代理(Broker),其他客户端(订阅者,如显示端、数据库)从Broker订阅所需数据,实现解耦。
  4. 数据汇聚与展示层:这是用户交互的界面。数据需要被存储、可视化。这里有多个选择:
    • 轻量级方案:使用Node-RED。这是一个基于流的编程工具,可以非常直观地搭建数据处理逻辑。它可以订阅MQTT数据,然后通过Dashboard插件生成简单的图表和仪表盘,直接在网页上显示。部署简单,适合快速原型。
    • 中度集成方案:使用Home Assistant。如果你本身就是智能家居玩家,那么将环境数据接入HA是顺理成章的事。ESP32可以通过MQTT自动被HA发现,数据直接成为HA中的实体,可以利用HA强大的UI和自动化引擎进行展示和联动。
    • 自建数据库方案:对于希望长期存储并做深度分析的用户,可以将数据通过MQTT写入InfluxDB(时序数据库),然后使用Grafana来制作专业、美观的仪表盘。这是功能最强大、最灵活的方案,但部署和维护复杂度也最高。

我的建议是,初学者可以从Node-RED开始,快速看到成果;智能家居深度用户直接对接Home Assistant;数据控和极客则可以考虑InfluxDB+Grafana的组合。

3. 硬件搭建与电路连接详解

3.1 主要物料清单与准备

在开始焊接和接线前,请准备好以下核心物料。我列出的都是经过验证的、性价比高的型号,你可以根据预算和需求调整。

组件推荐型号数量说明
主控板ESP32 DevKitC V4 或 NodeMCU-32S1核心处理器,确保引脚够用。
温湿度传感器DHT22 (AM2302)1注意区分模块版(带PCB)和探头版。
空气质量传感器SGP301测量TVOC和eCO2,I2C接口。
颗粒物传感器PMS50031测量PM1.0, PM2.5, PM10,UART接口。
气压传感器BMP2801测量气压、温度,I2C接口。
面包板与杜邦线-若干用于原型搭建,公对公、公对母都需要。
USB数据线Micro-USB1用于供电和程序烧录。
电源5V/2A USB适配器1长期运行需稳定供电,尤其带PMS5003时。

实操心得:购买传感器时,优先选择“模块”而非“裸传感器”。模块通常已经集成了必要的基础电路(如上拉电阻、电平转换、稳压芯片),并提供了友好的引脚(如VCC, GND, SDA, SCL),极大降低了连接难度和出错概率。多花几块钱,省去大量麻烦。

3.2 电路连接图与接线要点

将所有传感器连接到ESP32是第一步。为了清晰和避免干扰,强烈建议遵循“电源先行,信号分类”的原则。下图展示了基于I2C和UART的典型连接方式(以ESP32 DevKitC为例):

连接示意图(文字描述):

  1. 统一供电:将ESP32的3.3V引脚(或VIN引脚,如果你用5V供电)作为主电源正极,连接到面包板的正极总线。将所有传感器的VCC/VIN引脚连接到这根总线。
  2. 统一接地:将ESP32的GND引脚连接到面包板的负极总线。将所有传感器的GND引脚连接到这根总线。确保共地!这是通信稳定的基础。
  3. I2C总线连接:对于SGP30、BMP280这类I2C设备。
    • 将ESP32的GPIO21作为SDA(数据线)连接到所有I2C传感器的SDA引脚。
    • 将ESP32的GPIO22作为SCL(时钟线)连接到所有I2C传感器的SCL引脚。
    • 注意:I2C总线上通常需要上拉电阻。幸运的是,ESP32内部可以配置软件上拉,而大多数传感器模块也已经在板上集成了物理上拉电阻(通常是4.7kΩ或10kΩ)。如果你的模块没有,则需要在SDA和SCL线上各接一个4.7kΩ电阻到3.3V。
  4. UART连接:对于PMS5003这类UART设备。
    • PMS5003的TX引脚(发送端)应连接到ESP32的一个RX引脚(接收端),例如GPIO16
    • PMS5003的RX引脚(接收端)应连接到ESP32的一个TX引脚(发送端),例如GPIO17
    • 重要:PMS5003的工作电压是5V,但其UART信号电平是3.3V。大多数模块的输出已经是3.3V,可以直接连接ESP32的GPIO(ESP32的GPIO可耐受5V输入)。但为安全起见,最好确认模块规格,或使用电平转换模块。
  5. 单线连接:对于DHT22(单总线协议)。
    • 将DHT22的数据引脚连接到ESP32的一个GPIO,例如GPIO4
    • 该数据线通常也需要一个4.7kΩ - 10kΩ的上拉电阻到3.3V。模块版通常已集成。

接线完成后的检查清单:

  • [ ] 所有VCC是否都接到了3.3V(或5V)?
  • [ ] 所有GND是否都共地?
  • [ ] I2C设备的SDA、SCL是否分别并联?
  • [ ] UART设备的TX-RX是否交叉连接?
  • [ ] 电源适配器是否能提供足够电流(ESP32+PMS5003风扇峰值可能超过500mA)?

4. 软件环境配置与核心代码实现

4.1 开发环境与库安装

我们使用Arduino IDE进行开发,因为它对初学者最友好,库生态丰富。

  1. 安装Arduino IDE:从官网下载并安装最新版。
  2. 添加ESP32开发板支持
    • 打开文件->首选项,在“附加开发板管理器网址”中输入:https://espressif.github.io/arduino-esp32/package_esp32_index.json
    • 打开工具->开发板->开发板管理器,搜索“esp32”,安装由“Espressif Systems”提供的版本。
  3. 安装必要的库:打开项目->加载库->管理库...,搜索并安装以下库:
    • DHT sensor library(by Adafruit):用于驱动DHT22。
    • Adafruit SGP30 Sensor:用于驱动SGP30。
    • Adafruit BMP280 Library:用于驱动BMP280。
    • PubSubClient(by Nick O‘Leary):用于MQTT通信。
    • ArduinoJson(by Benoit Blanchon):用于处理JSON格式数据(推荐)。
  4. 准备MQTT代理:你需要在本地网络运行一个MQTT Broker。最轻量级的选择是Mosquitto。可以在树莓派、NAS或一台常开机的电脑上安装。对于快速测试,也可以使用一些公共的免费Broker(仅限测试,生产环境勿用)。

4.2 核心代码逻辑与分步解析

下面是一个集成DHT22、SGP30、BMP280,并通过MQTT上报数据的核心代码框架。我将逐段解释关键部分。

#include <WiFi.h> #include <PubSubClient.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> #include <Adafruit_SGP30.h> #include <DHT.h> // 1. 网络和MQTT配置 const char* ssid = "你的Wi-Fi名称"; const char* password = "你的Wi-Fi密码"; const char* mqtt_server = "192.168.1.100"; // 你的MQTT Broker IP const int mqtt_port = 1883; const char* mqtt_topic = "home/sensor/room1"; // MQTT发布主题 WiFiClient espClient; PubSubClient client(espClient); // 2. 传感器对象定义与引脚定义 #define DHTPIN 4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); Adafruit_BMP280 bmp; Adafruit_SGP30 sgp; // 3. 全局变量存储读数 float temperature, humidity, pressure; uint16_t tvoc, eco2; // 4. 初始化函数 void setup() { Serial.begin(115200); delay(1000); // 初始化传感器 initSensors(); // 连接Wi-Fi setupWiFi(); // 配置MQTT客户端 client.setServer(mqtt_server, mqtt_port); // client.setCallback(callback); // 如果需要订阅指令,可设置回调函数 } void loop() { // 确保MQTT连接保持 if (!client.connected()) { reconnectMQTT(); } client.loop(); // 每5秒读取并发送一次数据(避免频繁请求,某些传感器需要间隔) static unsigned long lastReadTime = 0; if (millis() - lastReadTime > 5000) { lastReadTime = millis(); readSensorData(); publishData(); } } // 5. 传感器初始化子函数 void initSensors() { // 启动I2C总线 Wire.begin(); // 初始化DHT22 dht.begin(); Serial.println("DHT22 init..."); // 初始化BMP280 if (!bmp.begin(0x76)) { // 0x76是常见I2C地址,也可能是0x77 Serial.println("Could not find BMP280 sensor!"); while (1); } bmp.setSampling(...); // 可配置采样模式,详见库文档 Serial.println("BMP280 init OK"); // 初始化SGP30 if (!sgp.begin()){ Serial.println("SGP30 not found!"); while (1); } Serial.println("SGP30 init OK"); // SGP30需要初始基线校准,通常运行一段时间后,将稳定值设为基线 } // 6. Wi-Fi连接子函数 void setupWiFi() { delay(10); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } // 7. MQTT重连子函数 void reconnectMQTT() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP32-Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); // 连接成功后,可以订阅主题 // client.subscribe("home/command"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } // 8. 读取传感器数据子函数 void readSensorData() { // 读取DHT22 (注意:读取DHT22相对较慢,且两次读取需间隔至少2秒) humidity = dht.readHumidity(); temperature = dht.readTemperature(); // 读取摄氏温度 // 检查DHT22读数是否有效 if (isnan(humidity) || isnan(temperature)) { Serial.println("Failed to read from DHT sensor!"); // 可以在此使用BMP280的温度作为备用(但BMP280对机内温度敏感) temperature = bmp.readTemperature(); humidity = 50.0; // 或设置一个默认值 } // 读取BMP280 pressure = bmp.readPressure() / 100.0F; // 转换为百帕(hPa) // 读取SGP30 if (sgp.IAQmeasure()) { tvoc = sgp.TVOC; eco2 = sgp.eCO2; } else { Serial.println("SGP30 read failed"); tvoc = 0; eco2 = 400; } } // 9. 发布数据到MQTT子函数 void publishData() { // 构建JSON格式的字符串,便于其他系统解析 String payload = "{"; payload += "\"temperature\":" + String(temperature, 1) + ","; payload += "\"humidity\":" + String(humidity, 1) + ","; payload += "\"pressure\":" + String(pressure, 1) + ","; payload += "\"tvoc\":" + String(tvoc) + ","; payload += "\"eco2\":" + String(eco2); payload += "}"; // 发布消息 if (client.publish(mqtt_topic, payload.c_str())) { Serial.println("Publish OK: " + payload); } else { Serial.println("Publish FAILED"); } }

代码关键点解析:

  • 传感器地址:I2C设备有地址。BMP280常见地址是0x760x77,如果初始化失败,尝试换一个地址。SGP30的地址是固定的0x58
  • SGP30基线校准:SGP30的算法需要“干净空气”和“稳定运行”下的基线值来保证长期准确性。代码中未包含自动保存/加载基线的逻辑,这是一个高级话题。对于初期使用,可以忽略,传感器在连续运行48小时后会自我优化。更完善的实现需要将sgp.getIAQBaseline()得到的基线值保存到EEPROM或Flash中,并在启动时用sgp.setIAQBaseline()设置。
  • 错误处理:代码中对DHT22和SGP30的读取做了简单的错误处理。在实际应用中,你可能需要更健壮的逻辑,比如多次重试、使用上一次有效值等。
  • JSON格式:使用JSON格式发布数据是推荐做法,因为它结构清晰,容易被Node-RED、Home Assistant等系统解析。ArduinoJson库可以更优雅地构建和解析JSON。
  • 发布频率loop函数中设置了5秒的发布间隔。对于环境监测,这个频率足够了。过于频繁会增加网络负担和传感器功耗(尤其是SGP30和PMS5003)。

5. 数据可视化与系统集成实战

5.1 使用Node-RED创建简易仪表盘

设备端代码完成后,数据已经通过MQTT发出。接下来我们需要一个“接收端”来展示。Node-RED是最快上手的方案。

  1. 安装Node-RED:在你的服务器(如树莓派)上,可以通过一条命令安装:bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)。安装后运行node-red-start
  2. 访问Node-RED:打开浏览器,访问http://你的服务器IP:1880
  3. 搭建流(Flow)
    • 从左侧面板拖入一个mqtt in节点。双击配置,添加你的MQTT Broker服务器地址,并填写主题home/sensor/room1
    • 拖入一个json节点,连接到mqtt in节点后面。这个节点将字符串解析为JSON对象。
    • 为每个你想显示的数据(如温度、湿度),拖入一个function节点。在函数节点里,写一行简单的代码来提取数据,例如msg.payload = msg.payload.temperature; return msg;。这样就把完整的JSON对象中的温度值提取出来,作为新的payload
    • 为每个function节点连接一个chart节点(用于趋势图)或gauge节点(用于仪表盘)。双击这些UI节点进行样式和范围设置(如温度设置0-40度)。
    • 最后,拖入一个dashboard节点(tabgroup),将UI节点与它关联,以组织布局。
  4. 部署与查看:点击右上角红色“部署”按钮。然后访问http://你的服务器IP:1880/ui,就能看到实时刷新的仪表盘了。

Node-RED的优势是图形化、灵活,可以轻松添加其他逻辑,比如当TVOC超过阈值时发送一条通知到手机。

5.2 集成到Home Assistant实现自动化

如果你使用Home Assistant,集成会更加无缝。

  1. 在HA中配置MQTT:确保HA的configuration.yaml中已启用MQTT集成。如果使用Mosquitto插件,通常会自动发现。
  2. ESP32自动发现:上述Arduino代码使用的是基本MQTT发布。为了让HA自动创建实体,你需要让设备发布符合Home Assistant MQTT发现协议的消息。这需要修改publishData函数,为每个传感器单独发布一个配置消息和一个状态消息。幸运的是,有现成的库如AsyncMqttClient和特定示例可以简化此过程。核心思想是:设备启动时,向homeassistant/sensor/room1_temperature/config这样的主题发布一个配置JSON,声明这是一个温度传感器、单位是°C、值模板等。然后定期向homeassistant/sensor/room1_temperature/state发布温度值。
  3. 手动配置:如果觉得自动发现复杂,也可以在HA的configuration.yaml中手动定义MQTT传感器:
    sensor: - platform: mqtt name: "Room Temperature" state_topic: "home/sensor/room1" unit_of_measurement: "°C" value_template: "{{ value_json.temperature }}" - platform: mqtt name: "Room Humidity" state_topic: "home/sensor/room1" unit_of_measurement: "%" value_template: "{{ value_json.humidity }}" # ... 以此类推
  4. 创建自动化:数据进入HA后,你就可以创建强大的自动化了。例如:“当客厅eCO2浓度超过1000ppm时,自动打开新风系统或发送提醒到手机”;“当湿度超过70%时,自动开启空调除湿模式”。这才是家庭环境监测系统的终极价值所在——从感知到自动执行。

6. 部署优化与常见问题排查

6.1 长期运行稳定性优化

原型在桌面上运行良好,但要7x24小时稳定工作,还需要一些优化。

  1. 电源稳定性:避免使用电脑USB口长期供电。使用质量可靠的5V/2A USB电源适配器。如果设备安装在偏远位置,考虑使用带有电容的电源模块,以应对可能的电压波动。
  2. 外壳与散热:为ESP32和传感器制作一个简单的外壳(3D打印或亚克力拼装),避免灰尘和短路。注意PMS5003这类有风扇的传感器需要保持进气口通畅。
  3. 看门狗与异常重启:在代码中启用硬件看门狗(WDT),防止程序跑飞导致死机。ESP32的Arduino核心默认启用了任务看门狗,但你也可以添加一些软件看门狗逻辑,在关键循环中定期“喂狗”。
  4. Wi-Fi连接维护:网络环境可能变化。增强reconnectMQTT函数,加入对Wi-Fi连接状态的检查。如果Wi-Fi断开,先尝试重连Wi-Fi,再连MQTT。
  5. 数据缓存与断线续传:对于关键数据,可以考虑在ESP32的SPIFFS或EEPROM中缓存最近几次的读数。当网络恢复后,先补发缓存的数据(需注意时间戳),保证数据连续性。这属于高级功能。
  6. 降低功耗:如果使用电池供电,需要深度优化:使用ESP32的深度睡眠模式,定时唤醒测量并发送数据,发送完毕后立即重新睡眠。这需要硬件上连接ENGPIO0引脚来实现自动唤醒。

6.2 常见问题与解决方案速查表

在搭建和运行过程中,你几乎一定会遇到下面这些问题。这里是我的排查清单:

问题现象可能原因排查步骤与解决方案
ESP32无法连接Wi-Fi1. SSID/密码错误
2. Wi-Fi信号太弱
3. 路由器设置了MAC过滤
1. 检查代码中的SSID和密码,注意特殊字符。
2. 将设备靠近路由器测试。
3. 查看路由器后台,将ESP32的MAC地址加入白名单(或关闭过滤)。
MQTT连接失败1. Broker地址/端口错误
2. 网络防火墙阻止
3. Broker未运行或需要认证
1. 用电脑上的MQTT客户端(如MQTTX)测试Broker是否可达。
2. 检查服务器防火墙是否开放1883端口。
3. 确认Mosquitto服务已启动,如果设置了用户名密码,需在代码中配置。
传感器读数全为0或NaN1. 电源未接通或电压不足
2. I2C/UART接线错误
3. 传感器地址错误
4. 库未正确安装或初始化顺序问题
1. 用万用表测量传感器VCC和GND间电压是否为3.3V。
2. 仔细检查接线,特别是TX/RX是否接反。
3. 使用I2C扫描程序(Arduino有示例)检查设备地址。
4. 查看串口输出的初始化信息,确保每个传感器都显示“init OK”。
SGP30读数长期不变或不准1. 未进行基线校准
2. 传感器预热不足
1. 让设备在通风良好的环境下连续运行48小时以上,算法会自我校准。
2. 实现基线保存/加载功能,提升长期稳定性。
DHT22读数偶尔失败1. 读取间隔太短
2. 信号线过长或干扰
3. 上拉电阻缺失或阻值不对
1. 确保两次read操作间隔大于2秒。
2. 缩短数据线长度,远离电源线。
3. 在数据线和3.3V之间添加一个4.7kΩ电阻。
PMS5003数据乱码1. TX/RX接反
2. 波特率不匹配
3. 电源电流不足导致工作不稳定
1. 确认PMS5003的TX接ESP32的RX。
2. PMS5003固定波特率为9600,确认串口初始化正确。
3. 使用独立5V/1A以上电源给PMS5003供电,或检查总电流。
Node-RED收不到数据1. MQTT节点配置错误
2. 主题(Topic)不匹配
3. 数据格式无法解析
1. 检查Broker地址、端口、主题是否与ESP32代码一致。
2. 在Node-RED中添加一个debug节点连接到mqtt in后,查看原始报文。
3. 如果payload是JSON,确保使用了json节点进行解析。
Home Assistant中实体显示“不可用”1. MQTT集成配置错误
2. 设备长时间未上报数据
3. 自动发现未生效或冲突
1. 检查HA日志,查看MQTT连接和订阅状态。
2. 确认ESP32在线并在持续发布消息。
3. 尝试在HA开发者工具的“MQTT”选项卡下监听主题,看是否能收到消息。

6.3 从原型到产品的进阶思考

当你的系统稳定运行后,可能会考虑如何让它更“像样”。

  1. 多房间部署:复制多个ESP32节点,放置在不同房间(客厅、卧室、书房)。只需修改代码中的mqtt_topic(如home/sensor/livingroom,home/sensor/bedroom)和设备ID即可。在Node-RED或HA中为每个房间创建独立的视图。
  2. 低功耗与电池供电:如前所述,使用深度睡眠。计算一下:ESP32深度睡眠电流约10μA,激活后工作电流约80mA。如果每5分钟唤醒一次,工作10秒后睡眠,那么一节2000mAh的18650电池理论上可以工作数月。这需要仔细的电源管理和可能的分压电路。
  3. 自定义PCB:如果对多个设备有需求,可以考虑设计一块简单的PCB,将ESP32和所有传感器集成在一起,体积更小,可靠性更高。嘉立创等平台提供了非常便宜的打样服务。
  4. 数据持久化与分析:将数据存入InfluxDB,用Grafana绘制历史趋势曲线、生成日报/周报。你可以分析出“每天下午3点客厅CO2浓度最高”、“卧室湿度在夜间会显著上升”等规律,为生活方式调整提供数据支持。

这个项目最吸引人的地方在于,它从一个简单的数据采集点开始,可以根据你的兴趣和技能,无限扩展成一个真正的家庭环境智能中枢。每一次调试、每一个问题的解决,都会让你对物联网系统的理解更深一层。

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

“烟雾飘散方向不对”是Prompt问题还是模型缺陷?2024 Q2 Midjourney烟雾物理引擎更新深度逆向分析(含3大未公开--stylize影响因子)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;烟雾物理引擎的底层架构与设计哲学 烟雾物理引擎并非传统刚体或流体模拟的简单延伸&#xff0c;而是一种面向视觉真实感与实时交互双重目标的轻量级粒子场耦合系统。其设计哲学根植于“可预测的混沌”——在保…

作者头像 李华
网站建设 2026/5/25 23:40:37

教育机构搭建AI编程辅导平台时如何通过Taotoken管理多学员用量

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 教育机构搭建AI编程辅导平台时如何通过Taotoken管理多学员用量 在构建面向学员的AI编程辅导平台时&#xff0c;教育科技团队面临一…

作者头像 李华
网站建设 2026/5/25 23:39:38

Windows文件夹共享

目标&#xff1a;同一局域网实现在一台计算机上共享文件夹&#xff0c;在另一台电脑访问一、电脑A 1.点击要共享的文件夹 -> 属性 -> 共享2.添加Everyone用户组3.控制面板中网络共享关闭密码保存&#xff0c;在访问时不用输入账号密码。二、电脑B 1.在文件资源管理器路径…

作者头像 李华
网站建设 2026/5/25 23:39:37

【Java基础|Stream流:从基础入门到实战进阶,告别繁琐循环!】

前言在Java 8之前&#xff0c;我们对集合、数组进行过滤、遍历、排序、分组、求和等操作时&#xff0c;往往需要编写大量冗余的for循环、迭代器代码&#xff0c;不仅代码繁琐、可读性差&#xff0c;还极易出错&#xff0c;并行处理也需要手动编写多线程代码&#xff0c;开发效率…

作者头像 李华
网站建设 2026/5/25 23:38:55

水泵自动化控制系统:设备联动,整套水务设备协同运转

水泵自动化控制系统&#xff0c;是一套以PLC/控制器传感器变频器云平台为核心&#xff0c;对水泵进行自动启停、变频调速、恒压/恒液位、故障保护、远程监控与智能调度的一体化解决方案&#xff0c;目标是无人值守、节能降耗、安全可靠、运维高效。 一、解决的核心痛点人工依赖…

作者头像 李华