It's a exercise on Raspberry Pi Pico/MicroPython work with ESP-C3-12F Module.
The ESP-C3-12F preloaded with AT Command Firmware (AT version:2.2.0.0
(s-90458f0 - ESP32C3 - Jun 18 2021 10:24:22)), act as a WiFi co-processor. The Raspberry Pi Pico control ESP-C3-12F using
AT Command, to connect and send data to TCP and UDP Server running on
Raspberry Pi 4B/Python.
Connection:
It's strongly recommended using separate 3V3 Power Supply for ESP-C3-12F.
Separated
Power Supply ESP-C3-12F Raspberry Pi Pico
+-------------+ +----------------
3V3 ------------|VCC RX0|-------| GP0 (UART TX)
| TX0|-------| GP1 (UART RX)
| | |
| EN |-------| GP2
| GND | |
+------+------+ |
| |
GND -------------------+--------------| GND
+----------------
Exercise Code:
mpyPico_ESP_AT_TCP.py, a simple program to try AT command on ESP.
import usys, uos
import machine
import utime
class color:
BLACK = '\033[1;30;48m'
RED = '\033[1;31;48m'
GREEN = '\033[1;32;48m'
YELLOW = '\033[1;33;48m'
BLUE = '\033[1;34;48m'
MAGENTA = '\033[1;35;48m'
CYAN = '\033[1;36;48m'
END = '\033[1;37;0m'
print("====================================")
print(usys.implementation[0], uos.uname()[3],
"\nrun on", uos.uname()[4])
print("------------------------------------")
esp_reset = machine.Pin(2, machine.Pin.OUT)
#uart_esp =machine.UART(0, baudrate=115200)
uart_esp =machine.UART(0, timeout=1000)
#print("UART(0) connected to ESP: \n", uart_esp, "\n")
#==================================
"""
esp_sendCMD_waitResp: send comand to ESP, and wait response
if targetResp catched, return True
otherwise return False
"""
def esp_sendCMD_waitResp(cmd, uart=uart_esp, timeout=2000, targetResp="OK"):
print(color.MAGENTA + cmd + color.END)
uart.write(cmd)
return esp_waitResp(uart, timeout, targetResp)
"""
esp_waitResp: wait ESP response
if targetResp catched, return True
otherwise return False
"""
def esp_waitResp(uart=uart_esp, timeout=2000, targetResp="OK"):
targetCatched = False
prvMills = utime.ticks_ms()
print(color.BLUE)
while (utime.ticks_diff(utime.ticks_ms(), prvMills))<timeout:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
if line_decoded == targetResp:
print(color.GREEN + line_decoded)
targetCatched = True
break
#more checking for Response
elif line_decoded == "OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "ERROR":
print(color.RED + line_decoded)
break
elif line_decoded == "SEND OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "SEND FAIL":
print(color.RED + line_decoded)
break
else:
print(line_decoded)
except UnicodeError:
print(line)
print(color.END)
return targetCatched
# In my test there are something
# like "################################################"
# follow ready of AT+RST/AT+RESTORE or hardware reset,
# Just dummy wait response to clear it
def esp_waitDummtResp(uart=uart_esp, timeout=2000):
esp_waitResp(uart=uart_esp, timeout=2000)
#A dummy infinity loop
#to monitor any data sent from ESP via UART
def esp_dummyMonitor(uart=uart_esp):
while True:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
print(line_decoded)
except UnicodeError:
print(line)
#==================================
print()
print("=== Start ===")
#hardware reset ESP
print("Hardware reset")
esp_reset.value(1)
utime.sleep(0.5)
esp_reset.value(0)
utime.sleep(0.5)
esp_reset.value(1)
print("wait 'ready' from Hardware Reset\n")
esp_waitResp(targetResp='ready')
esp_waitDummtResp()
esp_sendCMD_waitResp('AT\r\n') #Test AT startup
esp_sendCMD_waitResp('AT+GMR\r\n') #Check version information
esp_sendCMD_waitResp('AT+RESTORE\r\n')
esp_waitResp(targetResp='ready') #wait ready
esp_waitDummtResp()
esp_sendCMD_waitResp('AT+CIPAPMAC?\r\n') #Query MAC address of ESP SoftAP
esp_sendCMD_waitResp('AT+CIPSTAMAC?\r\n') #Query MAC address of ESP station
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode
esp_sendCMD_waitResp('AT+CWMODE=2\r\n') #Set the Wi-Fi mode = SoftAP mode
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
esp_sendCMD_waitResp('AT+CIPMUX=1\r\n') #Enable multiple connections
esp_sendCMD_waitResp('AT+CIPMUX?\r\n')
esp_sendCMD_waitResp('AT+CWSAP="esp","password",5,3\r\n') #config ESP SoftAP
esp_sendCMD_waitResp('AT+CWSAP?\r\n')
esp_sendCMD_waitResp('AT+CIPAP?\r\n') #Query the IP address of the ESP SoftAP
esp_dummyMonitor()
print("\n~ bye ~\n");
"""
Raspberry Pi Pico/MicroPython + ESP-C3-12F exercise
ESP-C3-12F with AT-command firmware:
AT version:2.2.0.0(s-90458f0 - ESP32C3 - Jun 18 2021 10:24:22)
Scan Access Point
"""
import usys, uos
import machine
import utime
class color:
BLACK = '\033[1;30;48m'
RED = '\033[1;31;48m'
GREEN = '\033[1;32;48m'
YELLOW = '\033[1;33;48m'
BLUE = '\033[1;34;48m'
MAGENTA = '\033[1;35;48m'
CYAN = '\033[1;36;48m'
END = '\033[1;37;0m'
print("====================================")
print(usys.implementation[0], uos.uname()[3],
"\nrun on", uos.uname()[4])
print("------------------------------------")
esp_reset = machine.Pin(2, machine.Pin.OUT)
uart_esp =machine.UART(0, timeout=1000)
#print("UART(0) connected to ESP: \n", uart_esp, "\n")
#==================================
"""
esp_sendCMD_waitResp: send comand to ESP, and wait response
if targetResp catched, return True
otherwise return False
"""
def esp_sendCMD_waitResp(cmd, uart=uart_esp, timeout=2000, targetResp="OK"):
print(color.MAGENTA + cmd + color.END)
uart.write(cmd)
return esp_waitResp(uart, timeout, targetResp)
"""
esp_waitResp: wait ESP response
if targetResp catched, return True
otherwise return False
"""
def esp_waitResp(uart=uart_esp, timeout=2000, targetResp="OK"):
targetCatched = False
prvMills = utime.ticks_ms()
print(color.BLUE)
while (utime.ticks_diff(utime.ticks_ms(), prvMills))<timeout:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
if line_decoded == targetResp:
print(color.GREEN + line_decoded)
targetCatched = True
break
#more checking for Response
elif line_decoded == "OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "ERROR":
print(color.RED + line_decoded)
break
elif line_decoded == "SEND OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "SEND FAIL":
print(color.RED + line_decoded)
break
else:
print(line_decoded)
except UnicodeError:
print(line)
print(color.END)
return targetCatched
# In my test there are something
# like "################################################"
# follow ready of AT+RST/AT+RESTORE or hardware reset,
# Just dummy wait response to clear it
def esp_waitDummtResp(uart=uart_esp, timeout=2000):
esp_waitResp(uart=uart_esp, timeout=2000)
#A dummy infinity loop
#to monitor any data sent from ESP via UART
def esp_dummyMonitor(uart=uart_esp):
while True:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
print(line_decoded)
except UnicodeError:
print(line)
#==================================
print()
print("=== Start ===")
#hardware reset ESP
print("Hardware reset")
esp_reset.value(1)
utime.sleep(0.5)
esp_reset.value(0)
utime.sleep(0.5)
esp_reset.value(1)
print("wait 'ready' from Hardware Reset\n")
esp_waitResp(targetResp='ready')
esp_waitDummtResp()
esp_sendCMD_waitResp('AT\r\n') #Test AT startup
esp_sendCMD_waitResp('AT+GMR\r\n') #Check version information
esp_sendCMD_waitResp('AT+RESTORE\r\n')
esp_waitResp(targetResp='ready') #wait ready
esp_waitDummtResp()
esp_sendCMD_waitResp('AT+CIPAPMAC?\r\n') #Query MAC address of ESP SoftAP
esp_sendCMD_waitResp('AT+CIPSTAMAC?\r\n') #Query MAC address of ESP station
esp_sendCMD_waitResp('AT+CWMODE=1\r\n') #Set the Wi-Fi mode = Station mode
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
preScanTime = utime.ticks_ms()
esp_sendCMD_waitResp('AT+CWLAP\r\n', timeout=10000) #List Available APs
print("Time used to Scan AP: ",
utime.ticks_diff(utime.ticks_ms(), preScanTime),
"(ms)")
print("\n~ bye ~\n");
"""
Raspberry Pi Pico/MicroPython + ESP-C3-12F exercise
ESP-C3-12F with AT-command firmware:
AT version:2.2.0.0(s-90458f0 - ESP32C3 - Jun 18 2021 10:24:22)
Pico send AT command to ESP-C3-12F via UART,
- set in station mode
- join AP
- connect to server ip:port 9999
- send text and wait response
Modified from exercise in my another blogspot
https://helloraspberrypi.blogspot.com/2021/02/
picomicropython-esp-01s-at-command-act.html
"""
import usys, uos
import machine
import utime
class color:
BLACK = '\033[1;30;48m'
RED = '\033[1;31;48m'
GREEN = '\033[1;32;48m'
YELLOW = '\033[1;33;48m'
BLUE = '\033[1;34;48m'
MAGENTA = '\033[1;35;48m'
CYAN = '\033[1;36;48m'
END = '\033[1;37;0m'
#server port & ip hard-coded,
#have to match with server side setting
server_ip="192.168.120.147"
server_port=9999
print("====================================")
print(usys.implementation[0], uos.uname()[3],
"\nrun on", uos.uname()[4])
print("------------------------------------")
esp_reset = machine.Pin(2, machine.Pin.OUT)
#uart_esp =machine.UART(0, baudrate=115200)
uart_esp =machine.UART(0, timeout=1000)
#print("UART(0) connected to ESP: \n", uart_esp, "\n")
#==================================
"""
esp_sendCMD_waitResp: send comand to ESP, and wait response
if targetResp catched, return True
otherwise return False
"""
def esp_sendCMD_waitResp(cmd, uart=uart_esp, timeout=2000, targetResp="OK"):
print(color.MAGENTA + cmd + color.END)
uart.write(cmd)
return esp_waitResp(uart, timeout, targetResp)
"""
esp_waitResp: wait ESP response
if targetResp catched, return True
otherwise return False
"""
def esp_waitResp(uart=uart_esp, timeout=2000, targetResp="OK"):
targetCatched = False
prvMills = utime.ticks_ms()
print(color.BLUE)
while (utime.ticks_diff(utime.ticks_ms(), prvMills))<timeout:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
if line_decoded == targetResp:
print(color.GREEN + line_decoded)
targetCatched = True
break
#more checking for Response
elif line_decoded == "OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "ERROR":
print(color.RED + line_decoded)
break
elif line_decoded == "SEND OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "SEND FAIL":
print(color.RED + line_decoded)
break
else:
print(line_decoded)
except UnicodeError:
print(line)
print(color.END)
return targetCatched
def espSend(text="test", uart=uart_esp):
esp_sendCMD_waitResp('AT+CIPSEND=' + str(len(text)) + '\r\n')
esp_waitResp(targetResp=">")
esp_sendCMD_waitResp(text)
# In my test there are something
# like "################################################"
# follow ready of AT+RST/AT+RESTORE or hardware reset,
# Just dummy wait response to clear it
def esp_waitDummtResp(uart=uart_esp, timeout=2000):
esp_waitResp(uart=uart_esp, timeout=2000)
#==================================
print()
print("=== Start ===")
#hardware reset ESP
print("Hardware reset")
esp_reset.value(1)
utime.sleep(0.5)
esp_reset.value(0)
utime.sleep(0.5)
esp_reset.value(1)
print("wait 'ready' from Hardware Reset\n")
esp_waitResp(targetResp='ready')
esp_waitDummtResp()
esp_sendCMD_waitResp('AT\r\n') #Test AT startup
esp_sendCMD_waitResp('AT+GMR\r\n') #Check version information
esp_sendCMD_waitResp('AT+RESTORE\r\n')
esp_waitResp(targetResp='ready') #wait ready
esp_waitDummtResp()
esp_sendCMD_waitResp('AT+CIPAPMAC?\r\n') #Query MAC address of ESP SoftAP
esp_sendCMD_waitResp('AT+CIPSTAMAC?\r\n') #Query MAC address of ESP station
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode
esp_sendCMD_waitResp('AT+CWMODE=1\r\n') #1 = Station mode
#2 = SoftAP mode
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
esp_sendCMD_waitResp('AT+CWJAP="ssid","password"\r\n', timeout=5000) #Connect to AP
esp_sendCMD_waitResp('AT+CIFSR\r\n') #Obtain the Local IP Address
esp_sendCMD_waitResp('AT+CIPSTART="TCP","' +
server_ip + '",' +
str(server_port) + '\r\n')
espSend()
while True:
print('Enter something:')
msg = input()
esp_sendCMD_waitResp('AT+CIPSTART="TCP","' +
server_ip + '",' +
str(server_port) + '\r\n')
espSend(msg)
print("\n~ bye ~\n");
"""
Simple Python TCP Server
tested on Raspberry Pi/Python3
ref:
https://docs.python.org/3/library/socketserver.html
"""
import socketserver
import platform
print("sys info:")
for info in platform.uname():
print(info)
class MyTCPHandler(socketserver.BaseRequestHandler):
"""
The request handler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
# just send back the same data, but upper-cased
self.request.sendall(self.client_address[0].encode())
self.request.sendall(self.data.upper())
self.request.sendall(b'\r\n')
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
# Create the server, binding to localhost on port 9999
#with socketserver.TCPServer((HOST, PORT), MyTCPHandler) as server:
with socketserver.TCPServer(('', PORT), MyTCPHandler) as server:
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
"""
Raspberry Pi Pico/MicroPython + ESP-C3-12F exercise
ESP-C3-12F with AT-command firmware:
AT version:2.2.0.0(s-90458f0 - ESP32C3 - Jun 18 2021 10:24:22)
Pico send AT command to ESP-C3-12F via UART,
- set in station mode
- join AP
- connect to UDP
- send text and wait response
ref:
https://docs.espressif.com/projects/esp-at/en/release-v2.2.0.0_esp32c3/
AT_Command_Examples/TCP-IP_AT_Examples.html
Example 3.2. UDP Transmission with Changeable Remote IP and Port
"""
import usys, uos
import machine
import utime
class color:
BLACK = '\033[1;30;48m'
RED = '\033[1;31;48m'
GREEN = '\033[1;32;48m'
YELLOW = '\033[1;33;48m'
BLUE = '\033[1;34;48m'
MAGENTA = '\033[1;35;48m'
CYAN = '\033[1;36;48m'
END = '\033[1;37;0m'
#server port & ip hard-coded,
#have to match with server side setting
server_ip="192.168.120.147"
server_port=8000
print("====================================")
print(usys.implementation[0], uos.uname()[3],
"\nrun on", uos.uname()[4])
print("------------------------------------")
esp_reset = machine.Pin(2, machine.Pin.OUT)
#uart_esp =machine.UART(0, baudrate=115200)
uart_esp =machine.UART(0, timeout=1000)
#print("UART(0) connected to ESP: \n", uart_esp, "\n")
#==================================
"""
esp_sendCMD_waitResp: send comand to ESP, and wait response
if targetResp catched, return True
otherwise return False
"""
def esp_sendCMD_waitResp(cmd, uart=uart_esp, timeout=2000, targetResp="OK"):
print(color.MAGENTA + cmd + color.END)
uart.write(cmd)
return esp_waitResp(uart, timeout, targetResp)
"""
esp_waitResp: wait ESP response
if targetResp catched, return True
otherwise return False
"""
def esp_waitResp(uart=uart_esp, timeout=2000, targetResp="OK"):
targetCatched = False
prvMills = utime.ticks_ms()
print(color.BLUE)
while (utime.ticks_diff(utime.ticks_ms(), prvMills))<timeout:
line=uart.readline()
if line is not None:
try:
line_decoded = line.strip().decode()
if line_decoded == targetResp:
print(color.GREEN + line_decoded)
targetCatched = True
break
#more checking for Response
elif line_decoded == "OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "ERROR":
print(color.RED + line_decoded)
break
elif line_decoded == "SEND OK":
print(color.GREEN + line_decoded)
break
elif line_decoded == "SEND FAIL":
print(color.RED + line_decoded)
break
else:
print(line_decoded)
except UnicodeError:
print(line)
print(color.END)
return targetCatched
def espSend(text="test", uart=uart_esp):
esp_sendCMD_waitResp('AT+CIPSEND=' + str(len(text)) + '\r\n')
esp_waitResp(targetResp=">")
esp_sendCMD_waitResp(text)
# In my test there are something
# like "################################################"
# follow ready of AT+RST/AT+RESTORE or hardware reset,
# Just dummy wait response to clear it
def esp_waitDummtResp(uart=uart_esp, timeout=2000):
esp_waitResp(uart=uart_esp, timeout=2000)
#==================================
print()
print("=== Start ===")
#hardware reset ESP
print("Hardware reset")
esp_reset.value(1)
utime.sleep(0.5)
esp_reset.value(0)
utime.sleep(0.5)
esp_reset.value(1)
print("wait 'ready' from Hardware Reset\n")
esp_waitResp(targetResp='ready')
esp_waitDummtResp()
esp_sendCMD_waitResp('AT\r\n') #Test AT startup
esp_sendCMD_waitResp('AT+GMR\r\n') #Check version information
esp_sendCMD_waitResp('AT+RESTORE\r\n')
esp_waitResp(targetResp='ready') #wait ready
esp_waitDummtResp()
esp_sendCMD_waitResp('AT+CIPAPMAC?\r\n') #Query MAC address of ESP SoftAP
esp_sendCMD_waitResp('AT+CIPSTAMAC?\r\n') #Query MAC address of ESP station
esp_sendCMD_waitResp('AT+CWMODE=3\r\n') #3 = SoftAP+Station mode
esp_sendCMD_waitResp('AT+CWMODE?\r\n') #Query the Wi-Fi mode again
esp_sendCMD_waitResp('AT+CWJAP="ssid","password"\r\n', timeout=5000) #Connect to AP
esp_sendCMD_waitResp('AT+CIFSR\r\n') #Obtain the Local IP Address
esp_sendCMD_waitResp('AT+CIPSTART="UDP","' +
server_ip +
'",' + str(server_port) +
',' + '1112,2\r\n')
espSend()
while True:
print('Enter something:')
msg = input()
espSend(msg)
print("\n~ bye ~\n");
"""
Simple Python UDP Server
tested on Raspberry Pi/Python3
ref:
https://wiki.python.org/moin/UdpCommunication
"""
import socket
#have to match my ip
UDP_IP = "192.168.120.147"
UDP_PORT = 8000
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
print("UDP IP: %s" % UDP_IP)
print("UDP port: %s" % UDP_PORT)
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
print("received message: %s" % data)
Thank you for the much work.
ReplyDeleteUnfortunately, I couldn't get it running. Until I found out: The ESP-12F needs also a connection from GPIO15 to GND. Otherwise it will not work.