SBK_BarDrive Library 2.1.0
LED bar meter control and queued animations for Arduino
Loading...
Searching...
No Matches
splitDriverDevicesBarMeter.ino
Go to the documentation of this file.
1/**
2 * @example splitDriverDevicesBarMeter.ino
3 * @brief Example showing how to split a bar meter on multiple driver devices.
4 *
5 * Requirements:
6 * - Supported driver with complatible library (SBK_MAX72xx or SBK_HT16K33 libraries)
7 * - Bar meter display or leds array wired to driver
8 *
9 * @author
10 * Samuel Barabé (Smart Builds & Kits)
11 *
12 * @version 2.1.0
13 * @license MIT
14 */
15
16#include <Arduino.h>
17
18// ──────────────────────────────────────────────
19// SBK BarDrive Configuration Flags
20// ──────────────────────────────────────────────
21#define SBK_BARDRIVE_WITH_ANIM // Give access to preset animations and controls.
22
23// ──────────────────────────────────────────────
24// SELECT YOUR DRIVER SETUP
25// Uncomment one of the following driver configurations
26// ──────────────────────────────────────────────
27
28/* === [A] Using MAX7219/MAX7221 via SOFTWARE SPI (any 3 digital pins) === */
29// #define DIN_PIN A4 ///< Define software SPI Data In pin
30// #define CLK_PIN A5 ///< Define software SPI Clock pin
31// #define CS_PIN A3 ///< Define SPI Chip Select pin
32// #include <SBK_MAX72xxSoft.h>
33// SBK_MAX72xxSoft driver(DIN_PIN, CLK_PIN, CS_PIN, 2); ///< Construct MAX72xx software SPI driver instance for 2 devices : (DataIn pin, Clock pin, Chip Select pin, devices number)
34// #include <SBK_BarDrive.h>
35// SBK_BarDrive<SBK_MAX72xxSoft> bar1(&driver, 0, 8, BarDirection::FORWARD, 0); ///< Construct using segments count starting at segment 0 (auto-mapped layout) : (driver, device index, segments count, BarDirection, segment offset)
36// SBK_BarDrive<SBK_MAX72xxSoft> bar2(&driver, 0, 8, BarDirection::FORWARD, 8); ///< Construct using segments count starting at segment 0 (auto-mapped layout) : (driver, device index, segments count, BarDirection, segment offset)
37// SBK_BarDrive<SBK_MAX72xxSoft> bar3(&driver, 0, MatrixPreset::BL28_3005SK, BarDirection::FORWARD, 2); ///< Construct using matrix type bar meter preset (auto-mapped layout) : (driver, device index, MatrixPreset type, BarDirection, row offset)
38
39/* === [B] Using MAX7219/MAX7221 via HARDWARE SPI (dedicated MCU SPI pins) === */
40// #define CS_PIN A3 ///< Define SPI Chip Select pin
41// #include <SBK_MAX72xxHard.h>
42// SBK_MAX72xxHard driver(CS_PIN, 2); ///< Construct MAX72xx hardware SPI driver instance for 2 devices : (Chip Select pin, devices number)
43// #include <SBK_BarDrive.h>
44// SBK_BarDrive<SBK_MAX72xxHard> bar1(&driver, 0, 8, BarDirection::FORWARD, 0); ///< Construct using segments count starting at segment 0 (auto-mapped layout) : (driver, device index, segments count, BarDirection, segment offset)
45// SBK_BarDrive<SBK_MAX72xxHard> bar2(&driver, 0, 8, BarDirection::FORWARD, 8); ///< Construct using segments count starting at segment 0 (auto-mapped layout) : (driver, device index, segments count, BarDirection, segment offset)
46// SBK_BarDrive<SBK_MAX72xxHard> bar3(&driver, 0, MatrixPreset::BL28_3005SK, BarDirection::FORWARD, 2); ///< Construct using matrix type bar meter preset (auto-mapped layout) : (driver, device index, MatrixPreset type, BarDirection, row offset)
47
48/* === [C] Using HT16K33 via I2C === */
49#include <SBK_HT16K33.h>
50const uint8_t NUM_DEV = 2; ///< Number of HT16K33 devices in use
51const uint8_t DEV0_IDX = 0; ///< Device 0 index
52const uint8_t DEV1_IDX = 1; ///< Device 1 index
53const uint8_t DEV0_ADD = 0x70; ///< I2C address for device 0 (typically 0x70–0x77)
54const uint8_t DEV1_ADD = 0x71; ///< I2C address for device 1 (typically 0x70–0x77)
55const uint8_t DEV0_NUM_ROWS = 8; ///< Device 0: 20-SOP = 8 rows, 24-SOP = 12 rows, 28-SOP = 16 rows
56const uint8_t DEV1_NUM_ROWS = 8; ///< Device 1: 20-SOP = 8 rows, 24-SOP = 12 rows, 28-SOP = 16 rows
57SBK_HT16K33 driver(NUM_DEV);
58#include <SBK_BarDrive.h>
59SBK_BarDrive<SBK_HT16K33> bar1(&driver, 0, 24, BarDirection::FORWARD, 0); ///< 24-segment bar on device 0, starting at segment 0
60SBK_BarDrive<SBK_HT16K33> bar2(&driver, 0, 24, BarDirection::FORWARD, 24); ///< 24-segment bar on device 0, starting at segment 24 (offset)
61SBK_BarDrive<SBK_HT16K33> bar3(&driver, 0, MatrixPreset::BL28_3005SK, BarDirection::FORWARD, 6); ///< BL28-3005SK preset, starts at row offset 6
62
63/**
64 * @brief In this example, three bar meters are created using SBK_BarDrive across 2 devices with 8 rows (anodes) outputs :
65 *
66 * - bar1: A 24-segment 1D bar meter on device 0 (segments 0–23),
67 * mapped from row 0 to row 2, across columns 0–7.
68 *
69 * - bar2: Another 24-segment 1D bar meter on device 0 (segments 24–47),
70 * mapped from row 3 to row 5, across columns 0–7.
71 *
72 * - bar3: A 28-segment 2D matrix bar meter using MatrixPreset::BL28_3005SK
73 * (4 rows × 7 columns), starting at row offset 6.
74 * This fills:
75 * - Device 0: rows 6–7, columns 0–6
76 * - Device 1: rows 0–1, columns 0–6
77 */
78
79void setup()
80{
81 Serial.begin(115200);
82
83#ifdef SBK_HT16K33_IS_DEFINED
84 // HT16K33 driver instance setup (demo uses a single device)
85 driver.setAddress(DEV0_IDX, DEV0_ADD); // Set I2C address for device 0
86 driver.setDriverRows(DEV0_IDX, DEV0_NUM_ROWS); // Set number of active anode outputs (rows)
87 driver.setAddress(DEV1_IDX, DEV1_ADD); // Set I2C address for device 0
88 driver.setDriverRows(DEV1_IDX, DEV1_NUM_ROWS); // Set number of active anode outputs (rows)
89#endif
90
91 driver.begin();
92 driver.setBrightness(0, 10);
93
94 // Outputs mapping to serial
95 bar1.debugSegmentMapping();
96 Serial.println(), Serial.println();
97 bar2.debugSegmentMapping();
98 Serial.println(), Serial.println();
99 bar3.debugSegmentMapping();
100
101 bar1.animations().animInit().fillUpIntv(25).loop();
102 bar2.animations().animInit().bounceFillUpIntv(25).loop();
103 bar3.animations().animInit().beatPulse(116);
104}
105
106void loop()
107{
108 bar1.animations().update();
109 bar2.animations().update();
110 bar3.animations().update();
111
112 driver.show();
113}