点灯大师——WIFI控制灯

发布者:huanli最新更新时间:2025-02-08 来源: jianshu关键字:STM32 手机看文章 扫描二维码
随时随地手机看文章

在之前的教程中,我们学习了 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 硬件接线

本教程使用的硬件如下:

  • 单片机STM32F103C8T6

  • WIFI模块:ESP-01S

  • 小灯:三色 LED 灯模块

  • 串口:USB 转 TTL

  • 烧录器:ST-LINK V2

ESP8266LEDSTM32USB 转 TTL
3V3
3.3
RX
A2
TX
A3
GND
G

RA5

YA6

GA7

GNDG


A10TX


A9RX


GGND

烧录的时候接线如下表,如果不会烧录的话可以看我之前的文章【STM32下载程序的五种方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html】。

ST-Link V2STM32
SWCLKSWCLK
SWDIOSWDIO
GNDGND
3.3V3V3

接好如下图:

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。

  1. 定义串口句柄 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 可以定义该串口的波特率。

  1. 初始化串口底层函数,调用 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时钟 */

[1] [2] [3]
关键字:STM32 引用地址:点灯大师——WIFI控制灯

上一篇:干货:手把手指导单片机复位原因分析
下一篇:温度传感器DS18B20详解

推荐阅读最新更新时间:2026-03-24 12:01

51单片机ESP8266WIFI模块LED的无线控制
51单片机ESP8266WIFI模块LED灯的无线控制。具体步骤如下: 1、51单片机和无线WIFI模块的连接:RXD、TXD、GND和51单片机的TXD、RXD、GND接好,模块其他引脚均为高电平,电源VCC是3.3V左右(两节1.5v干电池)。 2、关于安卓手机方面测试时可以使用,网络调试助手(下载这个app安装在手机即可)发送数字1表示小灯亮,0表示灯灭。后续想深入的话可以自己开发安卓app软件。 3、WIFI模块参数设置由于参数的设置方法和步奏网上资料很全,也可以参考: 51单片机驱动ESP8266模块的C语言程序:http://blog.sina.com.cn/s/blog_68541adc0102x8
[单片机]
使用 Keil Studio for Visual Studio Code开发 STM32 设备
Keil Studio是 Arm 最新一代的集成开发环境(IDE),将嵌入式开发工具直接集成到了 Visual Studio Code 中。作为 µVision 的后继者,它提供了现代化的特性,包括与业界工具的无缝集成、版本控制支持,以及用于 CI 工作流的命令行接口(CLI)。 Keil Studio 作为 Arm Keil MDK 6的一部分,为基于 Cortex M 的微控制器提供了全面支持,其中包括 STMicroelectronics 广泛的 STM32 产品系列。它将 Arm 编译器的可靠性与成熟度、广泛的器件支持,与 Visual Studio Code 的灵活性和可扩展性有机结合在一起。 快速上手 借
[单片机]
使用 Keil Studio for Visual Studio Code开发 <font color='red'>STM32</font> 设备
基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
随着老龄化加剧与科技进步,“ + 养老” 成为智慧养老核心方向,老年人出行安全与健康监测需求日益迫切。针对传统拐杖智能化不足、功能单一的痛点,本文提出一种融合多与物联网平台的智能拐杖系统,以 为核心主控,集成 GPS、姿态检测、超声波等传感模块,搭配 本地显示与机智云 App,实现定位、防摔、报警及云端监测一体化功能,为老年人安全出行与家庭照护提供技术支撑。 01系统总体设计 拐杖系统主要能实现GPS定位、防摔倒、障碍物检测、液晶显示、短信报警、语音提示、联网App等功能。系统总体设计结构如图1所示。 图1智能拐杖系统总体设计结构 02硬件设计 智能拐杖系统通过STM32主控芯片来传输和处理各传感设
[单片机]
基于机智云与<font color='red'>STM32</font>的智能拐杖安全监测系统在养老物联网中的应用
实战解析:通过一个小项目掌握STM32所有外设
一、项目目标:实现外设间的无缝协同 本项目旨在实现一个清晰的核心功能: 读取数据() 显示温度在 上() 温度超限时蜂鸣器报警(PWM/) 通过按键调整报警阈值(GPIO 输入) 通过串口输出调试信息() 后台定时刷新显示(定时中断 + ) 这一个项目,几乎覆盖了 的全部核心外设模块,是最适合系统学习的实践框架。 二、外设初始化思路 1. RCC 系统 所有外设都依赖时钟。先开启 GPIO、USART、C、M、I2C 等模块的时钟。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); RC
[嵌入式]
野火STM32学习笔记(构建库函数模型第五节课)
解释初始化函数是怎么运作的 第四节课我们已经了解了如何通过固件库编程的方式初始化一个GPIO口,配置其速度,工作模式等等,这一切都有一个“幕后黑手”就是那一个一百多行的GPIO_Init()函数。我们再来一睹一下芳容: 第一部分 我们从第一行开始看: 大括号内第一二行都是存放这些变量的初始值,可以不用太在意。再看下面模式配置那边,第一行注释是把模式的低四位存入变量currentmode,这样做的目的是取出这些值(与0x0F相与取值),再判断它的bit4位是几(如下图),是0则是输入,是1则是输出,判断方式也很简单,即赋值给currentmode的值和0x10(二进制00010000)与运算,看看是不是0就知
[单片机]
基于stm32标准库独立按键的多按键状态机的实现
写在前面 一般引用都写在最后,但是这篇博文(https://www.cnblogs.com/ZzJan/p/11334869.html)对我这个状态机的影响很大,我这里有许多借鉴他的思维。所以写在前面,以表敬意 简单按键检测 一开始学习单片机的时候我接触到按键的时候就知道按键有抖动,记得当初按键消抖分为硬件和软件,硬件上常用于复位按键如下图 硬件消抖 软件上来说,最经典的消抖 if(KEY1 == 0) { delay_ms(20); // 延时消抖 if(KEY1 == 0) { while(KEY1 == 0);//堵塞,等待松开 // 按键按下处理代码 } }
[单片机]
基于<font color='red'>stm32</font>标准库独立按键的多按键状态机的实现
STM32 PC13 PC14 PC15 PB3 PB4 PA13 PA14 PA15 做普通IO口笔记
在MCU刚上电时,PC13作为侵入检测TAMPER引脚, PC14、PC15默认是作为连接32.768K低速外部晶振用的脚,PB3、PB4、PA15是JTAG调试脚,不能直接作为普通IO使用,下面是将他们作为普通IO使用的配置方法: STM32的PC13、PC14、PC15用作普通IO口设置方法 1.引脚定义 2.引脚用作普通IO口的条件 注: 1、最新文档中已经删除“在同一时间只有一个引脚能作为输出”也就是三个引脚可以同时作为输出引脚,其他条件未变 。 2、需要备份区域由VDD供电才可以。把VBAT通过一个100nf电容接到VDD上,重新上电3个LED就可以闪烁了。手册说不能驱动LED,我把LED用灌电流的接法(共阳极
[单片机]
基于STM32的Flash读写详解
前言 本文主要介绍STM32多种的内部Flash读写方式和读写长文件的功能函数怎样编写。阅读完本文可以使你能够正常的完成Flash读写操作。 介绍 STM32 FLASH 不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。本次实验选用的STM32 开发板是F103ZET6,其 FLASH 容量为 512K 字节,属于大容量产品(另外还有中容量和小容量产品),大容量产品的闪存模块组织如图 所示: STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved