02-ESP32连接WIFI、PC控制LED
ESP32连接WIFI、PC控制LED
- 一、连接WIFI
- 二、PC控制LED
一、连接WIFI
查阅MicroPython官方文档,可以找到连接wifi最基础的实例代码
- 设置工作模式
AP(AccessPoint),无线接入点,即家里的路由器类似的功能。
STA(Station),无线终端,即连接到AP的装置,手机、电脑等。这个模式不允许其他设备接入。
通过以下代码可以扫描到附近的设备
import networkwlan = 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" : breakudp_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 : returnif 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" : breakudp_socket.close() #关闭资源
PC端运行脚本,输入对应指令,即可控制LED亮灭
相关资料、代码