摘要:?智能插座作為智能家居的入門級設備,憑借其低成本、易部署等優勢,受到了廣大用戶的青睞。本文將引領你從零開始,使用功能強大的STM32微控制器、廣受歡迎的ESP8266 WiFi模塊以及功能豐富的米家IoT平臺,一步步打造出一款能夠遠程控制、定時開關、統計用電量,并完美融入米家生態的智能插座。
關鍵詞:?STM32, ESP8266, 米家, 智能插座, 物聯網, DIY, 教程
一、 引言
智能家居浪潮席卷而來,智能插座作為基礎設備,其市場需求日益旺盛。本文將帶領大家使用STM32、ESP8266 WiFi模塊,結合米家IoT平臺,開發一款可遠程控制、定時開關、統計用電量的智能插座,并開源全部代碼及設計資料。
二、 項目概述
2.1 功能需求
- 遠程控制:?通過米家App或語音助手控制插座開關
- 定時開關:?設置定時任務,自動開啟/關閉插座
- 用電統計:?記錄用電量,分析用電習慣
- 米家聯動:?與其他米家設備聯動,實現場景化智能控制
2.2 系統架構
- STM32:?主控芯片,負責控制繼電器開關、采集電流數據、與ESP8266通信。
- ESP8266:?WiFi模塊,負責與米家云通信,接收控制指令。
- 米家云:?提供設備接入、數據存儲、遠程控制等服務。
三、 硬件設計
3.1 硬件選型
組件 | 型號 | 說明 |
---|---|---|
主控芯片 | STM32F103C8T6 | 資源豐富,性價比高 |
WiFi模塊 | ESP8266-01S | 成熟穩定,價格便宜 |
繼電器 | 5V 10A | 控制交流電開關 |
電流傳感器 | ACS712 | 非侵入式電流檢測 |
電源模塊 | AC-DC 5V | 為系統供電 |
3.2 電路原理圖
3.3 電路連接說明
- 將 ESP8266 的 TX、RX 分別連接到 STM32 的 RX、TX,注意交叉連接。
- 繼電器控制端連接到 STM32 的 GPIO 引腳,驅動電路根據繼電器類型選擇。
- 電流傳感器 ACS712 的輸出引腳連接到 STM32 的 ADC 引腳。
四、 軟件開發
4.1 軟件架構
?
4.2 關鍵代碼解析
1. ESP8266 初始化及 WiFi 連接
// 初始化 ESP8266
void ESP8266_Init(void) {// 設置串口參數UartInit();// 發送 AT 指令測試 ESP8266 是否正常if (ESP8266_SendCmd("AT\r\n", "OK", 1000)) {printf("ESP8266 OK\r\n");} else {printf("ESP8266 Error\r\n");return;}// 設置 WiFi 模式為 StationESP8266_SendCmd("AT+CWMODE=1\r\n", "OK", 1000);// 連接 WiFichar cmd[50];sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", WIFI_SSID, WIFI_PWD);if (ESP8266_SendCmd(cmd, "OK", 5000)) {printf("WiFi Connected\r\n");} else {printf("WiFi Connect Failed\r\n");}
}// 發送 AT 指令
bool ESP8266_SendCmd(char* cmd, char* ack, uint16_t timeout) {// 發送指令UartSendString(cmd);// 等待回復return UartWaitAck(ack, timeout);
}
2. 米家設備綁定
- 本項目使用?米家自定義協議?接入,需要在米家開發者平臺創建產品和設備,獲取到相應的密鑰信息。
- 設備綁定過程涉及到數據加密和簽名,具體實現可參考米家官方文檔。
// 設備綁定
void MIoT_DeviceBind(void) {// 構造綁定請求數據包MIoT_Packet_t packet;packet.cmd = MIOT_CMD_BIND;// 填充設備信息和密鑰// ...// 數據加密和簽名// ...// 發送綁定請求ESP8266_SendData((char*)&packet, sizeof(packet));// 接收綁定回復// ...
}
3. 接收控制指令并控制繼電器
// 接收控制指令
void MIoT_ReceiveCmd(void) {MIoT_Packet_t packet;// 接收數據包// ...// 解析數據包switch (packet.cmd) {case MIOT_CMD_CONTROL:// 控制繼電器開關if (packet.data.control.power_switch) {Relay_On();} else {Relay_Off();}break;// 其他指令處理// ...}
}// 控制繼電器
void Relay_On(void) {GPIO_SetBits(RELAY_GPIO_PORT, RELAY_GPIO_PIN);
}void Relay_Off(void) {GPIO_ResetBits(RELAY_GPIO_PORT, RELAY_GPIO_PIN);
}
4. 采集電流數據并上報狀態
// 采集電流數據
float GetCurrent(void) {// 讀取 ADC 值uint16_t adcValue = ADC_GetValue(ADC1, ADC_Channel_1); // 假設使用ADC1的通道1// 將 ADC 值轉換為電壓值float voltage = adcValue * (3.3 / 4095); // 假設參考電壓為3.3V// 根據傳感器規格將電壓值轉換為電流值// 例如,對于 ACS712,電流值 = (電壓值 - 2.5) / 0.185float current = (voltage - ACS712_VREF) / ACS712_SENSITIVITY; return current;
}// 上報設備狀態
void MIoT_ReportStatus(void) {// 構造狀態數據包MIoT_Packet_t packet;packet.cmd = MIOT_CMD_REPORT;// 填充設備狀態數據packet.data.status.power_switch = (Relay_GetState() == 1); // 繼電器狀態,建議使用布爾值packet.data.status.current = GetCurrent();// 數據加密和簽名MIoT_EncodeData(&packet); // 發送狀態數據包ESP8266_SendData((char*)&packet, sizeof(packet));
}// 示例函數: 獲取繼電器狀態
bool Relay_GetState(void) {// 讀取繼電器控制引腳的電平狀態if (GPIO_ReadOutputDataBit(RELAY_GPIO_PORT, RELAY_GPIO_PIN) == 1) {return true; // 繼電器閉合,插座通電} else {return false; // 繼電器斷開,插座斷電}
}// 示例函數: 使用 ESP8266 發送數據
bool ESP8266_SendData(char* data, uint16_t len) {// 通過串口發送數據到 ESP8266// ...// 檢查發送是否成功// ...
}
代碼說明:
GetCurrent()
?函數:- 使用 STM32 的 ADC 模塊讀取電流傳感器 ACS712 的模擬電壓值。
- 根據傳感器規格書,將讀取到的 ADC 值轉換為實際電流值。
MIoT_ReportStatus()
?函數:- 構造符合米家自定義協議的狀態數據包。
- 調用?
GetCurrent()
?函數獲取當前電流值。 - 調用?
Relay_GetState()
?函數獲取繼電器狀態。 - 對數據進行加密和簽名,確保數據安全。
- 通過 ESP8266 將狀態數據包發送到米家云平臺。
注意:
- 以上代碼僅供參考,實際開發中需要根據所選硬件和米家平臺的要求進行調整。
- 請務必仔細閱讀相關芯片手冊和米家開發文檔,確保代碼的正確性和安全性。
五、 米家平臺接入
- 登錄米家開發者平臺,創建智能插座產品和設備。
- 選擇自定義協議接入方式,定義設備模型,添加屬性和方法。
- 在代碼中實現設備綁定、狀態上報、指令接收等功能,并對接米家云平臺 API。
- 完成開發后,進行測試和調試,確保設備能夠正常連接米家 App 并實現預期功能。
六、 總結與
本文介紹了基于 STM32 和 ESP8266 的智能插座的設計與實現,并詳細講解了硬件電路、軟件架構、關鍵代碼以及米家平臺接入流程。通過本文,讀者可以快速掌握智能插座開發的基本方法,并在此基礎上進行功能擴展和創新。