基于米家协议的智能灯嵌入式程序开发教程
前言
随着智能家居的普及,越来越多的设备接入到米家生态系统中。本文将详细介绍如何开发一个支持米家协议的智能灯嵌入式程序,实现通过米家APP控制灯光的开关、亮度和色温调节等功能。
一、技术背景
1.1 米家协议简介
米家协议(MIoT)是小米IoT平台的通信协议,基于WiFi连接,采用JSON格式进行数据交换。主要特点:
- 安全性高:采用Token认证机制
- 响应快速:局域网直连,延迟低
- 功能丰富:支持多种设备类型和功能定义
- 生态完善:可与米家APP和小爱同学无缝对接
1.2 开发环境准备
本教程基于ESP32开发板,需要准备:
- 硬件:ESP32-DevKitC、LED驱动电路、RGB LED灯珠
- 软件:Arduino IDE 或 ESP-IDF、米家开发者账号
- 库文件:MIoT SDK、WiFi库、JSON解析库
二、硬件设计
2.1 电路连接图
ESP32 GPIO引脚分配:
- GPIO 12: PWM输出 - 红色LED
- GPIO 13: PWM输出 - 绿色LED
- GPIO 14: PWM输出 - 蓝色LED
- GPIO 15: PWM输出 - 白光LED(色温调节)
- GPIO 2: 板载LED指示灯(连接状态)
2.2 PWM配置
ESP32支持16路PWM输出,我们使用其中4路控制RGBW灯光。
三、核心代码实现
3.1 主程序框架
#include <WiFi.h>
#include <ArduinoJson.h>
#include "MIoT.h"// 设备信息配置
#define PRODUCT_ID "your_product_id"
#define DEVICE_ID "your_device_id"
#define TOKEN "your_token"// WiFi配置
const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";// PWM通道定义
#define PWM_FREQ 5000
#define PWM_RESOLUTION 8
#define RED_CHANNEL 0
#define GREEN_CHANNEL 1
#define BLUE_CHANNEL 2
#define WHITE_CHANNEL 3// GPIO引脚定义
#define RED_PIN 12
#define GREEN_PIN 13
#define BLUE_PIN 14
#define WHITE_PIN 15
#define STATUS_LED 2// 灯光状态结构体
struct LightState {bool power;uint8_t brightness;uint16_t color_temp;uint8_t red;uint8_t green;uint8_t blue;
} light_state = {false, 100, 4000, 255, 255, 255};// MIoT实例
MIoT miot;void setup() {Serial.begin(115200);// 初始化PWM通道initPWM();// 连接WiFiconnectWiFi();// 初始化米家协议initMIoT();// 注册设备属性和方法registerProperties();Serial.println("Smart Light Ready!");
}void loop() {// 处理米家协议消息miot.loop();// 更新灯光状态updateLight();// 处理本地按键(如果有)handleLocalControl();delay(10);
}
3.2 PWM初始化和控制
void initPWM() {// 配置PWM通道ledcSetup(RED_CHANNEL, PWM_FREQ, PWM_RESOLUTION);ledcSetup(GREEN_CHANNEL, PWM_FREQ, PWM_RESOLUTION);ledcSetup(BLUE_CHANNEL, PWM_FREQ, PWM_RESOLUTION);ledcSetup(WHITE_CHANNEL, PWM_FREQ, PWM_RESOLUTION);// 绑定GPIO到PWM通道ledcAttachPin(RED_PIN, RED_CHANNEL);ledcAttachPin(GREEN_PIN, GREEN_CHANNEL);ledcAttachPin(BLUE_PIN, BLUE_CHANNEL);ledcAttachPin(WHITE_PIN, WHITE_CHANNEL);// 初始化状态LEDpinMode(STATUS_LED, OUTPUT);// 关闭所有LEDsetAllLED(0, 0, 0, 0);
}void setAllLED(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {ledcWrite(RED_CHANNEL, r);ledcWrite(GREEN_CHANNEL, g);ledcWrite(BLUE_CHANNEL, b);ledcWrite(WHITE_CHANNEL, w);
}void updateLight() {if (!light_state.power) {// 灯光关闭setAllLED(0, 0, 0, 0);return;}// 根据亮度调整输出float brightness_factor = light_state.brightness / 100.0;// 计算实际输出值uint8_t r = light_state.red * brightness_factor;uint8_t g = light_state.green * brightness_factor;uint8_t b = light_state.blue * brightness_factor;// 色温转换为白光亮度uint8_t w = calculateWhiteFromColorTemp(light_state.color_temp) * brightness_factor;setAllLED(r, g, b, w);
}uint8_t calculateWhiteFromColorTemp(uint16_t color_temp) {// 色温范围:2700K(暖白)到 6500K(冷白)// 映射到0-255if (color_temp < 2700) color_temp = 2700;if (color_temp > 6500) color_temp = 6500;return map(color_temp, 2700, 6500, 0, 255);
}
3.3 米家协议实现
void initMIoT() {// 设置设备信息miot.setDeviceInfo(PRODUCT_ID, DEVICE_ID, TOKEN);// 设置回调函数miot.onPropertyGet(handlePropertyGet);miot