目录
关于树莓派pico和circuitpython的更多玩法,请看树莓派pico专栏
关于树莓派pico和circuitpython的更多玩法,请看树莓派pico专栏
说明
使用硬件为esp01,01s和01在使用上没有差别,故使用方法通用
esp01操作要使用at指令,详情见官网,esp01固件使用官方默认固件,大小8Mbit
文章使用环境为树莓派pico、circuitpython8.x
esp01默认使用uart,波特率115200
关于uart的使用说明见树莓派pico入坑笔记,uart使用
注意在指令最后加上\r\n作为结束,防止esp01会报error说明指令不合法,在python中,可以在字符串里加\r\n。
uart.write('AT\r\n'.encode('ascii'))
关于at指令
用到的指令涉及wifi ap建立,wifi station端连接,udp连接建立,数据发送,数据接收和断开udp连接,这里只介绍一部分用到的指令
其中WiFi最多支持10人接入,udp和tcp连接支持5人接入,本文只用一人接入
WiFi的at指令
AT+CWMODE=1,设置为station模式,相当于手机连接wifi时手机和路由器中的手机
AT+CWMODE=2,设置为ap模式,相当于手机连接wifi时手机和路由器中的路由器
AT+CWSAP="ESP","1234567890",5,3,建立wifi,参数分别时WiFi名称、密码、信道号,加密方式,后两个参数默认使用5和3即可,此外还有其他参数,这里用不到,具体含义和功能见官网
AT+CWJAP="ESP","1234567890",连接wifi,参数为wifi名称和密码
AT+CWLIF,查询连接到 ESP SoftAP 的 station 信息
AT+CIPAP?,查询 ESP SoftAP 的 IP 地址
ATE0,关闭回显,ATE1,开启回显,回显是指输入的命令会和响应数据一同返回给用户
UDP的at指令
AT+CIPMUX=1,启用多连接模式
AT+CIPSTART=4,"UDP","192.168.4.1",1113,1113,0,和该ip地址建立udp连接,该链接id设置为4(0~4),本地udp端口设置为1113,远端udp端口为1113,固定连接模式0
AT+CIPSEND=4,5 ,向id为4 的连接发送长度为5字节的数据,esp会返回>提示用户输入要发送的数据,如果输入的超过5字节,将只发送前5个字节
AT+CIPCLOSE=4,断开和id为4的连接
样例程序
ap端默认ip192.168.4.1,端口1113,sta端默认ip192.168.4.2,端口1113,
已经在电脑端使用安信可调试助手搭建了ap端并建立和192.168.4.2的udp连接
AT指令应答一般包含OK字样,有、可用作为发送下一条指令的依据,防止指令过快而没有被执行
注意发送的数据中有'\'等字符需要加\作为转义,具体注意事项见官网
调试助手端输入指令
AT+CWMODE=2
AT+CWSAP="ESP","1234567890",5,3
AT+CIPMUX=1
AT+CIPSTART=4,"UDP","192.168.4.2",1113,1113,0
sta端程序
import board
import busio
from time import sleep
U= busio.UART(board.GP4,board.GP5,baudrate=115200)
def Cmd_Send(cmd: str):
U.write(bytearray(cmd + '\r\n', 'ascii'))
while True:
d = U.read(64)
U.reset_input_buffer()
if d:
string = d.decode('ascii')
if ('OK' in string) or ('CLOSED' in string) or ('boot' in string):
break
Cmd_Send('AT+CWMODE=1')
Cmd_Send('ATE0')
ssid: str ='ESP'
passworld: str ='1234567890'
Cmd_Send('AT+CWJAP="{}","{}"'.format(ssid,passworld))
id: int =4
host: str ='192.168.4.1'
hport: int =1113
lport: int =1113
Cmd_Send('AT+CIPMUX=1')
Cmd_Send('AT+CIPSTART={},"UDP","{}",{},{},0'.format(id,host,hport,lport))
data: str ='text'
id: int = 4
Cmd_Send('AT+CIPSEND={},{}'.format(id, len(data)))
Cmd_Send(data)
Cmd_Send('AT+CIPCLOSE={}'.format(id))
效果
接收的数据为
+IPD,4,4:text,其中+IPD,4,4意思是接收到连接4发来的4字节数据:text
进阶使用
esp01库下载,本库针对udp单链接设计,读者可用根据需要进行修改
库函数说明
def Esp01_Init(uart: busio.UART,debug: bool =False )
初始化,提供esp连接的uart,第二个参数为True时将输出发送的每一条at指令,作为调试信息
def Wifi_Sta_Init(ssid: str ='ESP',passworld: str ='1234567890')
WiFi sta初始化,默认wifi名称和密码见上
def Wifi_Ap_Init(ssid: str ='ESP',passworld: str ='1234567890')
wifi ap初始化,默认wifi名称和密码见上
def Udp_Server_Init(id: int =4,host: str ='192.168.4.2',hport: int =1113,lport: int =1113)
udp server初始化,默认连接id、ip、本地端口和连接端口见上
def Udp_Client_Init(id: int =4,host: str ='192.168.4.1',hport: int =1113,lport: int =1113)
udp client初始化,默认连接id、ip、本地端口和连接端口见上
def Udp_Deinit(id: int =4)
udp断开连接,默认连接id见上
def Cmd_Send(cmd: str)
发送at指令,收到正确应答后返回,返回时清空uart缓冲
def Data_Get() -> str
接收传进的数据,返回时清空uart缓冲
def Data_Send(data: str ='text', id: int = 4)
发送数据,默认发送数据和发送到的连接id见上
样例代码
import esp01 as esp
import board
import busio
from time import sleep
uart= busio.UART(board.GP4,board.GP5,baudrate=115200)
# 初始化,缺省默认不开启调试输出
esp.Esp01_Init(uart)
data='hello'
# 缺省默认wifi接入
esp.Wifi_Sta_Init()
# 缺省默认udp连接
esp.Udp_Client_Init()
# 缺省发送默认数据
esp.Data_Send()
# esp.Data_Send(data)#发送自定义数据
# 缺省断开默认连接
esp.Udp_Deinit()