ESP8266 温湿度监测系统教程(SHT30+MAX7219+LeanCloud+HTTP 服务)

本教程将手把手教你搭建一个基于 ESP8266 的温湿度监测系统,实现「每秒读取温湿度 + 点阵屏实时显示 + HTTP 局域网访问 + 每 5 分钟上传 LeanCloud 云端」的完整功能,适合新手快速上手。

一、项目功能清单

  1. 硬件:ESP8266 驱动 SHT30 温湿度传感器(高精度)+ 4 联 MAX7219 8*8 点阵屏;
  2. 数据读取:每秒读取一次温湿度,实时显示在点阵屏上;
  3. 局域网访问:ESP8266 搭建 HTTP 服务器,固定主机名,电脑 / 手机可访问温湿度数据;
  4. 云端存储:每 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 开发板:
    1. 打开 Arduino IDE → 文件 → 首选项 → 附加开发板管理器网址,输入:http://arduino.esp8266.com/stable/package_esp8266com_index.json
    2. 工具 → 开发板 → 开发板管理器,搜索「esp8266」并安装;
    3. 工具 → 开发板,选择「NodeMCU 1.0 (ESP-12E Module)」。

2. 安装依赖库

打开 Arduino IDE → 项目 → 加载库 → 管理库,搜索并安装以下库:

  • Adafruit SHT31(SHT30 传感器驱动);
  • MD_Parola(MAX7219 点阵屏显示控制);
  • MD_MAX72XX(MAX7219 底层驱动);
  • ESP8266WiFi(自带,无需安装)。

3. LeanCloud 准备(云端存储)

  1. 注册 LeanCloud 账号(https://console.leancloud.app/),创建一个「应用」;
  2. 进入应用 → 设置 → 应用凭证,记录以下信息(后续填到代码里):
    • 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. 烧录程序

  1. 将 ESP8266 通过 Micro USB 连接到电脑;
  2. Arduino IDE → 工具 → 端口,选择 ESP8266 对应的 COM 口;
  3. 点击「上传」按钮(右箭头),等待烧录完成(底部提示「上传成功」)。

2. 功能测试

测试 1:串口调试(看日志)

打开 Arduino IDE → 工具 → 串口监视器,波特率选 115200,可看到:

  • 传感器 / 点阵屏初始化成功提示;
  • WiFi 连接成功,显示主机名和 IP;
  • 每秒刷新的温湿度数据;
  • 每 5 分钟一次的 LeanCloud 上传日志。
测试 2:点阵屏显示

正常情况下,点阵屏会显示当前温湿度(如「25.5C 60.0%」),若显示「Read Err」,说明 SHT30 读取失败,需检查接线。

测试 3:局域网 HTTP 访问

在同一 WiFi 下的电脑 / 手机浏览器输入:http://esp8266-temphumi/temp_humihttp://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)

八、总结

  1. 本项目核心是 ESP8266 作为主控,整合了 SHT30(数据采集)、MAX7219(本地显示)、HTTP 服务(局域网访问)、LeanCloud(云端存储)四大功能;
  2. 接线是基础:SHT30 必须接 3.3V,MAX7219 推荐接 5V,信号引脚严格对应;
  3. 关键配置:WiFi 信息、LeanCloud 凭证需替换为自己的,SHT30 地址可根据实际调整;
  4. 扩展方向:可修改上传频率、点阵屏显示样式,或在 LeanCloud 添加数据可视化面板。

整个系统实现了「本地采集 - 本地显示 - 局域网访问 - 云端存储」的完整闭环,适合物联网入门学习。

相关推荐
牛奶皮子1 天前
合并 CSS 文件可以减少 HTTP 请求数,因为每个请求都会带来额外的网络开销
css·网络·http
阿巴~阿巴~1 天前
“可达”方能“可靠”:深入解析网络层在TCP通信中的基石作用
运维·服务器·网络·网络协议·tcp/ip·ip·tcp
数据雕塑家1 天前
【网络故障排查实战】多台机器互ping异常:MAC地址冲突引发的网络“薛定谔猫“现象
网络·macos
安生生申1 天前
HTTP与HTTPS的区别
网络协议·http·https
闲人编程1 天前
商品管理与库存系统
服务器·网络·数据库·python·api·数据模型·codecapsule
北京耐用通信1 天前
耐达讯自动化CAN转PROFIBUS网关让软启动器如何让包装线告别“信号迷宫”
人工智能·物联网·网络协议·自动化·信息与通信
2501_939909051 天前
flannel vs calico网络
网络
一只小鱼儿吖1 天前
携趣HTTP代理浏览器设置器(PC版)使用指南
网络·网络协议·http
进击切图仔1 天前
Realsense 相机测试及说明
网络·人工智能·深度学习·数码相机