第一章开发环境:
主控 | STM32F103C8T6 |
WIFI模块 | ESP01S |
开发语言 | C |
开发编译器· | KEIL |
组网方式 | WIFI |
服务器协议 | MQTT |
本章要点:
- ESP01S的AT指令配网以及服务器连接
- STM32与ESP01S的usart协议通信
- 断网重连以及断服务器重连
- STM32向服务器端口发送对应指令
抽象理解:
1、ESP01S1的AT指令配网
ESP01S的配网方式为AT指令集,通过识别对对应的AT指令实现对应的操作。
具体ESP01S AT指令集合参考以下文章(84条消息) STM32+ESP-01s+EMQX实现单片机MQTT协议传输数据上云(一)ESP-01s的AP-MQTT bin文件安装以及指令使用_esp01 mqtt_JASON丶LI的博客-CSDNA
AT指令总合AT 命令集 - ESP32 - — ESP-AT 用户指南 latest 文档 (espressif.com)
2、STM32与ESP01S通信
STM32本身是不具备连接wifi的能力的,它主要是通过与ESP01S进行USART通信,将上述的AT指令集传输到ESP01S,以此来触发其实现对应的操作。
3、重连
断网重连
AT+CWRECONNCFG=3,100
//设置wifi自动重连,间隔为3s一次,持续100次
断服务器重连
AT+MQTTCONN=0,"127.0.0.1",1883,1
4、指令发送
printf("AT+RESTODE\r\n"); //模块初始化
delay_ms(5000);
printf("AT+CWMODE=1\r\n"); //设置wifi模式为Station模式
delay_ms(5000);
printf("AT+CWJAP=\"Xiaomi_2\",\"84961994\"\r\n"); //连接wifi
delay_ms(5000);
printf("AT+CWRECONNCFG=3,100\r\n"); //设置wifi自动重连,间隔为3s一次,持续100次
delay_ms(5000);
printf("AT+MQTTUSERCFG=0,1,\"ESP01SHomeAssistant\",\"admin\",\"84961994\",0,0,\"\"\r\n"); //设置用户属性
delay_ms(5000);
printf("AT+MQTTCONN=0,\"43.139.72.253\",1883,1\r\n"); //连接mqtt服务器
delay_ms(5000);
printf("AT+MQTTSUB=0,\"TOESP01S\",0\r\n"); //订阅TOESP01S
delay_ms(5000);
记住这里的指令每条之间都要delay5s左右,因为需要给予其足够的时间处理上一条指令。
代码
这里代码我就只给出主函数以及对应的输出指令函数了,应该我的代码是基于FreeRTOS系统写的,要是不太懂的话可以到我之前的博客去简单入门一下(而且printf重定义也不放在这里面了)
main.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "sys.h"
#include "Wifi.h"
/***************
Jason:
STM32F103C8T6
FreeRTOS
2023/7/6
***************/
#define START_TASK_PRIO 1
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define Send_TASK_PRIO 2
#define Send_STK_SIZE 50
TaskHandle_t SendTask_Handler;
void Send_task(void *pvParameters);
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init();
uart_init(115200);
Wifi_Init();
xTaskCreate((TaskFunction_t )start_task,
(const char* )"start_task",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
vTaskStartScheduler();
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL();
xTaskCreate((TaskFunction_t )Send_task,
(const char* )"Send_task",
(uint16_t )Send_STK_SIZE,
(void* )NULL,
(UBaseType_t )SendTask_Handler,
(TaskHandle_t* )&SendTask_Handler);
vTaskDelete(StartTask_Handler);
taskEXIT_CRITICAL();
}
void Send_task(void *pvParameters)
{
printf("AT+MQTTPUB=0,\"FROMESP01S\",\"ESP01S-OK\",0,0");//发送对应指令
}
Wifi.c
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "Wifi.h"
#include "delay.h"
void Wifi_Init(void)
{
printf("AT+RESTODE\r\n"); //模块初始化
delay_ms(5000);
printf("AT+CWMODE=1\r\n"); //设置wifi模式为Station模式
delay_ms(5000);
printf("AT+CWJAP=\"Xiaomi_2\",\"84961994\"\r\n"); //连接wifi
delay_ms(5000);
printf("AT+CWRECONNCFG=3,100\r\n"); //设置wifi自动重连,间隔为3s一次,持续100次
delay_ms(5000);
printf("AT+MQTTUSERCFG=0,1,\"ESP01SHomeAssistant\",\"admin\",\"84961994\",0,0,\"\"\r\n"); //设置用户属性
delay_ms(5000);
printf("AT+MQTTCONN=0,\"43.139.72.253\",1883,1\r\n"); //连接mqtt服务器
delay_ms(5000);
printf("AT+MQTTSUB=0,\"TOESP01S\",0\r\n"); //订阅TOESP01S
delay_ms(5000);
}
如果要整个项目的工程文件,可以直接到百度网盘提取(解压密码同下)
链接:https://pan.baidu.com/s/1_nRoSaMWo67tFVc15L4oHg?pwd=1016
提取码:1016
本文为作者独立编写
本BLOG上所有的原创文章未经本人许可,不得用于商业用途及传统媒体。网络媒体转载请注明出处,否则属于侵权行为。
特别鸣谢:77