改华为智能插座为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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 高阶…