ESP32的MQTT AT固件烧录+STM32以ESP32的MQTT AT固件的AT指令连接EMQX下mqtt服务器实现消息订阅和发布

ESP32烧录AT固件并进行MQTT通讯 AT+CWLAP //搜索WIFI。AT+CWMODE=1 //设置客户端模式。AT+CWJAP="WIFI名","密码" //连接wifi。主题-- v1/devices/me/telemetry。域名-- mqtt.thingsboard.cloud。内容-- "{temperature:25}"烧录后注意usb的串口是不能发AT指令的。用AT指令确认OK后连WIFI。进连接测试界面复制这条测试命令。ESP--AT固件指令。 阅读详情
AI摘要

本文档详述了如何使用STM32通过ESP32的AT指令来连接和控制MQTT服务器的过程,包括ESP32的固件烧录、配置上电自动连接WIFI和断开重连设置,以及STM32如何发送AT指令进行数据交互。STM32通过串口与ESP32交互,实现订阅和发布MQTT消息。示例代码展示了STM32如何解析接收到的数据并进行相应的操作。

目录

写在前面

三种方案(利用ESP32连接EMQX下的MQTT)

步骤

ESP32烧录固件并AT指令进行测试。

下载固件

 烧录工具下载

烧录固件(选择ESP32)

 关于AT 指令与MQTT服务器断开后自动重连MQTT服务器

关于AT指令设置上电自动连接WIFI

关于AT指令设置断开后自动重新连接WIFI

STM32对接ESP32(以AT指令交互)

原理:

步骤:

设备: 

连线:

测试:

主要代码: 

效果:

最后


 

写在前面

        ESP32是一块完整的开发板,据我目前所知,它本身自带蓝牙和WIFI,可用arduino和MicroPython单独对其完成开发,以前我用arduino已经试过了。参考我之前的

ESP32(基于Arduino)连接EMQX的Mqtt服务器上传信息与命令控制_昊月光华的博客-优快云博客_arduino esp32 mqtt

        既然ESP32本身在通信方面上就已经做得足够完美了(最高主频可以达到240MHZ),而且以arduino库开发的方式又极其简单和轻松。奈何让esp32订阅和发布都是相当于另外写一套代码(尽管也很简单,但避免不了新的需求又要增加新的代码),其中包括串口通信的代码(保证不会有信息丢失),还要包括断网自动重连WIFI和与mqtt服务器断开自动重连等辅助代码。试想在这种情况下,需要判断从stm32发过来的信息中是发给那个主题的,不得不继续修改代码增加判断。( (除非单独指定某个串口接受某个主题的数据,然后esp32收到就直接发送对应主题。)

三种方案(利用ESP32连接EMQX下的MQTT)

  • 第一种:正如上面的那样,esp32单独工作,stm32与esp32串口通信订阅和发布。(这种比如容易看到效果,因为可以单独进行测试)
  • 第二种:也就是本次我要做的事情,直接用stm32通过AT指令控制ESP32连接wifi,连接mqtt服务器,然后订阅和发布。
  • 第三种:结合前面两种的方案,让esp32单独开发,比如用arduino可以单独订阅和发布,自己规定一套协议,我把它称之为仿AT指令 ,然后约定xxx格式是订阅,xxx格式是发布。好处在于可以自己扩展代码。比如说可以知道另一个连接mqtt服务器的客户端的在线情况。坏处在于:难度较大,需要保证每次的发布信息和收到订阅主题的信息都能无差错。

本次实现第二种:让esp32烧录MQTT 的AT 固件 然后 stm32以发AT 指令的方式完成所有功能。详细见步骤:

步骤

ESP32烧录固件并AT指令进行测试。

这个官方文档上有。

接线 

 

下载固件

esp32的固件链接

https://docs.ai-thinker.com/_media/esp32/esp32-s_at2.2-sdk4.0.1-uart0.rar

 

 烧录工具下载

Flash烧录工具的下载链接:工具 | 乐鑫科技

下载解压后图示 

 

 

烧录固件(选择ESP32)

打开烧录工具

 选择后(如下配置只有被勾选的那一行是有效的)

在烧录之前,把esp32设置成自动下载模式,先按EN,同时按下IO0

串口打印出

rst:0x1 (POWERON_RESET),boot:0x3 (DOWNLOAD_BOOT(UART0/UART1/SDIO_REI_REO_V2))
waiting for download

 说明进入了下载模式

 start后,开始下载

 

完成后复位测试AT指令。(需要注意的是AT指令格式必须是严格的,比如以下带AT的指令,AT前不能有空格,后面也不能有空格,另外串口调试助手发送还必须带回车符。)

在进行以下AT指令测试之前,本地EMQX的mqtt服务器要安装后并在bin路径下 

emqx start

启动。

 

 进行AT指令测试。(附上官网文档上的指令)

更多关于WIFI 的AT指令和MQTT 的AT指令集参考乐鑫官网

AT 命令集 - ESP32 - — ESP-AT 用户指南 latest 文档 (espressif.com)

发送AT指令的顺序:

AT                                                                                     #测试AT功能

AT+CWMODE=1                                                          #设置模组进入STA模式

AT+CWJAP="ssid","password"                               #连接wifi

AT+MQTTUSERCFG=0,1,"用户ID","账号","密码",0,0,""

# 设置MQTT连接所需要的的参数,包括用户ID(不为空)、

# 账号(admin)以及密码(public)

AT+MQTTCONN=0,"本地IP",1883,0

AT+MQTTPUB=0,"对应主题","发布主题对应信息",0,0          //发布对应主题信息                                            

AT+MQTTSUB=0,"订阅的主题名",0      //订阅对应的主题

 

 串口助手下AT 指令测试

若连接mqtt服务器返回 ERROR 

先调用 MQTT+CLEAN=0 清除MQTT的连接信息。再重新连接。

 

 

 关于AT 指令与MQTT服务器断开后自动重连MQTT服务器

AT+MQTTCONN=0,"192.168.1.13",1883,0(以连接本地为例,0改成1即可,经过测试,手动断开服务器连接后能自动重连)

关于AT指令设置上电自动连接WIFI

AT+CWAUTOCONN=<enable>  0:上电不自动连接 1:上电自动连接

关于AT指令设置断开后自动重新连接WIFI

AT+CWRECONNCFG=1,0  //断开后每隔1s自动重连,始终尝试自动重连

到这,把esp32断网自动重连WIFI和mqtt服务器都设置完毕。

 

STM32对接ESP32(以AT指令交互)

原理:

让stm32以串口的形式发送给ESP32代替串口调试助手与ESP32进行交互。需要注意的是在连接时适当的延时保证ESP32处理完数据。(若不延时,我测试时有可能会连接失败)

步骤:

  1. STM32发AT指令控制ESP32正常连接EMQX下的mqtt服务器并订阅相关主题
  2. 用paho MQTT客户端也连接mqtt服务器,并发布相应主题
  3. stm32收到信息进行数据处理,判断是哪个主题发来的并解析出具体消息。

 

设备: 

其中STM32是F103C8T6最小系统开发板。

连线:

stm32的串口2连接ESP32的串口1。stm32的串口2以DMA加空闲中断接受数据。

测试:

esp32收到stm32发过来的AT指令订阅"hello"主题,用paho客户端或EMQX下的websocket发布主题信息,以json格式发送,esp32收到后发送到stm32,stm32解析出对应数据信息。

主要代码: 

我的代码中难免有败笔,只考虑了正常情况,敬请指出。 

mqtt.c




#include "mqtt.h"






u16 MAXCONNECT_TIME=0;

u8 Rx2_Buf[180]={0};   //接受ESP32模块信息
u8 Rx2_sBuf[180]={0};  //发送缓存数组 以DMA方式
u8 Rx2_Cnt=0;

__IO u8  mqttstate=0;
char wifi_uid[]="rookie";
char wifi_pwd[]="yy061457";
 


//连接WIFI  ESP32可以设置为自动重连
void ConnectWifi(void){
    
    sprintf((char *)Rx2_sBuf,CONNECTWIFI,wifi_uid,wifi_pwd);
  
    HAL_UART_Transmit(&huart2,Rx2_sBuf,strlen((const char *)Rx2_sBuf),10);
  
    
}


 //清除MQTT连接
void CleanMqttInfo(void){
     
    HAL_UART_Transmit(&huart2,(uint8_t *)CLEANMQTTINFO,sizeof(CLEANMQTTINFO),10);
    printf("%s\r\n",CLEANMQTTINFO);
 
    
}

 //登录认证
void ConnectMQTTServer(void){
    
    //清除先前遗留连接信息
      CleanMqttInfo();  
    
    HAL_Delay(500);
    //登录认证
    HAL_UART_Transmit(&huart2,(u8*)LOGINMQTT,sizeof(LOGINMQTT),20);
    printf("%s\r\n",LOGINMQTT);
     HAL_Delay(500);
    
    
    //连接mqtt服务器
    HAL_UART_Transmit(&huart2,(u8*)CONNECTMQTT,sizeof(CONNECTMQTT),20);
    printf("%s\r\n",CONNECTMQTT);
    HAL_Delay(1000);
     
}


//连接WIFI与MQTT服务器
void MQTT_Init(void){
    

    
                    ConnectWifi();     //可设置上电自动连接wifi
                    HAL_Delay(5000);
                     mqttstate=1;
                     ConnectMQTTServer();
                    while(mqttstate!=2){
  
                        ConnectMQTTServer();
                         HAL_Delay(1000);
                    }
                   printf("Connect mqtt success\r\n");
                 
                    SubAssignTopic("hello"); //订阅相关主题
                    
                    HAL_Delay(1000);
        
}

///订阅指定主题
void SubAssignTopic(char * subtopic){
    
    sprintf(Rx2_sBuf,SUBTOPIC,subtopic);
    printf("%s\r\n",Rx2_sBuf);
    HAL_UART_Transmit(&huart2,Rx2_sBuf,sizeof(Rx2_sBuf),10);

}




//获取对应主题和对应信息(JSON格式),以及json数据报长度
void GetTopicAndMsg(char * p,char * src,char* topic, char* cnt,int len,char * msg) {

    while (*p != '"' && p != &src[len - 1])p++; //匹配第一个引号


    if (*p++ == '"') {
        char start = 0;
        while (*p != '"' && p != &src[len - 1]) {
            topic[start++] = *p++;
        }

        if (*p++ == '"') {  //匹配第二个引号
            topic[start] = '\0';
            printf("[topic]:%s\r\n", topic);  //主题获取完毕
            
        }
        if (*p == ',' && p!= &src[len-1]) { //匹配第一个逗号
            p++;
            char temp[3] = { 0 };
            char j = 0;
            while (*p!=',' && p != &src[len-1])
            {
                temp[j++] = *p++;
            }
            *cnt = atoi(temp);//得到长度
            printf("[CNT]:%d\r\n", *cnt);
            if (*p++ == ',') {//匹配描述消息体长度的最后一个逗号
                j = 0;
                while (p != &src[len]) {  
                    msg[j++] = *p++;
                }
                msg[j] = '\0';
                printf("[msg]:%s\r\n", msg);

            }   
        }
       
    }

}


void Test(void){
    
    char topic[30]={0};
    char msg[160]={0};
       char* p = strstr((const char *)Rx2_Buf, "MQTTSUBRECV");
        if(p){
          u8 len =strlen((const char *)Rx2_Buf);
          char cnt=0;
             //获取主题与json数据报
            GetTopicAndMsg(p ,Rx2_Buf,  topic,&cnt,  len,  msg);
            
            
             json_error_t error;
             json_t *root;
             root = json_loads((const char*)msg, 0, &error); 
            if(json_is_object(root))  //是json格式数据
            {
                        //解析json数据
                if(strcmp(topic,"hello") == 0){
                    char *name=(char *)json_string_value(json_object_get(root, "name"));
                 int val1=json_integer_value(json_object_get(root, "val1"));
                 int val2=json_integer_value(json_object_get(root, "val2"));
                 int val3=json_integer_value(json_object_get(root, "val3"));
                 //测试解析后的数据
                 printf("parse name:%s-val1:%d-val2:%d-val3:%d\r\n",name,val1,val2,val3);
                             
                    }
                     
                 //释放内存
                  json_decref(root);
                    
                }
            else  //非json格式数据
            {
                 printf("format error:%d-%s\r\n", error.line, error.text);
                
            }
                
            
            
            
            
 
        }
            
        
       
    
}


//发布信息到指定主题
void PubMsgByTopic(char * topic,char * msg){
    
    sprintf(Rx2_sBuf,topic,msg);
    HAL_UART_Transmit(&huart2,Rx2_sBuf,sizeof(Rx2_sBuf),10);
    
}









mqtt.h



#ifndef __MQTT_H_
#define __MQTT_H_




#include "template.h"

void ConnectWifi(void);
void ConnectMQTTServer(void);
    
  
  
extern u8 Rx2_Buf[180];
extern u8 Rx2_sBuf[180];


extern __IO u8 mqttstate;


//订阅主题格式
#define SUBTOPIC   "AT+MQTTSUB=0,\"%s\",0\r\n"

 //发布对应主题对应信息格式
#define PUBTOPIC  "AT+MQTTPUB=0,\"%s\",\"%s\",0,0\r\n"

//连接对应WIFI  账号 密码
#define CONNECTWIFI  "AT+CWJAP=\
\"%s\",\
\"%s\"\r\n"

//清除MQTT连接信息
 #define  CLEANMQTTINFO "AT+MQTTCLEAN=0\r\n"
 
 
 
 //连接EMQX服务器的本地登录账号和密码
 #define LOGINMQTT "AT+MQTTUSERCFG=0,1,\
\"ESP\",\
\"admin\",\
\"061457\",\
0,0,""\
\r\n"

//连接本地EMQX 下的mqtt服务器地址 设置断开自动重连
#define  CONNECTMQTT "AT+MQTTCONN=0,\"192.168.1.13\",1883,1\r\n"
 

    
    
    
    
    
extern u16  MAXCONNECT_TIME;
void SubAssignTopic(char * subtopic);
void PubMsgByTopic(char * topic,char * msg);
void MQTT_Init(void);


void  Test(void);
#endif


 

效果:

发布hello主题 

json 数据如下

{
"name":"yzh",
"val1":1,
"val2":2,
"val3":3
}

 

 

最后

结束。

ESP32-C2模组使用AT固件示例 1、完整的 Wi­Fi 子系统,符合 IEEE 802.11b/g/n 协议,具有 Station 模式、SoftAP 模式、SoftAP +Station 模式和混杂模式(即 Promiscuousmode,是一种特殊模式)(Infrastructure BSS)Station 模式、SoftAP 模式、Station + SoftAP 模式和混杂模式请注意 ESP8684 系列 在 Station 模式下扫描时,SoftAP 信道会同时改变。– 单核 120 MHz:305.42 CoreMark; 阅读详情

相关推荐

基于STM32与ESP32的物联网MQTT通信系统设计与实现

MQTT协议作为物联网领域的核心通信标准,以其轻量级、低功耗和发布/订阅模式,成为设备与云端高效交互的首选方案。其工作原理基于主题路由,设备通过订阅和发布主题实现解耦通信,特别适合资源受限的嵌入式场景。在工程实践中,通过将复杂的网络协议栈与主控业务逻辑分离,可以大幅提升系统稳定性和开发效率。例如,利用ESP32作为网络协处理器,通过AT指令与STM32协同,能够高效连接EMQX等MQTT服务器,构建可靠的消息中枢。这种架构广泛应用于智能家居、工业监控等场景,实现了传感器数据的稳定上报与远程指令的实时控制。

weixin_29165725的博客 273

ESP32-DevKitC_V4刷AT指令固件

断开电源,将MicroUSB(供电)、USB转TTL(测试AT)两个端重新插入电脑,用串口调试工作进行调试。点击START,此时会显示等待上电同步。如果等一会儿没反应,按开发板上的“BOOT”按钮1秒左右。将ESP32-DevKitC_V4的MicroUSB端与电脑USB端相连。2.将ESP32-DevKitC_V4串口通过USB转TTL连接到电脑。

zouxin_88的专栏 1121

树莓派Pico+MicroPython+MQTT+EMQX物联网数据上报实战

在物联网设备数据上报场景中,轻量级通信协议和高效开发语言至关重要。MQTT基于发布/订阅模型,具有QoS分级、心跳保活和遗嘱消息等机制,特别适合网络不稳定的嵌入式环境;MicroPython让开发者用接近Python的语法快速编写固件,降低嵌入式开发门槛;EMQX作为高性能开源Broker,提供可视化Dashboard和规则引擎,简化设备接入与数据处理。JSON凭借良好的可读性和跨语言解析特性,成为设备消息的标准编码格式。本文从硬件选型出发,完整讲解树莓派Pico结合MicroPython实现MQTT客户端

weixin_34111790的博客 586

ESP32 与 STM32 串口通信

ESP32 与 STM32 串口通信 STM32串口部分代码参考正点原子

qq_67301179的博客 1万+

基于ESP8266与MQTT协议的物联网远程灯光控制系统搭建指南

物联网(IoT)技术通过将物理设备连接到互联网,实现了远程监控与控制,其核心在于设备、网络与云平台的协同。MQTT作为一种轻量级的发布/订阅消息传输协议,专为低带宽、高延迟或不稳定的网络环境设计,是物联网设备通信的理想选择。它通过代理服务器(Broker)实现消息的路由与分发,确保了通信的可靠性与实时性。结合ESP8266这类集成了Wi-Fi功能的微控制器,开发者可以低成本、高效率地构建智能硬件终端。本文以远程灯光控制这一经典应用场景为例,详细阐述了如何利用ESP8266、MQTT协议以及Python Fl

weixin_34152820的博客 523

基于树莓派Pico W与MicroPython的MQTT物联网数据上云实战

物联网应用开发中,传感器数据的采集与远距离传输是基础环节。MQTT协议凭借轻量级、低带宽及发布/订阅模型的优势,成为资源受限设备接入云端的首选;而JSON凭借良好的可读性和跨语言特性,成为数据交换的标准格式。本文以树莓派Pico W开发板为硬件载体,基于MicroPython脚本读取模拟传感器值,构造JSON消息并通过MQTT发布至EMQX服务器。文章详细介绍了环境搭建、代码实现、连接调试及常见问题排查方法,并展示了如何利用Dashboard监控消息流转。该方案可快速验证设备上云链路,适用于智能家居、环境监

weixin_42741930的博客 170

STM32+ESP32 AT固件实战:从零构建MQTT物联网网关连接EMQX

本文详细介绍了基于STM32主控与ESP32 AT固件构建MQTT物联网网关的完整实战方案。通过硬件连接、固件烧录、AT指令配置等步骤,指导开发者实现设备稳定连接EMQX服务器,并重点解析了STM32端的程序状态机设计、消息收发逻辑及关键的异常处理与稳定性加固策略,为快速搭建可靠的物联网节点提供了清晰路径。

t4y5u6i7o的博客 495

ESP32网络编程-OTA方式升级固件(基于Arduino IDE)

ESP32吸引人的编程方式之一就是通过OTA方式升级固件。本文将详细介绍在Arduino IDE中升级固件。

视觉与物联智能 3749

MQTT发布订阅与QoS机制深度解析:物联网通信的底层逻辑

MQTT 是一种面向物联网场景设计的轻量级消息传输协议,其核心并非简单封装 TCP,而是通过发布订阅(Publish-Subscribe)模型重构设备与系统间的通信范式。该模型解耦生产者与消费者,依托 Topic 层级结构实现语义化路由,并以 QoS(服务质量)等级将‘可靠性’转化为可配置、可权衡的工程参数。结合遗嘱消息(Will Message)与 Retain 机制,MQTT 在弱网、低功耗、高并发等典型物联网约束下,仍能保障状态一致性与事件可达性。本文聚焦 MQTT 协议本质,深入剖析发布订阅拓扑、Q

weixin_34241036的博客 342

STM32+ESP8266+EMQX物联网分层架构实战

MQTT是物联网设备通信的核心协议,其发布/订阅模型天然支持解耦与扩展;嵌入式系统则强调实时性、低功耗与硬件可控性。将STM32作为本地决策中枢处理传感器采集与执行器控制,ESP8266专注Wi-Fi连接与MQTT客户端功能,EMQX承担消息路由、鉴权与QoS保障——这种分层架构既规避了单芯片资源争抢,又提升了断网容错与系统可维护性。典型应用于智能家居节点开发,尤其适合需接入多传感器、多执行器且要求本地保活的工程场景。

weixin_29166013的博客 217

STM32+ESP8266+OneNet+UniApp物联网毕设全链路实现

物联网系统本质是硬件、网络、云平台与应用终端的端到端协同。其核心原理在于分层解耦与协议对齐:感知层采集数据,网络层可靠透传,云平台完成协议转换与规则调度,应用层提供跨端交互。技术价值体现在可调试性、可替换性与可扩展性——例如更换通信模组或云平台时,仅需调整对应层配置,业务逻辑不受影响。典型应用场景包括智能家居控制、环境监测等嵌入式课设与毕业设计。本文基于STM32F103C8T6、ESP8266-01S、OneNet MQTT服务与UniApp框架,构建了具备完整调试日志、错误校验机制和双端适配能力的可演示

weixin_29164185的博客 156

小熊派接入EMQX实现端云闭环的完整实践

MQTT协议是物联网设备与云平台通信的核心基础,其轻量、双向、支持QoS与主题路由的特性,特别适配STM32等资源受限终端。EMQX作为高性能开源MQTT Broker,具备高并发连接、JWT鉴权、ACL细粒度控制和Docker一键部署能力,成为轻量级IoT终端如小熊派对接的优选方案。本文聚焦HarmonyOS LiteOS-M环境下小熊派(STM32L475+ESP8266)的真实工程落地,覆盖TLS安全连接、HDF驱动适配、MQTT任务调度优化、主题规范设计及EMQX ACL/Rule Engine配置

weixin_32349093的博客 203

某宝智慧农场套件:农业IoT快速原型开发实战指南

农业物联网(Agri-IoT)是将传感器、边缘设备与云平台结合,实现农田环境数据采集、远程监控与智能控制的技术体系。其核心原理在于构建‘感知-传输-处理-执行’闭环,依赖轻量级协议(如MQTT)与低代码框架降低部署门槛。技术价值体现在大幅压缩从硬件接线到可视化看板的验证周期,尤其适配高校教学、县域合作社试点及职校实训等资源受限场景。典型应用包括大棚温湿度监测、自动灌溉触发与微信告警推送。本文聚焦ESP32+Mosquitto+Vue2+Flask构成的某宝主流智慧农场套件,详解开箱即用式部署、数据链路贯通与

weixin_33875564的博客 335

ESP8285+MQTT实现电机控制器远程监控

电机控制器是工业自动化中关键的执行单元,其远程监控能力直接关系到运维效率与故障响应速度。基于MQTT协议的轻量级物联网架构,凭借发布/订阅机制、低带宽占用和QoS保障等核心原理,成为中小规模设备联网的首选技术路径。ESP8285作为高集成度Wi-Fi SoC,在成本、尺寸与工业环境适应性上显著优于通用模组,特别适合嵌入式边缘网关场景。该方案无需复杂后台开发,即可实现状态上报、远程指令下发、断网缓存与遗嘱告警等实用功能,广泛应用于实验室Demo、产线泵机监控及智能传送带等现场。本文聚焦于ESP8285与电机控

weixin_34234721的博客 302

esp32固件,启用 ESP-AT 经典蓝牙

+CMD:138,"AT+BLUFINAME",0,1,1,0 +CMD:139,"AT+BLUFI",0,1,1,0 +CMD:140,"AT+BTINIT",0,1,1,0 +CMD:141,"AT+BTNAME",0,1,1,0 +CMD:142,"AT+BTSCANMODE",0,1,1,0 +CMD:143,"AT+BTSTARTDISC",0,0,1,0 +CMD:144,"AT+BTPINREPLY",0,0,1,0 +CMD:145,"AT+BTENCDEV",0,1,0,0 +CMD:146,"AT+BTENCCLEAR",0,0,1,1 +CMD:147,"AT+BTCOD",0,0,1,0 +CMD:148,"AT+BTPOWER",0,1,1,0 +CMD:149,"AT+BTSPPINIT",0,1,1,0 +CMD:150,"AT+BTSPPCONN",0,1,1,0 +CMD:151,"AT+BTSPPSTART",0,0,0,1 +CMD:152,"AT+BTSPPDISCONN",0,0,1,0 +CMD:153,"AT+BTSPPSEND",0,0,

手把手教你用Ubuntu Base 20.04打造轻量级ARM开发板根文件系统(附常见问题解决)

本文详细介绍了如何基于Ubuntu Base 20.04 LTS构建轻量级ARM开发板根文件系统,涵盖环境准备、镜像制作、跨架构配置、软件包定制及常见问题解决。通过实战指南,开发者可快速掌握ARM架构下的根文件系统构建技巧,优化系统性能并解决部署中的典型问题。

gin88的博客 210

STM32+华为云IoT+Qt跨平台智能家居控制系统实战

物联网系统开发中,边缘设备、云平台与人机交互端的协同是核心挑战。理解MQTT协议原理、设备影子(Device Shadow)机制及跨平台GUI框架选型逻辑,是构建高可靠智能系统的前提。STM32提供确定性实时控制能力,华为云IoT平台通过规则引擎和安全认证降低运维复杂度,Qt则以原生性能与C++/QML混合架构实现低开销、高响应的本地控制中心。该技术组合兼顾工业级稳定性与快速落地能力,适用于高校教学、中小型智能硬件项目及嵌入式工程师进阶实践,尤其适合需要离线自治、状态可追溯、多端一致体验的真实家居与实验室场

weixin_33951761的博客 395

MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南

本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pip和OpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。

weixin_29102619的博客 263

基于MicroPython与三轴传感器的嵌入式开发实战:从数据采集到物联网应用

在嵌入式系统开发中,传感器数据采集是连接物理世界与数字世界的核心技术。其原理是通过微控制器读取传感器模拟或数字信号,将其转化为可处理的数值。这项技术的价值在于为设备赋予感知能力,是实现智能硬件、物联网节点的基石,广泛应用于姿态检测、运动追踪和环境监测等场景。MicroPython作为一种轻量级Python实现,极大降低了嵌入式编程门槛,让开发者能像编写桌面脚本一样快速驱动硬件。结合ESP32等主流开发板,可以高效完成“固件烧录”和“I2C通信”等关键任务,快速构建从数据采集、处理到无线传输的完整链路。本文即

cumo3681的博客 898

四、ARDUINO UNO开发板介绍

(一)ARDUINO UNO开发板 Arduino生态中包括多种开发板、模块、扩展板。其中UNO R3是最适合入门且功能齐全使用量最多的Arduino开发板。以下就是Arduino UNO R3开发板的图片。 (二)ARDUINO UNO开发板基本构成 Arduino开发板设计得非常简洁,一块AVR单片机、一个晶振或振荡器和一个5V的直流电源。常见的开发板通过一条USB数据线连接计算机。Arduino有各式各样的开发板,其中最通用的是Ardui...

简时刻的博客 7万+

MC1496乘法器AM调制电路搭建全流程(附Multisim 14.0仿真文件)

本文提供了基于MC1496乘法器搭建AM调制电路的完整实战指南。针对仿真模型缺失的痛点,详细讲解了从晶体管级手动构建MC1496等效模型,到外围电路设计、调制度参数计算与调节,并在Multisim 14.0中进行仿真验证的全流程。通过深度剖析MC1496内部原理与AM信号调制机制,帮助读者获得从仿真到实践的可控设计与排错能力。

weixin_29190169的博客 591

ESP32在线开发工具实测:浏览器编译烧录,彻底告别环境地狱

嵌入式开发中,本地工具链的安装与配置常常成为比写代码更耗时的门槛,尤其是ESP32开发中动辄数百兆的平台包下载失败、工具链与系统库不兼容等问题,让许多开发者止步于第一步。随着浏览器技术演进,Web Serial、WebUSB与云端编译等方案逐渐成熟,在线开发工具开始成为绕开环境依赖的高效路径。这类工具将编译环境抽离到云端服务器,浏览器仅作为前端操作界面;通过Web Serial协议,网页可直连开发板完成固件烧录与串口调试;仿真平台如Wokwi则能零成本验证代码逻辑。从快速原型验证、跨设备协作到协议联调,ES

weixin_33937499的博客 698

BLDC方波控制 vs. FOC:技术选型指南与未来演进

本文深入对比BLDC电机方波控制与FOC技术的核心差异,分析两者在成本、性能和应用场景上的权衡。方波控制凭借低成本和易实现性,在电动工具和家电领域优势明显;而FOC则以平滑高效控制见长,适用于高端精密应用。文章为工程师提供了实用的技术选型指南,并展望了未来技术融合的发展趋势。

yhn4567890的博客 1172
上一篇: [RT_Thread]内核中线程间的同步与通信(事件集与邮箱的记录)
下一篇: 关于Java开发Idea中编码,解码以及解决中文乱码的实践经验
昊月光华
博客等级 码龄6年 340粉丝 158原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值