Skip to content

Custom 6-Digit Display TM1637 #43

@jasonacox

Description

@jasonacox

Request from email related to supporting a custom built 6 digit display:

While searching for a library to handle 6 DIGIs, I came across your TM1637TinyDisplay driver library – amazing work, by the way!

I’ve connected 6 seven-segment LEDs to the TM1637, arranged from left to right on GRID1 to GRID6.

For testing, I’m using the following commands:
display.showNumber(123456);
or
display.showNumberDec(123456);

However, the display shows “321654.”

I’m not very experienced in this field
In the TM1637TinyDisplay6.cpp file, I found the following:
const uint8_t digitmap[] = { 2, 1, 0, 5, 4, 3 };

Changing it to:
const uint8_t digitmap[] = { 0, 1, 2, 3, 4, 5 };
makes the display show “543216.”

I’ve tried various combinations without success:
// Digit sequence map for 6 digit displays
const uint8_t digitmap[] = { 2, 1, 0, 5, 4, 3 }; // 321654
// const uint8_t digitmap[] = { 0, 1, 2, 3, 4, 5 }; // 543216
// const uint8_t digitmap[] = { 2, 4, 5, 1, 0, 3 }; //
// const uint8_t digitmap[] = { 3, 5, 1, 2, 4, 0 }; // 654321
// const uint8_t digitmap[] = { 0, 4, 2, 1, 5, 3 }; // 321654
// const uint8_t digitmap[] = { 2, 4, 0, 3, 5, 1 }; // 165432

I suspect there might also be something else in the code that needs adjusting.

Could you please guide me on what I need to change to ensure the DIGIs are addressed in the correct order? GRID1 should correspond to DIGI 1 (left), and GRID6 to DIGI 6 (right).

For the 6 digit displays you buy from Amazon and AliExpress, the digits are not sequential (requires a map) and the 7-segment LED data must be uploaded in reverse order:

Digit 1 - GRID3
Digit 2 - GRID2
Digit 3 - GRID1
Digit 4 - GRID6
Digit 5 - GRID5
Digit 6 - GRID4

The default TM1637TinyDisplay code is set to work with that. If you want to change the code to make it work with a more logical wiring:

// original
const uint8_t digitmap[] = { 0, 1, 2, 3, 4, 5 }; 

You may need to update this function to handle the start command:

void TM1637TinyDisplay6::writeBuffer()
{
  uint8_t dot = 0;
  
  // Write COMM1
  start();
  writeByte(TM1637_I2C_COMM1);
  stop();

  // Write COMM2 + start with last digit address on 6-digit display
  start();
  writeByte(TM1637_I2C_COMM2 + (3 & 0x07)); // may need to change 3 to something else, e.g. 0-7

  // Write the data bytes
  if(m_flipDisplay) {
    for (uint8_t k=0; k < MAXDIGITS; k++) {
      dot = 0;
      if((k - 1) >= 0 ) {
        dot = digitsbuf[k - 1] & 0b10000000;
      }
      uint8_t orig = digitsbuf[k];
      uint8_t flip = ((orig >> 3) & 0b00000111) + 
        ((orig << 3) & 0b00111000) + (orig & 0b01000000) + dot;
      writeByte(flip);
    } 
  }
  else {
    for (uint8_t k=0; k < MAXDIGITS; k++) {
      // 6 digit display - send in reverse order
      writeByte(digitsbuf[MAXDIGITS - 1 - k]); 
    }
  }
  stop();
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions