From 82f5a841e2e3f2f8d61b843be468e13cc87c3aea Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:26:01 +1000 Subject: [PATCH 01/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index f63fab55..5ed0d24b 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -53,7 +53,7 @@ void HT16K33AlphaDisplay::loop() { float HT16K33AlphaDisplay::get_setup_priority() const { return setup_priority::PROCESSOR; } void HT16K33AlphaDisplay::display_() { - int numc = this->displays_.size() * 8; + int numc = this->displays_.size() * 12; int len = this->buffer_.size(); uint8_t data[numc]; memset(data, 0, numc); From 6f18c9ba5d453c71b0a1b00b4d2b032d90df5933 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:29:14 +1000 Subject: [PATCH 02/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 5ed0d24b..15ee4dd8 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -68,7 +68,7 @@ void HT16K33AlphaDisplay::display_() { } pos = 0; for (auto *display : this->displays_) { - display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, 8); + display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, 12); pos += 8; } } From c4de8766f7f6bdef5f232c827bbbb0b979457308 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:31:04 +1000 Subject: [PATCH 03/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 15ee4dd8..73fa60a1 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -30,7 +30,7 @@ void HT16K33AlphaDisplay::setup() { void HT16K33AlphaDisplay::loop() { unsigned long now = millis(); - int numc = this->displays_.size() * 8; + int numc = this->displays_.size() * 12; int len = this->buffer_.size(); if (!this->scroll_ || (len <= numc)) return; From 6026b63ebfd25996e1bf70567326a7995bf31084 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:48:41 +1000 Subject: [PATCH 04/17] Update display.py --- components/ht16k33_alpha/display.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/ht16k33_alpha/display.py b/components/ht16k33_alpha/display.py index 98e31c7e..45e201e6 100644 --- a/components/ht16k33_alpha/display.py +++ b/components/ht16k33_alpha/display.py @@ -14,6 +14,7 @@ CONF_SCROLL_DWELL = "scroll_dwell" CONF_SCROLL_DELAY = "scroll_delay" CONF_SECONDARY_DISPLAYS = "secondary_displays" +CONF_SIZE = "size" CONFIG_SECONDARY = cv.Schema({ cv.GenerateID(): cv.declare_id(i2c.I2CDevice) @@ -27,6 +28,7 @@ cv.Optional(CONF_SCROLL_DWELL, default='2s'): cv.positive_time_period_milliseconds, cv.Optional(CONF_SCROLL_DELAY, default='3'): cv.float_range(min=1), cv.Optional(CONF_SECONDARY_DISPLAYS): cv.ensure_list(CONFIG_SECONDARY), + cv.Optional(CONF_SIZE, default=4): cv.int_range(min=1, max=8) }).extend(cv.polling_component_schema('1s')).extend(i2c.i2c_device_schema(0x70)) async def to_code(config): @@ -44,6 +46,7 @@ async def to_code(config): cg.add(var.set_continuous(config[CONF_CONTINUOUS])) cg.add(var.set_scroll_speed(config[CONF_SCROLL_SPEED])) cg.add(var.set_scroll_dwell(config[CONF_SCROLL_DWELL])) + cg.add(var.set_size(config[CONF_SIZE])) cg.add(var.set_scroll_delay(int(config[CONF_SCROLL_DELAY] * config[CONF_SCROLL_SPEED].total_milliseconds))) if CONF_SECONDARY_DISPLAYS in config: for conf in config[CONF_SECONDARY_DISPLAYS]: From 2e979b253ce766ccf676e58372c68f5ac8ed6b8f Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:50:02 +1000 Subject: [PATCH 05/17] Update ht16k33_display.h --- components/ht16k33_alpha/ht16k33_display.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/ht16k33_alpha/ht16k33_display.h b/components/ht16k33_alpha/ht16k33_display.h index 0ac30c26..94b61cbd 100644 --- a/components/ht16k33_alpha/ht16k33_display.h +++ b/components/ht16k33_alpha/ht16k33_display.h @@ -24,6 +24,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { void set_scroll_speed(unsigned long scroll_speed) { this->scroll_speed_ = scroll_speed; } void set_scroll_dwell(unsigned long scroll_dwell) { this->scroll_dwell_ = scroll_dwell; } void set_scroll_delay(unsigned long scroll_delay) { this->scroll_delay_ = scroll_delay; } + void set_size(unsigned long size) { this->size_ = size; } void update() override; //// Clear display void set_brightness(float level); @@ -54,6 +55,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { unsigned long scroll_dwell_ {2000}; unsigned long scroll_delay_ {750}; unsigned long last_scroll_ {0}; + unsigned long size_ {4}; std::vector buffer_; int offset_ {0}; uint8_t brightness_ = 16; From 6b954f50db06e5d3ad8c921e965ce4169b1dfb69 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:51:01 +1000 Subject: [PATCH 06/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 73fa60a1..cae13078 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -30,7 +30,7 @@ void HT16K33AlphaDisplay::setup() { void HT16K33AlphaDisplay::loop() { unsigned long now = millis(); - int numc = this->displays_.size() * 12; + int numc = this->displays_.size() * this->size_; int len = this->buffer_.size(); if (!this->scroll_ || (len <= numc)) return; @@ -53,7 +53,7 @@ void HT16K33AlphaDisplay::loop() { float HT16K33AlphaDisplay::get_setup_priority() const { return setup_priority::PROCESSOR; } void HT16K33AlphaDisplay::display_() { - int numc = this->displays_.size() * 12; + int numc = this->displays_.size() * this->size_; int len = this->buffer_.size(); uint8_t data[numc]; memset(data, 0, numc); @@ -68,7 +68,7 @@ void HT16K33AlphaDisplay::display_() { } pos = 0; for (auto *display : this->displays_) { - display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, 12); + display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, this->size_); pos += 8; } } From 3658bd2d649bae76b9ab141b46e08fbf6543091e Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:54:52 +1000 Subject: [PATCH 07/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index cae13078..40f37362 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -30,7 +30,7 @@ void HT16K33AlphaDisplay::setup() { void HT16K33AlphaDisplay::loop() { unsigned long now = millis(); - int numc = this->displays_.size() * this->size_; + int numc = this->displays_.size() * this->size_ * 2; int len = this->buffer_.size(); if (!this->scroll_ || (len <= numc)) return; @@ -53,7 +53,7 @@ void HT16K33AlphaDisplay::loop() { float HT16K33AlphaDisplay::get_setup_priority() const { return setup_priority::PROCESSOR; } void HT16K33AlphaDisplay::display_() { - int numc = this->displays_.size() * this->size_; + int numc = this->displays_.size() * this->size_ * 2; int len = this->buffer_.size(); uint8_t data[numc]; memset(data, 0, numc); @@ -68,7 +68,7 @@ void HT16K33AlphaDisplay::display_() { } pos = 0; for (auto *display : this->displays_) { - display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, this->size_); + display->write_bytes(DISPLAY_COMMAND_SET_DDRAM_ADDR, data + pos, this->size_ * 2); pos += 8; } } From 240f7414718279537b0bc839ab221809c46bf3dc Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Tue, 12 Aug 2025 22:56:48 +1000 Subject: [PATCH 08/17] Update README.md --- components/ht16k33_alpha/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/ht16k33_alpha/README.md b/components/ht16k33_alpha/README.md index bf87f5e8..2db8f97f 100644 --- a/components/ht16k33_alpha/README.md +++ b/components/ht16k33_alpha/README.md @@ -20,6 +20,7 @@ display: scroll_speed: 250ms scroll_dwell: 2s scroll_delay: 3 + size: 4 lambda: |- it.print("ABCD"); secondary_displays: @@ -40,3 +41,5 @@ display: `secondary_display:` is a list of i2c devices where `address:` is required and `i2c_id:` is optional unless there is more than one i2c bus. +`size:` number of characters in module, default is 4. + From 80802a11b6032ed235c3d76477fd5f9451af141f Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:39:02 +1000 Subject: [PATCH 09/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 40f37362..7e78da1b 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -107,6 +107,26 @@ float HT16K33AlphaDisplay::get_brightness() { return this->brightness_ / 16.0; } +uint16_t swapBits(uint16_t n, uint p1, uint p2) { + // Extract the bit at position p1 + unsigned int bit1 = (n >> p1) & 1; + + // Extract the bit at position p2 + unsigned int bit2 = (n >> p2) & 1; + + // If the bits are different, perform the swap + if (bit1 != bit2) { + // Create a mask to toggle the bits at p1 and p2 + // If bit1 is 0 and bit2 is 1, set bit at p1 and clear bit at p2 + // If bit1 is 1 and bit2 is 0, clear bit at p1 and set bit at p2 + unsigned int xor_mask = (1U << p1) | (1U << p2); + + // XOR the number with the mask to swap the bits + n ^= xor_mask; + } + return n; +} + void HT16K33AlphaDisplay::print(const char *str) { uint16_t fontc = 0; while (*str != '\0') { @@ -120,6 +140,7 @@ void HT16K33AlphaDisplay::print(const char *str) { fontc |= 0x4000; str++; } + fontc = swapBits(fontc, 11, 13); this->buffer_.push_back(fontc & 0xff); this->buffer_.push_back(fontc >> 8); } From 7948f0208ec7418f904ca608ca7e595d6b3cb43a Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:43:45 +1000 Subject: [PATCH 10/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 7e78da1b..61ee4e5a 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -107,7 +107,7 @@ float HT16K33AlphaDisplay::get_brightness() { return this->brightness_ / 16.0; } -uint16_t swapBits(uint16_t n, uint p1, uint p2) { +uint16_t HT16K33AlphaDisplay::swapBits(uint16_t n, uint p1, uint p2) { // Extract the bit at position p1 unsigned int bit1 = (n >> p1) & 1; @@ -140,7 +140,7 @@ void HT16K33AlphaDisplay::print(const char *str) { fontc |= 0x4000; str++; } - fontc = swapBits(fontc, 11, 13); + fontc = this->swapBits(fontc, 11, 13); this->buffer_.push_back(fontc & 0xff); this->buffer_.push_back(fontc >> 8); } From 9a1965a88e449ae57e3d2df3e9e3397fea51eb05 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:44:19 +1000 Subject: [PATCH 11/17] Update ht16k33_display.h --- components/ht16k33_alpha/ht16k33_display.h | 1 + 1 file changed, 1 insertion(+) diff --git a/components/ht16k33_alpha/ht16k33_display.h b/components/ht16k33_alpha/ht16k33_display.h index 94b61cbd..23f3221b 100644 --- a/components/ht16k33_alpha/ht16k33_display.h +++ b/components/ht16k33_alpha/ht16k33_display.h @@ -46,6 +46,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { void command_(uint8_t value); void call_writer() { this->writer_(*this); } void display_(); + uint16_t HT16K33AlphaDisplay::swapBits(uint16_t n, uint p1, uint p2) std::vector displays_ {this}; std::function writer_; From b55bb001574bbc4bd3d3f8dd82e5c59547a897fd Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:45:41 +1000 Subject: [PATCH 12/17] Update ht16k33_display.h --- components/ht16k33_alpha/ht16k33_display.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.h b/components/ht16k33_alpha/ht16k33_display.h index 23f3221b..1b121eaa 100644 --- a/components/ht16k33_alpha/ht16k33_display.h +++ b/components/ht16k33_alpha/ht16k33_display.h @@ -46,7 +46,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { void command_(uint8_t value); void call_writer() { this->writer_(*this); } void display_(); - uint16_t HT16K33AlphaDisplay::swapBits(uint16_t n, uint p1, uint p2) + uint16_t swapBits(uint16_t n, uint p1, uint p2) std::vector displays_ {this}; std::function writer_; From 6b8a6a0aca06264365c6cf169a789e51abc79e88 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:46:24 +1000 Subject: [PATCH 13/17] Update ht16k33_display.h --- components/ht16k33_alpha/ht16k33_display.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.h b/components/ht16k33_alpha/ht16k33_display.h index 1b121eaa..252c4b2f 100644 --- a/components/ht16k33_alpha/ht16k33_display.h +++ b/components/ht16k33_alpha/ht16k33_display.h @@ -46,7 +46,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { void command_(uint8_t value); void call_writer() { this->writer_(*this); } void display_(); - uint16_t swapBits(uint16_t n, uint p1, uint p2) + uint16_t swapBits(uint16_t n, uint p1, uint p2); std::vector displays_ {this}; std::function writer_; From 984380c5e4c5361d30b706d7b247dcb714fbe55a Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:48:34 +1000 Subject: [PATCH 14/17] Update ht16k33_display.h --- components/ht16k33_alpha/ht16k33_display.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/ht16k33_alpha/ht16k33_display.h b/components/ht16k33_alpha/ht16k33_display.h index 252c4b2f..ae7b1504 100644 --- a/components/ht16k33_alpha/ht16k33_display.h +++ b/components/ht16k33_alpha/ht16k33_display.h @@ -20,6 +20,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { float get_setup_priority() const override; void add_secondary_display(i2c::I2CDevice *display) { this->displays_.push_back(display); } void set_scroll(bool scroll) { this->scroll_ = scroll; } + void set_swap_bits(bool swap_bits) { this->swap_bits_ = swap_bits; } void set_continuous(bool continuous) { this->continuous_ = continuous; } void set_scroll_speed(unsigned long scroll_speed) { this->scroll_speed_ = scroll_speed; } void set_scroll_dwell(unsigned long scroll_dwell) { this->scroll_dwell_ = scroll_dwell; } @@ -52,6 +53,7 @@ class HT16K33AlphaDisplay : public PollingComponent, public i2c::I2CDevice { std::function writer_; bool scroll_ {false}; bool continuous_ {false}; + bool swap_bits_ {false}; unsigned long scroll_speed_ {250}; unsigned long scroll_dwell_ {2000}; unsigned long scroll_delay_ {750}; From b835f29f1841ddee4d81a0886a5687451f02c0e0 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:49:12 +1000 Subject: [PATCH 15/17] Update ht16k33_display.cpp --- components/ht16k33_alpha/ht16k33_display.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/ht16k33_display.cpp b/components/ht16k33_alpha/ht16k33_display.cpp index 61ee4e5a..6f83bb45 100644 --- a/components/ht16k33_alpha/ht16k33_display.cpp +++ b/components/ht16k33_alpha/ht16k33_display.cpp @@ -140,7 +140,9 @@ void HT16K33AlphaDisplay::print(const char *str) { fontc |= 0x4000; str++; } - fontc = this->swapBits(fontc, 11, 13); + if(this->swap_bits_) { + fontc = this->swapBits(fontc, 11, 13); + } this->buffer_.push_back(fontc & 0xff); this->buffer_.push_back(fontc >> 8); } From 5a3d963ed8afc7dbf7775bfa91141b49a324f6c0 Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 22:51:11 +1000 Subject: [PATCH 16/17] Update display.py --- components/ht16k33_alpha/display.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/ht16k33_alpha/display.py b/components/ht16k33_alpha/display.py index 45e201e6..c11b36b2 100644 --- a/components/ht16k33_alpha/display.py +++ b/components/ht16k33_alpha/display.py @@ -12,6 +12,7 @@ CONF_SCROLL = "scroll" CONF_SCROLL_SPEED = "scroll_speed" CONF_SCROLL_DWELL = "scroll_dwell" +CONF_SWAP_BITS = "swap_bits" CONF_SCROLL_DELAY = "scroll_delay" CONF_SECONDARY_DISPLAYS = "secondary_displays" CONF_SIZE = "size" @@ -24,6 +25,7 @@ cv.GenerateID(): cv.declare_id(HT16K33AlphaDisplay), cv.Optional(CONF_CONTINUOUS, default=False): cv.boolean, cv.Optional(CONF_SCROLL, default=False): cv.boolean, + cv.Optional(CONF_SWAP_BITS, default=False): cv.boolean, cv.Optional(CONF_SCROLL_SPEED, default='250ms'): cv.positive_time_period_milliseconds, cv.Optional(CONF_SCROLL_DWELL, default='2s'): cv.positive_time_period_milliseconds, cv.Optional(CONF_SCROLL_DELAY, default='3'): cv.float_range(min=1), @@ -44,6 +46,7 @@ async def to_code(config): if config[CONF_SCROLL]: cg.add(var.set_scroll(True)) cg.add(var.set_continuous(config[CONF_CONTINUOUS])) + cg.add(var.set_swap_bits(config[CONF_SWAP_BITS])) cg.add(var.set_scroll_speed(config[CONF_SCROLL_SPEED])) cg.add(var.set_scroll_dwell(config[CONF_SCROLL_DWELL])) cg.add(var.set_size(config[CONF_SIZE])) From e084d136327eda0b08704a9a1cd606a5dbb4c77b Mon Sep 17 00:00:00 2001 From: Maksym Kozlenko Date: Fri, 15 Aug 2025 23:10:11 +1000 Subject: [PATCH 17/17] Update font.h --- components/ht16k33_alpha/font.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/ht16k33_alpha/font.h b/components/ht16k33_alpha/font.h index 4b783f4f..2915755a 100644 --- a/components/ht16k33_alpha/font.h +++ b/components/ht16k33_alpha/font.h @@ -54,7 +54,8 @@ static const uint16_t alphafonttable[] PROGMEM = { 0b0000000011011011, // 2 0b0000000010001111, // 3 0b0000000011100110, // 4 -0b0010000001101001, // 5 +// 0b0010000001101001, // 5 +0b0000000011101101, // 5 fix 0b0000000011111101, // 6 0b0000000000000111, // 7 0b0000000011111111, // 8