ESP32学习笔记
MY BLOG: 优快云
准备工作:Python开发
-
ESP32硬件型号:ESP-WROOM-32
-
MicroPython固件:适合单片机开发的Python解释器
C语言需要编译器,而Python需要解释器
-
开发环境IDE:Thonny
适合轻量级开发,可以烧写MicroPython解释器固件到ESP32,并与硬件建立交互连接
-
ESP32USB驱动
资源汇总
基本外设
GPIO
库文件machine.Pin
导入
from machine import Pin
示例
pin2=Pin(2,Pin.OUT) #pin2输出配置
pin2.on() #高电平
pin2.value(1)
pin2.off() #低电平
pin2.value(0)
PWM
库文件machine.PWM
导入
from machine import PWM
Freq
频率范围:1Hz~40MHz (2.5ns ~ 1s)
duty
占空比范围:0~1023
示例
pwm2=PWM(Pin(2)) #pin2PWM配置
#获取当前频率
freq=pwm2.freq()
#获取当前周期
duty=pwm2.duty()
#设置频率
pwm2.freq(2000)
#设置周期
duty=pwm2.duty(512)
呼吸灯
from machine import Pin,PWM
from time import sleep,sleep_ms
led=PWM(Pin(2))
led.freq(1000)
while True:
for i in range(0,1024):
led.duty(i)
sleep_ms(1)
for i in range(1023,-1,-1): #start,stop,step
led.duty(i)
sleep_ms(1)
WIFI
计算机网络相关知识:https://doc.itprojects.cn/0001.zhishi/python.0006.networkprogram/index.html
WIFI网络环境的两种设备:AP (Access,接入点)
和STA (Station,终端设备)
- AP:创建WIFI网络的中心,如路由器
- STA:连接到AP的终端设备,如手机
ESSID
、SSID
、BSSID
:
-
ESSID 扩展服务集标识
通常用于指代一个大范围的、覆盖多个地方的无线网络
-
SSID 服务集标识
无线网络的名字,或许会重复
-
BSSID 基本服务集标识
无线网络的身份证,唯一
扫描wifi、连接到指定的wifi并获取网络配置信息
步骤:
-
导入
network
模块 -
创建
WLAN
(Wireless LAN)对象,使用STA_IF
(Station Interface),即终端设备接口 -
激活WLAN接口
-
进行WIFI接入点的扫描
-
检查终端设备是否已经连接到一个无线接入点
-
尝试连接指定的无线接入点
-
获取WLAN接口的MAC地址
-
获取WLAN接口的配置信息:IP地址、子网掩码、网关和DNS地址
示例
ESP32不支持5G路由器,可以使用手机热点充当路由器
import network
wlan=network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan()
wlan.isconnected()
wlan.connect('WuXiaoPro','diWuXiao666.')
wlan.config('mac')
wlan.ifconfig()
#函数封装
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('WuXiaoPro', 'diWuXiao666.')
i = 1
while not wlan.isconnected():
print("正在链接...{}".format(i))
i += 1
time.sleep(1)
print('network config:', wlan.ifconfig())
socket(套接字):一种编程接口,用于实现网路通信。QQ、微信的聊天都是基于socket
使用socket模块实现简单的UDP
客户端程序
-
导入socket模块
*
:通配符from socket import * //导入模块中所有的符号,不需要在每个方法前加上socket的前缀
-
创建socket
AF_INET——用于Internet进程间通信
SOCK_DGRAM——数据报套接字,UDP协议
#socket.socket(AddressFamily,Type) udp_socket=socket(AF_INET,SOCK_DGRAM)
-
准备目的地(接收方)地址
172.20.10.6:目的地ip地址
520:目的地端口
dset_addt=('172.20.10.6',520)
-
准备要发送的数据
send_data="hello" //数据写到程序中
或者
send_data=input("请输入要发送的数据:") //从键盘获取数据
-
发送数据
调用
sendto
方法udp_socket.sendto(send_data.encode('utf-8'),dest_addr)
-
关闭套接字
udp_socket.close()
测试
from socket import *
udp_socket=socket(AF_INET,SOCK_DGRAM)
dest_addr=('172.20.10.6',520)
send_data=input()
udp_socket.sendto(send_data.encode('utf-8'),dest_addr)
udp_socket.close()
简单的UDP通信
UDP是一种无连接的协议,它不会保证数据的可靠性和顺序,而且不涉及像TCP那样的握手过程。通过指定目标IP地址和端口号,通过UDP套接字进行数据的发送和接收,能够与计算机在同一局域网内进行通信。

from socket import *
udp_socket=socket(AF_INET,SOCK_DGRAM)
dest_addr=('172.20.10.6',520)
while True:
send_data=input()
udp_socket.sendto(send_data.encode('utf-8'),dest_addr)
recv_data=udp_socket.recvfrom(1024) #接收数据的长度最大为1024
print(recv_data[0].decode('gbk')) #对方发送的数据,GBK解码
print(recv_data[1]) #对方的ip和端口
udp_socket.close()
本示例中,没有绑定本地的相关信息,即运行在esp32上的网络程序没有端口号,因此运行时系统会自动分配端口号。
若要绑定,则可以参考以下示例:
# coding=utf-8
from socket import *
# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)
# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))
# 5. 关闭套接字
udp_socket.close()
聊天室
from socket import *
def main():
#创建UDP套接字
udp_socket=socket(AF_INET,SOCK_DGRAM)
#绑定本地信息:指定端口8540
udp_socket.bind(("",8540))
try:
while True:
#阻塞式接收数据
content,client_info=udp_socket.recvfrom(1024)
print("%s(%d)>>>%s" % (client_info[0],client_info[1],content.decode("gbk")))
except KeyboardInterrupt:
pass
finally:
udp_socket.close()
if __name__ == '__main__':
main()
UDP聊天软件
import socket
def send_msg(udp_socket):
"""获取键盘数据,并将其发送给对方"""
# 1. 从键盘输入数据
msg = input("\n请输入要发送的数据:")
# 2. 输入对方的ip地址
dest_ip = input("\n请输入对方的ip地址:")
# 3. 输入对方的port
dest_port = int(input("\n请输入对方的port:"))
# 4. 发送数据
udp_socket.sendto(msg.encode("utf-8"), (dest_ip, dest_port))
def recv_msg(udp_socket):
"""接收数据并显示"""
# 1. 接收数据
recv_msg = udp_socket.recvfrom(1024)
# 2. 解码
recv_ip = recv_msg[1]
recv_msg = recv_msg[0].decode("utf-8")
# 3. 显示接收到的数据
#print(">>>%s:%s" % (str(recv_ip), recv_msg))
print(">>>{ip}:{message}".format(ip=recv_ip,message=recv_msg))
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("", 8540))
while True:
# 3. 选择功能
print("="*30)
print("1:发送消息")
print("2:接收消息")
print("="*30)
op_num = input("请输入要操作的功能序号:")
# 4. 根据选择调用相应的函数
if op_num == "1":
send_msg(udp_socket)
elif op_num == "2":
recv_msg(udp_socket)
else:
print("输入有误,请重新输入...")
if __name__ == "__main__":
main()
还有UDP广播
、TCP
等内容,待用时再去学习总结吧!😜
案例
LED远程控制
import socket
import time
import network
import machine
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('WuXiaoPro', 'diWuXiao666.')
i = 1
while not wlan.isconnected():
print("正在链接...{}".format(i))
i += 1
time.sleep(1)
print('network config:', wlan.ifconfig())
def start_udp():
# 2. 启动网络功能(UDP)
# 2.1. 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2.2. 绑定本地信息
udp_socket.bind(("", 8540))
return udp_socket
def main():
# 1. 链接wifi
do_connect()
# 2. 创建UDP
udp_socket = start_udp()
# 3. 创建灯对象
led = machine.Pin(2, machine.Pin.OUT)
# 4. 接收网络数据
while True:
recv_data, sender_info = udp_socket.recvfrom(1024)
print("{}发送{}".format(sender_info, recv_data))
recv_data_str = recv_data.decode("utf-8")
try:
print(recv_data_str)
except Exception as ret:
print("error:", ret)
# 5. 处理接收的数据
if recv_data_str == "light on":
print("这里是要灯亮的代码...")
led.value(1)
elif recv_data_str == "light off":
print("这里是要灯灭的代码...")
led.value(0)
if __name__ == "__main__":
main()
微信公众号
关注博主微信公众号:灵萧宝殿
分享更多有趣有料内容
点此扫码