{"id":14967298,"url":"https://github.com/trevorwslee/micropython-dumbdisplay","last_synced_at":"2026-02-12T22:01:50.585Z","repository":{"id":165776580,"uuid":"391273982","full_name":"trevorwslee/MicroPython-DumbDisplay","owner":"trevorwslee","description":"DumbDisplay MicroPython Library is a port of the Arduino DumbDisplay Library (https://github.com/trevorwslee/Arduino-DumbDisplay) for the DumbDisplay Android app -- https://play.google.com/store/apps/details?id=nobody.trevorlee.dumbdisplay","archived":false,"fork":false,"pushed_at":"2025-11-16T09:02:15.000Z","size":13498,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-11-16T11:13:31.752Z","etag":null,"topics":["micro-python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/trevorwslee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-07-31T06:26:53.000Z","updated_at":"2025-10-26T07:13:51.000Z","dependencies_parsed_at":"2026-02-12T22:01:42.633Z","dependency_job_id":null,"html_url":"https://github.com/trevorwslee/MicroPython-DumbDisplay","commit_stats":{"total_commits":121,"total_committers":2,"mean_commits":60.5,"dds":0.487603305785124,"last_synced_commit":"2353b2dca63574235a98ee5c9a360f9c17476112"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/trevorwslee/MicroPython-DumbDisplay","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorwslee%2FMicroPython-DumbDisplay","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorwslee%2FMicroPython-DumbDisplay/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorwslee%2FMicroPython-DumbDisplay/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorwslee%2FMicroPython-DumbDisplay/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trevorwslee","download_url":"https://codeload.github.com/trevorwslee/MicroPython-DumbDisplay/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trevorwslee%2FMicroPython-DumbDisplay/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29382870,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-12T20:34:40.886Z","status":"ssl_error","status_checked_at":"2026-02-12T20:23:00.490Z","response_time":55,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["micro-python"],"created_at":"2024-09-24T13:37:48.692Z","updated_at":"2026-02-12T22:01:50.575Z","avatar_url":"https://github.com/trevorwslee.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# DumbDisplay MicroPython Library (v0.6.6)\n\nDumbDisplay MicroPython Library -- workable with Python 3 -- is a port of the [DumbDisplay Arduino Library](https://github.com/trevorwslee/Arduino-DumbDisplay)\nto MicroPython / Python 3 for the [DumbDisplay Android app](https://play.google.com/store/apps/details?id=nobody.trevorlee.dumbdisplay).\nFor a video introduction, please watch the YouTube video: [Introducing DumbDisplay MicroPython Library -- \nwith ESP32, Raspberry Pi Pico, and Raspberry Pi Zero](https://www.youtube.com/watch?v=KVU26FyXs5M).\n\nAlthough the porting is still work-in-progress, a large portion of the core of DumbDisplay functionalities has been ported.\nHopefully, this should already be helpful for friends that develop programs for microcontroller boards in MicroPython.\n\nAs hinted previously, even DumbDisplay MicroPython Library is originally targeted for MicroPython,\nit should be usable with regular Python 3, like with Raspberry Pi SBC or even with desktop / laptop.\nTherefore, DumbDisplay MicroPython Library might be an alternative way to prototype simple Android app driven remotely with Python 3 from desktop / laptop / SBC\nfor displaying experiment result data and getting simple interactions from the user, even simple Android games,\nlike the few simple Android game examples bundled with this library as examples;\nplease refer to the section [An Odd Way to Implement Simple Android Games in Python 3](#an-odd-way-to-implement-simple-android-games-in-python-3) for more details.\n\n\nEnjoy\n\n- [DumbDisplay MicroPython Library (v0.6.5)](#dumbdisplay-micropython-library-v065)\n- [Installation](#installation)\n- [Getting Started](#getting-started)\n- [More Details](#more-details)\n  - [IO Mechanism](#io-mechanism)\n  - [Layers](#layers)\n  - [Auto-Pinning of Layers](#auto-pinning-of-layers)\n  - [Feedbacks of Layers](#feedbacks-of-layers)\n    - [Poll for Feedback](#poll-for-feedback)\n    - [Callback for Feedback](#callback-for-feedback)\n  - [Notes](#notes)\n- [Selected Demos](#selected-demos)\n- [An Odd Way to Implement Simple Android Games in Python 3](#an-odd-way-to-implement-simple-android-games-in-python-3)\n- [Thank You!](#thank-you)\n- [License](#license)\n- [Change History](#change-history)\n\n\n# Installation\n\nFor \"installing\" this library for MicroPython, please refer to the [above-mentioned YouTube video](https://www.youtube.com/watch?v=KVU26FyXs5M),\nwhich demonstrates some examples of using DumbDisplay MicroPython Library for microcontroller programming.\n\nIf your targeted is desktop / laptop, or SBC like Raspberry Pi, you can install the Python package (this library) like:\n```\npip install git+https://github.com/trevorwslee/MicroPython-DumbDisplay\n```\n\nIf in the installation process you see error like\n`ModuleNotFoundError: No module named 'setuptools.config.expand'; 'setuptools.config' is not a package`\n, please try to upgrade your `setuptools` package first like\n```\npip install --upgrade setuptools\n```\nthen try installing this library again.\n\nIf you would like to try out the development version (for desktop / laptop), you can install the development version like:\n```\npip install --upgrade --force-reinstall git+https://github.com/trevorwslee/MicroPython-DumbDisplay@develop\n``` \n\nTo switch back after trying the development version, run\n```\npip install --upgrade --force-reinstall git+https://github.com/trevorwslee/MicroPython-DumbDisplay\n```\n\n\n# Getting Started\n\nTo use DumbDisplay MicroPython Library, the basic Python script setup is:\n\n1. Import core components, for creating `DumbDisplay` object\n   \u003cbr\u003ee.g.\n   ```\n   from dumbdisplay.core import *\n   dd = DumbDisplay()\n   ```\n   - you can import the core components with ```from dumbdisplay.core import *```\n   - or you can choose to import all components (including layers to be mentioned later) with ```from dumbdisplay.full import *```\n\n2. Import IO mechanism, for creating IO object [to pass to DumbDisplay object] like\n   \u003cbr\u003ee.g.\n   ```\n   from dumbdisplay.core import *\n   from dumbdisplay.ios import *\n   dd = DumbDisplay(io=io4Wifi(\"ssid\", \"password\")) # the default is io4Inet()\n   ```\n   - the default `io` is `io4Inet()`, which uses Python networking support (not available for MicroPython)\n\n3. Import layer, for creating layer object [passing DumbDisplay object to it]\n    \u003cbr\u003ee.g.\n    ```\n    from dumbdisplay.core import *\n    from dumbdisplay.layer_ledgrid import *\n    dd = DumbDisplay()\n    l = LayerLedGrid(dd)\n    ```\n   - you can choose to import all types of layers with ```from dumbdisplay.full import *```\n     \n\n# More Details\n\n## IO Mechanism\n\nWhen create a `DumbDisplay` object, an IO object is needed\n- `io4Inet` (the default) -- Python networking support (not available for MicroPython)\n- `io4Wifi` -- MicroPython WiFi support (for Raspberry Pi Pico W, ESP32, etc.)\n- `io4Uart` -- MicroPython UART support (for Raspberry Pi Pico W, ESP32, etc.)\n- `io4Ble` -- MicroPython BLE support (for ESP32, etc.)\n\nE.g.\n```\nfrom dumbdisplay.core import *\nfrom dumbdisplay.ios import *\ndd = DumbDisplay(io4Wifi(\"ssid\", \"password\"))\n```\n\n## Layers\n\nOther then the `DumbDisplay` object, you will need to create one or more layer objects to represent the visible portion of the UI:\n\n- `LayerLedGrid` -- a single LED, or a row / column / grid of multiple LEDs (**n** columns by **m** rows)\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_ledgrid import *\n  dd = DumbDisplay()\n  l = LayerLedGrid(dd)\n  ```\n  example:\n  |[`demo_LayerLedGrid()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_ledgrid_2x2.png\"\u003e\u003c/img\u003e|\n\n- `LayerLcd` -- a TEXT based LCD with configurable number of lines of configurable number of characters\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_lcd import *\n  dd = DumbDisplay()\n  l = LayerLcd(dd)\n  ```\n  \n  example:\n  |[`demo_LayerLcd()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_lcd.png\"\u003e\u003c/img\u003e|\n\n- `LayerGraphical` -- a graphical LCD that you can draw to with common TFT LCD drawing directives\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_graphical import *\n  dd = DumbDisplay()\n  l = LayerGraphical(dd)\n  ```\n  \n  example:\n  |[`demo_LayerGraphical()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_graphical.png\"\u003e\u003c/img\u003e|\n\n- `Layer7SegmentRow` -- a single 7-segment digit, or a row of **n** 7-segments digits\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_7segrow import *\n  dd = DumbDisplay()\n  l = Layer7SegmentRow(dd)\n  ```\n  \n  example:\n  |[`demo_Layer7SegmentRow()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_7segment_3d.png\"\u003e\u003c/img\u003e|\n\n- `LayerTurtle` -- a Python Turtle like canvas that you can draw to using Python Turtle like commands\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_turtle import *\n  dd = DumbDisplay()\n  l = LayerTurtle(dd)\n  ```\n\n  example:\n  |[`demo_LayerTurtle()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_turtle.png\"\u003e\u003c/img\u003e|\n\n\n- `LayerSelection` -- a row / column / grid of TEXT based LCDs mostly for showing selection choices\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_selection import *\n  dd = DumbDisplay()\n  l = LayerSelection(dd)\n  ```\n\n  example:\n  |[`demo_LayerSelection()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_selection_1x3.png\"\u003e\u003c/img\u003e|\n\n\n- `LayerPlotter` -- a \"plotter\" for plotting real-time data\n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_plotter import *\n  dd = DumbDisplay()\n  l = LayerPlotter(dd)\n  ```\n  \n  example:\n  |[`demo_LayerPlotter()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_plotter.png\"\u003e\u003c/img\u003e|\n  \n  as shown in th example, two types of data are fed to the plotter -- `X` and `Sin`\n  ```\n  l.label(\"X\", sin=\"Sin\")\n  ```\n  And the real-time values of `X` and `Sin` are fed like\n  ```\n  for x in range(1000):\n    sin = math.sin(x)\n    l.set(x, sin=sin)\n    time.sleep(0.8)\n  ```\n\n- `LayerJoystick` -- a joystick; also can be a horizontal or vertical slider \n  ```\n  from dumbdisplay.core import *\n  from dumbdisplay.layer_joystick import *\n  dd = DumbDisplay()\n  l = LayerJoystick(dd)\n  ```\n  \n  |[`demo_LayerJoystick()` in `dd_demo.py`](dd_demo.py)|\n  |:--:|\n  |\u003cimg style=\"width: 300px; height: 300px;\" src=\"screenshots/layer_joystick.png\"\u003e\u003c/img\u003e|  \n  \n  as shown in the example\n  * you can configure the joystick to be a horizontal or vertical slider by changing the `directions` parameter to `LayerJoystick`\n    - param `max_stick_value`: the max value of the stick; e.g. 255 or 1023 (the default); min is 15\n    - param `directions`: \"lr\" or \"hori\": left-to-right; \"tb\" or \"vert\": top-to-bottom; \"rl\": right-to-left; \"bt\": bottom-to-top;\n                          use \"+\" combines the above like \"lr+tb\" to mean both directions; \"\" the same as \"lr+tb\"\n  * feedback -- to be talked about later -- is enabled by default, and you can poll for feedback like\n    ```\n    while True:\n      fb = l.getFeedback()\n      if fb:\n        print(f\"* Feedback: {fb.type} at ({fb.x}, {fb.y})\")\n    ```\n\n## Auto-Pinning of Layers\n\nIn case of multiple layers, you can \"auto pin\" them together; otherwise, multiple layers will be stacked on top of each other\n```\nAutoPin('V', AutoPin('H', l_ledgrid, l_lcd), AutoPin('H', l_selection, l_7segmentrow), l_graphical).pin(dd)\n```\n\nExample:\n|[`demo_AutoPin()` in `dd_demo.py`](dd_demo.py)|\n|:--:|\n|\u003cimg style=\"width: 400px; height: 400px;\" src=\"screenshots/autopin_layers.png\"\u003e\u003c/img\u003e|\n\n## Feedbacks of Layers\n\nCertain user interaction, like pressing, with the layers (the UI) can trigger feedback to the corresponding layer objects \n\nGiven a layer `l`, normally you enable feedback like\n```\nl.enable_feedback()\n```\nor to enable feedback with auto flashing (UI feedback) of the layer by provide options like `\"fl\"` like\n```\nl.enable_feedback(\"fl\")\n```\n\nThere are two ways feedback of a layer can be received -- polling or callback\n \n### Poll for Feedback\n\nAfter creating the layer, a loop can be implemented to poll for feedback like\n```\nwhile True:\n  fb = l.getFeedback()\n  if fb:\n      print(f\"* Feedback: {fb.type} at ({fb.x}, {fb.y})\")\n```\n- fb is of type `DDFeedback`\n- `DDFeedback.type`: the type of feedback, like `\"click\"`, `\"doubleclick\"`, `\"longpress\"`\n- `DDFeedback.x`, `DDFeedback.y`: the \"coordinates\" of the feedback\n  \u003cbr\u003eHere, what \"coordinates\" refers to depends on the type of layer\n  * E.g, for `LayerLedGrid`,  \"coordinates\" refers to which LED\n  * E.g, for `LayerGraphical`,  \"coordinates\" refers to the pixel coordinates\n  * E.g, for `LayerSelection`,  \"coordinates\" refers to which selection\n\nPlease take [`demo_Feedback()` in `dd_demo.py`](dd_demo.py) as an example.\n\n### Callback for Feedback\n\nWhen enabling the layer for feedback, a  callback / handler can be supplied like\n```\nl.enableFeedback(\"fa\", feedback_handler=lambda layer, type, x, y, *args: print(f\"* Feedback: {type} at ({x}, {y})\"))\n```\nThe parameters passed to the callback `lambda`:\n- `layer`: the layer object that received the feedback\n- `type`: the type of feedback (as mentioned above)\n- `x`, `y`: the \"coordinates\" of the feedback (as mentioned above)\n- `*args`: just there for future extension\n\n***Important*** note: Since DumbDisplay is \"cooperative\", you should give \"time-slices\" for DumbDisplay to process feedback signals from the Android app, like:\n```\nwhile True:\n    dd.timeslice()\n```\n\nPlease take [`demo_Feedback_callback()` in `dd_demo.py`](dd_demo.py) as an example.\n\n\n## Notes\n* If seeing ESP32 brownout detection issue, try \n    ```\n    import machine\n    machine.reset_cause()\n    ```\n* If DumbDisplay Android app fails to make connection to desktop / laptop, check your desktop firewall settings; try switching desktop WIFI to use 2.4 GHz.\n\n\n\n# Selected Demos\n\nHere are two Raspberry Pi Pico PIO demos\n\n|[Respberry Pi Pico W Generating Tones With Programmable I/O (PIO) Using MicroPython](https://www.instructables.com/Respberry-Pi-Pico-W-Generating-Tones-With-Programm/)|[Respberry Pi Pico W NeoPixels Experiments With Programmable I/O (PIO) Using MicroPython](https://www.instructables.com/Respberry-Pi-Pico-W-NeoPixels-Experiments-With-Pro/)|\n|--|--|\n|![](screenshots/u_melody_dd.jpg)|![](screenshots/u_neopixeldd_dd.jpg)|\n\n\n[`PyTorchIntroductoryExperiments`](https://github.com/trevorwslee/PyTorchIntroductoryExperiments) -- targeted to be run with Python 3 -- shows two regular Python 3 demos\n\n|||\n|--|--|\n|![](screenshots/dd-mnist.jpg)|![](screenshots/dd-sliding-puzzle.jpg)|\n\n# An Odd Way to Implement Simple Android Games in Python 3\n\nThe odd way introduced here to implement simple Android games in Python 3 certainly involves this Python library, as well as the DumbDisplay Android app\n* This [DumbDisplay library](https://github.com/trevorwslee/MicroPython-DumbDisplay/tree/master) is used to implement the game logic in Python 3, as a simple personal game server.\n* The [DumbDisplay Android app](https://play.google.com/store/apps/details?id=nobody.trevorlee.dumbdisplay) is used to render the game graphical components, as well to get input from the users.\n  Note that no separate work from you on this part -- the logics are driven by the Python game server.\n* The connection protocol between the game server and the DumbDisplay Android app is TCP/IP over WIFI.\n\nFor example, a simple \"Tetris One Block\" implementation bundled with this library as one of the examples.\n\n|  |  |\n|--|--|\n|Please note that this \"Tetris One Block\" example was adapted from `TETRIS ONE BLOCK/tetris_one_block.py` of the GitHub Repository [Python-Games](https://github.com/DimaGutierrez/Python-Games)|![](screenshots/dd-tetris-one-block.jpg)|\n\nAs mentioned, the example game \"Tetris One Block\" is bundled with the DumbDisplay MicroPython Library, which you can install in your Python 3 environment like\n```\npip install git+https://github.com/trevorwslee/MicroPython-DumbDisplay\n```\n\nIf during installation you see error like\n```ModuleNotFoundError: No module named 'setuptools.config.expand'; 'setuptools.config' is not a package```\n, please try to upgrade your `setuptools` package first like\n```\npip install --upgrade setuptools\n```\nthen try installing again.\n\n\nAssuming DumbDisplay MicroPython library is installed, you can run the example game \"Tetris One Block\" like\n```\npython -m dumbdisplay example.tetris_one_block\n```\n\nWhen the example game [server] starts, the console should show output like\n```\n*** Running TETRIS ONE BLOCK ***\nconnecting socket ... listing on 192.168.0.46:10201 ...\n```\n\nThen, go ahead to your Android mobile phone, bring up the [DumbDisplay Android app](https://play.google.com/store/apps/details?id=nobody.trevorlee.dumbdisplay) and connect it with the game server\n\n|  |  |  |  |\n|--|--|--|--|\n|![](screenshots/dd_connect_wifi_00.jpg)|![](screenshots/dd_connect_wifi_01.jpg)|![](screenshots/dd_connect_wifi_02.jpg)|![](screenshots/dd_connect_wifi_03.jpg)|\n\nWith your DumbDisplay Android app connected to the game server, whatever game it is running, can be played with the DumbDisplay Android app as the UI for the game.\n\n| [Tetris One Block](dumbdisplay_examples/tetris/tetris_one_block.py) |  [Tetris Two Block](dumbdisplay_examples/tetris/tetris_two_block.py) |  [Tetris Classic](dumbdisplay_examples/tetris/tetris_classic.py) |\n|:--:|:--:|:--:|\n|![](screenshots/dd-tetris-one-block.jpg)|![](screenshots/dd-tetris-two-block.jpg)|![](screenshots/dd-tetris-classic.jpg)|\n|```python -m dumbdisplay example.tetris_one_block```|```python -m dumbdisplay example.tetris_two_block```|```python -m dumbdisplay example.tetris_classic```|\n\nAnother more exciting example game adapted from [Python-Games](https://github.com/DimaGutierrez/Python-Games) is the \"Space Shooting\" game.\nLike the Tetris games, the \"Space Shooting\" game can also be played with the DumbDisplay Android app as the UI, with a user-friendly virtual joystick to control the movement of the space-fighter.\n\n| portrait  | landscape  |\n|:--:|:--:|\n|![](screenshots/dd-space-shooting.jpg)|![](screenshots/dd-space-shooting-landscape.jpg)|\n\nYou can start the \"Space Shooting\" game serve like\n```\npython -m dumbdisplay example.space_shooting\n```\n\nIf you prefer to play the game with no sound, you can disable sound by providing the `--no-sound` command-line argument like\n```\npython -m dumbdisplay example.space_shooting --no-sound\n```\n\nEnjoy!\n\n\n# Thank You!\n\nGreeting from the author Trevor Lee:\n\n\u003e Peace be with you!\n\u003e May God bless you!\n\u003e Jesus loves you!\n\u003e Amazing Grace!\n\n\n# License\n\nMIT\n\n\n# Change History\n\nv0.6.6\n- working on it\n- added GIF support for animated background\n- bug fix\n\nv0.6.5\n- added \"space shooter\" example\n- added landscape layer pinning support\n- bug fixes\n\nv0.6.0\n- added DDRootLayer\n- added LayerTurtle\n- added more examples\n- bug fixes\n\nv0.5.0\n- ported \"level options\" for LayerGraphical \n- ported LayerSelection\n- added dumbdisplay_examples package\n- bug fixes\n\nv0.3.1\n- ported LayerJoystick\n\nv0.3.0\n- checked Raspberry Pi Pico W WIFI support\n- ported more options from Arduino DumbDisplay library\n- bug fixes\n\nv0.2.1\n- ported LayerPlotter\n- ported \"layer margin\"\n- bug fixes\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrevorwslee%2Fmicropython-dumbdisplay","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrevorwslee%2Fmicropython-dumbdisplay","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrevorwslee%2Fmicropython-dumbdisplay/lists"}