“ ESP-12F作为一款高性价比的wifi模块,在Iot领域有着广泛的应用,所以试着用Pico对接跑跑看看效果。”
01
—
ESP-12F简介
模块实物图如下所示:
引脚图:
各个引脚功能
启动模式依旧是 还是一样的 GPIO0低电平
02
—
ESP-12F刷写AT指令固件
尝试了很多版本的固件,包括网上所说的V1.6和V1.7版本,最终都以失败告终,后来用Ai-Thinker_ESP8266_DOUT_8Mbit_AiCloud_0.0.0.6_20170517.bin固件,最后刷写成功。具体流程如下:
1、配置刷写软件如下:
注意flash size根据模块的型号来进行选择,如果不知道具体型号,可以尝试用安可信的串口工具,选择波特率为74800,一个很蛋疼的波特率。重新上电就可以看到flash的大小。
2、根据第一节中提到的工作模式,将模块置为下载模式,我这边的模块只需要将GPIO0下拉到低电平即可,各位大牛可以根据实际情况来进行短接
3、然后点击START,将模块重新上电,即可开始进行烧录下载,如果进度条没跑完,可以重复几次,一般都可以烧写成功。
03
—
ESP-12F AT指令简介
这次演示的主要是通过ESP-12F来构建一个TCP Client,连接我们的TCP Server
主要用到的指令有以下几个,其他的指令,各位可以自行尝试:
1、AT,主要是用来测试模块是否在正常工作
AT
OK
2、AT+CWMODE,用来设置模块的工作模式
AT+CWMODE=?
<mode>:
‣ 1:Station 模式 客户端模式
‣ 2:SoftAP 模式 软路由模式
‣ 3:SoftAP+Station 模式
3、AT+CWJAP_DEF,用来设置模块连接的WIFI密码
AT+CWJAP_DEF="wifi名称","wifi密码"
CLOSED
WIFI DISCONNECT
WIFI CONNECTED
WIFI GOT IP
4、AT+CIPSTART,启动一个服务,可以是UDP,TCP
AT+CIPSTART="TCP","IP地址",IP端口
5、AT+CIPSEND,发送数据,启动TCP或者UDP服务后,如果返回OK,即可开始发送数据:
AT+CIPSEND=数据长度
04
—
Pico实现指令对接
1、首先配置好串口,这里我用了两路串口,一路用来连接模块,一路用来打印
uart1 = UART(1,baudrate=115200,tx=Pin(4),rx=Pin(5))
uart0 = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))
2、定义一个串口接收函数
def uart_recv(uart):
rxData=bytes()
rxData_One=bytes()
if uart.any():
rxData = uart.readline()
return rxData
3、整个流程演示接收流程的实现,由于只是demo,所以和模块对接的各种细节没有去做容错处理,只是简单的实现数据发送流程。
需要注意的是模块在接收AT指令后会返回不同长度的数据,而且会返回多条\r\n结束的数据,不管怎样,很多指令必须以OK作为最终的响应,如果在没有收到模块回复的OK 指令就执行下一条AT指令,很容易出现busyp....,相信很多玩过这个模块的都知道。
所以在实现过程中,我简单粗暴的定义了一个OK标志数组,来针对指令是否返回OK来进行容错
ok_flag=[2,2,2,2]
整个TCP连接发送流程如下:
if __name__ == '__main__':
uart0.write('AT\r\n')
while True:
buf = uart_recv(uart0)
if buf!= None:
buf = buf.decode('utf-8').replace('\r','').replace('\n','').replace(' ','')
print(buf)
if buf.find('busyp') > -1 or buf.find('ERROR') > -1:
break
elif buf=='AT':
ok_flag[0]=0
print('AT ok_flag is {}'.format(ok_flag))
elif buf == 'OK' and ok_flag[0]==0:
ok_flag[0]=1
sendToUart(uart0,CWMODE)
print('AT ok_flag is {}'.format(ok_flag))
ok_flag[0]=2
elif buf.find(CWMODE) > -1:
ok_flag[1]=0
print('CWMODE ok_flag is {}'.format(ok_flag))
elif buf == 'OK' and ok_flag[1]==0:
ok_flag[1]=1
sendToUart(uart0,CWJAP_DEF)
print('CWMODE ok_flag is {}'.format(ok_flag))
ok_flag[1]=2
elif buf.find('WIFIGOTIP') > -1:
ok_flag[2]=0
print('WIFIGOTIP ok_flag is {}'.format(ok_flag))
elif buf == 'OK' and ok_flag[2]==0:
ok_flag[2]=1
sendToUart(uart0,CIPSTART)
print('WIFIGOTIP ok_flag is {}'.format(ok_flag))
ok_flag[2]=2
elif buf.find(CIPSTART) > -1:
ok_flag[3]=0
print('CIPSTART ok_flag is {}'.format(ok_flag))
elif buf == 'OK' and ok_flag[3]==0:
ok_flag[3]=1
CIPSEND = CIPSEND.format(str(len(msg)))
sendToUart(uart0,CIPSEND)
print('CIPSEND ok_flag is {}'.format(ok_flag))
ok_flag[3]=2
elif buf.find(CIPSEND) > -1:
print('>>>>>>')
sendToUart(uart0,msg)
Thonny终端打印如下:
AT
AT ok_flag is [0, 2, 2, 2, 2]
OK
AT ok_flag is [1, 2, 2, 2, 2]
AT+CWMODE=1
CWMODE ok_flag is [2, 0, 2, 2, 2]
OK
CWMODE ok_flag is [2, 1, 2, 2, 2]
AT+CWJAP_DEF="wifi名称","wifi密码"
WIFIDISCONNECT
WIFICONNECTED
WIFIGOTIP
WIFIGOTIP ok_flag is [2, 2, 0, 2, 2]
OK
WIFIGOTIP ok_flag is [2, 2, 1, 2, 2]
AT+CIPSTART="TCP","IP地址",IP端口
CIPSTART ok_flag is [2, 2, 2, 0, 2]
CONNECT
OK
CIPSEND ok_flag is [2, 2, 2, 1, 2]
AT+CIPSEND=13
>>>>>>
OK
>
busys...
Recv13bytes
SENDOK
TCP/UDP soket调试工具接收到数据如下:
整个对接下来还算比较顺利,但是对于这个模块的使用还不是太熟练,很多时候会出现wifi连接不上,TCP连接不上,各种busyp....等情况。后续有实际的项目再详细调试吧。