ESP-12F作为一款高性价比的wifi模块,在Iot领域有着广泛的应用,所以试着用Pico对接跑跑看看效果。

01

ESP-12F简介

esp12f adc第几引脚 esp12f工作引脚_linux

模块实物图如下所示:

esp12f adc第几引脚 esp12f工作引脚_esp12f adc第几引脚_02

引脚图:

esp12f adc第几引脚 esp12f工作引脚_python_03

各个引脚功能

esp12f adc第几引脚 esp12f工作引脚_python_04

esp12f adc第几引脚 esp12f工作引脚_物联网_05

esp12f adc第几引脚 esp12f工作引脚_linux_06

启动模式依旧是 还是一样的 GPIO0低电平

esp12f adc第几引脚 esp12f工作引脚_python_07

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的大小。

esp12f adc第几引脚 esp12f工作引脚_linux_08

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调试工具接收到数据如下:

esp12f adc第几引脚 esp12f工作引脚_python_09

整个对接下来还算比较顺利,但是对于这个模块的使用还不是太熟练,很多时候会出现wifi连接不上,TCP连接不上,各种busyp....等情况。后续有实际的项目再详细调试吧。