眉山市网站建设_网站建设公司_无障碍设计_seo优化
2026/1/17 7:51:04 网站建设 项目流程

扫码看温湿度:手把手教你用ESP32+微信小程序搭建远程环境监控系统

你有没有想过,让家里的温湿度数据像网页一样“扫一扫就能看到”?不需要安装App、不用配路由器,只要打开微信扫个码,就能实时查看阳台花盆的土壤湿度、婴儿房的空气质量——这听起来像是智能家居广告里的场景,其实你自己动手也能实现。

今天我们就来干一件“接地气又硬核”的事:用一块几十块钱的ESP32开发板,加上一个简单的微信小程序,打造一套完整的远程环境监测系统。

整个过程不讲虚的,从传感器接线到手机端显示,一步步带你走通“硬件采集 → 网络上传 → 云端中转 → 小程序展示”的全链路。无论你是电子爱好者、嵌入式初学者,还是想做毕业设计的学生,这篇教程都能让你真正搞懂物联网是怎么跑起来的。


为什么是“ESP32 + 微信小程序”?

先别急着写代码,我们先聊聊这个组合为啥这么香。

ESP32 是乐鑫推出的明星芯片,双核处理器、自带Wi-Fi和蓝牙、支持低功耗模式,关键是生态成熟、资料多、Arduino一键上手。更重要的是——它能联网。

而微信小程序呢?10亿用户基数、无需安装、即开即用、跨平台统一。最关键的是:你妈也能操作。

把这两个东西捏在一起,就形成了一个极简但完整的物联网闭环:

边缘感知(ESP32)→ 数据上传(HTTP/MQTT)→ 云服务中转 → 移动终端呈现(微信小程序)

没有复杂的App开发,也没有繁琐的部署流程。适合快速验证想法、教学演示、甚至小范围商用原型。


第一步:让ESP32学会“说话”——采集并发送环境数据

我们要做的第一件事,就是让ESP32能读取周围环境的数据,并通过Wi-Fi发出去。

硬件准备清单

  • ESP32开发板(任何型号均可,推荐NodeMCU-32S)
  • DHT22温湿度传感器(或BME280等I²C模块)
  • 杜邦线若干
  • 面包板(可选)

接线很简单:
- DHT22 VCC → 3.3V
- GND → GND
- DATA → GPIO4(可自定义)

软件环境

使用 Arduino IDE 编程,安装以下库:
-WiFi.h(内置)
-DHT sensor libraryby Adafruit
-Adafruit Unified Sensor(依赖库)

核心任务拆解

ESP32要完成五个动作:
1. 上电初始化串口和GPIO;
2. 启动DHT传感器驱动;
3. 连接家中Wi-Fi;
4. 定时采集温湿度;
5. 把数据打包成HTTP请求,发给服务器。

听起来复杂?其实核心逻辑不过几十行代码。

关键代码解析(Arduino C++)

#include <WiFi.h> #include "DHT.h" #define DHTPIN 4 // 接在GPIO4 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); const char* ssid = "你的WiFi名称"; const char* password = "你的WiFi密码"; const char* server = "https://api.yourserver.com/data"; // 替换为你的接口地址 void setup() { Serial.begin(115200); dht.begin(); // 连接Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("正在连接WiFi..."); } Serial.println("已连接!IP地址:" + WiFi.localIP().toString()); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("传感器读取失败!"); return; } // 建立HTTP连接 if (WiFi.status() == WL_CONNECTED) { WiFiClient client; if (client.connect(server, 80)) { String postData = "temp=" + String(t, 1) + "&humid=" + String(h, 1); client.println("POST /data HTTP/1.1"); client.println("Host: api.yourserver.com"); client.println("Content-Type: application/x-www-form-urlencoded"); client.print("Content-Length: "); client.println(postData.length()); client.println(); client.print(postData); Serial.println("数据已发送:" + postData); } else { Serial.println("无法连接服务器"); } client.stop(); } delay(5000); // 每5秒上报一次 }
重点说明几个坑点:
  • 手动构造HTTP报文头是为了让普通Web服务器能正确接收表单数据;
  • 使用application/x-www-form-urlencoded格式,相当于网页提交<form>表单;
  • 必须保证Host:字段与实际域名一致,否则Nginx/Apache可能拒绝响应;
  • 实际项目建议改用 HTTPS 并启用证书校验,提升安全性;
  • 可加入重试机制,比如失败后尝试3次再进入深度睡眠。

✅ 提示:如果你不想自己搭服务器,可以先用 EasyIoT 或 Blinker 这类免配置平台测试通路,它们提供现成的API和可视化面板。


第二步:找个“中间人”——服务器的角色到底是什么?

很多人卡住的地方不是ESP32也不是小程序,而是中间那个“看不见”的服务器。

其实它的作用非常简单:当ESP32说“我有新数据”,它记下来;当小程序问“现在多少度?”,它告诉它。

你可以把它想象成一个邮局——ESP32寄信,小程序收信,邮局负责收发和暂存。

最简架构图

[ESP32] ---(HTTP POST)---> [云服务器] <---(HTTPS GET)--- [微信小程序] ↑↓ [数据库]

服务器怎么做?三个选择:

方案适合人群优点缺点
使用现成IoT平台(如Blinker)初学者零代码、免备案、自带UI功能受限、不能深度定制
自建Node.js + Express服务进阶玩家完全可控、可扩展需要买服务器、备案域名
接入阿里云IoT/腾讯连连商业项目稳定可靠、支持海量设备学习成本高、流程复杂

对于本教程,我们推荐先用 Blinker 快速验证逻辑,成功后再考虑自建服务。


第三步:让手机“看见”数据——微信小程序怎么显示?

终于到了最直观的部分:你在手机上打开微信,扫个码,看到温度数字跳出来——那一刻真的很有成就感。

但要注意:微信小程序不能直接连ESP32!它只能通过HTTPS协议访问已备案的公网域名。

所以数据路径只能是:

小程序 → HTTPS请求 → 服务器 → 返回JSON → 更新页面

开发准备

  1. 注册微信公众平台账号(个人类型即可)
  2. 下载并安装「微信开发者工具」
  3. 创建一个空白小程序项目
  4. 在「开发管理」→「开发设置」中添加你的域名到 request 合法域名列表
    (例如:https://api.yourserver.com

小程序代码实战

页面结构(index.wxml)——看得见的部分
<view class="container"> <text class="title">🌿 实时环境监测</text> <view class="data-card"> <text>当前温度:</text> <text class="value temp">{{temperature}}°C</text> </view> <view class="data-card"> <text>当前湿度:</text> <text class="value humid">{{humidity}}%</text> </view> <text class="update-time">最后更新:{{lastUpdate}}</text> </view>
逻辑控制(index.js)——背后的“大脑”
Page({ data: { temperature: '--', humidity: '--', lastUpdate: '' }, onLoad() { console.log('页面加载'); this.fetchData(); // 首次获取 this.startPolling(); // 开始轮询 }, fetchData() { wx.request({ url: 'https://api.yourserver.com/data/latest', method: 'GET', success: (res) => { if (res.statusCode === 200 && res.data) { const { temperature, humidity } = res.data; this.setData({ temperature: parseFloat(temperature).toFixed(1), humidity: parseFloat(humidity).toFixed(1), lastUpdate: new Date().toLocaleTimeString() }); } }, fail: (err) => { console.error('请求失败:', err); wx.showToast({ title: '网络异常', icon: 'none' }); } }); }, startPolling() { setInterval(() => { this.fetchData(); }, 10000); // 每10秒刷新一次 } });
样式美化(index.wxss)——锦上添花
.container { padding: 40rpx; text-align: center; background: #f8f9fa; } .title { font-size: 48rpx; color: #1a1a1a; margin-bottom: 60rpx; display: block; } .data-card { font-size: 36rpx; margin: 30rpx 0; } .value { font-weight: bold; color: #d63333; } .temp { color: #ff6b35; } .humid { color: #13c2c2; } .update-time { font-size: 28rpx; color: #888; margin-top: 60rpx; }
关键知识点总结:
  • onLoad()是页面加载时触发的第一个函数;
  • wx.request()是唯一合法的网络请求方式,且必须HTTPS;
  • setData()是更新视图的唯一方法,不可省略;
  • 轮询间隔建议 ≥5秒,避免被微信限流;
  • 可结合onPullDownRefresh实现下拉刷新功能。

实际部署中的那些“隐形挑战”

你以为烧完代码、上线小程序就完了?真正的工程问题才刚刚开始。

1. 断网怎么办?

ESP32上传失败时不能直接丢弃数据。解决方案:
- 使用SPIFFS或LittleFS将数据暂存Flash;
- 网络恢复后补传历史记录;
- 添加心跳机制判断是否离线太久。

2. 多台设备数据混乱?

每块ESP32应分配唯一设备ID(可用MAC地址或自定义sn),上传时带上参数:

POST /data?device_id=esp32_001

服务器根据ID区分不同设备,小程序也可按设备查询。

3. 如何降低功耗?

如果用于野外监测,可以用深度睡眠模式:

esp_sleep_enable_timer_wakeup(5 * 1000000); // 休眠5秒 esp_light_sleep_start();

配合超级电容或锂电池,续航可达数月。

4. 能不能更实时?

目前是“轮询”方式,延迟最高达10秒。进阶方案:
- 改用 MQTT 协议 + WebSocket,在小程序端实现近实时推送;
- 或使用微信订阅消息模板,超限时自动推送到微信聊天列表。


还能怎么玩?这些扩展思路值得试试

这套系统只是起点。一旦你打通了数据链路,接下来的玩法就多了:

🌱 智慧农业大棚

  • 加入土壤湿度传感器,自动浇水;
  • 小程序里画出过去24小时温湿度趋势图;
  • 温度过高时触发蜂鸣器报警。

🏠 智能家居联动

  • 结合继电器控制加湿器开关;
  • 当湿度低于40%,自动开启空气净化器;
  • 通过小程序远程查看家里状态。

📸 图像+数据联合监控(ESP32-CAM)

  • 拍照上传至服务器;
  • 小程序同时显示图片和环境参数;
  • 做一个“宝宝房全天候看护系统”。

🔔 微信告警推送

利用微信模板消息功能:
- 当温度超过35°C,发送提醒:“阳台植物快晒坏了!”
- 湿度持续偏低,提示“记得给宝宝房间加湿”


写在最后:这不是玩具,是通往全栈开发的大门

很多人觉得“ESP32教程”就是点个灯、读个传感器,但当你能把数据送到微信小程序里展示出来的时候,你就已经走完了硬件 → 网络 → 后端 → 前端的完整链条。

这不仅是物联网入门的最佳实践路径,更是培养系统思维的绝佳训练场。

下次有人问你:“你会做物联网吗?”
你可以淡定地掏出手机,扫一下桌上的二维码,说:

“你看,这是我做的。”

如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。我们一起把这件事做得更稳、更快、更智能。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询