改華為智能插座為mqtt本地控制

華為插座

?1. 打開插座后蓋板,取出主板

?2.取下主板上的8266

?3焊上esp32c3 supermini,熱熔膠粘上,焊接電源正負極,及第5腳

?4.取下電源板阻容降壓全部。因此電路不能提供足夠電流給esp32工作。

?5.外接小型ac-dc電源5v

?6.刷代碼

?Mqtt插座成品

?

特別提醒,所有操作都必須斷電,不能帶220v電源刷機。

準備拍一個詳細的改制視頻上傳抖音

mqtt插座代碼

#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "mqtt_client.h"
#include "driver/gpio.h"
#include "esp_netif.h"#define WIFI_SSID     "CMCC-6ZN9"  //    "ChinaNet-AETP5V"
#define WIFI_PASS      "2KJKWEML"  //     "wf123456" "2KJKWEML"
#define MQTT_BROKER    "mqtt://192.168.101.233:1883"
#define GPIO_OUTPUT_IO 5static const char *TAG = "LIGHT_CONTROL";static esp_mqtt_client_handle_t mqtt_client = NULL;// === 發送 MQTT Discovery 配置 ===
static void send_discovery_config(void) {const char *config_topic = "homeassistant/switch/esp32c3_switch/config";const char *config_payload ="{""\"name\": \"ESP32C3 Switch\",""\"command_topic\": \"light/control\",""\"payload_on\": \"on\",""\"payload_off\": \"off\",""\"unique_id\": \"switch1\"""}";esp_mqtt_client_publish(mqtt_client, config_topic, config_payload, 0, 1, 1);ESP_LOGI(TAG, "MQTT discovery config sent");
}// === MQTT 事件回調 ===
static void mqtt_event_handler_cb(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) {esp_mqtt_event_handle_t event = event_data;mqtt_client = event->client;switch (event->event_id) {case MQTT_EVENT_CONNECTED:ESP_LOGI(TAG, "MQTT Connected");send_discovery_config();esp_mqtt_client_subscribe(event->client, "light/control", 0);break;case MQTT_EVENT_DATA:ESP_LOGI(TAG, "Received on topic: %.*s -> %.*s",event->topic_len, event->topic,event->data_len, event->data);if (strncmp(event->topic, "light/control", event->topic_len) == 0) {if (strncmp(event->data, "on", event->data_len) == 0) {gpio_set_level(GPIO_OUTPUT_IO, 1);ESP_LOGI(TAG, "GPIO %d set to HIGH", GPIO_OUTPUT_IO);} else if (strncmp(event->data, "off", event->data_len) == 0) {gpio_set_level(GPIO_OUTPUT_IO, 0);ESP_LOGI(TAG, "GPIO %d set to LOW", GPIO_OUTPUT_IO);}}break;default:break;}
}// === 啟動 MQTT ===
static void mqtt_app_start(void) {esp_mqtt_client_config_t mqtt_cfg = {.broker.address.uri = MQTT_BROKER,};mqtt_client = esp_mqtt_client_init(&mqtt_cfg);esp_mqtt_client_register_event(mqtt_client, ESP_EVENT_ANY_ID, mqtt_event_handler_cb, NULL);esp_mqtt_client_start(mqtt_client);
}// === WiFi 事件回調 ===
static void wifi_event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data) {if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {ESP_LOGI(TAG, "WiFi disconnected, retry...");esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "Got IP: " IPSTR, IP2STR(&event->ip_info.ip));mqtt_app_start();  // 只有拿到 IP 后才啟動 MQTT}
}// === 初始化 WiFi STA ===
static void wifi_init_sta(void) {ESP_LOGI(TAG, "Initializing WiFi...");esp_netif_init();esp_event_loop_create_default();esp_netif_create_default_wifi_sta();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();esp_wifi_init(&cfg);// 注冊 WiFi 和 IP 事件回調esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL);esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &wifi_event_handler, NULL);wifi_config_t wifi_config = { 0 };strncpy((char*)wifi_config.sta.ssid, WIFI_SSID, sizeof(wifi_config.sta.ssid));strncpy((char*)wifi_config.sta.password, WIFI_PASS, sizeof(wifi_config.sta.password));esp_wifi_set_mode(WIFI_MODE_STA);esp_wifi_set_config(WIFI_IF_STA, &wifi_config);esp_wifi_start();
}// === 主函數 ===
void app_main(void) {// 初始化 GPIO2 為輸出gpio_config_t io_conf_out = {.pin_bit_mask = 1ULL << GPIO_OUTPUT_IO,.mode = GPIO_MODE_OUTPUT,.pull_up_en = GPIO_PULLUP_DISABLE,.pull_down_en = GPIO_PULLDOWN_DISABLE,.intr_type = GPIO_INTR_DISABLE};gpio_config(&io_conf_out);// 初始化 NVS 和連接 Wi-FiESP_ERROR_CHECK(nvs_flash_init());wifi_init_sta();
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96799.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2.4G和5G位圖說明列表,0xff也只是1-8號信道而已

根據你提供的 SDK 代碼&#xff0c;0xFF 僅表示啟用 1 到 8 號信道&#xff08;即 2.4GHz 頻段的信道&#xff09;。這是因為每個 BIT(x) 是一個位標志&#xff0c;0xFF 在二進制中對應的是 11111111&#xff0c;即啟用信道 1 至 8。對于 5GHz 信道&#xff0c;你需要確保傳輸的…

【網絡運維】Shell 腳本編程: for 循環與 select 循環

Shell 腳本編程&#xff1a; for 循環與 select 循環 循環語句命令常用于重復執行一條指令或一組指令&#xff0c;直到條件不再滿足時停止&#xff0c;Shell腳本語言的循環語句常見的有while、until、for及select循環語句。 本文將詳細介紹Shell編程中for循環和select循環的各種…

線性回歸入門:從原理到實戰的完整指南

線性回歸入門&#xff1a;從原理到實戰的完整指南線性回歸是機器學習中最基礎、最實用的算法之一 —— 它通過構建線性模型擬合數據&#xff0c;不僅能解決回歸預測問題&#xff0c;還能為復雜模型&#xff08;如神經網絡、集成算法&#xff09;提供基礎思路。今天我們從 “直線…

積分排行樣式

這個排名需要考慮不同child的位置<view class"pm-top"><!--背景 podiumtree 或 podium--><image class"podium-bg" :src"podium" mode"widthFix"></image><view class"podium-list"><vi…

【機器學習入門】1.1 緒論:從數據到智能的認知革命

引言&#xff1a;什么是機器學習&#xff1f;想象一下&#xff0c;當你在郵箱中看到一封郵件時&#xff0c;系統能自動識別出它是垃圾郵件&#xff1b;當你在購物網站瀏覽商品時&#xff0c;平臺能精準推薦你可能感興趣的物品&#xff1b;當自動駕駛汽車行駛在道路上時&#xf…

iptables 防火墻技術詳解

目錄 前言 1 iptables概述 1.1 Netfilter與iptables關系 1.1.1 Netfilter 1.1.2 iptables 1.1.3 兩者關系 2 iptables的表、鏈結構 2.1 四表五鏈結構介紹 2.1.1 基本概念 2.1.2 四表功能*** 2.1.3 五鏈功能*** 2.2 數據包過濾的匹配流程*** 2.2.1 規則表應用順序*…

SOME/IP-SD報文中 Entry Format(條目格式)-理解筆記3

&#x1f3af; 一、核心目標&#xff1a;解決“找服務”的問題 想象一下&#xff0c;一輛現代汽車里有上百個智能設備&#xff08;ECU&#xff09;&#xff0c;比如&#xff1a; 自動駕駛控制器&#xff08;需要“車速”服務&#xff09;中控大屏&#xff08;需要“導航”和“音…

AAA服務器技術

一、AAA認證架構理解AAA基本概念與架構先介紹&#xff1a; AAA是什么&#xff08;認證、授權、計費&#xff09;重點理解&#xff1a; 為什么需要AAA&#xff1f;它的三大功能分別解決什么問題&#xff1f;關聯后續&#xff1a; 這是所有后續協議&#xff08;RADIUS/TACACS&…

客戶生命周期價值幫助HelloFresh優化其營銷支出

1 引言 了解客戶的長期價值對HelloFresh至關重要。客戶生命周期價值&#xff08;CLV&#xff09;代表了客戶與公司關系的整個過程中所產生的總價值。通過預測這一指標&#xff0c;我們可以更明智地決定如何分配營銷資源&#xff0c;以獲得最大的影響。 在本文中&#xff0c;我…

Vue 2 中的 v-model和Vue3中的v-model

你問的是 v-model&#xff08;不是 v-modal 吧 &#x1f604;&#xff09;&#xff0c;我來幫你梳理一下 Vue2 和 Vue3 的 v-model 區別。&#x1f539; Vue 2 中的 v-model語法<input v-model"msg">v-model 本質上是 語法糖&#xff0c;等價于&#xff1a;<…

樸素貝葉斯算法學習總結

一、貝葉斯理論基礎 1. 貝葉斯思想的核心 貝葉斯算法由 18 世紀英國數學家托馬斯?貝葉斯提出&#xff0c;其核心是解決 “逆概” 問題 —— 區別于 “正向概率” 已知條件求結果概率的思路&#xff0c;逆概是通過觀測到的結果&#xff0c;反推導致該結果的原因概率。比如在日常…

【Protues仿真】基于AT89C52單片機的舵機和直流電機控制

目錄 1 PWM信號 1.1 三個最基本的量 1.1.1 周期 T&#xff08;Period&#xff09; 1.1.2脈沖寬度 Th&#xff08;High Time&#xff09; 1.1.3占空比 D&#xff08;Duty Cycle&#xff09; 1.2 為什么要用 PWM 1.3 關鍵參數對照表 1.4單片機里產生 PWM 的四種套路 1.4…

vue家教預約平臺設計與實現(代碼+數據庫+LW)

摘要 隨著互聯網技術的不斷發展&#xff0c;在線家教平臺逐漸成為家長和學生選擇教育服務的重要途徑。尤其在現代社會中&#xff0c;個性化教育需求日益增多&#xff0c;傳統的線下家教形式已無法完全滿足廣大家長和學生的需求。在線家教平臺不僅能為學生提供更多選擇&#xf…

AI系列 - Claude 與 Qwen 模型自動補全對比:誰更勝一籌?

Claude 與 Qwen 模型自動補全對比&#xff1a;誰更勝一籌&#xff1f; 導讀&#xff1a;隨著大語言模型的快速發展&#xff0c;自動補全功能在代碼編寫、文本生成等領域變得越來越重要。本文將對比 Anthropic 的 Claude 系列模型與 Alibaba 的 Qwen 系列模型在自動補全任務中的…

【ARM】MDK在debug模式下斷點的類型

1、 文檔目標本文旨在深入探討嵌入式開發環境中&#xff08;以MDK為例&#xff09;調試模式下的斷點類型&#xff0c;幫助開發者全面了解不同斷點的工作原理及其應用場景。通過掌握這些知識&#xff0c;開發者可以更高效地進行代碼調試&#xff0c;快速定位和解決問題。2、 問題…

CF2133C 下界(The Nether)

CF2133C 下界&#xff08;The Nether&#xff09; 洛谷題目傳送門 題目描述 這是一道交互題。 最近發現下界&#xff08;The Nether&#xff09;后&#xff0c;Steve 在他的世界中建造了一個由 nnn 個下界傳送門組成的網絡&#xff0c;每個傳送門位于不同的位置。 每個傳送…

無線USB轉換器TOS-WLink網盤更新--TOS-WLink使用幫助V1.0.pdf

1&#xff0c;編寫原因 隨著當前視頻越來越多&#xff0c;對于首次接觸到WLink的朋友、首次開箱使用的朋友不夠友好&#xff0c;常常感覺無從下手&#xff0c;為此編寫了TOS-WLink使用幫助V1.0.pdf&#xff1b;按照文檔進行一步一步驅動安裝&#xff0c;配網&#xff1b;文檔中…

Redis面試精講 Day 29:Redis安全防護與最佳實踐

【Redis面試精講 Day 29】Redis安全防護與最佳實踐 在“Redis面試精講”系列的第29天&#xff0c;我們聚焦于一個在生產環境中至關重要、卻常被開發者忽視的核心主題——Redis的安全防護與最佳實踐。隨著Redis廣泛應用于高并發、分布式系統中&#xff0c;其暴露在公網或內網中…

【數據結構】LeetCode160.相交鏈表 138.隨即鏈表復制 牛客——鏈表回文問題

文章目錄一、相交鏈表問題問題描述解題思路分析思路一&#xff1a;暴力遍歷法思路二&#xff1a;雙指針對齊法&#xff08;最優解&#xff09;二、鏈表的回文結構問題描述解題思路完整代碼三、 隨即鏈表的復制問題描述解題思路復雜度分析一、相交鏈表問題 問題描述 給定兩個單…

Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集【四、事務引擎核心 - MVCC與鎖機制】

Mysql InnoDB 底層架構設計、功能、原理、源碼系列合集 一、InnoDB 架構先導。【模塊劃分&#xff0c;各模塊功能、源碼位置、關鍵結構體/函數】 二、內存結構核心 - 緩沖池與性能加速器 三、日志系統 - 事務持久化的基石 四、事務引擎核心 - MVCC與鎖機制 五、InnoDB 高階…