ESP32+OneNet智能温湿度监测与远程控制系统实战指南

在智能家居和物联网快速发展的今天,DIY一个属于自己的智能环境监测系统变得前所未有的简单。本文将带你从零开始,使用ESP32开发板、OneNet物联网平台和uni-app框架,构建一个功能完整的智能温湿度监测与远程控制系统。这个项目不仅适合物联网初学者作为入门实践,也能为电子爱好者提供可扩展的基础框架,甚至可以作为学生课设或毕设的优质选择。

1. 项目准备与硬件搭建

1.1 硬件组件清单与连接

构建这个智能系统需要以下核心硬件组件:

  • ESP32开发板:推荐使用ESP32-WROOM-32D,性价比高且稳定性好
  • DHT22温湿度传感器:精度高(温度±0.5℃,湿度±2%),响应快
  • LED灯模块:用于远程控制演示
  • 电阻与连接线:220Ω电阻用于LED限流
  • 面包板与杜邦线:便于快速原型搭建

硬件连接示意图如下:

组件 ESP32引脚 备注
DHT22 VCC 3.3V 电源正极
DHT22 GND GND 电源地线
DHT22 DATA GPIO4 数据引脚
LED正极 GPIO5 通过220Ω电阻连接
LED负极 GND 直接接地

提示:DHT22数据引脚建议连接一个4.7kΩ上拉电阻以确保信号稳定,部分模块已内置此电阻。

1.2 开发环境配置

在开始编码前,需要完成以下软件准备:

  1. Arduino IDE安装

    • 从官网下载并安装最新版Arduino IDE
    • 在首选项中添加ESP32开发板管理URL:https://dl.espressif.com/dl/package_esp32_index.json
    • 通过开发板管理器安装ESP32开发板支持包
  2. 必要的库安装

    • DHT sensor library(用于温湿度传感器)
    • OneNet MQTT库(用于与OneNet平台通信)
    • ArduinoJson库(用于处理JSON数据)
# 通过Arduino库管理器安装所需库
# 依次搜索并安装:
# - "DHT sensor library" by Adafruit
# - "PubSubClient" by Nick O'Leary
# - "ArduinoJson" by Benoit Blanchon
  1. OneNet平台准备
    • 注册OneNet开发者账号
    • 在控制台创建新产品,选择"设备接入服务"
    • 记录下产品ID、设备密钥等关键信息

2. ESP32固件开发

2.1 温湿度数据采集与上传

ESP32固件的核心功能是定期采集环境数据并上传至OneNet平台。以下是关键代码实现:

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN 4     // DHT22数据引脚
#define DHTTYPE DHT22 // DHT22传感器类型
#define LED_PIN 5    // LED控制引脚

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "mqtt.heclouds.com";
const int mqtt_port = 1883;
const char* device_id = "your_device_id";
const char* product_id = "your_product_id";
const char* access_key = "your_access_key";

WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);

void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

void reconnect() {
  while (!client.connected()) {
    String clientId = "ESP32Client-";
    clientId += String(random(0xffff), HEX);
    if (client.connect(clientId.c_str(), product_id, access_key)) {
      client.subscribe("cmd"); // 订阅命令主题
    } else {
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  pinMode(LED_PIN, OUTPUT);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  static unsigned long lastMsg = 0;
  if (millis() - lastMsg > 5000) { // 每5秒上传一次数据
    lastMsg = millis();
    
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    
    if (isnan(humidity) || isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }

    String payload = "{\"temp\":" + String(temperature) + 
                     ",\"humi\":" + String(humidity) + "}";
    client.publish("data", payload.c_str());
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  // 命令处理逻辑将在下一节实现
}

2.2 远程命令接收与执行

为了实现远程控制LED功能,需要扩展固件以处理来自OneNet的下行命令:

void callback(char* topic, byte* payload, unsigned int length) {
  String message;
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }
  
  DynamicJsonDocument doc(1024);
  deserializeJson(doc, message);
  
  if (doc.containsKey("led")) {
    int ledState = doc["led"];
    digitalWrite(LED_PIN, ledState ? HIGH : LOW);
    
    // 发送状态确认
    String ack = "{\"led\":" + String(ledState) + "}";
    client.publish("ack", ack.c_str());
  }
}

3. OneNet平台配置

3.1 设备接入与数据流创建

在OneNet平台上完成以下关键配置:

  1. 创建设备

    • 进入产品详情页,选择"设备管理"
    • 点击"添加设备",填写设备名称和鉴权信息
    • 记录生成的设备ID,将在代码中使用
  2. 定义数据模型

    • 在"物模型"页面,添加两个属性:
      • 温度(temp):float类型,单位℃
      • 湿度(humi):float类型,单位%
    • 添加一个服务:
      • LED控制(led_switch):包含一个布尔型参数"led"
  3. API权限配置

    • 在"权限管理"中,确保已开启以下API权限:
      • 设备属性上报
      • 设备服务调用
      • 设备命令下发

3.2 数据可视化配置

OneNet提供了强大的数据可视化工具,可以快速创建监控面板:

  1. 创建数据看板

    • 进入"应用管理",选择"数据可视化"
    • 新建一个看板,选择适合的模板
  2. 添加温湿度曲线

    • 拖拽"折线图"组件到看板
    • 配置数据源为设备上报的温度和湿度属性
    • 设置合适的刷新间隔(如5秒)
  3. 添加LED控制开关

    • 拖拽"开关"组件到看板
    • 配置动作为调用设备的led_switch服务
    • 可以设置开关样式和默认状态

4. uni-app移动端开发

4.1 项目创建与基础配置

使用HBuilder X创建uni-app项目:

# 创建uni-app项目
vue create -p dcloudio/uni-preset-vue iot-monitor-app

# 进入项目目录
cd iot-monitor-app

# 安装必要依赖
npm install @dcloudio/uni-ui

项目目录结构关键部分:

├── pages
│   ├── index
│   │   ├── index.vue      # 主页面
│   │   └── config.json    # 页面配置
├── static
│   └── icons              # 图标资源
├── App.vue                # 应用入口
└── manifest.json          # 应用配置

4.2 主页面开发

实现温湿度显示和LED控制的核心页面:

<template>
  <view class="container">
    <view class="card">
      <view class="title">环境监测</view>
      <view class="data-row">
        <text>温度: </text>
        <text class="value">{{ temp }}℃</text>
      </view>
      <view class="data-row">
        <text>湿度: </text>
        <text class="value">{{ humi }}%</text>
      </view>
    </view>
    
    <view class="card">
      <view class="title">LED控制</view>
      <switch :checked="led" @change="toggleLED" />
    </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      temp: 0,
      humi: 0,
      led: false,
      timer: null
    }
  },
  onLoad() {
    this.fetchData();
    this.timer = setInterval(this.fetchData, 3000);
  },
  onUnload() {
    clearInterval(this.timer);
  },
  methods: {
    async fetchData() {
      try {
        const res = await uni.request({
          url: 'https://iot-api.heclouds.com/thingmodel/query-device-property',
          method: 'GET',
          header: {
            'Authorization': `token=${this.getToken()}`
          },
          data: {
            device_id: 'your_device_id'
          }
        });
        
        this.temp = res.data.data.temp;
        this.humi = res.data.data.humi;
      } catch (error) {
        console.error('获取数据失败:', error);
      }
    },
    async toggleLED(e) {
      this.led = e.detail.value;
      try {
        await uni.request({
          url: 'https://iot-api.heclouds.com/thingmodel/invoke-service',
          method: 'POST',
          header: {
            'Authorization': `token=${this.getToken()}`
          },
          data: {
            device_id: 'your_device_id',
            service_id: 'led_switch',
            params: {
              led: this.led
            }
          }
        });
      } catch (error) {
        console.error('控制LED失败:', error);
      }
    },
    getToken() {
      // 实现token获取逻辑
      return 'your_generated_token';
    }
  }
}
</script>

<style>
.container {
  padding: 20px;
}
.card {
  background: #fff;
  border-radius: 10px;
  padding: 20px;
  margin-bottom: 20px;
  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.title {
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 15px;
}
.data-row {
  display: flex;
  justify-content: space-between;
  margin-bottom: 10px;
}
.value {
  font-weight: bold;
  color: #007AFF;
}
</style>

4.3 跨平台适配与优化

uni-app的优势在于一次开发可发布到多个平台。针对不同平台的优化建议:

  • 微信小程序

    • 注意请求域名需配置在合法域名列表中
    • 使用微信的登录授权获取用户信息
  • Android/iOS App

    • 添加原生插件支持推送通知
    • 优化启动图和图标适配
  • H5

    • 考虑响应式布局适配不同屏幕尺寸
    • 使用localStorage缓存token减少API调用

5. 项目扩展与进阶

5.1 功能扩展建议

基础功能实现后,可以考虑以下扩展方向:

  1. 多设备支持

    • 修改APP界面支持切换不同设备
    • 使用OneNet的设备分组功能管理多个传感器
  2. 历史数据查询

    • 调用OneNet的历史数据API
    • 实现日期选择器和图表展示
  3. 报警功能

    • 在ESP32端实现阈值检测
    • 或使用OneNet的平台级报警规则
    • 集成推送通知功能
  4. 能耗优化

    • 实现ESP32的深度睡眠模式
    • 根据环境变化动态调整采样频率

5.2 常见问题解决方案

在实际部署中可能会遇到以下典型问题:

问题1:ESP32无法连接OneNet

  • 检查WiFi连接状态
  • 验证MQTT连接参数(产品ID、设备ID、鉴权信息)
  • 确保OneNet服务正常运行

问题2:温湿度数据异常

  • 检查DHT22连接是否牢固
  • 验证供电电压是否稳定(3.3V)
  • 考虑添加传感器数据校验逻辑

问题3:APP控制延迟高

  • 优化网络请求频率
  • 考虑使用WebSocket实现实时通信
  • 检查OneNet服务的区域设置(选择就近区域)

问题4:跨平台样式不一致

  • 使用条件编译处理平台差异
  • 针对各平台单独优化样式表
  • 利用uni-app的API能力检测运行环境

5.3 性能优化技巧

提升系统整体性能的几个实用技巧:

  1. ESP32固件优化

    • 使用FreeRTOS任务管理关键功能
    • 实现OTA升级功能方便后期维护
    • 添加看门狗定时器提高稳定性
  2. OneNet平台优化

    • 合理设置数据存储策略
    • 使用数据压缩减少传输量
    • 利用规则引擎实现边缘计算
  3. APP优化

    • 实现数据本地缓存
    • 使用虚拟列表优化长列表性能
    • 添加骨架屏提升用户体验

这个项目虽然从功能上看相对简单,但它完整涵盖了物联网系统的关键组成部分:终端设备、通信网络、云平台和用户界面。通过这个实践,你不仅能够掌握ESP32编程、OneNet平台使用和uni-app开发等具体技能,更能建立起对物联网系统架构的全面理解。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐