From 4108aa32a42f414ccb734704cb8677df7e9e9fea Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Sat, 23 Jan 2021 18:53:54 +0000 Subject: [PATCH] Minor changes to ePaper files and docs. --- DRIVERS.md | 30 ++++--- FPLOT.md | 4 +- README.md | 9 +- color_setup/{epd96_asyn.py => epd29_async.py} | 4 +- color_setup/{epd96_demo.py => epd29_sync.py} | 8 +- gui/core/fplot.py | 2 +- gui/demos/{epd29_test.py => epd29_async.py} | 41 ++++----- gui/demos/epd29_sync.py | 79 ++++++++++++++++++ images/seismo.JPG | Bin 0 -> 24203 bytes 9 files changed, 133 insertions(+), 44 deletions(-) rename color_setup/{epd96_asyn.py => epd29_async.py} (92%) rename color_setup/{epd96_demo.py => epd29_sync.py} (85%) rename gui/demos/{epd29_test.py => epd29_async.py} (77%) create mode 100644 gui/demos/epd29_sync.py create mode 100644 images/seismo.JPG diff --git a/DRIVERS.md b/DRIVERS.md index 7bea8bb..7da9ece 100644 --- a/DRIVERS.md +++ b/DRIVERS.md @@ -34,7 +34,7 @@ a bare minimum of functionality required to support the above.      6.4.1 [Micropower applications](./DRIVERS.md#641-micropower-applications) 6.5 [Resources](./DRIVERS.md#65-resources) 7. [ePaper displays](./DRIVERS.md#7-epaper-displays) - 7.1 [Adafruit flexible eInk Display](./DRIVERS.md#71-adafruit-flexible-eink-display) + 7.1 [Adafruit monochrome eInk Displays](./DRIVERS.md#71-adafruit-monochrome-eink-displays)      7.1.1 [EPD constructor args](./DRIVERS.md#711-epd-constructor-args)      7.1.2 [EPD public methods](./DRIVERS.md#712-epd-public-methods)      7.1.3 [EPD public bound variables](./DRIVERS.md#713-epd-public-bound-variables) @@ -538,9 +538,9 @@ more - which may be problematic for applications which need to respond to external events. A specific asynchronous mode provides support for reducing blocking time. See [EPD Asynchronous support](./DRIVERS.md#8-epd-asynchronous-support). -## 7.1 Adafruit flexible eInk Display +## 7.1 Adafruit monochrome eInk Displays -The driver assumes an Adafruit 2.9 inch 296*128 pixel flexible +The driver supports two Adafruit 2.9 inch 296*128 pixel units. A flexible [display](https://www.adafruit.com/product/4262) interfaced via their [interface breakout](https://www.adafruit.com/product/4224). @@ -548,28 +548,32 @@ An alternative is the [Adafruit 2.9" eInk FeatherWing](https://www.adafruit.com/product/4777) with [wiring details](./DRIVERS.md#714-featherwing-wiring) listed below. -These alternatives behave identically except that the FeatherWing shows a black -border around the display. The reason for this is +In my testing there are differences between these alternatives. The FeatherWing +shows a black border around the display. The reason for this is [unclear](https://github.com/adafruit/Adafruit_CircuitPython_IL0373/issues/11#issuecomment-763704622). +Secondly, while the FeatherWing behaves as expected the image on the flexible +display gradually degrades if the display is powered down. The white background +becomes speckled over a period of a few minutes. -The breakout has an `ENA` pin which enables the display to be powered down. -This facilitates micropower applications: the host shuts down the display -before going into deep sleep. +The interface breakout for the flexible display has an `ENA` pin which enables +the display to be powered down. This facilitates micropower applications: the +host shuts down the display before itself going into deep sleep. The driver is cross platform and supports landscape or portrait mode. To keep the buffer size down (to 4736 bytes) there is no greyscale support. It should -be noted that the Adafruit site cautions against refreshing these displays more -frequently than every 180s. It is +be noted that the Adafruit site cautions against refreshing the flexible +displays more frequently than every 180s. This warning does not appear on the +FeatherWing pages. No reason for the warning is given and it is [unclear](https://forums.adafruit.com/viewtopic.php?f=19&t=174091) if this is an absolute limit or an average rate. ##### Wiring The [interface schematic is here](https://learn.adafruit.com/assets/86038). The -drawing title is confusing but I balieve this is the correct schematic. +drawing title is confusing but I believe this is the correct schematic. The following assumes a Pyboard host. Pyboard pin numbers are based on hardware -SPI 2 and my arbitrary choice of GPIO. All may be changed and soft SPI may be +SPI 2 and an arbitrary choice of GPIO. All may be changed and soft SPI may be used. | Pyb | Breakout | @@ -677,7 +681,7 @@ This 2.7" 176*274 display is designed for the Raspberry Pi and is detailed I bought two of these units from different sources. Both have hardware issues discussed [here](https://forum.micropython.org/viewtopic.php?f=2&t=9564). I have failed to achieve consistent behaviour. Units behave perfectly one day and -fail the next. I published this driver on the assumption that I was sold +fail the next. I published this driver on the assumption that I was twice sold dubious Chinese clones and that genuine ones would be reliable. The driver is cross-platform. diff --git a/FPLOT.md b/FPLOT.md index 593c2ef..6700906 100644 --- a/FPLOT.md +++ b/FPLOT.md @@ -45,7 +45,7 @@ two varying vectors. 4.2.1 [Scaling](./FPLOT.md#421-scaling) Required scaling of complex points. 4.3 [class TSequence](./FPLOT.md#43-class-tsequence) Plot Y values on time axis. -###### [Main README](../README.md) +###### [Main README](./README.md) # 1. Python files @@ -170,7 +170,7 @@ The Cartesian curve constructor takes the following positional arguments: Mandatory arguments: 1. `graph` The `CartesianGraph` instance. - 2. `color` + 2. `color` If `None` is passed, the `graph` foreground color is used. Optional arguments: 3. `populate=None` A generator to populate the curve. See below. diff --git a/README.md b/README.md index 8116d9a..fd64f86 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,9 @@ floats as the notionally very long scale moves behind its small window. ![Image](images/textbox1.JPG) The Textbox widget for scrolling text with word wrap or clipping. +![Image](images/seismo.JPG) A mockup of a seismograph screen on an ePaper +display. + Notes on [Adafruit and other OLED displays](./ADAFRUIT.md) including wiring details, pin names and hardware issues. @@ -258,7 +261,8 @@ Demos for larger displays. Demos for ePaper displays: * `waveshare_test.py` For the Waveshare eInk Display HAT 2.7" 176*274 display. - * `epd29_test.py` Demo for Adafruit 2.9" eInk display. + * `epd29_sync.py` Demo for Adafruit 2.9" eInk display: emulates a seismograph. + * `epd29_async.py` Asynchronous demo for Adafruit 2.9" eInk display. Demos for Sharp displays: * `sharptest.py` Basic functionality check. @@ -311,7 +315,8 @@ copied to the hardware root as `color_setup.py`. Example files: [Adafruit 1.44 inch TFT display](https://www.adafruit.com/product/2088). * `ili9341_setup.py` A 240*320 ILI9341 display on ESP32. * `waveshare_setup.py` 176*274 ePaper display. - * `epd96_asyn.py` Adafruit 2.9 inch ePaper display, optimised for `uasyncio`. + * `epd29_sync.py` Adafruit 2.9 inch ePaper display for synchronous code. + * `epd29_async.py` Adafruit 2.9 inch ePaper display: `uasyncio` applications. ## 2.2 Dependencies diff --git a/color_setup/epd96_asyn.py b/color_setup/epd29_async.py similarity index 92% rename from color_setup/epd96_asyn.py rename to color_setup/epd29_async.py index 5dc19f7..4e1c4f6 100644 --- a/color_setup/epd96_asyn.py +++ b/color_setup/epd29_async.py @@ -1,5 +1,5 @@ -# epd96_asyn.py Config for asynchronous applications on 2.9" ePaper. -# Customise for your hardware config +# epd29_async.py Config for asynchronous applications on 2.9" ePaper. +# Customise for your hardware config. # Released under the MIT License (MIT). See LICENSE. # Copyright (c) 2020 Peter Hinch diff --git a/color_setup/epd96_demo.py b/color_setup/epd29_sync.py similarity index 85% rename from color_setup/epd96_demo.py rename to color_setup/epd29_sync.py index 75e47c9..83e947e 100644 --- a/color_setup/epd96_demo.py +++ b/color_setup/epd29_sync.py @@ -1,7 +1,5 @@ -# epd96_demo.py Allow standard demos to run on ePaper. -# Customise for your hardware config. -# Beware of running demos for long as they refresh the display more frequently -# than is advised by Adafruit. +# epd29_sync.py Config for synchronous applications on 2.9" ePaper. +# Customise for your hardware config # Released under the MIT License (MIT). See LICENSE. # Copyright (c) 2020 Peter Hinch @@ -41,4 +39,4 @@ pbusy = machine.Pin('Y4', machine.Pin.IN) spi = machine.SPI(2, baudrate=5_000_000) gc.collect() # Precaution before instantiating framebuf ssd = SSD(spi, pcs, pdc, prst, pbusy) # Create a display instance -ssd.demo_mode = True +# ssd.demo_mode = True diff --git a/gui/core/fplot.py b/gui/core/fplot.py index 9638383..2e9785b 100644 --- a/gui/core/fplot.py +++ b/gui/core/fplot.py @@ -58,7 +58,7 @@ class Curve(): self.graph = graph self.origin = origin self.excursion = excursion - self.color = color + self.color = color if color is not None else graph.fgcolor self.lastpoint = None self.newpoint = None if populate is not None and self._valid(populate): diff --git a/gui/demos/epd29_test.py b/gui/demos/epd29_async.py similarity index 77% rename from gui/demos/epd29_test.py rename to gui/demos/epd29_async.py index 894fcf6..ae10c5f 100644 --- a/gui/demos/epd29_test.py +++ b/gui/demos/epd29_async.py @@ -1,9 +1,10 @@ -# epd29_test.py Demo program for nano_gui on an Adafruit 2.9" flexible ePaper screen +# epd29_async.py Demo program for nano_gui on an Adafruit 2.9" flexible ePaper screen # Released under the MIT License (MIT). See LICENSE. # Copyright (c) 2020 Peter Hinch # color_setup must set landcsape True, asyn True and must not set demo_mode +from cmath import exp, pi import uasyncio as asyncio from color_setup import ssd # On a monochrome display Writer is more efficient than CWriter. @@ -11,11 +12,13 @@ from gui.core.writer import Writer from gui.core.nanogui import refresh from gui.widgets.meter import Meter from gui.widgets.label import Label +from gui.widgets.dial import Dial, Pointer # Fonts import gui.fonts.arial10 as arial10 import gui.fonts.font6 as small +ssd._asyn = True # HACK to make it config agnostic # Some ports don't support uos.urandom. # See https://github.com/peterhinch/micropython-samples/tree/master/random def xorshift64star(modulo, seed = 0xf9ac6ba4): @@ -28,21 +31,20 @@ def xorshift64star(modulo, seed = 0xf9ac6ba4): return (x * 0x2545F4914F6CDD1D) % modulo return func -async def fields(evt): - wri = Writer(ssd, small, verbose=False) +async def compass(evt): # TODO why does this not get drawn on 1st pass? + wri = Writer(ssd, arial10, verbose=False) wri.set_clip(False, False, False) - textfield = Label(wri, 0, 2, wri.stringlen('longer')) - numfield = Label(wri, 25, 2, wri.stringlen('99.990'), bdcolor=None) - countfield = Label(wri, 0, 60, wri.stringlen('1')) - n = 1 - random = xorshift64star(65535) + v1 = 0 + 0.9j + v2 = exp(0 - (pi / 6) * 1j) + dial = Dial(wri, 5, 5, height = 75, ticks = 12, bdcolor=None, + label='Direction', style = Dial.COMPASS) + ptr = Pointer(dial) while True: - for s in ('short', 'longer', '1', ''): - textfield.value(s) - numfield.value('{:5.2f}'.format(random() /1000)) - countfield.value('{:1d}'.format(n)) - n += 1 - await evt.wait() + ptr.value(v1) + v1 *= v2 +# await asyncio.sleep_ms(100) + await evt.wait() + async def multi_fields(evt): wri = Writer(ssd, small, verbose=False) @@ -68,15 +70,16 @@ async def multi_fields(evt): async def meter(evt): wri = Writer(ssd, arial10, verbose=False) + wri.set_clip(False, False, False) row = 10 - col = 150 + col = 170 args = {'height' : 80, 'width' : 15, 'divisions' : 4, 'style' : Meter.BAR} m0 = Meter(wri, row, col, legends=('0.0', '0.5', '1.0'), **args) - m1 = Meter(wri, row, col + 50, legends=('-1', '0', '+1'), **args) - m2 = Meter(wri, row, col + 100, legends=('-1', '0', '+1'), **args) + m1 = Meter(wri, row, col + 40, legends=('-1', '0', '+1'), **args) + m2 = Meter(wri, row, col + 80, legends=('-1', '0', '+1'), **args) random = xorshift64star(2**24 - 1) while True: steps = 10 @@ -93,7 +96,7 @@ async def main(): evt = asyncio.Event() asyncio.create_task(meter(evt)) asyncio.create_task(multi_fields(evt)) - asyncio.create_task(fields(evt)) + asyncio.create_task(compass(evt)) while True: # Normal procedure before refresh, but 10s sleep should mean it always returns immediately await ssd.wait() @@ -103,7 +106,7 @@ async def main(): # framebuffer in background evt.set() evt.clear() - await asyncio.sleep(20) # Allow for slow refresh + await asyncio.sleep(10) # Allow for slow refresh tstr = '''Test of asynchronous code updating the EPD. This should diff --git a/gui/demos/epd29_sync.py b/gui/demos/epd29_sync.py new file mode 100644 index 0000000..d86042b --- /dev/null +++ b/gui/demos/epd29_sync.py @@ -0,0 +1,79 @@ +# epd29_sync.py Demo of synchronous code on 2.9" EPD display + +# Released under the MIT License (MIT). See LICENSE. +# Copyright (c) 2020 Peter Hinch + +# color_setup must set landcsape True, asyn False and must not set demo_mode + +from math import pi, sin +from color_setup import ssd +from gui.core.writer import Writer +from gui.core.nanogui import refresh +from gui.core.fplot import CartesianGraph, Curve +from gui.widgets.meter import Meter +from gui.widgets.label import Label +from gui.widgets.dial import Dial, Pointer + +# Fonts +import gui.fonts.arial10 as arial10 +import gui.fonts.freesans20 as large + +wri = Writer(ssd, arial10, verbose=False) +wri.set_clip(False, False, False) + +wri_large = Writer(ssd, large, verbose=False) +wri_large.set_clip(False, False, False) + +# 296*128 +def graph(): + row, col, ht, wd = 5, 140, 75, 150 + def populate(): + x = -0.998 + while x < 1.01: + z = 6 * pi * x + y = sin(z) / z + yield x, y + x += 0.05 + + g = CartesianGraph(wri, row, col, height = ht, width = wd, bdcolor=False) + curve2 = Curve(g, None, populate()) + Label(wri, row + ht + 5, col - 10, '-2.0 t: secs') + Label(wri, row + ht + 5, col - 8 + int(wd//2), '0.0') + Label(wri, row + ht + 5, col - 10 + wd, '2.0') + +def compass(): + dial = Dial(wri, 5, 5, height = 75, ticks = 12, bdcolor=None, + label='Direction', style = Dial.COMPASS) + ptr = Pointer(dial) + ptr.value(1 + 1j) + +def meter(): + m = Meter(wri, 5, 100, height = 75, divisions = 4, + label='Peak', style=Meter.BAR, legends=('0', '50', '100')) + m.value(0.72) + +def labels(): + row = 100 + col = 0 + Label(wri_large, row, col, 'Seismograph') + col = 140 + Label(wri, row, col + 0, 'Event time') + Label(wri, row, col + 60, '01:35', bdcolor=None) + Label(wri, row, col + 95, 'UTC') + row = 115 + Label(wri, row, col + 0, 'Event date') + Label(wri, row, col + 60, '6th Jan 2021', bdcolor=None) + +def main(): + refresh(ssd, True) + graph() + compass() + meter() + labels() + ssd.wait_until_ready() + refresh(ssd) + print('Waiting for display update') + ssd.wait_until_ready() + +main() + diff --git a/images/seismo.JPG b/images/seismo.JPG new file mode 100644 index 0000000000000000000000000000000000000000..2442d6c0348479f29738b49f131c3f15f46d3aaf GIT binary patch literal 24203 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 M_l#~@(emg2*(WkCWdHyG literal 0 HcmV?d00001