Using an Adafruit Airlift module or Airlift capable development board with WiFi is not difficult, but it does require some code that other networking solutions do not require, mainly to set up the SPI bus communications between the main microcontroller and the ESP32 running NINA firmware.
Connections to Enterprise WiFi are not supported by Airlift.
Check out the page below for basic wiring with an Airlift breakout board connected to a Feather microcontroller board. The example scans for WiFi access points within range.
import board import busio from digitalio import DigitalInOut from adafruit_esp32spi import adafruit_esp32spi import adafruit_requests as requests print("ESP32 SPI hardware test") esp32_cs = DigitalInOut(board.D10) esp32_ready = DigitalInOut(board.D9) esp32_reset = DigitalInOut(board.D7) spi = busio.SPI(board.SCK, board.MOSI, board.MISO) esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) if esp.status == adafruit_esp32spi.WL_IDLE_STATUS: print("ESP32 found and in idle mode") print("Firmware vers.", esp.firmware_version) print("MAC addr:", [hex(i) for i in esp.MAC_address]) for ap in esp.scan_networks(): print("\t%s\t\tRSSI: %d" % (str(ap['ssid'], 'utf-8'), ap['rssi'])) print("Done!")
The Adafruit Airlift Shield provides an Airlift ESP32 coprocessor on an Arduino shield form factor. The pins for the Airlift are as follows:
esp32_cs = DigitalInOut(board.D10)
esp32_ready = DigitalInOut(board.D7)
esp32_reset = DigitalInOut(board.D5)
The ESP32 coprocessor is on the following Cortex M4 pins in CircuitPython:
- CS Pin -
board.ESP_CS
- Ready/Busy -
board.ESP_BUSY
- Reset -
board.ESP_RESET
The ESP32 coprocessor is on the following Cortex M4 pins in CircuitPython:
- CS Pin -
board.ESP_CS
- Ready/Busy -
board.ESP_BUSY
- Reset -
board.ESP_RESET
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import os import adafruit_connection_manager import board import busio from adafruit_esp32spi import adafruit_esp32spi from digitalio import DigitalInOut import adafruit_requests # Get WiFi details, ensure these are setup in settings.toml ssid = os.getenv("CIRCUITPY_WIFI_SSID") password = os.getenv("CIRCUITPY_WIFI_PASSWORD") # If you are using a board with pre-defined ESP32 Pins: esp32_cs = DigitalInOut(board.ESP_CS) esp32_ready = DigitalInOut(board.ESP_BUSY) esp32_reset = DigitalInOut(board.ESP_RESET) # If you have an externally connected ESP32: # esp32_cs = DigitalInOut(board.D9) # esp32_ready = DigitalInOut(board.D10) # esp32_reset = DigitalInOut(board.D5) # If you have an AirLift Featherwing or ItsyBitsy Airlift: # esp32_cs = DigitalInOut(board.D13) # esp32_ready = DigitalInOut(board.D11) # esp32_reset = DigitalInOut(board.D12) spi = busio.SPI(board.SCK, board.MOSI, board.MISO) radio = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) print("Connecting to AP...") while not radio.is_connected: try: radio.connect_AP(ssid, password) except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue print("Connected to", str(radio.ssid, "utf-8"), "\tRSSI:", radio.rssi) # Initialize a requests session pool = adafruit_connection_manager.get_radio_socketpool(radio) ssl_context = adafruit_connection_manager.get_radio_ssl_context(radio) requests = adafruit_requests.Session(pool, ssl_context) JSON_GET_URL = "https://httpbin.org/get" # Define a custom header as a dict. headers = {"user-agent": "blinka/1.0.0"} print("Fetching JSON data from %s..." % JSON_GET_URL) with requests.get(JSON_GET_URL, headers=headers) as response: print("-" * 60) json_data = response.json() headers = json_data["headers"] print("Response's Custom User-Agent Header: {0}".format(headers["User-Agent"])) print("-" * 60) # Read Response's HTTP status code print("Response HTTP Status Code: ", response.status_code) print("-" * 60)
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import os import adafruit_connection_manager import board import busio from adafruit_esp32spi import adafruit_esp32spi from digitalio import DigitalInOut import adafruit_requests # Get WiFi details, ensure these are setup in settings.toml ssid = os.getenv("CIRCUITPY_WIFI_SSID") password = os.getenv("CIRCUITPY_WIFI_PASSWORD") # If you are using a board with pre-defined ESP32 Pins: esp32_cs = DigitalInOut(board.ESP_CS) esp32_ready = DigitalInOut(board.ESP_BUSY) esp32_reset = DigitalInOut(board.ESP_RESET) # If you have an externally connected ESP32: # esp32_cs = DigitalInOut(board.D9) # esp32_ready = DigitalInOut(board.D10) # esp32_reset = DigitalInOut(board.D5) # If you have an AirLift Featherwing or ItsyBitsy Airlift: # esp32_cs = DigitalInOut(board.D13) # esp32_ready = DigitalInOut(board.D11) # esp32_reset = DigitalInOut(board.D12) spi = busio.SPI(board.SCK, board.MOSI, board.MISO) radio = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) print("Connecting to AP...") while not radio.is_connected: try: radio.connect_AP(ssid, password) except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue print("Connected to", str(radio.ssid, "utf-8"), "\tRSSI:", radio.rssi) # Initialize a requests session pool = adafruit_connection_manager.get_radio_socketpool(radio) ssl_context = adafruit_connection_manager.get_radio_ssl_context(radio) requests = adafruit_requests.Session(pool, ssl_context) TEXT_URL = "http://wifitest.adafruit.com/testwifi/index.html" JSON_GET_URL = "https://httpbin.org/get" JSON_POST_URL = "https://httpbin.org/post" print("Fetching text from %s" % TEXT_URL) with requests.get(TEXT_URL) as response: print("-" * 40) print("Text Response: ", response.text) print("-" * 40) print("Fetching JSON data from %s" % JSON_GET_URL) with requests.get(JSON_GET_URL) as response: print("-" * 40) print("JSON Response: ", response.json()) print("-" * 40) data = "31F" print(f"POSTing data to {JSON_POST_URL}: {data}") with requests.post(JSON_POST_URL, data=data) as response: print("-" * 40) json_resp = response.json() # Parse out the 'data' key from json_resp dict. print("Data received from server:", json_resp["data"]) print("-" * 40) json_data = {"Date": "July 25, 2019"} print(f"POSTing data to {JSON_POST_URL}: {json_data}") with requests.post(JSON_POST_URL, json=json_data) as response: print("-" * 40) json_resp = response.json() # Parse out the 'json' key from json_resp dict. print("JSON Data received from server:", json_resp["json"]) print("-" * 40)
Text editor powered by tinymce.