
1. 项目概述一个无线气象站的诞生几年前我还在为一个农业大棚项目头疼需要实时监测几个不同区域的温湿度但拉线布线不仅成本高还容易在田间地头被损坏。那时候我就想如果能有一个小巧、便宜、能自己组装的无线气象站该多好。于是基于 Arduino 和无线模块的 DIY 气象站就成了我的首选方案。这不仅仅是一个玩具对于很多创客、学生甚至是有特定环境监测需求的小型项目来说它都是一个极具性价比和灵活性的解决方案。一个典型的 Arduino 无线气象站核心功能就是采集环境数据如温度、湿度、气压、光照等然后通过无线方式如 Wi-Fi、LoRa、蓝牙或 433MHz 射频将数据发送到接收端。接收端可以是一台电脑、一个手机 App或者另一个 Arduino 设备用于显示、记录甚至触发一些自动化操作。它解决了传统有线传感器部署不便、移动性差的问题特别适合分布式监测、远程数据收集等场景。无论你是刚接触 Arduino 的新手想通过一个综合项目练手还是有一定经验的开发者需要为一个具体应用比如家庭花园监测、小型实验室环境监控快速搭建原型这个项目都能提供从硬件选型、电路连接、代码编写到数据可视化的完整经验。下面我就把自己从多次实践中总结的搭建过程、踩过的坑以及优化技巧毫无保留地分享出来。2. 核心硬件选型与设计思路搭建无线气象站第一步也是最重要的一步就是硬件选型。选型决定了项目的成本、复杂度、通信距离和功耗需要根据你的具体应用场景来权衡。2.1 主控板Arduino 家族的选择Arduino 板子是大脑。对于气象站常见选择有Arduino Uno R3经典入门款。优势是生态极其丰富任何传感器模块几乎都有现成库调试方便。缺点是本身不带无线功能需要额外搭配无线模块如 ESP-01 Wi-Fi 模块或 NRF24L01 2.4G 模块整体体积和接线会稍显复杂。适合纯粹学习、验证想法的新手。Arduino Nano功能与 Uno 相同但体积小巧适合需要将整个设备装入小盒子的场景。同样需要外接无线模块。ESP32 或 ESP8266 开发板这是目前无线气象站的主流甚至首选方案。以 ESP32 为例它本身就是一个功能强大的微控制器且集成了 Wi-Fi 和蓝牙。这意味着你不需要额外购买和连接无线模块一块板子搞定计算和通信大大简化了硬件设计。像 NodeMCU、Wemos D1 mini基于 ESP8266等板子价格甚至比 Arduino Uno Wi-Fi 模块的组合更便宜性能更强。强烈建议大多数项目直接使用 ESP32除非你有特殊的外设或库兼容性要求。注意虽然我们常说“Arduino 气象站”但技术上完全可以使用 ESP32 并在 Arduino IDE 中进行开发因为 ESP32 已被 Arduino 核心库完美支持。在 IDE 的板卡管理器中添加 ESP32 支持后编程体验与标准 Arduino 几乎无异。2.2 传感器模块数据的来源根据你想监测的数据选择传感器温湿度DHT11低成本精度一般、DHT22精度更高量程更广或SHT31工业级精度价格高。DHT系列使用单总线通信接线简单。气压与海拔BMP280或BME280。BME280 更强大它集成了温度、湿度和气压三种传感器。如果你只需要气压和温度BMP280 更便宜。它们都使用 I2C 或 SPI 接口。光照强度BH1750。数字光照传感器使用 I2C 接口精度高使用方便。空气质量可选MQ-135检测多种有害气体或SGP30TVOC 和 eCO2 数字输出。MQ系列是模拟传感器需要校准受环境影响大SGP30 是数字传感器更稳定。设计思路对于入门我推荐ESP32 BME280的组合。BME280 一颗芯片搞定温、湿、压三大核心气象数据通过 I2C 与 ESP32 连接只需两根数据线SCL SDA加上电源和地总共4根线硬件连接极其清爽。这避免了使用多个传感器带来的接线混乱和地址冲突问题。2.3 无线通信方案连接世界的桥梁这是“无线”二字的灵魂所在选择最多Wi-Fi (ESP32/ESP8266 内置)最通用、最方便的方案。气象站连接本地路由器数据可以发送到局域网内的电脑或者通过路由器上传到互联网如发送到 ThingSpeak、Blynk 等物联网平台或自建的 MQTT 服务器。优势是网络基础设施现成数据传输速率高可与手机/电脑直接交互。缺点是依赖路由器通信距离受限于 Wi-Fi 信号范围通常室内50米且功耗相对较高不适合电池长期供电。LoRa (如 SX1278 模块)专为远距离、低功耗通信设计。通信距离在城市可达几公里郊区甚至十几公里功耗极低。适合野外、农田、没有网络覆盖区域的分布式监测。缺点是数据传输速率很慢每秒几十到几百字节不适合传输图像或高频数据且需要配对使用一个发送一个接收。你需要至少两个 LoRa 模块或者一个 LoRa 模块搭配一个 LoRa 网关。蓝牙 (ESP32 内置)适合短距离10米直接与手机通信的场景比如做一个便携式气象检测仪手机靠近就能读取数据。不适合远程或长期数据记录。433MHz/315MHz 射频 (如 HC-12、SI4463 模块)类似 LoRa距离较远几百米到上公里成本低廉但抗干扰能力和可靠性通常不如 LoRa需要自己处理通信协议。选择建议家庭、办公室、有稳定 Wi-Fi 的环境无脑选ESP32 Wi-Fi 方案。农场、水库、山区等无网络广域监测选择LoRa 方案并考虑太阳能电池板供电。极低成本、距离要求不极高的简单项目可以考虑HC-12等射频模块。2.4 电源与外围设计电源USB 供电最方便。如需户外部署可使用18650 锂电池搭配 TP4056 充电模块或直接使用太阳能板锂电池管理模块。ESP32 在 Wi-Fi 活跃时电流可能达到 100mA 以上设计电池供电时需计算续航。外壳3D 打印一个防水防尘外壳是最佳选择。也可以使用现成的防水接线盒在侧面开孔用于传感器透气注意防雨和天线引出。天线对于 Wi-Fi 或 LoRa尽量将天线置于外壳外部避免金属屏蔽。ESP32 板载的 PCB 天线性能在大多数室内环境足够如需增强可选用带外接天线接口的 ESP32 模块。3. 以 ESP32 BME280 Wi-Fi 为例的完整搭建流程我们以最流行的ESP32Wi-Fi BME280方案为例展示从零到一的搭建过程。目标是将数据上传到免费的物联网平台ThingSpeak以便在任何地方通过网页查看图表。3.1 硬件连接所需材料清单ESP32 开发板如 NodeMCU-32S x1BME280 传感器模块 x1Micro-USB 数据线 x1杜邦线母对母若干面包板可选用于测试连接示意图I2C 接法BME280 ESP32 VCC ----- 3.3V GND ----- GND SCL ----- GPIO22 (默认I2C SCL引脚) SDA ----- GPIO21 (默认I2C SDA引脚)实操心得务必确认 BME280 模块的工作电压。大部分模块是 3.3V 逻辑电平必须接 ESP32 的 3.3V 输出引脚接 5V 可能会损坏传感器。ESP32 的 3.3V 引脚输出能力有限约 500mA如果连接多个传感器要注意总电流。3.2 软件环境准备安装 Arduino IDE从 Arduino 官网下载并安装。添加 ESP32 板支持打开 Arduino IDE点击文件-首选项。在“附加开发板管理器网址”中填入https://espressif.github.io/arduino-esp32/package_esp32_index.json点击工具-开发板-开发板管理器搜索“esp32”找到并安装“Espressif Systems”提供的 ESP32 开发板包。安装必要的库工具-管理库...搜索并安装Adafruit BME280 Library用于驱动 BME280 传感器。同样方式安装Adafruit Unified Sensor库BME280 库的依赖。3.3 核心代码编写与解析以下是完整的 Arduino 草图代码包含了连接 Wi-Fi、读取 BME280 数据、上传到 ThingSpeak 的核心逻辑。请将代码中的YOUR_WIFI_SSID、YOUR_WIFI_PASSWORD和YOUR_CHANNEL_API_KEY替换为你自己的信息。#include WiFi.h #include Wire.h #include Adafruit_Sensor.h #include Adafruit_BME280.h #include ThingSpeak.h // 需要安装 ThingSpeak 库 // Wi-Fi 凭证 const char* ssid YOUR_WIFI_SSID; const char* password YOUR_WIFI_PASSWORD; // ThingSpeak 配置 unsigned long myChannelNumber YOUR_CHANNEL_ID; // 替换为你的频道ID const char* myWriteAPIKey YOUR_CHANNEL_API_KEY; // 替换为你的写API密钥 // 创建对象 WiFiClient client; Adafruit_BME280 bme; // I2C // 定时发送避免过快请求被限制ThingSpeak 免费账户约15秒一次 unsigned long lastUploadTime 0; const unsigned long uploadInterval 20000; // 20秒 void setup() { Serial.begin(115200); delay(100); // 初始化 BME280 bool status bme.begin(0x76); // 默认I2C地址是0x77有些模块是0x76 if (!status) { Serial.println(无法找到 BME280 传感器请检查接线); while (1); // 停止执行 } Serial.println(BME280 初始化成功); // 连接 Wi-Fi Serial.print(正在连接到 ); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(); Serial.println(Wi-Fi 连接成功); Serial.print(IP 地址: ); Serial.println(WiFi.localIP()); // 初始化 ThingSpeak ThingSpeak.begin(client); } void loop() { // 检查是否到达上传间隔 if (millis() - lastUploadTime uploadInterval) { // 读取传感器数据 float temperature bme.readTemperature(); // 摄氏度 float humidity bme.readHumidity(); // 百分比 float pressure bme.readPressure() / 100.0F; // 转换为 hPa (百帕) // 打印到串口监视器用于调试 Serial.print(温度: ); Serial.print(temperature); Serial.println( °C); Serial.print(湿度: ); Serial.print(humidity); Serial.println( %); Serial.print(气压: ); Serial.print(pressure); Serial.println( hPa); // 设置 ThingSpeak 通道字段 ThingSpeak.setField(1, temperature); // 字段1通常用于温度 ThingSpeak.setField(2, humidity); // 字段2用于湿度 ThingSpeak.setField(3, pressure); // 字段3用于气压 // 发送数据到 ThingSpeak int httpCode ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); if (httpCode 200) { Serial.println(数据上传成功); } else { Serial.println(上传失败。HTTP 错误码: String(httpCode)); // 可以在这里添加重试逻辑 } // 更新上次上传时间 lastUploadTime millis(); } // 短暂延迟避免 loop() 空转消耗CPU delay(1000); }代码关键点解析库依赖代码开头引入了所有必需的库。ThingSpeak库也需要通过库管理器安装。BME280 地址bme.begin(0x76)中的0x76是传感器的 I2C 地址。如果初始化失败尝试改为0x77。你可以先运行一个 I2C 扫描程序来确认地址。Wi-Fi 连接WiFi.begin()是阻塞式连接while循环会一直等待直到连接成功。在实际产品中你可能需要增加超时和重试机制。定时上传使用millis()进行非阻塞定时避免使用delay()导致程序卡住。这是 Arduino 编程中处理定时任务的标准做法。错误处理上传后检查httpCode200 表示成功。对于网络不稳定环境建议加入重试计数器连续失败多次后尝试重启 Wi-Fi 连接。功耗考虑进阶本例为了简单持续运行。对于电池供电可以在每次上传数据后调用WiFi.disconnect()和esp_deep_sleep(uploadInterval * 1000)让 ESP32 进入深度睡眠到时间后由定时器唤醒这将极大降低功耗。3.4 配置 ThingSpeak 平台访问 ThingSpeak.com用 MathWorks 账号登录可免费注册。点击Channels-My Channels-New Channel。填写频道名称和描述至少勾选三个字段Field分别命名为“Temperature”、“Humidity”、“Pressure”。其他设置可保持默认。创建成功后点击API Keys标签页记录下Write API Key。这个密钥需要填入上面的代码中。你还可以在Private View或Public View中添加各种图表小部件实时可视化你的数据。完成代码上传后打开串口监视器波特率 115200你将看到连接和上传日志。稍等片刻刷新你的 ThingSpeak 频道页面就能看到不断更新的数据图表了。4. 无线通信方案的深度拓展与对比前面我们实现了 Wi-Fi 方案但无线气象站的魅力在于其灵活性。让我们深入看看其他无线方案该如何实施以及如何根据场景做选择。4.1 LoRa 远距离低功耗方案实现如果你需要在没有 Wi-Fi 覆盖的野外部署LoRa 是理想选择。你需要两个节点一个传感器节点发送端和一个网关节点接收端通常连接电脑或网络。发送端传感器节点硬件Arduino Pro Mini 或 ESP32用于低功耗可使用休眠模式SX1278 LoRa 模块如 Ra-02BME280 传感器3.7V 锂电池发送端核心代码逻辑#include SPI.h #include LoRa.h // 需安装 LoRa 库 #include Adafruit_BME280.h #include Wire.h Adafruit_BME280 bme; #define BAND 868E6 // 根据你的地区选择频率433E6, 868E6, 915E6 void setup() { Serial.begin(115200); if (!LoRa.begin(BAND)) { Serial.println(LoRa 初始化失败); while (1); } bme.begin(0x76); LoRa.setTxPower(20); // 设置发射功率单位 dBm } void loop() { float temp bme.readTemperature(); float hum bme.readHumidity(); // 构建要发送的数据包字符串例如 23.5,65.2 String dataPacket String(temp) , String(hum); LoRa.beginPacket(); LoRa.print(dataPacket); LoRa.endPacket(); Serial.println(数据已发送: dataPacket); // 进入深度睡眠 5 分钟以省电 esp_deep_sleep(5 * 60 * 1000000); // 微秒单位 }接收端网关硬件ESP32 或 Arduino LoRa 模块连接电脑 USB或本身具有 Wi-Fi 功能如 ESP32将数据转发到服务器。接收端核心代码逻辑#include SPI.h #include LoRa.h void setup() { Serial.begin(115200); while (!Serial); if (!LoRa.begin(868E6)) { Serial.println(LoRa 初始化失败); while (1); } } void loop() { int packetSize LoRa.parsePacket(); if (packetSize) { String receivedData ; while (LoRa.available()) { receivedData (char)LoRa.read(); } Serial.print(收到数据: ); Serial.println(receivedData); // 在这里你可以将 receivedData 通过串口发送给电脑 // 或者如果接收端是 ESP32可以在这里解析数据并通过 Wi-Fi 上传到云端。 } }LoRa 方案注意事项频率与法规务必使用你所在地区允许的 ISM 频段如中国 470-510MHz。天线匹配使用与模块频率匹配的天线并尽量架高。数据包大小LoRa 数据包不宜过大通常建议小于 256 字节。功耗平衡发送功率、空中速率Spreading Factor和休眠时长共同决定续航。速率越慢距离越远但单次发送耗时越长。4.2 蓝牙直连手机方案利用 ESP32 内置的蓝牙可以创建一个简单的 BLE低功耗蓝牙服务让手机直接连接并读取数据。适合制作便携式气象仪。核心思路将 ESP32 配置为一个 BLE 服务器创建一个包含温度、湿度、气压特征值的服务。手机端使用 LightBlue、BLE Scanner 等 App 或自己编写 App 来连接并订阅这些特征值当数据更新时自动接收。由于 BLE 代码相对复杂这里给出一个简化框架和关键步骤包含必要的 BLE 库#include BLEDevice.h,#include BLEServer.h,#include BLE2902.h。定义 BLE 服务和特征创建一个服务 UUID 和三个特征 UUID分别对应温、湿、压。在setup()中初始化 BLE设置服务器、服务和特征并启动广播。在loop()中读取传感器数据然后更新对应的 BLE 特征值pCharacteristic_Temp-setValue(tempValue);pCharacteristic_Temp-notify();notify会主动通知已连接的客户端。蓝牙方案特点无需网络点对点通信手机就是显示终端。缺点是距离短且手机需要主动连接或保持在连接范围内。4.3 通信方案对比与选型决策表特性Wi-Fi (ESP32)LoRa (SX1278)蓝牙 BLE (ESP32)433MHz RF (HC-12)通信距离室内 50m 视环境远 (1-10km)短 (10m)中远 (几百米-1km)功耗高持续连接极低可深度睡眠低连接间歇低数据速率高 (Mbps)极低 (bps-kbps)中 (kbps)低 (kbps)网络依赖需要路由器/AP无需网络点对点或星型无需网络点对点无需网络点对点复杂度低内置协议栈中需处理简单协议中BLE配置稍复杂低简单串口透传成本低单芯片集成中模块天线低内置极低典型应用室内环境监测有网区域农业、野外、工业遥测个人便携设备手机直连遥控、简单遥测成本敏感选型决策流程问距离需要传多远 1km 选 LoRa室内选 Wi-Fi/蓝牙。问供电是否电池供电且需长期续航是则优先 LoRa 或 BLE深度睡眠。问数据是否需要高频、大数据量传输如图片是则只能选 Wi-Fi。问基础设施现场有 Wi-Fi 吗有则 Wi-Fi 最方便没有则考虑 LoRa 或自建射频网络。问预算与复杂度追求极致简单和低成本且距离要求不高HC-12 可能够用追求稳定、可靠、生态完善Wi-Fi 和 LoRa 是更主流的选择。5. 系统优化、数据持久化与常见问题排查一个能稳定运行的无线气象站除了基础功能还需要考虑数据可靠性、系统稳定性和后期维护的便利性。5.1 提升系统稳定性与数据可靠性Wi-Fi 连接重连机制网络可能中断。在loop()开始处或上传失败后检查WiFi.status()如果断开则尝试重连。if (WiFi.status() ! WL_CONNECTED) { Serial.println(Wi-Fi 断开尝试重连...); WiFi.disconnect(); WiFi.reconnect(); delay(5000); // 等待重连 }数据本地缓存防丢失在网络不稳定时数据可能丢失。可以使用 ESP32 的 SPIFFS 或 LittleFS 文件系统或者外部 EEPROM/SD 卡先将数据临时存储起来等网络恢复后再批量上传。这对于关键数据记录非常重要。看门狗定时器防止程序跑飞。ESP32 有硬件看门狗。#include esp_task_wdt.h void setup() { esp_task_wdt_init(10, true); // 10秒看门狗 esp_task_wdt_add(NULL); } void loop() { esp_task_wdt_reset(); // 喂狗 // ... 你的主循环代码 }电源滤波与硬件抗干扰在电源输入端并联一个100uF 电解电容和一个0.1uF 陶瓷电容以平滑电压波动。传感器信号线如 I2C 的 SDA、SCL如果较长10cm可以考虑串联一个100 欧姆左右的电阻或使用双绞线以减少噪声和振铃。将整个系统放入金属屏蔽盒注意为天线开窗可以有效抵抗外部电磁干扰。5.2 数据持久化与离线记录有时网络不可用或者你想在设备本地保存一份数据日志。SD 卡模块最直接的方式。使用SD库每次采集数据后以 CSV 格式追加写入文件。文件可以定期通过物理方式取出分析。File dataFile SD.open(/datalog.csv, FILE_APPEND); if (dataFile) { dataFile.println(dataString); // 例如 2023-10-27T14:30:00, 23.5, 65.2, 1013.25 dataFile.close(); }SPIFFS/LittleFSESP32 内部闪存无需额外硬件。适合存储量不大的临时缓存或配置文件。可以将未成功上传的数据先写入文件下次启动时读取并尝试重传。5.3 常见问题排查速查表在搭建和运行过程中你几乎一定会遇到下面这些问题。这里整理了排查思路现象可能原因排查步骤与解决方案传感器读取失败1. 接线错误或接触不良2. I2C 地址不对3. 电源问题电压不足4. 库未安装或版本冲突1. 用万用表检查 VCC、GND 电压应为 3.3V检查 SDA、SCL 连接。2. 运行 I2C 扫描程序搜索Arduino I2C Scanner代码确认设备地址。3. 尝试单独给传感器模块供电。4. 在 IDE 中检查库管理确保安装了正确库有时需要卸载旧版本。Wi-Fi 无法连接1. SSID/密码错误2. 路由器设置了 MAC 过滤或隐藏 SSID3. ESP32 离路由器太远4. 代码中 Wi-Fi 模式设置错误1. 再三确认凭证注意大小写。2. 检查路由器设置或尝试用手机热点测试。3. 拉近距离或使用外置天线。4. 确保使用的是WiFi.begin(ssid, password)而不是WiFi.softAP(...)。数据上传失败 (ThingSpeak)1. API Key 错误2. 网络连接不稳定3. 发送频率过快免费版限制4. 字段号不匹配1. 核对频道 ID 和 Write API Key。2. 增加串口打印检查WiFi.status()和上传返回的httpCode。3. 确保上传间隔uploadInterval大于 15 秒。4. 确认ThingSpeak.setField()中的字段号与你在网页上创建的字段顺序一致。LoRa 通信距离极短1. 频率设置不一致2. 天线未接或损坏3. 发射功率设置过低4. 环境干扰城市1. 确保发送和接收端LoRa.begin(frequency)频率相同。2. 确认天线已牢固连接且频率匹配。3. 尝试提高LoRa.setTxPower()值注意模块最大允许值。4. 尝试不同的扩频因子LoRa.setSpreadingFactor()值越大距离越远但速率越慢。设备运行一段时间后死机1. 电源不稳定电池耗尽或电压跌落2. 看门狗未喂食程序卡死3. 内存泄漏长时间运行后1. 监测电源电压尤其在 Wi-Fi 发射瞬间电压可能骤降需加大电容。2. 启用并正确使用看门狗定时器。3. 检查代码中是否有动态内存分配new,malloc未释放尽量使用静态分配。BME280 数据跳变或不准1. 传感器受热源影响如 MCU、电源芯片2. 通风不良导致温湿度滞后3. 传感器需要校准通常出厂已校准1. 将传感器远离板载发热元件或增加隔热。2. 在外壳上为传感器开透气孔确保空气流通。3. 与一个已知准确度的温湿度计对比如有固定偏差可在代码中做偏移补偿。5.4 进阶优化低功耗深度睡眠模式对于电池供电的户外气象站这是必备技能。以 ESP32 为例结合 Wi-Fi 和 BME280实现每 5 分钟测量并上传一次数据。核心改动在setup()中完成传感器初始化、Wi-Fi 连接、数据读取和上传。上传完成后调用esp_deep_sleep_start()进入深度睡眠。通过 ESP32 的RTC 定时器或外部引脚唤醒来设定睡眠时间。关键代码片段#define uS_TO_S_FACTOR 1000000ULL // 微秒到秒的转换因子 #define TIME_TO_SLEEP 300 // 深度睡眠时间秒5分钟 void setup() { Serial.begin(115200); // 1. 初始化并读取传感器 // 2. 连接Wi-Fi并上传数据 // 3. 所有任务完成后进入深度睡眠 Serial.println(准备进入深度睡眠); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start(); // 程序在此停止直到被定时器唤醒 // 唤醒后程序将从 setup() 重新开始运行 } void loop() { // 深度睡眠模式下loop() 永远不会被执行到 }深度睡眠注意事项电流ESP32 深度睡眠时电流可降至~10μA级别而正常工作时可达 100mA续航差异巨大。GPIO 状态睡眠前将不用的 GPIO 设置为输入上拉或下拉以降低功耗。传感器供电如果传感器功耗也大可以考虑通过一个 MOSFET 开关电路由 MCU 的 GPIO 控制其电源仅在测量时通电。RTC 内存深度睡眠后RAM 中数据会丢失但有一小块 RTC 慢速内存可以保留。使用RTC_DATA_ATTR修饰的变量可以保存数据跨睡眠周期例如用于存储上传失败重试次数。6. 项目扩展与创意应用基础气象站搭建完成后你可以以此为平台扩展出更多有趣和实用的功能。6.1 扩展更多传感器空气质量接入SGP30或PMS5003激光粉尘传感器监测 TVOC、CO2 或 PM2.5/PM10。光照与紫外线接入BH1750和GUVA-S12SD紫外线传感器用于植物种植或防晒提醒。降雨量自制或购买翻斗式雨量计通过 GPIO 中断计数来测量降雨。风速风向接入低成本的风速计和风向标传感器通常输出脉冲或电阻信号。6.2 构建本地数据服务器与可视化不依赖 ThingSpeak 等第三方平台在本地 Raspberry Pi 或旧电脑上搭建服务。数据接收让 ESP32 通过 HTTP POST 或 MQTT 协议将数据发送到本地服务器的特定端口。服务器端使用Node-RED图形化编程极简或Python (Flask/Django)编写一个简单的后端服务接收数据并存入数据库如 SQLite、InfluxDB。数据可视化使用Grafana连接数据库制作出非常专业和美观的实时仪表盘。这整套方案完全自主可控数据隐私性好。6.3 触发自动化与联动气象数据不仅是用来“看”的更是用来“行动”的。智能家居联动通过 Home Assistant 等平台当室内湿度低于 30% 时自动打开加湿器当温度高于 28°C 时自动打开空调。农业自动化当土壤湿度传感器可额外添加显示干燥时结合天气预测无降雨自动控制电磁阀进行灌溉。警报通知当气压在短时间内急剧下降可能预示暴风雨或 PM2.5 超标时通过 Telegram Bot、企业微信或短信 API 向手机发送警报。6.4 外壳设计与户外部署实战经验一个可靠的外壳是项目从“实验台”走向“实际应用”的关键。材料选择防水接线盒PVC 或 ABS是最容易获得且效果不错的方案。选择顶部有透明视窗的型号方便观察内部状态 LED。传感器放置温湿度/气压传感器必须与外部空气流通但不能直接淋雨。可以在盒子侧面开百叶窗式的小孔或者使用“防辐射罩”一种白色的、多层百叶的塑料罩能防晒防雨同时通风。切忌将传感器密封在盒内否则测到的是盒子内部的微环境。雨量计、风速风向仪必须完全安装在室外高于周围障碍物。电源与密封进线口使用防水电缆接头PG 接头。所有外壳接缝处可以涂抹硅酮密封胶。如果使用太阳能板将其安装在盒子外部并通过防水接头将电线引入盒内连接充电控制器。防雷与防静电户外重要在天线接口和电源进线处可以加装TVS 二极管或气体放电管等简易防雷器件。至少确保设备有良好的接地。从我自己的多个部署经验来看前期多花一点时间在设计防水、防尘和散热上后期能省去无数次的维护和故障排查。特别是温湿度传感器一旦受潮或积灰数据就完全不可信了。一个好的习惯是在部署前将组装好的设备放在冰箱、阳光下、浴室等不同环境测试几天对比专业仪表的读数确保其稳定性和准确性。