Testing out SPI means trying to have 2 devices on one SPI port, plus a bunch of LEDs on a secondary port. Seems to work just fine tho :) We use an ESP32 over SPI for internet access, with requests
and json
support its easy to get any sort of internet data like CheerLights & share the holiday cheer!
import time
import random
import board
import busio
from digitalio import DigitalInOut
# display
import displayio
import adafruit_ili9341
from adafruit_display_text import label
from adafruit_bitmap_font import bitmap_font
# wifi support
from adafruit_esp32spi import adafruit_esp32spi
from adafruit_esp32spi import adafruit_esp32spi_wifimanager
import adafruit_esp32spi.adafruit_esp32spi_socket as socket
import adafruit_requests as requests
# colorful lights
import adafruit_dotstar as dotstar
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.sequence import AnimationSequence
# Get wifi details and more from a secrets.py file
try:
from secrets import secrets
except ImportError:
print("WiFi secrets are kept in secrets.py, please add them there!")
raise
DATA_SOURCE = "https://api.thingspeak.com/channels/1417/feeds.json?results=1"
# Release any resources currently in use for the displays
displayio.release_displays()
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
tft_cs = board.D9
tft_dc = board.D10
display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=board.D6)
display = adafruit_ili9341.ILI9341(display_bus, width=320, height=240)
pixels = dotstar.DotStar(board.A0, board.A1, 144, brightness=0.2)
pixels.fill(0)
esp32_cs = DigitalInOut(board.D13)
esp32_ready = DigitalInOut(board.D11)
esp32_reset = DigitalInOut(board.D12)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset)
requests.set_socket(socket, esp)
# Make the display context
splash = displayio.Group()
# Draw a black background
color_bitmap = displayio.Bitmap(320, 240, 1)
color_palette = displayio.Palette(1)
color_palette[0] = 0x000000
bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0)
splash.append(bg_sprite)
# Draw a label
font = bitmap_font.load_font("Quicksand-Bold-48.pcf")
text_area = label.Label(font, max_glyphs=100,
anchor_point=(0, 0.5),
line_spacing=0.75,
x=20, y=120, color=0xFFFF00)
splash.append(text_area)
display.show(splash)
wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, None)
# we'll save the value in question
last_value = value = None
while True:
try:
print("Fetching json from", DATA_SOURCE)
splash.hidden = True
text_area.color = 0xFFFFFF
text_area.text = "Connecting\nto\nThingSpeak"
splash.hidden = False
response = wifi.get(DATA_SOURCE)
print(response.json())
value = response.json()
color = value["feeds"][0]["field2"]
name = value["feeds"][0]["field1"]
response.close()
response = None
except (ValueError, RuntimeError) as e:
print("Failed to get data, retrying\n", e)
wifi.reset()
continue
color = int(color[1:], 16)
splash.hidden = True
text_area.color = color
text_area.text = "Cheerlights\nis "+name
splash.hidden = False
animations = AnimationSequence(
Pulse(pixels, speed=0, color=color, period=3),
Chase(pixels, speed=0, size=3, color=color, spacing=2),
Sparkle(pixels, speed=0, color=color, num_sparkles=1),
Comet(pixels, 0, color=color, tail_length=24),
advance_interval=5, auto_clear=True,
)
# animate for 3 minutes before we retry
timestamp = time.monotonic()
while (time.monotonic()-timestamp) < 180:
animations.animate()