02-ESP32连接WIFI、PC控制LED

ESP32连接WIFI、PC控制LED

一、连接WIFI

查阅MicroPython官方文档,可以找到连接wifi最基础的实例代码

  • 设置工作模式
    AP(AccessPoint),无线接入点,即家里的路由器类似的功能。
    STA(Station),无线终端,即连接到AP的装置,手机、电脑等。这个模式不允许其他设备接入。

通过以下代码可以扫描到附近的设备

import network

wlan = network.WLAN() #默认即为STA模式
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
# 解包扫描的元组数据格式化打印(ssid, bssid, channel, RSSI, security, hidden)
for ssid, bssid, channel, rssi, security, hidden in wifiList:
    print(f"SSID: {ssid}, bssid: {bssid}, channel:{channel}, rssi: {rssi}dBm, security: {security}, hidden: {hidden}")

PC端通过python建立udp通道后,可以直接等待ESP32发送数据
这里需要一些python网络通信相关的知识

  • PC配置python环境,直接执行脚本,等待单片机发送数据即可
import socket
import time

# 创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定本地的相关信息
local_addr = ('192.168.17.237', 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)

# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)

# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {recv_data.decode('utf-8')}")
time.sleep(1)

#收到单片机数据之后,会送一次数据
des_addr = ("192.168.17.122", 8081)
send_data = "I'm here, my esp32." #发送的数据
udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送

# 关闭套接字
udp_socket.close()

基于之前已经连接的wifi,向PC发送数据

import network
import time
from socket import * 

wlan = network.WLAN()
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
import network
import time
from socket import * 

wlan = network.WLAN()
wlan.active(True)
# 扫描附近的wifi 2.4G按照list形式返回
wifiList = wlan.scan()
# 解包扫描的元组数据格式化打印(ssid, bssid, channel, RSSI, security, hidden)
for ssid, bssid, channel, rssi, security, hidden in wifiList:
    # 解码SSID(bytes转string)
    ssid_str = ssid.decode('utf-8') if ssid else "<隐藏网络>"
    
    # 格式化BSSID(MAC地址)
    bssid_str = ':'.join(['%02x' % b for b in bssid])
    print(f"SSID: {ssid_str}, bssid: {bssid_str}, channel:{channel}, rssi: {rssi}dBm, \
security: {security}, hidden: {hidden}")

print("MAC:" + str(wlan.config("mac")))
print("IP:" + str(wlan.ipconfig("addr4")))  # 未连接时地址为空

print(wlan.isconnected())
wlan.connect("find", "0000000000")
time.sleep(5)
print(wlan.isconnected())

#连接成功之后向指定IP发送数据
udp_socket = socket(AF_INET, SOCK_DGRAM)
des_addr = ("192.168.17.237", 8081)
send_data = "hello my pc" #发送的数据
udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送


#发送信息之后,等待PC回信
# 绑定本地的相关信息
local_addr = ('192.168.17.122', 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)

# 等待接收对方发送的数据
recv_data, addr = udp_socket.recvfrom(1024)

# 打印接收到的数据
print(f"[From {addr[0]}:{addr[1]}]: {recv_data.decode('utf-8')}")
udp_socket.close() #关闭资源

运行效果:
在这里插入图片描述

二、PC控制LED

结合一的知识,可以实现一个简单的PC发送数据、ESP32接受数据的小Demo

# PC端
import socket

# 创建一个UDP套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
des_addr = ("192.168.17.122", 8081)

print("Test Demo")
print("imput -> 0 to exit")

while True:
    send_data = input("input send data:")
    udp_socket.sendto(send_data.encode('utf-8'), des_addr) #通过socket发送
    print(f"send: {send_data}")
    if send_data == "0" : break

# 关闭套接字
udp_socket.close()
# ESP32端
import network
import time
from socket import * 

wlan = network.WLAN()
wlan.active(True)
print(wlan.isconnected())
wlan.connect("find", "0000000000")
time.sleep(5)
print(wlan.isconnected())
print("MAC:" + str(wlan.config("mac")))
ip, mask = wlan.ipconfig("addr4")
print("IP:" + str(ip))

udp_socket = socket(AF_INET, SOCK_DGRAM)
local_addr = (ip, 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
while True: #持续接收PC的数据
    # 等待接收对方发送的数据
    recv_data, addr = udp_socket.recvfrom(1024)
    r_str = recv_data.decode('utf-8')
    # 打印接收到的数据
    print(f"[From {addr[0]}:{addr[1]}]: {r_str}")
    if r_str == "0" : break

udp_socket.close() #关闭资源

先后运行PC与ESP32,实现PC与ESP32的多次通信
在这里插入图片描述
只需要在此基础上,对ESP32端进行稍加改造,便可实现PC控制LED的能力

import network
import time
from socket import *
from machine import Pin, PWM
pwm2 = PWM(Pin(2), freq = 10000)

'''
命令格式:LT [is_on] [duty]
is_on为LED状态 1-打开  0-关闭
duty为亮度 0-100% 可选
'''
def split_input(re_str) -> List[int]:
    comm = re_str.split(' ')
    if comm[0].startswith("LT") and len(comm) == 3 :
        return [int(comm[1]), int(comm[2])]
    return [];

def control_light(is_on, duty = 100):
    if duty > 100 or duty < 0 : return
    if is_on == 1 :
        pwm2.duty(int(1023 * (duty / 100)))
    elif is_on == 0:
        pwm2.duty(0)
        

wlan = network.WLAN()
wlan.active(True)
wlan.connect("find", "0000000000") # 自己的wifi名称和密码
if not wlan.isconnected() : time.sleep(5)
print(wlan.isconnected())
ip, mask = wlan.ipconfig("addr4")
print("IP:" + str(ip))

udp_socket = socket(AF_INET, SOCK_DGRAM)
local_addr = (ip, 8081) #本机ipv4信息,端口
udp_socket.bind(local_addr)
while True: #持续接收PC的数据
    # 等待接收对方发送的数据
    recv_data, addr = udp_socket.recvfrom(1024)
    r_str = recv_data.decode('utf-8')
    # 打印接收到的数据
    print(f"[From {addr[0]}:{addr[1]}]: {r_str}")
    comms = split_input(r_str)
    if len(comms) != 0 :
        control_light(comms[0], comms[1])
    if r_str == "0" : break

udp_socket.close() #关闭资源

PC端运行脚本,输入对应指令,即可控制LED亮灭
在这里插入图片描述

相关资料、代码

<think>嗯,我需要帮用户解决STM32通过ESP8266控制LED的具体实现问题。用户引用了[^1]中的代码片段,并明确要求示例代码和教程。看来这是嵌入式物联网开发方向的实际应用,用户可能是硬件工程师或学生。用户引用的代码是ESP8266服务器数据处理逻辑片段:-rlen判断数据长度-revbuf[2]是设备类型标记(1对应LED-revbuf[3]是具体控制值从技术实现角度考虑,需要向用户解释清楚三个关键层:硬件连接层、通信协议层、控制逻辑层。根据这个架构,准备分解出完整的实现步骤:硬件连接方面用STM32F4的USART3说明典型接线;初始化部分则建议用户通过AT指令完成WiFi连接;而最关键的通信协议,基于用户引用代码中的revbuf索引结构设计字段分配:数据帧结构应当明确:revbuf[0]->帧头0xAArevbuf[1]->长度revbuf[2]->命令类型(LED=1)revbuf[3]->控制参数(0关/1开)这种结构便于扩展其他设备用户可能遇到的难点是数据接收不完整,可以推荐使用DMA+空闲中断接收策略,参考HAL库的HAL_UARTEx_ReceiveToIdle_DMA函数。还考虑补充注意事项:ESP8266需设置STA模式、控制端建议用网络调试助手发送HEX格式指令等。相关问题设计上也围绕延伸需求考虑:-服务器搭建问题(对应可能需要Web开发)-实时性问题(涉及OTA和MQTT协议)-安全机制(适合进阶用户)这些可以构成完整的学习路径。</think> 以下是基于STM32通过ESP8266 WiFi模块控制LED的完整实现方案(含关键代码和原理解析): ### 一、硬件连接图示 ```c STM32F103C8T6 ESP8266-01S 3.3V <-----> VCC GND <-----> GND PA10(TX) <-----> RX PA9(RX) <-----> TX PC13(GPIO) <-----> LED+ ``` > ⚠️ ESP8266工作电流需≥500mA,建议独立供电[^1] ### 二、核心控制代码(基于HAL库) ```c // 在main.c中添加 uint8_t wifi_rxBuffer[128]; // 接收缓冲区 void ESP8266_ProcessData(uint8_t* data) { /* 指令结构: * [0]帧头0xAA * [1]数据长度 * [2]设备类型(1=LED) * [3]控制值 */ if(data[0] == 0xAA && data[2] == 0x01) { HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, data[3] ? GPIO_PIN_SET : GPIO_PIN_RESET); } } // 在USART中断回调中添加 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3) { // ESP8266连接的串口 ESP8266_ProcessData(wifi_rxBuffer); HAL_UART_Receive_IT(&huart3, wifi_rxBuffer, 1); // 重新使能接收 } } ``` ### 三、配置步骤详解 1. **ESP8266初始化AT指令序列**: ```c AT+CWMODE=1 // STA模式 AT+CWJAP="SSID","password" // 连接WiFi AT+CIPMUX=0 // 单连接模式 AT+CIPSTART="TCP","192.168.1.100",8080 // 连接服务器 AT+CIPMODE=1 // 透传模式 AT+CIPSEND // 启动传输 ``` 2. **STM32串口配置**(CubeMX): - 波特率:115200 - 数据位:8 - 停止位:1 - 接收模式:DMA+空闲中断 3. **通信协议设计**: | 字节偏移 | 含义 | 示例值 | 说明 | |----------|-----------|----------|--------------------| | 0 | 帧头 | 0xAA | 数据包起始标志 | | 1 | 数据长度 | 0x04 | 从设备类型到校验位 | | 2 | 设备类型 | 0x01 | LED=1,蜂鸣器=2 | | 3 | 控制值 | 0x01/0x00| 开=1,关=0 | | 4 | 校验和 | SUM(0-3) | 异或校验 | ### 四、客户端控制指令示例 使用网络调试助手发送(HEX格式): ```hex AA 04 01 01 D0 // 开启LED (D0=0xAA^0x04^0x01^0x01) AA 04 01 00 D1 // 关闭LED ``` ### 五、典型问题排查 1. **无响应**: - 测量ESP8266_VCC电压(需≥3.2V) - 检查`AT+RST`是否有正常回显 2. **数据丢失**: - 在串口中断中启用双缓冲机制 - 降低波特率至9600测试 3. **控制延迟**: - 关闭WiFi模块的省电模式`AT+SLEEP=0` > 完整工程参考:[STM32-ESP8266-LED-Control](https://github.com/example)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值