smart-leds-matrix

Crates.iosmart-leds-matrix
lib.rssmart-leds-matrix
version0.2.0
sourcesrc
created_at2022-02-06 22:33:17.006639
updated_at2024-01-17 13:46:49.24706
descriptionDrawTarget implementation for smart led based matrixes. It allows the usage of the embedded-graphics Drawables.
homepage
repositoryhttps://github.com/smart-leds-rs/smart-leds-matrix
max_upload_size
id528069
size26,619
Gergo Huszty (libesz)

documentation

https://docs.rs/crate/smart-leds-matrix

README

Smart LEDs matrix

A DrawTarget implementation to use (one, or more) smart LED matrixes as a graphics display driven by embedded-graphics Drawable objects. The integrated driver is from smart-leds crate.

Known issues (with my setup: stm32f401 + 8x8 ws2812 matrix):

  • circles with the same parameters are not exactly drawn always to the same position, not sure if this is the same with bigger resolution displays or not
  • write operation usually gets back with an overrun error, while the display is still updated for ~every second time (workaround: flush always twice)

Plan

  • Add more display types (like 2x2 or 1x4 grids of 8x8 matrixes), though user can add those anytime by implementing another layout.

Usage

You may start by creating a driver for your LED and controller. Some examples can be found here.

Once you have it, you can plug it into the DrawTarget implemented by this crate.

Example:

use ws2812_spi as ws2812;

use smart_leds_matrix::{SmartLedMatrix, layout::Rectangular};

use embedded_graphics::{
    pixelcolor::*,
    prelude::*,
    primitives::{
        PrimitiveStyleBuilder, Rectangle,
    },
};

fn main() -> ! {
[...]
    let ws = ws2812::Ws2812::new(spi);
    let mut matrix = SmartLedMatrix::<_, _, {8 * 8}>::new(ws, Rectangular::new_inverted_y(8, 8));
    matrix.set_brightness(15);
    matrix.clear(Rgb888::new(0, 0, 0));

    // Drawable objects are calling draw_iter() function of the matrix.
    // That is, only the internal frame buffer is updated, no real 
    // communication happens yet. That is useful when a frame is composed
    // of multiple objects, text, etc.
    Rectangle::new(Point::new(1, 1), Size::new(6, 6))
    .into_styled(
        PrimitiveStyleBuilder::new()
        .fill_color(Rgb888::RED)
        .build(),
    ).draw(&mut matrix)?;
    // Trigger the actual frame update on the matrix with gamma correction.
    matrix.flush_with_gamma();
    loop{}
}
Commit count: 40

cargo fmt