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亮灭
在这里插入图片描述

相关资料、代码

更多推荐