Code PyPortal with CircuitPython

CircuitPython Code

In the embedded code element below, click on the Download: Project Zip link, and save the .zip archive file to your computer.

Then, uncompress the .zip file, it will unpack to a folder named PyPortal_GithubStars.

Copy the contents of the PyPortal_GithubStars directory to your PyPortal's CIRCUITPY drive, and then be sure to rename the stars.py file to code.py so it will automatically run when the PyPortal re-starts.

This is what the final contents of the CIRCUITPY drive will look like:

"""
This example will access the github API, grab a number like
the number of stars for a repository... and display it on a screen!
if you can find something that spits out JSON data, we can display it
"""
import time
import board
from adafruit_pyportal import PyPortal

# 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

# Set up where we'll be fetching data from
DATA_SOURCE = "https://api.github.com/repos/adafruit/circuitpython"
CAPTION = "www.github.com/adafruit/circuitpython"
# If we have an access token, we can query more often
if 'github_token' in secrets:
    DATA_SOURCE += "?access_token="+secrets['github_token']

# The data we want to display
DATA_LOCATION = ["stargazers_count"]

cwd = ("/"+__file__).rsplit('/', 1)[0]
pyportal = PyPortal(url=DATA_SOURCE, json_path=DATA_LOCATION,
                    status_neopixel=board.NEOPIXEL,
                    default_bg=cwd+"/stars_background.bmp",
                    text_font=cwd+"/fonts/Collegiate-50.bdf",
                    text_position=(200, 100),
                    text_color=0xFFFFFF,
                    caption_text=CAPTION,
                    caption_font=cwd+"/fonts/Arial.bdf",
                    caption_position=(40, 220),
                    caption_color=0xFFFFFF)

# track the last value so we can play a sound when it updates
last_value = 0

while True:
    try:
        value = pyportal.fetch()
        print("Response is", value)
        if last_value < value:  # ooh it went up!
            print("New star!")
            pyportal.play_file(cwd+"/coin.wav")
        last_value = value
    except (ValueError, RuntimeError) as e:
        print("Some error occured, retrying! -", e)

    time.sleep(60)  # wait a minute before getting again
If you run into any errors, such as "ImportError: no module named `adafruit_display_text.label`" be sure to update your libraries to the latest release bundle!

How It Works

The PyPortal Stats Trophy is doing a couple of neat-o things to provide for your stats-tastic display needs!

Background

First, it displays a bitmap graphic as the screen's background. This is a 320 x 240 pixel RGB 16-bit raster graphic in .bmp format.

Font

Then, it displays the repo's name as a caption, created with bitmapped fonts to overlay on top of the background. The fonts used here is are bitmap fonts made from the Collegiate and Arial typefaces. You can learn more about converting type in this guide.

Next, the PyPortal will display the current number of GitHub Stars for the repository.

JSON

To keep things current, the Star count is grabbed from the website itself.

GitHub automatically generates a JSON file for each repo, in this case at the address https://api.github.com/repos/adafruit/circuitpython

This file contains all sorts of information, delivered in an easy-to-parse format. If you visit that URL by copying the address in to your browser, your browser may return it as a somewhat difficult to read chunk of raw text, or if you view it in Firefox, it will format it nicely for reading.

You can also use online code "beautifiers" such as https://codebeautify.org/jsonviewer or http://jsonviewer.stack.hu

Here it is in a raw-er form, but still using indentation and carriage returns to make it readable:

Download: file
{
  "id": 66166069,
  "node_id": "MDEwOlJlcG9zaXRvcnk2NjE2NjA2OQ==",
  "name": "circuitpython",
  "full_name": "adafruit/circuitpython",
  "private": false,
  "owner": {
    "login": "adafruit",
    "id": 181069,
    "node_id": "MDEyOk9yZ2FuaXphdGlvbjE4MTA2OQ==",
    "avatar_url": "https://avatars3.githubusercontent.com/u/181069?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/adafruit",
    "html_url": "https://github.com/adafruit",
    "followers_url": "https://api.github.com/users/adafruit/followers",
    "following_url": "https://api.github.com/users/adafruit/following{/other_user}",
    "gists_url": "https://api.github.com/users/adafruit/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/adafruit/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/adafruit/subscriptions",
    "organizations_url": "https://api.github.com/users/adafruit/orgs",
    "repos_url": "https://api.github.com/users/adafruit/repos",
    "events_url": "https://api.github.com/users/adafruit/events{/privacy}",
    "received_events_url": "https://api.github.com/users/adafruit/received_events",
    "type": "Organization",
    "site_admin": false
  },
  "html_url": "https://github.com/adafruit/circuitpython",
  "description": "CircuitPython - a Python implementation for teaching coding with microcontrollers",
  "fork": true,
  "url": "https://api.github.com/repos/adafruit/circuitpython",
  "forks_url": "https://api.github.com/repos/adafruit/circuitpython/forks",
  "keys_url": "https://api.github.com/repos/adafruit/circuitpython/keys{/key_id}",
  "collaborators_url": "https://api.github.com/repos/adafruit/circuitpython/collaborators{/collaborator}",
  "teams_url": "https://api.github.com/repos/adafruit/circuitpython/teams",
  "hooks_url": "https://api.github.com/repos/adafruit/circuitpython/hooks",
  "issue_events_url": "https://api.github.com/repos/adafruit/circuitpython/issues/events{/number}",
  "events_url": "https://api.github.com/repos/adafruit/circuitpython/events",
  "assignees_url": "https://api.github.com/repos/adafruit/circuitpython/assignees{/user}",
  "branches_url": "https://api.github.com/repos/adafruit/circuitpython/branches{/branch}",
  "tags_url": "https://api.github.com/repos/adafruit/circuitpython/tags",
  "blobs_url": "https://api.github.com/repos/adafruit/circuitpython/git/blobs{/sha}",
  "git_tags_url": "https://api.github.com/repos/adafruit/circuitpython/git/tags{/sha}",
  "git_refs_url": "https://api.github.com/repos/adafruit/circuitpython/git/refs{/sha}",
  "trees_url": "https://api.github.com/repos/adafruit/circuitpython/git/trees{/sha}",
  "statuses_url": "https://api.github.com/repos/adafruit/circuitpython/statuses/{sha}",
  "languages_url": "https://api.github.com/repos/adafruit/circuitpython/languages",
  "stargazers_url": "https://api.github.com/repos/adafruit/circuitpython/stargazers",
  "contributors_url": "https://api.github.com/repos/adafruit/circuitpython/contributors",
  "subscribers_url": "https://api.github.com/repos/adafruit/circuitpython/subscribers",
  "subscription_url": "https://api.github.com/repos/adafruit/circuitpython/subscription",
  "commits_url": "https://api.github.com/repos/adafruit/circuitpython/commits{/sha}",
  "git_commits_url": "https://api.github.com/repos/adafruit/circuitpython/git/commits{/sha}",
  "comments_url": "https://api.github.com/repos/adafruit/circuitpython/comments{/number}",
  "issue_comment_url": "https://api.github.com/repos/adafruit/circuitpython/issues/comments{/number}",
  "contents_url": "https://api.github.com/repos/adafruit/circuitpython/contents/{+path}",
  "compare_url": "https://api.github.com/repos/adafruit/circuitpython/compare/{base}...{head}",
  "merges_url": "https://api.github.com/repos/adafruit/circuitpython/merges",
  "archive_url": "https://api.github.com/repos/adafruit/circuitpython/{archive_format}{/ref}",
  "downloads_url": "https://api.github.com/repos/adafruit/circuitpython/downloads",
  "issues_url": "https://api.github.com/repos/adafruit/circuitpython/issues{/number}",
  "pulls_url": "https://api.github.com/repos/adafruit/circuitpython/pulls{/number}",
  "milestones_url": "https://api.github.com/repos/adafruit/circuitpython/milestones{/number}",
  "notifications_url": "https://api.github.com/repos/adafruit/circuitpython/notifications{?since,all,participating}",
  "labels_url": "https://api.github.com/repos/adafruit/circuitpython/labels{/name}",
  "releases_url": "https://api.github.com/repos/adafruit/circuitpython/releases{/id}",
  "deployments_url": "https://api.github.com/repos/adafruit/circuitpython/deployments",
  "created_at": "2016-08-20T20:10:40Z",
  "updated_at": "2019-03-01T20:31:34Z",
  "pushed_at": "2019-03-01T19:07:33Z",
  "git_url": "git://github.com/adafruit/circuitpython.git",
  "ssh_url": "[email protected]:adafruit/circuitpython.git",
  "clone_url": "https://github.com/adafruit/circuitpython.git",
  "svn_url": "https://github.com/adafruit/circuitpython",
  "homepage": "",
  "size": 57300,
  "stargazers_count": 1059,
  "watchers_count": 1059,
  "language": "C",
  "has_issues": true,
  "has_projects": false,
  "has_downloads": true,
  "has_wiki": false,
  "has_pages": false,
  "forks_count": 204,
  "mirror_url": null,
  "archived": false,
  "open_issues_count": 157,
  "license": {
    "key": "other",
    "name": "Other",
    "spdx_id": "NOASSERTION",
    "url": null,
    "node_id": "MDc6TGljZW5zZTA="
  },
  "forks": 204,
  "open_issues": 157,
  "watchers": 1059,
  "default_branch": "master",
  "organization": {
    "login": "adafruit",
    "id": 181069,
    "node_id": "MDEyOk9yZ2FuaXphdGlvbjE4MTA2OQ==",
    "avatar_url": "https://avatars3.githubusercontent.com/u/181069?v=4",
    "gravatar_id": "",
    "url": "https://api.github.com/users/adafruit",
    "html_url": "https://github.com/adafruit",
    "followers_url": "https://api.github.com/users/adafruit/followers",
    "following_url": "https://api.github.com/users/adafruit/following{/other_user}",
    "gists_url": "https://api.github.com/users/adafruit/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/adafruit/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/adafruit/subscriptions",
    "organizations_url": "https://api.github.com/users/adafruit/orgs",
    "repos_url": "https://api.github.com/users/adafruit/repos",
    "events_url": "https://api.github.com/users/adafruit/events{/privacy}",
    "received_events_url": "https://api.github.com/users/adafruit/received_events",
    "type": "Organization",
    "site_admin": false
  },
  "parent": {
    "id": 15337142,
    "node_id": "MDEwOlJlcG9zaXRvcnkxNTMzNzE0Mg==",
    "name": "micropython",
    "full_name": "micropython/micropython",
    "private": false,
    "owner": {
      "login": "micropython",
      "id": 6298560,
      "node_id": "MDEyOk9yZ2FuaXphdGlvbjYyOTg1NjA=",
      "avatar_url": "https://avatars1.githubusercontent.com/u/6298560?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/micropython",
      "html_url": "https://github.com/micropython",
      "followers_url": "https://api.github.com/users/micropython/followers",
      "following_url": "https://api.github.com/users/micropython/following{/other_user}",
      "gists_url": "https://api.github.com/users/micropython/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/micropython/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/micropython/subscriptions",
      "organizations_url": "https://api.github.com/users/micropython/orgs",
      "repos_url": "https://api.github.com/users/micropython/repos",
      "events_url": "https://api.github.com/users/micropython/events{/privacy}",
      "received_events_url": "https://api.github.com/users/micropython/received_events",
      "type": "Organization",
      "site_admin": false
    },
    "html_url": "https://github.com/micropython/micropython",
    "description": "MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems",
    "fork": false,
    "url": "https://api.github.com/repos/micropython/micropython",
    "forks_url": "https://api.github.com/repos/micropython/micropython/forks",
    "keys_url": "https://api.github.com/repos/micropython/micropython/keys{/key_id}",
    "collaborators_url": "https://api.github.com/repos/micropython/micropython/collaborators{/collaborator}",
    "teams_url": "https://api.github.com/repos/micropython/micropython/teams",
    "hooks_url": "https://api.github.com/repos/micropython/micropython/hooks",
    "issue_events_url": "https://api.github.com/repos/micropython/micropython/issues/events{/number}",
    "events_url": "https://api.github.com/repos/micropython/micropython/events",
    "assignees_url": "https://api.github.com/repos/micropython/micropython/assignees{/user}",
    "branches_url": "https://api.github.com/repos/micropython/micropython/branches{/branch}",
    "tags_url": "https://api.github.com/repos/micropython/micropython/tags",
    "blobs_url": "https://api.github.com/repos/micropython/micropython/git/blobs{/sha}",
    "git_tags_url": "https://api.github.com/repos/micropython/micropython/git/tags{/sha}",
    "git_refs_url": "https://api.github.com/repos/micropython/micropython/git/refs{/sha}",
    "trees_url": "https://api.github.com/repos/micropython/micropython/git/trees{/sha}",
    "statuses_url": "https://api.github.com/repos/micropython/micropython/statuses/{sha}",
    "languages_url": "https://api.github.com/repos/micropython/micropython/languages",
    "stargazers_url": "https://api.github.com/repos/micropython/micropython/stargazers",
    "contributors_url": "https://api.github.com/repos/micropython/micropython/contributors",
    "subscribers_url": "https://api.github.com/repos/micropython/micropython/subscribers",
    "subscription_url": "https://api.github.com/repos/micropython/micropython/subscription",
    "commits_url": "https://api.github.com/repos/micropython/micropython/commits{/sha}",
    "git_commits_url": "https://api.github.com/repos/micropython/micropython/git/commits{/sha}",
    "comments_url": "https://api.github.com/repos/micropython/micropython/comments{/number}",
    "issue_comment_url": "https://api.github.com/repos/micropython/micropython/issues/comments{/number}",
    "contents_url": "https://api.github.com/repos/micropython/micropython/contents/{+path}",
    "compare_url": "https://api.github.com/repos/micropython/micropython/compare/{base}...{head}",
    "merges_url": "https://api.github.com/repos/micropython/micropython/merges",
    "archive_url": "https://api.github.com/repos/micropython/micropython/{archive_format}{/ref}",
    "downloads_url": "https://api.github.com/repos/micropython/micropython/downloads",
    "issues_url": "https://api.github.com/repos/micropython/micropython/issues{/number}",
    "pulls_url": "https://api.github.com/repos/micropython/micropython/pulls{/number}",
    "milestones_url": "https://api.github.com/repos/micropython/micropython/milestones{/number}",
    "notifications_url": "https://api.github.com/repos/micropython/micropython/notifications{?since,all,participating}",
    "labels_url": "https://api.github.com/repos/micropython/micropython/labels{/name}",
    "releases_url": "https://api.github.com/repos/micropython/micropython/releases{/id}",
    "deployments_url": "https://api.github.com/repos/micropython/micropython/deployments",
    "created_at": "2013-12-20T11:47:07Z",
    "updated_at": "2019-03-01T18:51:51Z",
    "pushed_at": "2019-03-01T16:47:12Z",
    "git_url": "git://github.com/micropython/micropython.git",
    "ssh_url": "[email protected]:micropython/micropython.git",
    "clone_url": "https://github.com/micropython/micropython.git",
    "svn_url": "https://github.com/micropython/micropython",
    "homepage": "https://micropython.org",
    "size": 39688,
    "stargazers_count": 7996,
    "watchers_count": 7996,
    "language": "C",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": false,
    "forks_count": 2298,
    "mirror_url": null,
    "archived": false,
    "open_issues_count": 713,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZTEz"
    },
    "forks": 2298,
    "open_issues": 713,
    "watchers": 7996,
    "default_branch": "master"
  },
  "source": {
    "id": 15337142,
    "node_id": "MDEwOlJlcG9zaXRvcnkxNTMzNzE0Mg==",
    "name": "micropython",
    "full_name": "micropython/micropython",
    "private": false,
    "owner": {
      "login": "micropython",
      "id": 6298560,
      "node_id": "MDEyOk9yZ2FuaXphdGlvbjYyOTg1NjA=",
      "avatar_url": "https://avatars1.githubusercontent.com/u/6298560?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/micropython",
      "html_url": "https://github.com/micropython",
      "followers_url": "https://api.github.com/users/micropython/followers",
      "following_url": "https://api.github.com/users/micropython/following{/other_user}",
      "gists_url": "https://api.github.com/users/micropython/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/micropython/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/micropython/subscriptions",
      "organizations_url": "https://api.github.com/users/micropython/orgs",
      "repos_url": "https://api.github.com/users/micropython/repos",
      "events_url": "https://api.github.com/users/micropython/events{/privacy}",
      "received_events_url": "https://api.github.com/users/micropython/received_events",
      "type": "Organization",
      "site_admin": false
    },
    "html_url": "https://github.com/micropython/micropython",
    "description": "MicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems",
    "fork": false,
    "url": "https://api.github.com/repos/micropython/micropython",
    "forks_url": "https://api.github.com/repos/micropython/micropython/forks",
    "keys_url": "https://api.github.com/repos/micropython/micropython/keys{/key_id}",
    "collaborators_url": "https://api.github.com/repos/micropython/micropython/collaborators{/collaborator}",
    "teams_url": "https://api.github.com/repos/micropython/micropython/teams",
    "hooks_url": "https://api.github.com/repos/micropython/micropython/hooks",
    "issue_events_url": "https://api.github.com/repos/micropython/micropython/issues/events{/number}",
    "events_url": "https://api.github.com/repos/micropython/micropython/events",
    "assignees_url": "https://api.github.com/repos/micropython/micropython/assignees{/user}",
    "branches_url": "https://api.github.com/repos/micropython/micropython/branches{/branch}",
    "tags_url": "https://api.github.com/repos/micropython/micropython/tags",
    "blobs_url": "https://api.github.com/repos/micropython/micropython/git/blobs{/sha}",
    "git_tags_url": "https://api.github.com/repos/micropython/micropython/git/tags{/sha}",
    "git_refs_url": "https://api.github.com/repos/micropython/micropython/git/refs{/sha}",
    "trees_url": "https://api.github.com/repos/micropython/micropython/git/trees{/sha}",
    "statuses_url": "https://api.github.com/repos/micropython/micropython/statuses/{sha}",
    "languages_url": "https://api.github.com/repos/micropython/micropython/languages",
    "stargazers_url": "https://api.github.com/repos/micropython/micropython/stargazers",
    "contributors_url": "https://api.github.com/repos/micropython/micropython/contributors",
    "subscribers_url": "https://api.github.com/repos/micropython/micropython/subscribers",
    "subscription_url": "https://api.github.com/repos/micropython/micropython/subscription",
    "commits_url": "https://api.github.com/repos/micropython/micropython/commits{/sha}",
    "git_commits_url": "https://api.github.com/repos/micropython/micropython/git/commits{/sha}",
    "comments_url": "https://api.github.com/repos/micropython/micropython/comments{/number}",
    "issue_comment_url": "https://api.github.com/repos/micropython/micropython/issues/comments{/number}",
    "contents_url": "https://api.github.com/repos/micropython/micropython/contents/{+path}",
    "compare_url": "https://api.github.com/repos/micropython/micropython/compare/{base}...{head}",
    "merges_url": "https://api.github.com/repos/micropython/micropython/merges",
    "archive_url": "https://api.github.com/repos/micropython/micropython/{archive_format}{/ref}",
    "downloads_url": "https://api.github.com/repos/micropython/micropython/downloads",
    "issues_url": "https://api.github.com/repos/micropython/micropython/issues{/number}",
    "pulls_url": "https://api.github.com/repos/micropython/micropython/pulls{/number}",
    "milestones_url": "https://api.github.com/repos/micropython/micropython/milestones{/number}",
    "notifications_url": "https://api.github.com/repos/micropython/micropython/notifications{?since,all,participating}",
    "labels_url": "https://api.github.com/repos/micropython/micropython/labels{/name}",
    "releases_url": "https://api.github.com/repos/micropython/micropython/releases{/id}",
    "deployments_url": "https://api.github.com/repos/micropython/micropython/deployments",
    "created_at": "2013-12-20T11:47:07Z",
    "updated_at": "2019-03-01T18:51:51Z",
    "pushed_at": "2019-03-01T16:47:12Z",
    "git_url": "git://github.com/micropython/micropython.git",
    "ssh_url": "[email protected]:micropython/micropython.git",
    "clone_url": "https://github.com/micropython/micropython.git",
    "svn_url": "https://github.com/micropython/micropython",
    "homepage": "https://micropython.org",
    "size": 39688,
    "stargazers_count": 7996,
    "watchers_count": 7996,
    "language": "C",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": true,
    "has_pages": false,
    "forks_count": 2298,
    "mirror_url": null,
    "archived": false,
    "open_issues_count": 713,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZTEz"
    },
    "forks": 2298,
    "open_issues": 713,
    "watchers": 7996,
    "default_branch": "master"
  },
  "network_count": 2298,
  "subscribers_count": 109
}

Keys

If we look a bit further down the JSON page, we'll see a key called stargazers_count that has a value of 1059. The raw JSON for this key : value pair looks like this: "stargazers_count": 1059

Our CircuitPython code is able to grab and parse this data using these variables:

Download: file
DATA_SOURCE = "https://api.github.com/repos/adafruit/circuitpython"
DATA_LOCATION = ["stargazers_count"]

Traversing JSON

The DATA_LOCATION contains a value that we use to traverse the JSON file. In the image above, note how there is a tree hierarchy indicated by the indentation level. The stargazer_count key is at the root level of the file's hierarchy, so we can call it explicitly. In some JSON files, the key you seek may have a parent or parents that must be traversed as well.

PyPortal Constructor

When we set up the pyportal constructor, we are providing it with these things:

  • url to query
  • json_path to traverse and find the key:value pair we need
  • default_bg path and name to display the background bitmap
  • text_font path and name to the font used for displaying the star count value
  • text_position on the screen's x/y coordinate system
  • text_color
  • caption_text to display statically -- in this case the name of the repo
  • caption_font
  • caption_position
  • caption_color

Fetch

With the pyportal set up, we can then use pyportal.fetch() to do the query and parsing of the GitHub data and then display it on screen along with the caption text on top of the background image.

Ba-Ding!

Additionally, we use the last_value variable's state to compare against the latest value. If they differ, we play the coin.wav file for a satisfying ding over the PyPortal's built in speaker!

To make your own .wav files, check out this guide.

Customization

You can customize this project to make it your own and point to different website API's as the source of your JSON data, as well as adjust the graphics and text.

Text Position

Depending on the design of your background bitmap and the length of the text you're displaying, you may want to reposition the text and caption. You can do this with the text_position and caption_position options.

The PyPortal's display is 320 pixels wide and 240 pixels high. In order to refer to those positions on the screen, we use an x/y coordinate system, where x is horizontal and y is vertical.

The origin of this coordinate system is the upper left corner. This means that a pixel placed at the upper left corner would be (0,0) and the lower right corner would be (320, 240).

So, if you wanted to move the subscriber count text to the right and up closer to the top, your code may look like this for that part of the pyportal constructor: text_position=(250, 10)

Text Color

Another way to customize your stats trophy is to adjust the color of the text. The line text_color=0xFFFFFF in the constructor shows how. You will need to use the hexidecimal value for any color you want to display.

You can use something like https://htmlcolorcodes.com/ to pick your color and then copy the hex value, in this example it would be 0x0ED9EE

Background Image

If you would like to create your own background, awesome! You'll want to save the file with these specifications:

  • 320 x 240 pixels
  • 24-bit RGB color (8-bits per channel)
  • Save file as .bmp format

You can then copy the .bmp file to the root level of the CIRCUITPY drive. Make sure you refer to this new filename in the pyportal constructor line:

default_bg=cwd+"/stars_background.bmp"

Change that line to use the new filename name, such as:

default_bg=cwd+"/my_new_background.bmp"

Advanced Option: API Key

The GitHub API allows up to ten queries per minute for an unauthenticated request. If you would like to query your GitHub stars stats at a higher rate, up to 30 per minute, you can do so by adding your GitHub API key token to the secrets.py file. The code we're using checks for the presence of the github_token variable in the file, and if it's there, it adds that argument to the query.

Here's more info on the query limits. To get a token, follow these instruction.

Once you have your token, add it to the secrets.py file. Your file should look something like this:

Download: file
secrets = {
    'ssid' : '_your_wifi_ssid_',
    'password' : '_your_wifi_password',
    'timezone' : "America/Los_Angeles", # this is offset from UTC
    'location' : "Los Angeles, US",
    'github_token' : 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    }

Save your secrets file and now you can query three times as fast!

Now, we'll look at mounting the PyPortal onto a trophy for display!

This guide was first published on Mar 01, 2019. It was last updated on Mar 01, 2019. This page (Code PyPortal with CircuitPython) was last updated on Jun 05, 2019.