I have a very simple setup which works fine with an Uno.

enter image description here

#include <SevenSegmentTM1637.h>
#include <SevenSegmentExtended.h>

const byte PIN_CLK = 2;
const byte PIN_DIO = 3;
SevenSegmentExtended display(PIN_CLK, PIN_DIO);

void setup() {


void loop() {}

When I use the very same setup with a Pro Mini (XCSOURCE ATMEGA 328P, 5V 16Mhz), the display doesn't light up. I get monitor outputs and can blink the onboard LED, but no reaction from the TM1637 display.

I get this output in the console:

�E%MA1e� 10001111
Acknowledged: 0
ADDR :  11000000
DATA0:  0
write byte: 84
ADDR :  11000000
DATA0:  1111000
write byte: 69
ADDR :  11000000
DATA0:  1111000
write byte: 83
ADDR :  11000000
DATA0:  1111000
write byte: 84
ADDR :  11000000
DATA0:  1111000

Does anyone have an idea how to debug or fix this?

  • Could you please post a schematic?
    – sa_leinad
    Nov 29, 2016 at 0:33
  • I just added it to my original question.
    – Railsana
    Nov 29, 2016 at 9:10
  • You haven't created the display object. Shouldn't you have a line somewhere that creates the object: SevenSegmentTM1637 display(PIN_CLK, PIN_DIO); Nov 30, 2016 at 18:45
  • Yes, sorry. I forgot to copy that in. I edited the question now.
    – Railsana
    Dec 1, 2016 at 9:04
  • What would be the output of the console on an UNO? Dec 1, 2016 at 10:25

2 Answers 2


Since you're using a Grove Display, I believe it will be using I2C.

For better debugging, try using the actual I2C pins on your Pro mini, which are A4 and A5.

I2C: A4 (SDA) and A5 (SCL). Support I2C (TWI) communication using the Wire library. https://www.arduino.cc/en/Main/ArduinoBoardProMini

I2C may need pull-up resistors on your data lines.


It can also be nice to use "verified to be working" code, like example code from the manufacturer.

 * TM1637.cpp
 * A library for the 4 digit display
#include "TM1637.h"
#define CLK 39 //pins definitions for TM1637 and can be changed to other ports
#define DIO 38
TM1637 tm1637(CLK,DIO);
void setup()
void loop()
    int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//0~9,A,b,C,d,E,F
    int8_t ListDisp[4];
    unsigned char i = 0;
    unsigned char count = 0;
        i = count;
        count ++;
        if(count == sizeof(NumTab)) count = 0;
        for(unsigned char BitSelect = 0;BitSelect < 4;BitSelect ++)
            ListDisp[BitSelect] = NumTab[i];
            i ++;
            if(i == sizeof(NumTab)) i = 0;

You will need to adapt the pin numbers.

But after these steps it should work just fine.

Source: http://wiki.seeed.cc/Grove-4-Digit_Display/

  • 1
    You will need pullups resistors 4.7K are normally a good value. Dec 1, 2016 at 13:13
  • Your answer is false, the TM1637 uses CLK and DIO not I2C. playground.arduino.cc/Main/TM1637
    – Dat Ha
    Dec 1, 2016 at 15:36
  • olimex.cl/website_MCI/static/documents/Datasheet_TM1637.pdf The wiring does show the pull-ups. And a note on the datasheet includes: "Microprocessor data realize the communication with TM1637 by means of two–wire bus interface (Note: The communication method is not equal to 12C bus protocol totally because there is no slave address)". So I believe that, in hardware it's I2C but not completely in software. But it indeed appears that you can put it on any of the pins.
    – aaa
    Dec 1, 2016 at 15:43
  • I'm actually unsure if the pull-ups are on the board already. And it seems to work with regular pins aswel, but then again, there also is a software I2C library. But if it doesn't work, I would use the hardware-wise method.
    – aaa
    Dec 1, 2016 at 15:48
  • Holy s***. The pins A4 and A5 really are the solution.
    – Railsana
    Dec 1, 2016 at 19:31

4.7k resistors on 2 and 3 pins does not help.

Works great if the tm1637 directly connected to 12 and 13 pins.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.