Clue And MagTag Pep Talk Generator
2024-07-05 | By Adafruit Industries
License: See Original Project LCD / TFT
Courtesy of Adafruit
Guide by Eva Herrada
Overview
Need some motivation before that big meeting or interview? Do you wish you had the right phrase to motivate your friends and colleagues? The Clue and MagTag Pep Talk Generator will provide you with just the right words (or not) to provide sentiment for the occasion.
In this guide, you'll learn how to use a MagTag or a CLUE, or both if you're feeling daring, to create a pep talk generator that will randomly create a motivational sentence using 4 phrases.
There are instructions in this guide for both the MagTag and the Clue. You can use either. The MagTag will give you a new pep talk every minute and the Clue will give you one when you turn it on and one when you press one of the buttons on the front.
MagTag Parts
- Adafruit MagTag Starter Kit - ADABOX017 Essentials
Or buy the parts you need separately:
- Adafruit MagTag - 2.9" Grayscale E-Ink WiFi Display
- Lithium Ion Polymer Battery with Short Cable - 3.7V 420mAh
Don't forget to pick up a USB-C cable:
CLUE Parts
- Adafruit CLUE - nRF52840 Express with Bluetooth LE
- Clear Acrylic Enclosure + Hardware Kit for Adafruit CLUE
- USB cable - USB A to Micro-B
Installing CircuitPython on the MagTag
CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY drive to iterate.
Set Up CircuitPython
Follow the steps to get CircuitPython installed on your MagTag.
Download the latest CircuitPython for your board from circuitpython.org
Click the link above and download the latest .BIN and .UF2 file.
(depending on how you program the ESP32S2 board you may need one or the other, might as well get both.)
Download and save it to your desktop (or wherever is handy).
Plug your MagTag into your computer using a known-good USB cable.
A lot of people end up using charge-only USB cables and it is very frustrating! So, make sure you have a USB cable you know is good for data sync.
Option 1 - Load with UF2 Bootloader
This is by far the easiest way to load CircuitPython. However, it requires your board has the UF2 bootloader installed. Some early boards do not (we hadn't written UF2 yet!) - in which case you can load using the built in ROM bootloader.
Still, try this first!
Try Launching UF2 Bootloader
Loading CircuitPython by drag-n-drop UF2 bootloader is the easier way and we recommend it. If you have a MagTag where the front of the board is black, your MagTag came with UF2 already on it.
Launch UF2 by double-clicking the Reset button (the one next to the USB C port). You may have to try a few times to get the timing right.
If the UF2 bootloader is installed, you will see a new disk drive appear called MAGTAGBOOT.
Copy the UF2 file you downloaded at the first step of this tutorial onto the MAGTAGBOOT drive.
If you're using Windows and you get an error at the end of the file copy that says Error from the file copy, Error 0x800701B1: A device which does not exist was specified. You can ignore this error, the bootloader sometimes disconnects without telling Windows, the install completed just fine and you can continue. If its really annoying, you can also upgrade the bootloader (the latest version of the UF2 bootloader fixes this warning.)
Your board should auto-reset into CircuitPython, or you may need to press reset. A CIRCUITPY drive will appear. You're done! Go to the next pages.
Option 2 - Use esptool to load BIN file
If you have an original MagTag with while soldermask on the front, we didn't have UF2 written for the ESP32S2 yet so it will not come with the UF2 bootloader.
You can upload with esptool to the ROM (hardware) bootloader instead!
Follow the initial steps found in the Run esptool and check connection section of the ROM Bootloader page to verify your environment is set up, your board is successfully connected, and which port it's using.
In the final command to write a binary file to the board, replace the port with your port, and replace "firmware.bin" with the the file you downloaded above.
The output should look something like the output in the image.
Press reset to exit the bootloader.
Your CIRCUITPY drive should appear!
You're all set! Go to the next pages.
Option 3 - Use Chrome Browser to Upload BIN file
If for some reason you cannot get esptool to run, you can always try using the Chrome-browser version of esptool we have written. This is handy if you don't have Python on your computer, or something is really weird with your setup that makes esptool not run (which happens sometimes and isn't worth debugging!) You can follow along on the Web Serial ESPTool page and either load the UF2 bootloader and then come back to Option 1 on this page, or you can download the CircuitPython BIN file directly using the tool in the same manner as the bootloader.
CircuitPython Internet Test
One of the great things about the ESP32 is the built-in WiFi capabilities. This page covers the basics of getting connected using CircuitPython.
The first thing you need to do is update your code.py to the following. Click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file and copy the entire lib folder and the code.py file to your CIRCUITPY drive.
# SPDX-FileCopyrightText: 2020 Brent Rubell for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import os
import ipaddress
import ssl
import wifi
import socketpool
import adafruit_requests
# URLs to fetch from
TEXT_URL = "http://wifitest.adafruit.com/testwifi/index.html"
JSON_QUOTES_URL = "https://www.adafruit.com/api/quotes.php"
JSON_STARS_URL = "https://api.github.com/repos/adafruit/circuitpython"
print("ESP32-S2 WebClient Test")
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
print("Available WiFi networks:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
print(f"Connecting to {os.getenv('CIRCUITPY_WIFI_SSID')}")
wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD"))
print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}")
print(f"My IP address: {wifi.radio.ipv4_address}")
ping_ip = ipaddress.IPv4Address("8.8.8.8")
ping = wifi.radio.ping(ip=ping_ip)
# retry once if timed out
if ping is None:
ping = wifi.radio.ping(ip=ping_ip)
if ping is None:
print("Couldn't ping 'google.com' successfully")
else:
# convert s to ms
print(f"Pinging 'google.com' took: {ping * 1000} ms")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
print(f"Fetching text from {TEXT_URL}")
response = requests.get(TEXT_URL)
print("-" * 40)
print(response.text)
print("-" * 40)
print(f"Fetching json from {JSON_QUOTES_URL}")
response = requests.get(JSON_QUOTES_URL)
print("-" * 40)
print(response.json())
print("-" * 40)
print()
print(f"Fetching and parsing json from {JSON_STARS_URL}")
response = requests.get(JSON_STARS_URL)
print("-" * 40)
print(f"CircuitPython GitHub Stars: {response.json()['stargazers_count']}")
print("-" * 40)
print("Done")
Your CIRCUITPY drive should resemble the following.
To get connected, the next thing you need to do is update the settings.toml file.
The settings.toml File
We expect people to share tons of projects as they build CircuitPython WiFi widgets. What we want to avoid is people accidentally sharing their passwords or secret tokens and API keys. So, we designed all our examples to use a settings.toml file, that is on your CIRCUITPY drive, to hold secret/private/custom data. That way you can share your main project without worrying about accidentally sharing private stuff.
If you have a fresh install of CircuitPython on your board, the initial settings.toml file on your CIRCUITPY drive is empty.
To get started, you can update the settings.toml on your CIRCUITPY drive to contain the following code.
# SPDX-FileCopyrightText: 2023 Adafruit Industries
#
# SPDX-License-Identifier: MIT
# This is where you store the credentials necessary for your code.
# The associated demo only requires WiFi, but you can include any
# credentials here, such as Adafruit IO username and key, etc.
CIRCUITPY_WIFI_SSID = "your-wifi-ssid"
CIRCUITPY_WIFI_PASSWORD = "your-wifi-password"
This file should contain a series of Python variables, each assigned to a string. Each variable should describe what it represents (say wifi_ssid), followed by an = (equals sign), followed by the data in the form of a Python string (such as "my-wifi-password" including the quote marks).
At a minimum you'll need to add/update your WiFi SSID and WiFi password, so do that now!
As you make projects you may need more tokens and keys, just add them one line at a time. See for example other tokens such as one for accessing GitHub or the Hackaday API. Other non-secret data like your time zone can also go here.
For the correct time zone string, look at http://worldtimeapi.org/timezones and remember that if your city is not listed, look for a city in the same time zone, for example Boston, New York, Philadelphia, Washington DC, and Miami are all on the same time as New York.
Of course, don't share your settings.toml - keep that out of GitHub, Discord, or other project-sharing sites.
Don't share your settings.toml file! It has your passwords and API keys in it!
If you connect to the serial console, you should see something like the following:
In order, the example code...
Checks the ESP32's MAC address.
print(f"My MAC address: {[hex(i) for i in wifi.radio.mac_address]}")
Performs a scan of all access points and prints out the access point's name (SSID), signal strength (RSSI), and channel.
print("Available WiFi networks:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
Connects to the access point you defined in the settings.toml file and prints out its local IP address.
print(f"Connecting to {os.getenv('WIFI_SSID')}")
wifi.radio.connect(os.getenv("WIFI_SSID"), os.getenv("WIFI_PASSWORD"))
print(f"Connected to {os.getenv('WIFI_SSID')}")
print(f"My IP address: {wifi.radio.ipv4_address}")
Attempts to ping a Google DNS server to test connectivity. If a ping fails, it returns None. Initial pings can sometimes fail for various reasons. So, if the initial ping is successful (is not None), it will print the echo speed in ms. If the initial ping fails, it will try one more time to ping, and then print the returned value. If the second ping fails, it will result in "Ping google.com: None ms" being printed to the serial console. Failure to ping does not always indicate a lack of connectivity, so the code will continue to run.
ping_ip = ipaddress.IPv4Address("8.8.8.8")
ping = wifi.radio.ping(ip=ping_ip) * 1000
if ping is not None:
print(f"Ping google.com: {ping} ms")
else:
ping = wifi.radio.ping(ip=ping_ip)
print(f"Ping google.com: {ping} ms")
The code creates a socketpool using the WiFi radio's available sockets. This is performed so we don't need to re-use sockets. Then, it initializes a a new instance of the requests interface - which makes getting data from the internet really really easy.
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
To read in plain-text from a web URL, call requests.get - you may pass in either a http, or a https URL for SSL connectivity.
print(f"Fetching text from {TEXT_URL}")
response = requests.get(TEXT_URL)
print("-" * 40)
print(response.text)
print("-" * 40)
Requests can also display a JSON-formatted response from a web URL using a call to requests.get.
print(f"Fetching json from {JSON_QUOTES_URL}")
response = requests.get(JSON_QUOTES_URL)
print("-" * 40)
print(response.json())
print("-" * 40)
Finally, you can fetch and parse a JSON URL using requests.get. This code snippet obtains the stargazers_count field from a call to the GitHub API.
print(f"Fetching and parsing json from {JSON_STARS_URL}")
response = requests.get(JSON_STARS_URL)
print("-" * 40)
print(f"CircuitPython GitHub Stars: {response.json()['stargazers_count']}")
print("-" * 40)
OK you now have your ESP32 board set up with a proper settings.toml file and can connect over the Internet. If not, check that your settings.toml file has the right SSID and password and retrace your steps until you get the Internet connectivity working!
Getting The Date & Time
A very common need for projects is to know the current date and time. Especially when you want to deep sleep until an event, or you want to change your display based on what day, time, date, etc. it is.
Determining the correct local time is really hard. There are various time zones, Daylight Savings dates, leap seconds, etc. Trying to get NTP time and then back-calculating what the local time is, is extraordinarily hard on a microcontroller just isn't worth the effort and it will get out of sync as laws change anyways.
For that reason, we have the free adafruit.io time service. Free for anyone with a free adafruit.io account. You do need an account because we have to keep accidentally mis-programmed-board from overwhelming adafruit.io and lock them out temporarily. Again, it's free!
There are other services like WorldTimeAPI, but we don't use those for our guides because they are nice people and we don't want to accidentally overload their site. Also, there's a chance it may eventually go down or also require an account.
Step 1) Make an Adafruit account
It's free! Visit https://accounts.adafruit.com/ to register and make an account if you do not already have one.
Step 2) Sign into Adafruit IO
Head over to io.adafruit.com and click Sign In to log into IO using your Adafruit account. It's free and fast to join.
Step 3) Get your Adafruit IO Key
Click on My Key in the top bar.
"My Key" has been replaced with a key-shaped icon!
You will get a popup with your Username and Key (In this screenshot, we've covered it with red blocks.)
Go to the settings.toml file on your CIRCUITPY drive and add three lines for AIO_USERNAME, ADAFRUIT_AIO_KEY, and TIMEZONE so you get something like the following:
# This file is where you keep secret settings, passwords, and tokens!
# If you put them in the code you risk committing that info or sharing it
CIRCUITPY_WIFI_SSID = "your-wifi-ssid"
CIRCUITPY_WIFI_PASSWORD = "your-wifi-password"
ADAFRUIT_AIO_USERAME = "your-adafruit-io-username"
ADAFTUIT_AIO_KEY = "your-adafruit-io-key"
# Timezone names from http://worldtimeapi.org/timezones
TIMEZONE="America/New_York"
The time zone is optional, if you don't have that entry, adafruit.io will guess your time zone based on geographic IP address lookup. You can visit http://worldtimeapi.org/timezones to see all the time zones available (even though we do not use World time for timekeeping, we do use the same time zone table).
Step 4) Upload Test Python Code
This code is like the Internet Test code from before, but this time it will connect to adafruit.io and get the local time.
import ipaddress
import os
import ssl
import wifi
import socketpool
import adafruit_requests
import secrets
# Get our username, key and desired timezone
ssid = os.getenv("CIRCUITPY_WIFI_SSID")
password = os.getenv("CIRCUITPY_WIFI_PASSWORD")
aio_username = os.getenv("ADAFRUIT_AIO_USERNAME")
aio_key = os.getenv("ADAFRUIT_AIO_KEY")
timezone = os.getenv("TIMEZONE")
TIME_URL = f"https://io.adafruit.com/api/v2/{aio_username}/integrations/time/strftime?x-aio-key={aio_key}&tz={timezone}")
TIME_URL += "&fmt=%25Y-%25m-%25d+%25H%3A%25M%3A%25S.%25L+%25j+%25u+%25z+%25Z"
print("ESP32-S2 Adafruit IO Time test")
print("My MAC addr:", [hex(i) for i in wifi.radio.mac_address])
print("Available WiFi networks:")
for network in wifi.radio.start_scanning_networks():
print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"),
network.rssi, network.channel))
wifi.radio.stop_scanning_networks()
print("Connecting to", ssid)
wifi.radio.connect(ssid, password)
print(f"Connected to {ssid}!")
print("My IP address is", wifi.radio.ipv4_address)
ipv4 = ipaddress.ip_address("8.8.4.4")
print("Ping google.com:", wifi.radio.ping(ipv4), "ms")
pool = socketpool.SocketPool(wifi.radio)
requests = adafruit_requests.Session(pool, ssl.create_default_context())
print("Fetching text from", TIME_URL)
response = requests.get(TIME_URL)
print("-" * 40)
print(response.text)
print("-" * 40)
After running this, you will see something like the below text. We have blocked out the part with the secret username and key data!
Note at the end you will get the date, time, and your time zone! If so, you have correctly configured your settings.toml and can continue to the next steps!
Code the MagTag Pep Talk Generator
Installing Project Code
To use with CircuitPython, you need to first install a few libraries, into the lib folder on your CIRCUITPY drive. Then you need to update code.py with the example script.
Thankfully, we can do this in one go. In the example below, click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, open the directory Pep_Talk_Generator/magtag/ and then click on the directory that matches the version of CircuitPython you're using and copy the contents of that directory to your CIRCUITPY drive.
Your CIRCUITPY drive should now look similar to the following image:
# SPDX-FileCopyrightText: 2021 Eva Herrada for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import random
from adafruit_magtag.magtag import MagTag
magtag = MagTag(default_bg="/bmps/background.bmp")
column_1 = [
"Champ, ",
"Fact: ",
"Everybody says ",
"Dang... ",
"Check it: ",
"Just saying... ",
"Superstar, ",
"Tiger, ",
"Self, ",
"Know this: ",
"News alert: ",
"Girl, ",
"Ace, ",
"Excuse me but ",
"Experts agree: ",
"In my opinion, ",
"Hear ye, hear ye: ",
"Okay, listen up: ",
]
column_2 = [
"the mere idea of you ",
"your soul ",
"your hair today ",
"everything you do ",
"your personal style ",
"every thought you have ",
"that sparkle in your eye ",
"your presence here ",
"what you got going on ",
"the essential you ",
"your life's journey ",
"that saucy personality ",
"your DNA ",
"that brain of yours ",
"your choice of attire ",
"the way you roll ",
"whatever your secret is ",
"all of y'all ",
]
column_3 = [
"has serious game, ",
"rains magic, ",
"deserves the Nobel Prize, ",
"raises the roof, ",
"breeds miracles, ",
"is paying off big time, ",
"shows mad skills, ",
"just shimmers, ",
"is a national treasure, ",
"gets the party hopping, ",
"is the next big thing, ",
"roars like a lion, ",
"is a rainbow factory, ",
"is made of diamonds, ",
"makes birds sing, ",
"should be taught in school, ",
"makes my world go 'round, ",
"is 100% legit, ",
]
column_4 = [
"24/7.",
"can I get an amen?",
"and that's a fact.",
"so treat yourself.",
"you feel me?",
"that's just science.",
"would I lie?",
"for reals.",
"mic drop.",
"you hidden gem.",
"snuggle bear.",
"period.",
"can I get an amen?",
"now let's dance.",
"high five.",
"say it again!",
"according to CNN.",
"so get used to it.",
]
magtag.add_text(
text_font="/fonts/Arial-16.bdf",
text_position=((magtag.graphics.display.width // 2), 49),
text_anchor_point=(0.5, 0.5),
text_wrap=22,
line_spacing=0.7,
)
magtag.set_text(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
0,
False,
)
magtag.add_text(
text_font="/fonts/Arial-12.bdf",
text_position=((magtag.graphics.display.width // 2), 116),
text_anchor_point=(0.5, 0.5),
line_spacing=0.7,
is_data=False,
)
magtag.set_text("Pep talk generator", 1)
magtag.exit_and_deep_sleep(60)
Code run-through
First, the code imports the required libraries and sets the display background.
import random
from adafruit_magtag.magtag import MagTag
magtag = MagTag(default_bg="/bmps/background.bmp")
Next, the four parts of the pep talk are each defined in lists.
column_1 = [
"Champ, ",
"Fact: ",
"Everybody says ",
"Dang... ",
"Check it: ",
"Just saying... ",
"Superstar, ",
"Tiger, ",
"Self, ",
"Know this: ",
"News alert: ",
"Girl, ",
"Ace, ",
"Excuse me but ",
"Experts agree: ",
"In my opinion, ",
"Hear ye, hear ye: ",
"Okay, listen up: ",
]
column_2 = [
"the mere idea of you ",
"your soul ",
"your hair today ",
"everything you do ",
"your personal style ",
"every thought you have ",
"that sparkle in your eye ",
"your presence here ",
"what you got going on ",
"the essential you ",
"your life's journey ",
"that saucy personality ",
"your DNA ",
"that brain of yours ",
"your choice of attire ",
"the way you roll ",
"whatever your secret is ",
"all of y'all ",
]
column_3 = [
"has serious game, ",
"rains magic, ",
"deserves the Nobel Prize, ",
"raises the roof, ",
"breeds miracles, ",
"is paying off big time, ",
"shows mad skills, ",
"just shimmers, ",
"is a national treasure, ",
"gets the party hopping, ",
"is the next big thing, ",
"roars like a lion, ",
"is a rainbow factory, ",
"is made of diamonds, ",
"makes birds sing, ",
"should be taught in school, ",
"makes my world go 'round, ",
"is 100% legit, ",
]
column_4 = [
"24/7.",
"can I get an amen?",
"and that's a fact.",
"so treat yourself.",
"you feel me?",
"that's just science.",
"would I lie?",
"for reals.",
"mic drop.",
"you hidden gem.",
"snuggle bear.",
"period.",
"can I get an amen?",
"now let's dance.",
"high five.",
"say it again!",
"according to CNN.",
"so get used to it.",
]
Finally, the code sets up the two text boxes. The first one is set to a string made by combining a single choice from each list. The second one is set to say, "Pep talk generator" and the display is refreshed. The code then waits 60 seconds and starts over again.
magtag.add_text(
text_font="/fonts/Arial-16.bdf",
text_position=((magtag.graphics.display.width // 2), 49),
text_anchor_point=(0.5, 0.5),
text_wrap=22,
line_spacing=0.7,
)
magtag.set_text(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
0,
False,
)
magtag.add_text(
text_font="/fonts/Arial-12.bdf",
text_position=((magtag.graphics.display.width // 2), 116),
text_anchor_point=(0.5, 0.5),
line_spacing=0.7,
is_data=False,
)
magtag.set_text("Pep talk generator", 1)
magtag.exit_and_deep_sleep(60)
CircuitPython on CLUE
CircuitPython is a derivative of MicroPython designed to simplify experimentation and education on low-cost microcontrollers. It makes it easier than ever to get prototyping by requiring no upfront desktop software downloads. Simply copy and edit files on the CIRCUITPY flash drive to iterate.
The following instructions will show you how to install CircuitPython. If you've already installed CircuitPython but are looking to update it or reinstall it, the same steps work for that as well!
Set up CircuitPython Quick Start!
Follow this quick step-by-step for super-fast Python power :)
Download the latest version of CircuitPython for CLUE from circuitpython.org
Click the link above to download the latest version of CircuitPython for the CLUE.
Download and save it to your desktop (or wherever is handy).
Plug your CLUE into your computer using a known-good USB cable.
A lot of people end up using charge-only USB cables and it is very frustrating! So, make sure you have a USB cable you know is good for data sync.
Double-click the Reset button on the top (magenta arrow) on your board, and you will see the NeoPixel RGB LED (green arrow) turn green. If it turns red, check the USB cable, try another USB port, etc. Note: The little red LED next to the USB connector will pulse red. That's ok!
If double-clicking doesn't work the first time, try again. Sometimes it can take a few tries to get the rhythm right!
You will see a new disk drive appear called CLUEBOOT.
Drag the adafruit-circuitpython-clue-etc.uf2 file to CLUEBOOT.
The LED will flash. Then, the CLUEBOOT drive will disappear, and a new disk drive called CIRCUITPY will appear.
If this is the first time, you're installing CircuitPython or you're doing a completely fresh install after erasing the filesystem, you will have two files - boot_out.txt, and code.py, and one folder - lib on your CIRCUITPY drive.
If CircuitPython was already installed, the files present before reloading CircuitPython should still be present on your CIRCUITPY drive. Loading CircuitPython will not create new files if there was already a CircuitPython filesystem present.
That's it, you're done! :)
Code the CLUE Pep Talk Generator
Installing Project Code
To use with CircuitPython, you need to first install a few libraries, into the lib folder on your CIRCUITPY drive. Then you need to update code.py with the example script.
Thankfully, we can do this in one go. In the example below, click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, open the directory Pep_Talk_Generator/clue/ and then click on the directory that matches the version of CircuitPython you're using and copy the contents of that directory to your CIRCUITPY drive.
Your CIRCUITPY drive should now look similar to the following image:
# SPDX-FileCopyrightText: 2021 Eva Herrada for Adafruit Industries
#
# SPDX-License-Identifier: MIT
import random
from adafruit_clue import clue
import displayio
from adafruit_display_text import label, wrap_text_to_pixels
from adafruit_bitmap_font import bitmap_font
import board
column_1 = [
"Champ, ",
"Fact: ",
"Everybody says ",
"Dang... ",
"Check it: ",
"Just saying... ",
"Superstar, ",
"Tiger, ",
"Self, ",
"Know this: ",
"News alert: ",
"Girl, ",
"Ace, ",
"Excuse me but ",
"Experts agree: ",
"In my opinion, ",
"Hear ye, hear ye: ",
"Okay, listen up: ",
]
column_2 = [
"the mere idea of you ",
"your soul ",
"your hair today ",
"everything you do ",
"your personal style ",
"every thought you have ",
"that sparkle in your eye ",
"your presence here ",
"what you got going on ",
"the essential you ",
"your life's journey ",
"that saucy personality ",
"your DNA ",
"that brain of yours ",
"your choice of attire ",
"the way you roll ",
"whatever your secret is ",
"all of y'all ",
]
column_3 = [
"has serious game, ",
"rains magic, ",
"deserves the Nobel Prize, ",
"raises the roof, ",
"breeds miracles, ",
"is paying off big time, ",
"shows mad skills, ",
"just shimmers, ",
"is a national treasure, ",
"gets the party hopping, ",
"is the next big thing, ",
"roars like a lion, ",
"is a rainbow factory, ",
"is made of diamonds, ",
"makes birds sing, ",
"should be taught in school, ",
"makes my world go 'round, ",
"is 100% legit, ",
]
column_4 = [
"24/7.",
"can I get an amen?",
"and that's a fact.",
"so treat yourself.",
"you feel me?",
"that's just science.",
"would I lie?",
"for reals.",
"mic drop.",
"you hidden gem.",
"snuggle bear.",
"period.",
"can I get an amen?",
"now let's dance.",
"high five.",
"say it again!",
"according to CNN.",
"so get used to it.",
]
arial18 = bitmap_font.load_font("/fonts/Arial-18.bdf")
arial12 = bitmap_font.load_font("/fonts/Arial-12.bdf")
arial18.load_glyphs(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;,./?><=+[{]}-_"
)
arial12.load_glyphs(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;,./?><=+[{]}-_"
)
display = board.DISPLAY
clue_group = displayio.Group()
bitmap_file = open("bmps/background.bmp", "rb")
bitmap1 = displayio.OnDiskBitmap(bitmap_file)
tile_grid = displayio.TileGrid(
bitmap1, pixel_shader=getattr(bitmap1, "pixel_shader", displayio.ColorConverter())
)
clue_group.append(tile_grid)
text = "\n".join(
wrap_text_to_pixels(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
180,
arial18,
)
)
pep = label.Label(
font=arial18,
text=text,
anchor_point=(0.5, 0.5),
anchored_position=(120, 115),
line_spacing=0.8,
color=0x000000,
)
clue_group.append(pep)
title = label.Label(
font=arial12,
text="Pep talk generator",
anchor_point=(0.5, 0.5),
anchored_position=(120, 231),
color=0x000000,
)
clue_group.append(title)
display.root_group = clue_group
while True:
if clue.button_a or clue.button_b:
pep.text = "\n".join(
wrap_text_to_pixels(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
180,
arial18,
)
)
Code run-through
The first thing the code does is import all the required libraries.
import random
from adafruit_clue import clue
import displayio
from adafruit_display_text import label, wrap_text_to_pixels
from adafruit_bitmap_font import bitmap_font
import board
Next, the code defines the four lists that will be used to generate the pep talks.
column_1 = [
"Champ, ",
"Fact: ",
"Everybody says ",
"Dang... ",
"Check it: ",
"Just saying... ",
"Superstar, ",
"Tiger, ",
"Self, ",
"Know this: ",
"News alert: ",
"Girl, ",
"Ace, ",
"Excuse me but ",
"Experts agree: ",
"In my opinion, ",
"Hear ye, hear ye: ",
"Okay, listen up: ",
]
column_2 = [
"the mere idea of you ",
"your soul ",
"your hair today ",
"everything you do ",
"your personal style ",
"every thought you have ",
"that sparkle in your eye ",
"your presence here ",
"what you got going on ",
"the essential you ",
"your life's journey ",
"that saucy personality ",
"your DNA ",
"that brain of yours ",
"your choice of attire ",
"the way you roll ",
"whatever your secret is ",
"all of y'all ",
]
column_3 = [
"has serious game, ",
"rains magic, ",
"deserves the Nobel Prize, ",
"raises the roof, ",
"breeds miracles, ",
"is paying off big time, ",
"shows mad skills, ",
"just shimmers, ",
"is a national treasure, ",
"gets the party hopping, ",
"is the next big thing, ",
"roars like a lion, ",
"is a rainbow factory, ",
"is made of diamonds, ",
"makes birds sing, ",
"should be taught in school, ",
"makes my world go 'round, ",
"is 100% legit, ",
]
column_4 = [
"24/7.",
"can I get an amen?",
"and that's a fact.",
"so treat yourself.",
"you feel me?",
"that's just science.",
"would I lie?",
"for reals.",
"mic drop.",
"you hidden gem.",
"snuggle bear.",
"period.",
"can I get an amen?",
"now let's dance.",
"high five.",
"say it again!",
"according to CNN.",
"so get used to it.",
]
After creating the lists for the pep talks, the code loads the fonts. It also loads a few glyphs to make updating the display a bit quicker.
arial18 = bitmap_font.load_font("/fonts/Arial-18.bdf")
arial12 = bitmap_font.load_font("/fonts/Arial-12.bdf")
arial18.load_glyphs(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;,./?><=+[{]}-_"
)
arial12.load_glyphs(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789;,./?><=+[{]}-_"
)
Then, the display gets set up. The initial pep talk is generated, and all the necessary bitmaps and text boxes are added to the display group which is then shown on the display.
display = board.DISPLAY
clue_group = displayio.Group()
bitmap_file = open("bmps/background.bmp", "rb")
bitmap1 = displayio.OnDiskBitmap(bitmap_file)
tile_grid = displayio.TileGrid(
bitmap1, pixel_shader=getattr(bitmap1, "pixel_shader", displayio.ColorConverter())
)
clue_group.append(tile_grid)
text = "\n".join(
wrap_text_to_pixels(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
180,
arial18,
)
)
pep = label.Label(
font=arial18,
text=text,
anchor_point=(0.5, 0.5),
anchored_position=(120, 115),
line_spacing=0.8,
color=0x000000,
)
clue_group.append(pep)
title = label.Label(
font=arial12,
text="Pep talk generator",
anchor_point=(0.5, 0.5),
anchored_position=(120, 231),
color=0x000000,
)
clue_group.append(title)
display.root_group = clue_group
Finally, the code loops through, waiting to see if the user presses one of the buttons on the front of the CLUE. If they do, it generates a new pep talk to display.
while True:
if clue.button_a or clue.button_b:
pep.text = "\n".join(
wrap_text_to_pixels(
random.choice(column_1)
+ random.choice(column_2)
+ random.choice(column_3)
+ random.choice(column_4),
180,
arial18,
)
)
Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.
Visit TechForum