在之前的教程中,我们学习了 ESP6266 的原理,并动手写了驱动,实现了串口的通讯和 STA、AP、STA+AP 三种模式。本次我们就来教大家如何使用 ESP8266 控制灯。这是一个简单的示例,展示了如何将 WIFI 通信与硬件控制相结合,实现远程控制的功能。你也可以扩展这个示例,添加更多的指令和功能,以满足自己的需求。
1. 源码下载及前置阅读
本文首发 良许嵌入式网 :https://www.lxlinux.net/e/ ,欢迎关注!
本文所涉及的源码及安装包如下(由于平台限制,请点击以下链接阅读原文下载):
https://www.lxlinux.net/e/stm32/esp8266-control-led.html
如果你是嵌入式开发小白,那么建议你先读读下面几篇文章。
【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】
【一文教你使用MDK开发工具:https://www.lxlinux.net/e/stm32/mdk-development-tool-tutorial.html】
【零基础快速上手STM32开发(手把手保姆级教程):https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html 】
前期教程,没看过的小伙伴可以先看下。
【手把手教你玩转WIFI模块(原理+驱动):https://www.lxlinux.net/e/stm32/esp8266-tutorial.html】
【STM32串口接收不定长数据(接收中断+超时判断):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-rxne-time-out.html】
| 作者简介 |
|---|
| 大家好,我是良许,博客里所有的文章皆为我的原创。 下面是我的一些个人介绍,欢迎交个朋友: · 211工科硕士,国家奖学金获得者; · 深耕嵌入式11年,前世界500强外企高级嵌入式工程师; · 书籍《速学Linux作者》,机械工业出版社专家委员会成员; · 全网60W粉丝,博客分享大量原创成体系文章,全网阅读量累计超4000万; · 靠自媒体连续年入百万,靠自己买房买车。 |
我本科及硕士都是学机械,通过自学成功进入世界500强外企。我已经将自己的学习经验写成了一本电子书,超千人通过此书学习并转行成功。现在将这本电子书免费分享给大家,希望对你们有帮助:
电子书链接:https://www.lxlinux.net/1024.html

2. 通信示意图
实现目标是我们有一个三色 LED 灯,电脑上使用网络调试助手向 WIFI 模块发送关键词「green」绿灯亮,再次发送「green」绿灯灭,黄灯和红灯的关键词是「yellow」、「red」,效果一样。

3. 编程实战
3.1 硬件接线
本教程使用的硬件如下:
| ESP8266 | LED | STM32 | USB 转 TTL |
|---|---|---|---|
| 3V3 | 3.3 | ||
| RX | A2 | ||
| TX | A3 | ||
| GND | G | ||
| R | A5 | ||
| Y | A6 | ||
| G | A7 | ||
| GND | G | ||
| A10 | TX | ||
| A9 | RX | ||
| G | GND |
烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。
| ST-Link V2 | STM32 |
|---|---|
| SWCLK | SWCLK |
| SWDIO | SWDIO |
| GND | GND |
| 3.3V | 3V3 |
接好如下图:

3.2 LED逻辑代码
LED 灯的代码简简单单,只要进行一下三个灯的初始化就行。
void led_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
LED1_GPIO_CLK_ENABLE(); /* LED1时钟使能 */
LED2_GPIO_CLK_ENABLE(); /* LED2时钟使能 */
LED3_GPIO_CLK_ENABLE(); /* LED3时钟使能 */
gpio_init_struct.Pin = LED1_GPIO_PIN; /* LED1引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(LED1_GPIO_PORT, &gpio_init_struct); /* 初始化LED1引脚 */
gpio_init_struct.Pin = LED2_GPIO_PIN; /* LED2引脚 */
HAL_GPIO_Init(LED2_GPIO_PORT, &gpio_init_struct); /* 初始化LED2引脚 */
gpio_init_struct.Pin = LED3_GPIO_PIN; /* LED3引脚 */
HAL_GPIO_Init(LED3_GPIO_PORT, &gpio_init_struct); /* 初始化LED3引脚 */
LED1(0); /* 关闭 LED1 */
LED2(0); /* 关闭 LED2 */
LED3(0); /* 关闭 LED3 */
}
LED 的 .h文件:
#ifndef _LED_H
#define _LED_H
#include 'sys.h'
/******************************************************************************************/
/* 引脚 定义 */
#define LED1_GPIO_PORT GPIOA
#define LED1_GPIO_PIN GPIO_PIN_7
#define LED1_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_PIN GPIO_PIN_6
#define LED2_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PA口时钟使能 */
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_PIN GPIO_PIN_5
#define LED3_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0) /* PB口时钟使能 */
/******************************************************************************************/
/* LED端口定义 */
#define LED1(x) do{ x ?
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED1_GPIO_PORT, LED1_GPIO_PIN, GPIO_PIN_RESET);
}while(0)
#define LED2(x) do{ x ?
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED2_GPIO_PORT, LED2_GPIO_PIN, GPIO_PIN_RESET);
}while(0)
#define LED3(x) do{ x ?
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(LED3_GPIO_PORT, LED3_GPIO_PIN, GPIO_PIN_RESET);
}while(0)
/* LED取反定义 */
#define LED1_TOGGLE() do{ HAL_GPIO_TogglePin(LED1_GPIO_PORT, LED1_GPIO_PIN); }while(0) /* 翻转LED1 */
#define LED2_TOGGLE() do{ HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_GPIO_PIN); }while(0) /* 翻转LED2 */
#define LED3_TOGGLE() do{ HAL_GPIO_TogglePin(LED3_GPIO_PORT, LED3_GPIO_PIN); }while(0) /* 翻转LED3 */
/******************************************************************************************/
/* 外部接口函数*/
void led_init(void); /* LED初始化 */
#endif
3.3 串口通讯实现
WIFI 串口通讯我们在【手把手教你玩转WIFI模块(原理+驱动):https://www.lxlinux.net/e/stm32/esp8266-tutorial.html】有详细教程,在这里就简单带过+浅浅复习下,没看过或者忘记了的小伙伴可以点击链接看看。
实现向串口发送数据,并等待返回值。ESP8266 的 TX 和 RX 定义在串口2。
定义串口句柄 g_uart_handle ,并调用 HAL_UART_Init 进行初始化。
UART_HandleTypeDef g_uart_handle;
void esp8266_uart_init(uint32_t baudrate)
{
g_uart_handle.Instance = ESP8266_UART_INTERFACE; /* ESP8266 UART */
g_uart_handle.Init.BaudRate = baudrate; /* 波特率 */
g_uart_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 数据位 */
g_uart_handle.Init.StopBits = UART_STOPBITS_1; /* 停止位 */
g_uart_handle.Init.Parity = UART_PARITY_NONE; /* 校验位 */
g_uart_handle.Init.Mode = UART_MODE_TX_RX; /* 收发模式 */
g_uart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 无硬件流控 */
g_uart_handle.Init.OverSampling = UART_OVERSAMPLING_16; /* 过采样 */
HAL_UART_Init(&g_uart_handle); /* 使能ESP8266 UART */
}
其中,ESP8266_UART_INTERFACE 是宏定义,指代的就是 USART2 。
传入参数 baudrate 可以定义该串口的波特率。
初始化串口底层函数,调用 HAL_UART_MspInit 函数。
注意最后一行,需要调用 __HAL_UART_ENABLE_IT 函数使能接收中断。
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef gpio_init_struct;
if (huart->Instance == USART_UX) /* 如果是串口1,进行串口1 MSP初始化 */
{
....
// 省略串口1相关代码
....
}
else if (huart->Instance == ESP8266_UART_INTERFACE) /* 如果是ESP8266 UART */
{
ESP8266_UART_TX_GPIO_CLK_ENABLE(); /* 使能UART TX引脚时钟 */
ESP8266_UART_RX_GPIO_CLK_ENABLE(); /* 使能UART RX引脚时钟 */
ESP8266_UART_CLK_ENABLE(); /* 使能UART时钟 */
上一篇:干货:手把手指导单片机复位原因分析
下一篇:温度传感器DS18B20详解
推荐阅读最新更新时间:2026-03-24 12:01
- REF196 精密微功率、低压差堆叠电压基准的典型应用电路
- LTC4367IMS8 用于滞后调节的过压电源控制器的典型应用
- CLRC663非接触式读写器IC的典型应用
- 使用 ON Semiconductor 的 CS-5621 的参考设计
- RSO-0515S 15V、67mA输出DC/DC转换器典型应用电路
- NCP51200 3 Amp VTT 终端稳压器 DDR1、DDR2、DDR3、LPDDR3、DDR4 的典型应用
- LR645大电流SMPS启动电路典型应用
- ADR420 可编程电流源的典型应用
- DC417B,使用 LT1806CS8 多尺寸单运算放大器原型的演示板
- DM300019,用于评估 dsPIC30F 和 dsPIC33F MCU 系列器件的 dsPICDEM 入门开发板



stm32驱动屏IC rm68042
STM32 PMSM FOC 简介
基于STM32G031的测试测量训练平台完成虚拟仪器实现
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号