#display #embedded-hal #3642bs #seven-segment

no-std sevseg_3642bs

Driver crate for the 3642BS seven segment display

4 releases

0.3.4 Mar 21, 2023
0.3.3 Feb 23, 2023
0.3.2 Feb 22, 2023
0.3.1 Feb 22, 2023

#1708 in Embedded development

MIT/Apache

23KB
313 lines

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;
}

Dependencies

~71KB