上篇:硬件搭建与云端配置

一、项目概述

智能家居是物联网技术最贴近日常生活的应用场景之一。一套完整的智能家居系统通常需要解决三个核心问题:感知(环境状态采集)、控制(设备执行指令)和通信(设备与云端的数据交互)。

本文项目聚焦于门禁安防与环境监测两个方向,具体实现以下功能:

功能模块 具体内容
RFID门禁 刷卡识别、舵机开门、非法刷卡报警
环境监测 温湿度、空气质量、火焰检测
远程控制 云端远程开门、报警阈值调整
本地控制 板载按钮、嵌入式Web服务器

技术选型说明:ESP32兼具WiFi/BLE通信能力与足够的GPIO接口,适合作为物联网终端主控;阿里云物联网平台提供免费的公共实例,支持MQTT协议接入,无需自建服务器即可完成设备管理、数据存储与消息转发。

二、系统硬件选型

2.1 主控芯片

TinkerNode是基于ESP32的物联网开发板,主要技术参数如下:

参数 规格
主控芯片 ESP32
无线通信 WiFi 2.4GHz / 蓝牙4.0 / NB-IoT
数字I/O 5个(D0-D4)
模拟输入 2个(A0-A1)
通信接口 SPI / I2C / UART
工作电压 3.3V
Flash 16MB
2.2 外围设备选型
设备 型号 功能
RFID读卡模块 RC522 读取ISO/IEC 14443A标准卡片UID
舵机 SG90 控制门锁开闭(0°关 / 90°开)
温湿度传感器 DHT11 温度0-50℃ / 湿度20-90%RH
空气质量传感器 MQ135 检测氨气/苯/烟雾等有害气体
火焰传感器 红外型 检测火焰红外光谱
蜂鸣器 有源

本地声音报警

2.3 GPIO引脚分配
模块 信号引脚 连接ESP32引脚
RC522 SCK(时钟) SCK(GPIO18)
RC522 MOSI(主出从入) MOSI(GPIO23)
RC522 MISO(主入从出) MISO(GPIO19)
RC522 RST(复位) GPIO22
RC522 SDA(片选) GPIO21
火焰传感器 模拟输出 A0
MQ135 模拟输出 A1
DHT11 数据线 D0
蜂鸣器 信号线 D1
SG90舵机 信号线 D2

注意:TinkerNode的D3引脚连接了板载按键,D4引脚连接了板载LED,在使用这两个引脚时需考虑板载电路的影响。

三、阿里云物联网平台配置

3.1 创建产品

登录阿里云物联网平台控制台,进入“设备管理 → 产品”,点击创建产品:

配置项 填写内容
产品名称 SmartHome
节点类型 设备
连网方式 WiFi
数据格式 ICA标准数据格式(Alink JSON)

创建成功后,系统生成唯一的ProductKey,作为该产品下所有设备的统一标识。

3.2 创建设备

在产品下添加设备,每台设备分配唯一的三元组信息:

参数 说明
ProductKey 产品标识,同一产品下所有设备共用
DeviceName 设备名称,产品下唯一
DeviceSecret 设备密钥,用于MQTT连接认证

本次系统共创建5个设备:

设备名称 功能说明
Servo_Device 舵机远程控制
Door_Device 门禁事件上报
Humiture_Device 温湿度数据上报
Air_Device 空气质量数据上报
Flame_Device 火焰数据上报
3.3 物模型定义

物模型(TSL,Thing Specification Language)是阿里云对设备功能的标准描述,包含属性、服务、事件三种类型。

属性:描述设备运行状态,分为只读(设备上报)和读写(云端可下发)。

事件:设备主动上报的异常或通知,无需云端响应。

四、设备端开发环境

4.1 核心库依赖
库名称 用途 安装方式
DFRobot_Iot 阿里云IoT平台连接 库管理器搜索安装
PubSubClient MQTT协议实现 库管理器搜索安装
ArduinoJson JSON数据解析与构建 库管理器搜索安装
MFRC522 RC522读卡模块驱动 库管理器搜索安装
ESP32Servo 舵机控制 库管理器搜索安装
DHT DHT11/DHT22传感器驱动 库管理器搜索安装
4.2 工程目录结构
SmartHome/
├── smarthome.ino          // 主程序入口
├── headfile.h             // 统一头文件引用
├── AccessControl.h/cpp    // 门禁控制模块
├── EnMonitor.h/cpp        // 环境监测模块
├── CloudControl.h/cpp     // 云端通信模块
├── WebServer.h/cpp        // 嵌入式Web服务器

五、WiFi连接与设备认证

5.1 WiFi连接

设备端通过STA模式连接家庭路由器:

const char *WIFI_SSID = "路由器名称";
const char *WIFI_PASSWORD = "路由器密码";

void connectWiFi() 
{
    Serial.print("正在连接 WiFi...");
    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(500);
        Serial.print(".");
    }
    Serial.println("\nWiFi 连接成功");
    Serial.print("IP 地址: ");
    Serial.println(WiFi.localIP());
}
5.2 MQTT连接与设备认证

使用DFRobot_Iot库完成阿里云MQTT连接:

void connectDevice(CloudDevice &device) 
{
    // 使用三元组初始化MQTT客户端
    device.iot.init(ALIYUN_SERVER, PRODUCT_KEY, device.clientId,
                    device.deviceName, device.deviceSecret);

    device.mqttClient = new PubSubClient(device.wifiClient);
    device.mqttClient->setServer(device.iot._mqttServer, PORT);
    
    // 若有回调函数,设置消息处理回调
    if (device.callback != nullptr) 
    {
        device.mqttClient->setCallback(device.callback);
    }

    // 建立连接
    while (!device.mqttClient->connected()) 
    {
        if (device.mqttClient->connect(device.iot._clientId,
                                       device.iot._username,device.iot._password)) 
        {
            // 订阅设备属性设置Topic(仅需要接收指令的设备)
            if (device.needSubscribe) 
            {
                device.mqttClient->subscribe(subTopic.c_str());
            }
        } 
        else 
        {
            delay(5000);
        }
    }
}
5.3 Topic设计

设备与云端通信通过发布/订阅特定的MQTT Topic实现:

Topic类型 格式 用途
属性上报 /sys/${ProductKey}/${DeviceName}/thing/event/property/post 设备上报属性数据
属性设置 /sys/${ProductKey}/${DeviceName}/thing/service/property/set 云端下发属性指令
事件上报 /sys/${ProductKey}/${DeviceName}/thing/event/${EventName}/post 设备上报事件

发布/订阅模式是MQTT协议的核心机制。设备通过发布操作将数据发送到特定Topic,云端通过订阅同一Topic接收数据;云端下发的指令发布到设备的订阅Topic,设备在回调函数中处理。

六、小结

上篇完成了硬件选型、云端配置与基础通信框架的搭建。核心成果包括:

  1. 确定了ESP32主控与各类传感器/执行器的硬件连接方案

  2. 在阿里云物联网平台完成产品创建、设备注册与物模型定义

  3. 建立了设备端WiFi连接与MQTT认证的基础代码框架

  4. 明确了各模块的Topic设计方案

下篇将进入具体的软件实现,包括门禁控制逻辑、传感器数据采集、云端数据上报与指令响应、以及嵌入式Web服务器的搭建。

更多推荐