2018-08-31 10:17:58 +00:00
|
|
|
# ssd1306_test.py Demo program for rendering arbitrary fonts to an SSD1306 OLED display.
|
2018-08-14 16:22:21 +00:00
|
|
|
|
|
|
|
# The MIT License (MIT)
|
|
|
|
#
|
2018-08-31 10:17:58 +00:00
|
|
|
# Copyright (c) 2018 Peter Hinch
|
2018-08-14 16:22:21 +00:00
|
|
|
#
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
|
|
# in the Software without restriction, including without limitation the rights
|
|
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
|
|
# furnished to do so, subject to the following conditions:
|
|
|
|
#
|
|
|
|
# The above copyright notice and this permission notice shall be included in
|
|
|
|
# all copies or substantial portions of the Software.
|
|
|
|
#
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
# THE SOFTWARE.
|
|
|
|
|
|
|
|
|
|
|
|
# https://learn.adafruit.com/monochrome-oled-breakouts/wiring-128x32-spi-oled-display
|
|
|
|
# https://www.proto-pic.co.uk/monochrome-128x32-oled-graphic-display.html
|
|
|
|
|
|
|
|
# V0.3 12th Aug 2018
|
|
|
|
|
|
|
|
import machine
|
|
|
|
import utime
|
|
|
|
import uos
|
|
|
|
from ssd1306_setup import WIDTH, HEIGHT, setup
|
2018-08-28 10:37:21 +00:00
|
|
|
from writer import Writer, CWriter
|
2018-08-31 10:17:58 +00:00
|
|
|
from writer_gui import Label, Meter
|
2018-08-14 16:22:21 +00:00
|
|
|
|
|
|
|
# Fonts
|
|
|
|
import freesans20
|
|
|
|
import courier20 as fixed
|
|
|
|
import font6 as small
|
2018-08-31 10:17:58 +00:00
|
|
|
import arial10
|
2018-08-14 16:22:21 +00:00
|
|
|
|
|
|
|
def inverse(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
rhs = WIDTH -1
|
|
|
|
ssd.line(rhs - 20, 0, rhs, 20, 1)
|
|
|
|
square_side = 10
|
|
|
|
ssd.fill_rect(rhs - square_side, 0, square_side, square_side, 1)
|
|
|
|
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # In case previous tests have altered it
|
|
|
|
wri = Writer(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri.printstring('Sunday\n')
|
|
|
|
wri.printstring('12 Aug 2018\n')
|
|
|
|
wri.printstring('10.30am', True) # Inverse text
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def scroll(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
rhs = WIDTH -1
|
|
|
|
ssd.line(rhs - 20, 0, rhs, 20, 1)
|
|
|
|
square_side = 10
|
|
|
|
ssd.fill_rect(rhs - square_side, 0, square_side, square_side, 1)
|
|
|
|
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # In case previous tests have altered it
|
|
|
|
wri = Writer(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri.printstring('Sunday\n')
|
|
|
|
wri.printstring('12 Aug 2018\n')
|
|
|
|
wri.printstring('10.30am')
|
|
|
|
for x in range(5):
|
|
|
|
ssd.show()
|
|
|
|
utime.sleep(2)
|
|
|
|
wri.printstring('\nCount = {:2d}'.format(x))
|
|
|
|
ssd.show()
|
|
|
|
utime.sleep(2)
|
|
|
|
wri.printstring('\nDone.')
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def usd_scroll(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
# Only CWriter can do usd
|
|
|
|
CWriter.invert_display(ssd)
|
|
|
|
CWriter.set_textpos(ssd, 0, 0)
|
|
|
|
wri = CWriter(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
|
|
|
|
wri.printstring('Sunday\n')
|
|
|
|
wri.printstring('12 Aug 2018\n')
|
|
|
|
wri.printstring('10.30am')
|
|
|
|
for x in range(5):
|
|
|
|
ssd.show()
|
|
|
|
utime.sleep(2)
|
|
|
|
wri.printstring('\nCount = {:2d}'.format(x))
|
|
|
|
ssd.show()
|
|
|
|
utime.sleep(2)
|
|
|
|
wri.printstring('\nDone.')
|
|
|
|
ssd.show()
|
|
|
|
CWriter.invert_display(ssd, False) # For subsequent tests
|
|
|
|
|
|
|
|
def usd(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
# Only CWriter can do usd
|
|
|
|
CWriter.invert_display(ssd)
|
|
|
|
CWriter.set_textpos(ssd, 0, 0)
|
|
|
|
wri = CWriter(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri.printstring('Sunday\n')
|
|
|
|
wri.printstring('12 Aug 2018\n')
|
|
|
|
wri.printstring('10.30am')
|
|
|
|
ssd.show()
|
|
|
|
CWriter.invert_display(ssd, False) # For subsequent tests
|
|
|
|
|
|
|
|
def rjust(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # Previous tests may have altered it
|
|
|
|
wri = Writer(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
|
|
|
|
my_str = 'Sunday\n'
|
|
|
|
l = wri.stringlen(my_str)
|
|
|
|
Writer.set_textpos(ssd, col = WIDTH - l)
|
|
|
|
wri.printstring(my_str)
|
|
|
|
|
|
|
|
my_str = '12 Aug 2018\n'
|
|
|
|
l = wri.stringlen(my_str)
|
|
|
|
Writer.set_textpos(ssd, col = WIDTH - l)
|
|
|
|
wri.printstring(my_str)
|
|
|
|
|
|
|
|
my_str = '10.30am'
|
|
|
|
l = wri.stringlen(my_str)
|
|
|
|
Writer.set_textpos(ssd, col = WIDTH - l)
|
|
|
|
wri.printstring(my_str)
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def fonts(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # In case previous tests have altered it
|
|
|
|
wri = Writer(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri_f = Writer(ssd, small, verbose=False)
|
|
|
|
wri_f.set_clip(False, False, False) # Char wrap
|
|
|
|
wri_f.printstring('Sunday\n')
|
|
|
|
wri.printstring('12 Aug 2018\n')
|
|
|
|
wri.printstring('10.30am')
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def tabs(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # In case previous tests have altered it
|
|
|
|
wri = Writer(ssd, fixed, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri.printstring('1\t2\n')
|
|
|
|
wri.printstring('111\t22\n')
|
|
|
|
wri.printstring('1111\t1')
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def usd_tabs(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
CWriter.invert_display(ssd)
|
|
|
|
CWriter.set_textpos(ssd, 0, 0)
|
|
|
|
wri = CWriter(ssd, fixed, verbose=False)
|
|
|
|
wri.set_clip(False, False, False) # Char wrap
|
|
|
|
wri.printstring('1\t2\n')
|
|
|
|
wri.printstring('111\t22\n')
|
|
|
|
wri.printstring('1111\t1')
|
|
|
|
ssd.show()
|
|
|
|
CWriter.invert_display(ssd, False) # For subsequent tests
|
|
|
|
|
|
|
|
def wrap(use_spi=False, soft=True):
|
|
|
|
ssd = setup(use_spi, soft) # Create a display instance
|
|
|
|
Writer.set_textpos(ssd, 0, 0) # In case previous tests have altered it
|
|
|
|
wri = Writer(ssd, freesans20, verbose=False)
|
|
|
|
wri.set_clip(False, False, True) # Word wrap
|
|
|
|
wri.printstring('the quick brown fox jumps over')
|
|
|
|
ssd.show()
|
|
|
|
|
|
|
|
def dual(use_spi=False, soft=True):
|
|
|
|
ssd0 = setup(False, soft) # I2C display
|
|
|
|
ssd1 = setup(True, False) # SPI instance
|
|
|
|
Writer.set_textpos(ssd0, 0, 0) # In case previous tests have altered it
|
|
|
|
wri0 = Writer(ssd0, small, verbose=False)
|
|
|
|
wri0.set_clip(False, False, False)
|
|
|
|
Writer.set_textpos(ssd1, 0, 0) # In case previous tests have altered it
|
|
|
|
wri1 = Writer(ssd1, small, verbose=False)
|
|
|
|
wri1.set_clip(False, False, False)
|
|
|
|
|
|
|
|
nfields = []
|
|
|
|
dy = small.height() + 6
|
|
|
|
col = 15
|
|
|
|
for n, wri in enumerate((wri0, wri1)):
|
|
|
|
nfields.append([])
|
|
|
|
y = 2
|
|
|
|
for txt in ('X:', 'Y:', 'Z:'):
|
|
|
|
Label(wri, y, 0, txt)
|
2018-08-28 10:37:21 +00:00
|
|
|
nfields[n].append(Label(wri, y, col, wri.stringlen('99.99'), True))
|
2018-08-14 16:22:21 +00:00
|
|
|
y += dy
|
|
|
|
|
|
|
|
for _ in range(10):
|
|
|
|
for n, wri in enumerate((wri0, wri1)):
|
|
|
|
for field in nfields[n]:
|
2018-08-31 10:17:58 +00:00
|
|
|
value = int.from_bytes(uos.urandom(3),'little')/167772
|
2018-08-28 10:37:21 +00:00
|
|
|
field.value('{:5.2f}'.format(value))
|
2018-08-14 16:22:21 +00:00
|
|
|
wri.device.show()
|
|
|
|
utime.sleep(1)
|
|
|
|
for wri in (wri0, wri1):
|
|
|
|
Label(wri, 0, 64, ' DONE ', True)
|
|
|
|
wri.device.show()
|
|
|
|
|
|
|
|
|
|
|
|
tstr = '''Test assumes a 128*64 (w*h) display. Edit WIDTH and HEIGHT in ssd1306_setup.py for others.
|
|
|
|
Device pinouts are comments in ssd1306_setup.py.
|
|
|
|
All tests take two boolean args:
|
|
|
|
use_spi = False. Set True for SPI connected device
|
|
|
|
soft=True set False to use hardware I2C/SPI. Hardware I2C option currently fails with official SSD1306 driver.
|
|
|
|
|
|
|
|
Available tests:
|
|
|
|
inverse() Show black on white text.
|
|
|
|
scroll() Illustrate scrolling
|
|
|
|
usd() Upside-down display.
|
|
|
|
usd_scroll() Upside-down scroll test.
|
|
|
|
rjust() Right justification.
|
|
|
|
fonts() Two fonts.
|
|
|
|
tabs() Tab stops.
|
|
|
|
usd_tabs() Upside-down tabs.
|
|
|
|
wrap() Word wrapping
|
|
|
|
dual() Test two displays on one host.'''
|
|
|
|
|
|
|
|
print(tstr)
|