本教程将手把手教你搭建一个基于 ESP8266 的温湿度监测系统,实现「每秒读取温湿度 + 点阵屏实时显示 + HTTP 局域网访问 + 每 5 分钟上传 LeanCloud 云端」的完整功能,适合新手快速上手。
一、项目功能清单
- 硬件:ESP8266 驱动 SHT30 温湿度传感器(高精度)+ 4 联 MAX7219 8*8 点阵屏;
- 数据读取:每秒读取一次温湿度,实时显示在点阵屏上;
- 局域网访问:ESP8266 搭建 HTTP 服务器,固定主机名,电脑 / 手机可访问温湿度数据;
- 云端存储:每 5 分钟自动将温湿度数据上传到 LeanCloud,支持远程查看历史数据。
二、硬件准备
| 器件 | 数量 | 备注 |
|---|---|---|
| ESP8266(NodeMCU) | 1 个 | 核心控制板 |
| SHT30 温湿度传感器 | 1 个 | I2C 通信,精度优于 DHT11 |
| 4 联 MAX7219 点阵屏 | 1 个 | SPI 通信,8*32 显示区域 |
| 杜邦线 | 若干 | 公对公 / 公对母 |
| Micro USB 数据线 | 1 根 | 供电 + 烧录程序 |
| 5V 电源(可选) | 1 个 | 脱离电脑供电使用 |
三、硬件接线(核心步骤)
1. SHT30 → ESP8266(I2C 通信,必须接 3.3V)
| SHT30 引脚 | ESP8266 引脚 | 重要说明 |
|---|---|---|
| VCC | 3.3V | 禁止接 5V!会烧毁传感器 |
| GND | GND | 共地,保证电压稳定 |
| SDA | D2 (GPIO4) | I2C 数据引脚 |
| SCL | D1 (GPIO5) | I2C 时钟引脚 |
2. MAX7219 点阵屏 → ESP8266(SPI 通信)
| MAX7219 引脚 | ESP8266 引脚 | 说明 |
|---|---|---|
| VCC | 5V | 推荐 5V 供电,显示更清晰 |
| GND | GND | 共地 |
| DIN | D7 (GPIO13) | SPI 数据引脚 |
| CS | D8 (GPIO15) | SPI 片选引脚 |
| CLK | D5 (GPIO14) | SPI 时钟引脚 |
接线提示:先接 GND,再接 VCC,最后接信号引脚(SDA/SCL/DIN/CLK/CS),避免接反烧毁器件。
四、软件准备
1. Arduino IDE 配置
- 安装 Arduino IDE(官网下载:https://www.arduino.cc/en/software);
- 配置 ESP8266 开发板:
- 打开 Arduino IDE → 文件 → 首选项 → 附加开发板管理器网址,输入:
http://arduino.esp8266.com/stable/package_esp8266com_index.json; - 工具 → 开发板 → 开发板管理器,搜索「esp8266」并安装;
- 工具 → 开发板,选择「NodeMCU 1.0 (ESP-12E Module)」。
- 打开 Arduino IDE → 文件 → 首选项 → 附加开发板管理器网址,输入:
2. 安装依赖库
打开 Arduino IDE → 项目 → 加载库 → 管理库,搜索并安装以下库:
Adafruit SHT31(SHT30 传感器驱动);MD_Parola(MAX7219 点阵屏显示控制);MD_MAX72XX(MAX7219 底层驱动);ESP8266WiFi(自带,无需安装)。
3. LeanCloud 准备(云端存储)
- 注册 LeanCloud 账号(https://console.leancloud.app/),创建一个「应用」;
- 进入应用 → 设置 → 应用凭证,记录以下信息(后续填到代码里):
- AppID、AppKey、MasterKey(注意保护 MasterKey,不要泄露)。
五、完整代码
将以下代码复制到 Arduino IDE,替换「配置项」中的 WiFi 信息、LeanCloud 凭证即可使用。
cpp
运行
#include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <WiFiClient.h> #include <Adafruit_SHT31.h> #include <MD_Parola.h> #include <MD_MAX72xx.h> #include <SPI.h> // ====================== 【配置项 - 需修改】 ====================== // WiFi配置 const char* ssid = "你的WiFi名称"; // 替换为自家WiFi名称 const char* password = "你的WiFi密码"; // 替换为自家WiFi密码 // 局域网主机名(固定访问地址) const char* espHostname = "esp8266-temphumi"; // MAX7219配置(4联8*8点阵屏,数量无需修改) #define MAX_DEVICES 4 // 点阵屏数量(4联屏固定为4) #define CLK_PIN 14 // D5(对应接线,无需修改) #define DATA_PIN 13 // D7(对应接线,无需修改) #define CS_PIN 15 // D8(对应接线,无需修改) // LeanCloud配置(替换为自己的凭证) const char* leanCloudServer = "2m"; const String leanCloudAppID = "2E#####"; const String leanCloudAppKey = "####"; const String leanCloudMasterKey = "####"; // ================================================================ // 全局变量初始化 MD_Parola matrix = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES); Adafruit_SHT31 sht30 = Adafruit_SHT31(); float temperature = 0.0, humidity = 0.0; ESP8266WebServer server(80); unsigned long lastUploadTime = 0; const unsigned long uploadInterval = 5 * 60 * 1000; // 5分钟上传一次 // 【功能1】读取SHT30温湿度数据 bool readSHT30() { float t, h; // SHT30读取温湿度,地址默认0x44,失败可改为0x45 if (sht30.readTemperature(&t) && sht30.readHumidity(&h)) { temperature = t; humidity = h; return true; } return false; } // 【功能2】HTTP服务接口:返回温湿度JSON数据 void handleTempHumi() { String json = "{\"temperature\":" + String(temperature, 1) + ",\"humidity\":" + String(humidity, 1) + "}"; server.send(200, "application/json", json); } // 【功能3】上传数据到LeanCloud云端 void uploadToLeanCloud() { WiFiClient client; const int httpPort = 80; // 连接LeanCloud服务器 if (!client.connect(leanCloudServer, httpPort)) { Serial.println("❌ LeanCloud连接失败"); return; } // 构建上传的JSON数据 String postData = "{\"temperature\":" + String(temperature, 1) + ",\"humidity\":" + String(humidity, 1) + "}"; // 发送HTTP POST请求(MasterKey需加,master标识) client.print(String("POST /1.1/classes/TempHumiData HTTP/1.1\r\n") + "Host: " + leanCloudServer + "\r\n" + "X-LC-Id: " + leanCloudAppID + "\r\n" + "X-LC-Key: " + leanCloudMasterKey + ",master\r\n" + "Content-Type: application/json\r\n" + "Content-Length: " + String(postData.length()) + "\r\n" + "Connection: close\r\n\r\n" + postData); // 打印响应(调试用) delay(1000); while (client.available()) { String line = client.readStringUntil('\r'); Serial.print(line); } client.stop(); Serial.println("\n✅ LeanCloud上传完成"); } // 【功能4】点阵屏显示温湿度 void displayOnMatrix() { matrix.setTextAlignment(PA_CENTER); // 居中显示 matrix.setIntensity(5); // 亮度(0-15,数值越大越亮) // 拼接显示内容:如「25.5C 60.0%」 String displayStr = String(temperature, 1) + "C " + String(humidity, 1) + "%"; matrix.print(displayStr); delay(1000); // 显示1秒(和读取频率同步) } // 初始化函数(只执行一次) void setup() { Serial.begin(115200); // 串口波特率,用于调试 // 1. 初始化SHT30传感器 if (!sht30.begin(0x44)) { Serial.println("❌ SHT30初始化失败!检查接线/地址"); while (1) delay(10); // 初始化失败则卡住,提示排查 } Serial.println("✅ SHT30初始化成功"); // 2. 初始化点阵屏 matrix.begin(); matrix.displayClear(); matrix.print("Init..."); // 开机提示 delay(1000); Serial.println("✅ 点阵屏初始化成功"); // 3. 设置局域网主机名 WiFi.hostname(espHostname); // 4. 连接WiFi Serial.print("🔌 连接WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\n✅ WiFi已连接"); Serial.print("📡 主机名: "); Serial.println(WiFi.hostname()); Serial.print("📡 IP地址: "); Serial.println(WiFi.localIP()); // 5. 启动HTTP服务器 server.on("/temp_humi", handleTempHumi); // 注册接口 server.begin(); Serial.println("✅ HTTP服务器已启动"); // 6. 首次读取温湿度 readSHT30(); } // 主循环(反复执行) void loop() { // 1. 每秒读取一次温湿度并显示 static unsigned long lastReadTime = 0; if (millis() - lastReadTime >= 1000) { lastReadTime = millis(); if (readSHT30()) { Serial.printf("🌡️ 温度: %.1f°C, 湿度: %.1f%%\n", temperature, humidity); displayOnMatrix(); } else { Serial.println("❌ SHT30读取失败"); matrix.print("Read Err"); delay(1000); } } // 2. 处理HTTP客户端请求(电脑/手机访问) server.handleClient(); // 3. 每5分钟上传数据到LeanCloud if (millis() - lastUploadTime >= uploadInterval) { lastUploadTime = millis(); Serial.println("\n📤 开始上传到LeanCloud..."); uploadToLeanCloud(); } }六、程序烧录与测试
1. 烧录程序
- 将 ESP8266 通过 Micro USB 连接到电脑;
- Arduino IDE → 工具 → 端口,选择 ESP8266 对应的 COM 口;
- 点击「上传」按钮(右箭头),等待烧录完成(底部提示「上传成功」)。
2. 功能测试
测试 1:串口调试(看日志)
打开 Arduino IDE → 工具 → 串口监视器,波特率选 115200,可看到:
- 传感器 / 点阵屏初始化成功提示;
- WiFi 连接成功,显示主机名和 IP;
- 每秒刷新的温湿度数据;
- 每 5 分钟一次的 LeanCloud 上传日志。
测试 2:点阵屏显示
正常情况下,点阵屏会显示当前温湿度(如「25.5C 60.0%」),若显示「Read Err」,说明 SHT30 读取失败,需检查接线。
测试 3:局域网 HTTP 访问
在同一 WiFi 下的电脑 / 手机浏览器输入:http://esp8266-temphumi/temp_humi或http://ESP8266的IP地址/temp_humi会返回 JSON 格式数据:{"temperature":25.5,"humidity":60.0}。
测试 4:LeanCloud 云端查看
登录 LeanCloud 控制台 → 数据存储 → 结构化数据 →TempHumiData表,可看到每 5 分钟上传的温湿度记录。
七、常见问题排查
| 问题现象 | 排查方向 |
|---|---|
| SHT30 初始化失败 | 1. 接线:SDA→D2、SCL→D1;2. 供电:必须接 3.3V;3. 地址:改 0x44 为 0x45 重试 |
| 点阵屏不显示 | 1. 接线:DIN→D7、CLK→D5、CS→D8;2. 确认是 4 联屏(MAX_DEVICES=4) |
| HTTP 访问失败 | 1. 电脑和 ESP8266 连同一 WiFi;2. 关闭电脑防火墙;3. 核对 IP / 主机名 |
| LeanCloud 上传失败 | 1. 凭证是否正确;2. MasterKey 后是否加,master;3. ESP8266 能否访问外网 |
| 点阵屏亮度太亮 / 太暗 | 修改代码中matrix.setIntensity(5)的数值(0-15) |
八、总结
- 本项目核心是 ESP8266 作为主控,整合了 SHT30(数据采集)、MAX7219(本地显示)、HTTP 服务(局域网访问)、LeanCloud(云端存储)四大功能;
- 接线是基础:SHT30 必须接 3.3V,MAX7219 推荐接 5V,信号引脚严格对应;
- 关键配置:WiFi 信息、LeanCloud 凭证需替换为自己的,SHT30 地址可根据实际调整;
- 扩展方向:可修改上传频率、点阵屏显示样式,或在 LeanCloud 添加数据可视化面板。
整个系统实现了「本地采集 - 本地显示 - 局域网访问 - 云端存储」的完整闭环,适合物联网入门学习。