MicroPython Programming Tutorial: Getting Started with the ESP32 Thing
Experiment 5: WiFi
While the possibilities of interacting with hardware directly connected to the ESP32 are endless, some real fun can be had connecting to the Internet. By being able to send and receive data to servers across the Internet, the ESP32 can download current weather or time data, upload sensor data, and respond to events (e.g. on Twitter) in real time. This is just the beginning of exploring the Internet of Things (IoT).
To demonstrate accessing the Internet, we will write a quick MicroPython program that connects to a local WiFi and downloads the example.com web page using an HTTP GET command.
We'll keep it simple this time--just the ESP32 Thing will be needed. We're going to use its built-in WiFi radio, get a web page, and then send the downloaded HTML contents over the serial connection.
Code: GET Some
In a new file, enter the following code (change
<YOUR WIFI SSID> to the name of your WiFi network name and
<YOUR WIFI PASSWORD> to the name of your WiFi's password--note that the name and password should be in quotation marks
language:python import machine import sys import network import utime import urequests # Pin definitions repl_button = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP) repl_led = machine.Pin(5, machine.Pin.OUT) # Network settings wifi_ssid = "<YOUR WIFI SSID>" wifi_password = "<YOUR WIFI PASSWORD>" # Web page (non-SSL) to get url = "http://example.com" # Create a station object to store our connection station = network.WLAN(network.STA_IF) station.active(True) # Continually try to connect to WiFi access point while not station.isconnected(): # Try to connect to WiFi access point print("Connecting...") station.connect(wifi_ssid, wifi_password) # Check to see if our REPL button is pressed over 10 seconds for i in range(100): if repl_button.value() == 0: print("Dropping to REPL") repl_led.value(1) sys.exit() utime.sleep_ms(100) # Continually print out HTML from web page as long as we have a connection while station.isconnected(): # Display connection details print("Connected!") print("My IP Address:", station.ifconfig()) # Perform HTTP GET request on a non-SSL web response = urequests.get(url) # Display the contents of the page print(response.text) # Check to see if our REPL button is pressed over 10 seconds for i in range(100): if repl_button.value() == 0: print("Dropping to REPL") repl_led.value(1) sys.exit() utime.sleep_ms(100) # If we lose connection, repeat this main.py and retry for a connection print("Connection lost. Trying again.")
Save the file with a name like wifi.py. In a command terminal, navigate to the directory where wifi.py is stored. Hold down button 0 on the ESP32 Thing to exit its currently running program. Back in the command terminal, enter the following commands (
<PORT> should be changed to your serial port name/location):
language:shell cp wifi.py main.py ampy --port <PORT> put main.py
Open a serial connection to the ESP32, and you should see your ESP32 connect to your WiFi network and then download the example.com HTML page. If you see text like the one below, you know that it worked:
If you are unable to connect and download the page, double-check the SSID and password in the code. Additionally, some network configurations do not work well with the ESP32, which means you might need to try a different network.
Code to Note
In this example, we're relying on the
urequests modules to handle much of the networking for us. We use the network module to perform the low-level communication over WiFi, including connecting to our Wifi access point. To create a connection to our WiFi access point, we first create a
WLAN object and use
network.STA_IF to tell the ESP32 that we want to use it as a client that connects to a separate access point:
language:python station = network.WLAN(network.STA_IF) station.active(True)
From there, we attempt to establish a connection with the access point:
language:python while not station.isconnected(): # Try to connect to WiFi access point print("Connecting...") station.connect(wifi_ssid, wifi_password)
station.connect(wifi_ssid, wifi_password) is what actually performs the connection. We wrap this up in a while loop that continually checks to see if we have a connection. This way, if no connection is established, the program will not move forward and try to perform a GET request on a website. Notice that we also include our "Drop to REPL" button check in this while loop, too, in case the ESP32 gets stuck here.
Once we have a connection, we use the
urequests module to perform our GET request on example.com:
language:python response = urequests.get(url)
This returns a
Response object that contains all the information returned by the server. We can view the response in text form with the command:
We then wait for 10 seconds before requesting the page again. During those 10 seconds, we check for a button 0 push every 100 ms.
If you would like to learn more about networking in MicroPython, see the network module documentation.