sevseg_3642bs

Crates.iosevseg_3642bs
lib.rssevseg_3642bs
version0.3.4
sourcesrc
created_at2023-02-22 17:29:13.926993
updated_at2023-03-21 23:01:55.004809
descriptionDriver crate for the 3642BS seven segment display
homepage
repositoryhttps://gitlab.com/slusheea/sevseg-3642bs
max_upload_size
id792002
size49,247
Slushee (Slushee-a)

documentation

README

3642BS driver for embedded devices

banner

Makes displaying stuff on the 3642BS easy.

Documentation

Allows you to display dec and hex numbers as well as the time and your own custom characters with a single line of code.

display.clear().unwrap();
display.number(1234).unwrap();
display.hex(0xF3E2).unwrap();
display.time(10, 30).unwrap();				    //   ===A===
                                                            //  ‖       ‖
// Make your own custom characters:                         //  F       B
let letter_c = SEG_A | SEG_F | SEG_E | SEG_D;               //  ‖       ‖
let letter_o = SEG_G | SEG_E | SEG_C | SEG_D;               //   ===G===
let letter_l = SEG_F | SEG_E | SEG_D;                       //  ‖       ‖
let text_cool = [letter_c, letter_o, letter_o, letter_l];   //  E       C
                                                            //  ‖       ‖
display.custom(text_cool).unwrap();                         //   ===D===

How to use

Include the library on your cargo.toml

sevseg_3642bs = "0.3.2"

Define which pins are going to be used:

let mut display = Display::new(
    pins.gpio16.into_push_pull_output(), // Segment A
    pins.gpio17.into_push_pull_output(), // Segment B
    pins.gpio18.into_push_pull_output(), // Segment C
    pins.gpio19.into_push_pull_output(), // Segment D
    pins.gpio20.into_push_pull_output(), // Segment E
    pins.gpio21.into_push_pull_output(), // Segment F
    pins.gpio22.into_push_pull_output(), // Segment G
    pins.gpio26.into_push_pull_output(), // Two dots
    pins.gpio15.into_push_pull_output(), // Digit 1
    pins.gpio14.into_push_pull_output(), // Digit 2
    pins.gpio13.into_push_pull_output(), // Digit 3
    pins.gpio12.into_push_pull_output(), // Digit 4
    delay, 				 // Your HAL's delay object
);

Since the display has to be multiplexed, delays can't be used on the same core the library is on, or the display will freeze on a single digit. For this reason I recommend using alarms or timers. You can also use async tasks with Embassy.

Example using Alarm0 (On the rpi pico):

// Other code like defining the pins and importing libraries.
// You'll need to import fugit::ExtU32

let mut timer = bsp::hal::Timer::new(pac.TIMER, &mut pac.RESETS);

// Other code like defining the Display struct

let alarm = timer.alarm_1().unwrap();

loop {
    // Other code like calculating "value"

    let _ = alarm.schedule(100_000.micros());

    while !alarm.finished() {
        display.number(value).unwrap();
    }   
}

Example using Timer (on the rpi pico):

// Other code like defining the pins and importing libraries

let mut timer = bsp::hal::Timer::new(pac.TIMER, &mut pac.RESETS);
let mut count_down = timer.count_down();

// Other code like defining the Display struct

let mut prev_time = timer.get_counter();
    
loop {
    // Other code like calculating "value"

    while timer.get_counter() < prev_time + 100_000 {
        display.number(value);
    }
    prev_time = timer.get_counter();
}

Example using the Real Time Clock (on the pi pico):

let mut watchdog = Watchdog::new(pac.WATCHDOG);

let clocks = clocks::init_clocks_and_plls(
    XTAL_FREQ_HZ,
    pac.XOSC,
    pac.CLOCKS,
    pac.PLL_SYS,
    pac.PLL_USB,
    &mut pac.RESETS,
    &mut watchdog,
).ok().unwrap();

let initial_date = DateTime {
    year: 2023,
    month: 1,
    day: 27,
    day_of_week: DayOfWeek::Friday,
    hour: 18,
    minute: 46,
    second: 0,
};

let real_time_clock = RealTimeClock::new(pac.RTC, clocks.rtc_clock, &mut pac.RESETS, initial_date).unwrap();

let mut prev_time = real_time_clock.now().unwrap().second;

loop {
    let mut current_time = real_time_clock.now().unwrap().second;
    while current_time == prev_time {
        display
            .time(
                real_time_clock.now().unwrap().minute,
                current_time,
                current_time,
            )
            .unwrap();
        current_time = real_time_clock.now().unwrap().second;
    }
    prev_time = current_time;
}
Commit count: 44

cargo fmt