Skip to main content

A tiny library to calculate CIE 1931 lightness tables for eyeball friendly PWM LED brightness.

Project description

Provides lightness correction tables for eyeball pleasing LED brightness.

Antialiased question mark in portrait mode on a CharlieWing

Want a smooth fade on your pulsing LEDs or get lovely antialiasing on LED matrix fonts? You need to correct your raw linear brightness values for human eyeball persistence of vision perception sensitivity.

Otherwise known as the CIE 1931 Lightness curve. It is also covered in many books. The research was done in the 1920s, winding up as one part of the International Commission on Illumination (CIE) 1931 standard.

Use it to smoothly fade an LED:
This example assumes CircuitPython or adafruit-blinka.

import time, board, pulseio, pwm_lightness
PWM = pwm_lightness.get_pwm_table(0xffff, max_input=100)
output_pin = pulseio.PWMOut(board.D13)  # or analogio.AnalogOut(A0) & .value
while True:
    for v in range(100, -1, -1):
        output_pin.duty_cycle = PWM[v]
        time.sleep(0.02)
    for v in range(1, 100):
        output_pin.duty_cycle = PWM[v]
        time.sleep(0.02)

It is also useful for the RGB values you send to programmable LED strips. Those are also linear fraction of on-time PWM.

Use it with Pillow to make an antialiased font shine rather than look like a bold blur:
This example assumes a RPi connected to an I2C Adafruit charlieplexed LED matrix.

import pwm_lightness
PWM = pwm_lightness.get_pwm_table(60)  # 0..255 is our max LED PWM value.
import board, busio, adafruit_is31fl3731, PIL
i2c = busio.I2C(board.SCL, board.SDA)
led_matrix = adafruit_is31fl3731.CharlieBonnet(i2c)
font = PIL.ImageFont.truetype('fonts/RobotoCondensed-Regular.ttf', 16)
image = PIL.Image.new('L', (led_matrix.height, led_matrix.width), 0)
draw = PIL.ImageDraw.Draw(image)
# fill=255 gives us the most antialiasing detail to work with, we control
# overall brightness via the max range in our PWM table.
draw.text((0,-1), '?', fill=255, font=font)
image = image.point(PWM)  # Corrects linear 0..255 values for PWM lightness.
image = image.transpose(PIL.Image.ROTATE_90)  # Match the matrix orientation.
led_matrix.image(image)  # Send pixels to our LED display.

This code does work on CircuitPython or MicroPython microcontrollers so long as your build has floating point enabled. In microcontroller environments recomputing a table on device is often overkill. Precompute the table(s) you need offline and store them as data to save precious RAM, no on device floating point required.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

pwm_lightness-1.0.0-py2.py3-none-any.whl (7.9 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file pwm_lightness-1.0.0-py2.py3-none-any.whl.

File metadata

  • Download URL: pwm_lightness-1.0.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 7.9 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/47.1.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.8.4rc1

File hashes

Hashes for pwm_lightness-1.0.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 4e334e93715bc8919d70f84897231acae846946802767964a411dad2cf0d69fa
MD5 214f6ba827d6c548c767dd4319153c56
BLAKE2b-256 8cbbc281993fc4601f41f1defe3785144e2d7f7df9d84ff47aaa9519b50ab1a8

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page