Arduino Nano 33 IoT - TM1637 4-Digit 7-Segment Display

Discover how to use a TM1637 4-digit 7-segment display with the Arduino Nano 33 IoT. The Nano 33 IoT runs a SAMD21 Cortex-M0+ processor at 48 MHz, includes built-in Wi-Fi and Bluetooth Low Energy, and operates at 3.3V logic. Despite all that, it keeps the same compact Nano footprint. The TM1637 module works at both 3.3V and 5V, so it connects directly without level shifting.

Along the way, you will discover:

Arduino Nano 33 IoT TM1637 4-Digit 7-Segment Display

Hardware Preparation

1×Arduino Nano 33 IoT
1×Micro USB Cable
1×TM1637 4-digit 7-segment Display (colon-separated)
1×Jumper Wires
1×Recommended: Screw Terminal Expansion Board for Arduino Nano
1×Recommended: Breakout Expansion Board for Arduino Nano
1×Recommended: Power Splitter for Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Disclosure: Some of the links provided in this section are Amazon affiliate links. We may receive a commission for any purchases made through these links at no additional cost to you.
Additionally, some of these links are for products from our own brand, DIYables .

Introducing the TM1637 Display Module

The TM1637 is a controller IC purpose-built for driving 7-segment LED displays. It manages all the LED multiplexing internally and stores the display data in its own registers. Once you send a value to the chip, the display holds it without any refresh loop from your code. Communication happens through a lightweight 2-wire protocol using CLK and DIO lines.

What makes this module useful:

  • 4 digits with 7 segments and a decimal point each
  • Colon LED between digit 1 and digit 2 for clock-style readouts
  • 8 brightness levels adjustable through software
  • 2-wire serial interface, compatible with 3.3V and 5V
  • Persistent display - no continuous updates needed
Function Pin
CLK Clock signal input
DIO Data input/output
VCC Power supply (3.3V or 5V)
GND Ground

Any two digital pins on the Nano 33 IoT can serve as CLK and DIO. The examples use pins 2 and 3.

Wiring Diagram

Connect the TM1637 module to the Arduino Nano 33 IoT:

  • CLK to pin 9
  • DIO to pin 10
  • VCC to 3.3V
  • GND to GND
The wiring diagram between Arduino Nano and 33 IoT TM1637 4-Digit 7-Segment Display

This image is created using Fritzing. Click to enlarge image

Preparing the Library

  1. Connect the Arduino Nano 33 IoT to your computer using a Micro-B USB cable.
  2. In Arduino IDE, choose Arduino NANO 33 IoT as the board and select the correct port.
  3. Open the Libraries panel from the left sidebar.
  4. Search for "DIYables_4Digit7Segment_TM1637" and locate the one published by DIYables.
  5. Press Install to add it.
Arduino TM1637 4-Digit 7-Segment Display library

No additional dependencies needed - everything is bundled in.

Note: If the board does not appear in the board list, install the Arduino SAMD Boards core via the Boards Manager.

Core Sketch

The core structure that every DIYables_4Digit7Segment_TM1637 sketch builds on:

#include <DIYables_4Digit7Segment_TM1637.h> #define CLK_PIN 9 #define DIO_PIN 10 DIYables_4Digit7Segment_TM1637 display(CLK_PIN, DIO_PIN); void setup() { display.begin(); display.print(1234); } void loop() { }

Pass the pin numbers to the constructor, call begin(), and you are ready to send data to the display.

Discover - Display Integer Numbers

Explore how the display handles various integer values including negatives and zero-padded output.

/* * This Arduino Nano 33 IoT code was developed by newbiely.com * * This Arduino Nano 33 IoT code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-iot/arduino-nano-33-iot-tm1637-4-digit-7-segment-display */ /* * DIYables_4Digit7Segment_TM1637 - Integer Example * * Displays various integer values on a 4-digit 7-segment display * with TM1637 driver, including zero-padded numbers. * * Tutorial: https://diyables.io/products/4-digit-7-segment-display-led-tm1637-with-colon * * TESTED HARDWARE: * - Arduino Uno R3 * - Arduino Uno R4 WiFi * - Arduino Uno R4 Minima * - Arduino Mega * - Arduino Due * - Arduino Giga * - DIYables STEM V3: https://diyables.io/stem-v3 * - DIYables STEM V4 IoT: https://diyables.io/stem-v4-iot * - DIYables STEM V4B IoT: https://diyables.io/stem-v4b-iot * - DIYables STEM V4B Edu: https://diyables.io/stem-v4-edu * - DIYables MEGA2560 R3: https://diyables.io/atmega2560-board * - DIYables Nano R3: https://diyables.io/nano-board * - DIYables ESP32 Board: https://diyables.io/esp32-board * - DIYables ESP32 S3, Uno-form factor: https://diyables.io/esp32-s3-uno * - It is expected to work with other boards */ #include <DIYables_4Digit7Segment_TM1637.h> // Pin configuration - change to match your wiring #define CLK_PIN 9 #define DIO_PIN 10 DIYables_4Digit7Segment_TM1637 display(CLK_PIN, DIO_PIN); void setup() { Serial.begin(9600); display.begin(); Serial.println("TM1637 Integer Example"); } void loop() { // Display various integers int numbers[] = {0, 42, 1234, -5, -123, 9999}; int count = sizeof(numbers) / sizeof(numbers[0]); for (int i = 0; i < count; i++) { display.print(numbers[i]); Serial.print("Displaying: "); Serial.println(numbers[i]); delay(2000); } // Display with zero padding display.print(42, true); // Shows "0042" Serial.println("Displaying: 0042 (zero-padded)"); delay(2000); }

Give It a Try

  • Connect the TM1637 module to the Nano 33 IoT as shown in the wiring diagram.
  • Connect the board to your computer with a Micro-B USB cable.
  • In Arduino IDE, select the board and port, paste the code, and press Upload.
  • Open the Serial Monitor to see what happens.

The display cycles through 0, 42, 1234, -5, -123, 9999, and then shows "0042" with zero-padding.

API Essentials

Method Role Usage Example
print(int) Display an integer (-999 to 9999) display.print(1234)
print(int, true) Display with leading zeros display.print(42, true)
clear() Clear the display display.clear()

Discover - Display Text and Temperature

Explore how the display renders text strings and temperature values with the degree symbol.

/* * This Arduino Nano 33 IoT code was developed by newbiely.com * * This Arduino Nano 33 IoT code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-iot/arduino-nano-33-iot-tm1637-4-digit-7-segment-display */ /* * DIYables_4Digit7Segment_TM1637 - TextAndDegree Example * * Displays text strings, special characters, and temperature * on a 4-digit 7-segment display with TM1637 driver. * * Tutorial: https://diyables.io/products/4-digit-7-segment-display-led-tm1637-with-colon * * TESTED HARDWARE: * - Arduino Uno R3 * - Arduino Uno R4 WiFi * - Arduino Uno R4 Minima * - Arduino Mega * - Arduino Due * - Arduino Giga * - DIYables STEM V3: https://diyables.io/stem-v3 * - DIYables STEM V4 IoT: https://diyables.io/stem-v4-iot * - DIYables STEM V4B IoT: https://diyables.io/stem-v4b-iot * - DIYables STEM V4B Edu: https://diyables.io/stem-v4-edu * - DIYables MEGA2560 R3: https://diyables.io/atmega2560-board * - DIYables Nano R3: https://diyables.io/nano-board * - DIYables ESP32 Board: https://diyables.io/esp32-board * - DIYables ESP32 S3, Uno-form factor: https://diyables.io/esp32-s3-uno * - It is expected to work with other boards */ #include <DIYables_4Digit7Segment_TM1637.h> // Pin configuration - change to match your wiring #define CLK_PIN 9 #define DIO_PIN 10 DIYables_4Digit7Segment_TM1637 display(CLK_PIN, DIO_PIN); void setup() { Serial.begin(9600); display.begin(); Serial.println("TM1637 Text and Degree Example"); } void loop() { // Display text strings const char* texts[] = {"HELP", "Hi", "COOL", "done"}; for (int i = 0; i < 4; i++) { display.print(texts[i]); Serial.print("Displaying: "); Serial.println(texts[i]); delay(2000); } // Display temperature with degree symbol display.printTemperature(25, 'C'); // Shows "25°C" Serial.println("Displaying: 25 degrees C"); delay(2000); display.printTemperature(72, 'F'); // Shows "72°F" Serial.println("Displaying: 72 degrees F"); delay(2000); // Display string with degree constant char buf[5]; buf[0] = '2'; buf[1] = '5'; buf[2] = DIYables_4Digit7Segment_TM1637::DEGREE; buf[3] = 'C'; buf[4] = '\0'; display.print(buf); // Same as printTemperature(25, 'C') Serial.println("Displaying: 25 degrees C (via print)"); delay(2000); }

Give It a Try

  • Wire the module as shown above.
  • Upload the sketch and open the Serial Monitor.

The display shows "HELP", "Hi", "COOL", "done", then temperatures "25°C" and "72°F".

API Essentials

Method Role Usage Example
print(const char*) Display a text string (up to 4 chars) display.print("HELP")
printTemperature(int, char) Display temperature with degree and unit display.printTemperature(25, 'C')
DEGREE Degree symbol constant display.DEGREE

Discover - Display Time with Blinking Colon

Explore clock-style time display with the colon toggling every half second.

/* * This Arduino Nano 33 IoT code was developed by newbiely.com * * This Arduino Nano 33 IoT code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-iot/arduino-nano-33-iot-tm1637-4-digit-7-segment-display */ /* * DIYables_4Digit7Segment_TM1637 - Time Example * * Displays time in HH:MM format with blinking colon separator * on a 4-digit 7-segment display with TM1637 driver. * * Tutorial: https://diyables.io/products/4-digit-7-segment-display-led-tm1637-with-colon * * TESTED HARDWARE: * - Arduino Uno R3 * - Arduino Uno R4 WiFi * - Arduino Uno R4 Minima * - Arduino Mega * - Arduino Due * - Arduino Giga * - DIYables STEM V3: https://diyables.io/stem-v3 * - DIYables STEM V4 IoT: https://diyables.io/stem-v4-iot * - DIYables STEM V4B IoT: https://diyables.io/stem-v4b-iot * - DIYables STEM V4B Edu: https://diyables.io/stem-v4-edu * - DIYables MEGA2560 R3: https://diyables.io/atmega2560-board * - DIYables Nano R3: https://diyables.io/nano-board * - DIYables ESP32 Board: https://diyables.io/esp32-board * - DIYables ESP32 S3, Uno-form factor: https://diyables.io/esp32-s3-uno * - It is expected to work with other boards */ #include <DIYables_4Digit7Segment_TM1637.h> // Pin configuration - change to match your wiring #define CLK_PIN 9 #define DIO_PIN 10 DIYables_4Digit7Segment_TM1637 display(CLK_PIN, DIO_PIN); int hours = 12; int minutes = 30; bool colonOn = true; void setup() { Serial.begin(9600); display.begin(); Serial.println("TM1637 Time Example"); Serial.println("Displaying 12:30 with blinking colon"); } void loop() { display.printTime(hours, minutes, colonOn); delay(500); // Toggle colon every 500ms for blinking effect colonOn = !colonOn; }

Give It a Try

  • Upload and observe "12:30" with the colon blinking on and off.

API Essentials

Method Role Usage Example
printTime(int, int) Display time HHMM with colon display.printTime(12, 30)
printTime(int, int, bool) Display time, control colon on/off display.printTime(12, 30, false)

Discover - Individual Digit Control

Explore setting each digit position independently with numbers, characters, and the colon.

/* * This Arduino Nano 33 IoT code was developed by newbiely.com * * This Arduino Nano 33 IoT code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-iot/arduino-nano-33-iot-tm1637-4-digit-7-segment-display */ /* * DIYables_4Digit7Segment_TM1637 - IndividualDigits Example * * Sets individual digits, characters, and colon on a 4-digit * 7-segment display with TM1637 driver. * * Tutorial: https://diyables.io/products/4-digit-7-segment-display-led-tm1637-with-colon * * TESTED HARDWARE: * - Arduino Uno R3 * - Arduino Uno R4 WiFi * - Arduino Uno R4 Minima * - Arduino Mega * - Arduino Due * - Arduino Giga * - DIYables STEM V3: https://diyables.io/stem-v3 * - DIYables STEM V4 IoT: https://diyables.io/stem-v4-iot * - DIYables STEM V4B IoT: https://diyables.io/stem-v4b-iot * - DIYables STEM V4B Edu: https://diyables.io/stem-v4-edu * - DIYables MEGA2560 R3: https://diyables.io/atmega2560-board * - DIYables Nano R3: https://diyables.io/nano-board * - DIYables ESP32 Board: https://diyables.io/esp32-board * - DIYables ESP32 S3, Uno-form factor: https://diyables.io/esp32-s3-uno * - It is expected to work with other boards */ #include <DIYables_4Digit7Segment_TM1637.h> // Pin configuration - change to match your wiring #define CLK_PIN 9 #define DIO_PIN 10 DIYables_4Digit7Segment_TM1637 display(CLK_PIN, DIO_PIN); void setup() { Serial.begin(9600); display.begin(); Serial.println("TM1637 Individual Digits Example"); } void loop() { // Set individual numbers on each digit position display.clear(); display.setNumber(0, 1); display.setNumber(1, 2); display.setNumber(2, 3); display.setNumber(3, 4); Serial.println("Displaying: 1234"); delay(2000); // Turn colon on display.setColon(true); Serial.println("Displaying: 12:34"); delay(2000); // Turn colon off display.setColon(false); Serial.println("Displaying: 1234"); delay(2000); // Set individual characters display.clear(); display.setChar(0, 'H'); display.setChar(1, 'E'); display.setChar(2, 'L'); display.setChar(3, 'P'); Serial.println("Displaying: HELP"); delay(2000); // Mix characters and numbers with colon display.clear(); display.setChar(0, 'A'); display.setNumber(1, 3); display.setChar(2, 'b'); display.setNumber(3, 7); display.setColon(true); Serial.println("Displaying: A3:b7"); delay(2000); // Blinking colon effect display.clear(); display.setNumber(0, 1); display.setNumber(1, 2); display.setNumber(2, 3); display.setNumber(3, 0); Serial.println("Blinking colon: 12:30"); for (int i = 0; i < 5; i++) { display.setColon(true); delay(500); display.setColon(false); delay(500); } delay(1000); }

Give It a Try

  • Upload and see the display cycle through different digit and character combinations.

API Essentials

Method Role Usage Example
setNumber(int, int) Set a digit (0-9) at position 0-3 display.setNumber(0, 1)
setChar(int, char) Set a character at position 0-3 display.setChar(0, 'H')
setColon(bool) Turn colon on or off display.setColon(true)
setSegments(int, uint8_t) Set raw segments at position 0-3 display.setSegments(0, 0x76)

Troubleshoot

  • Display is blank -- Check wiring. Verify CLK and DIO are connected to the right pins and VCC goes to 3.3V.
  • Wrong characters on the display -- CLK and DIO may be swapped. Try switching the two wires.
  • Display too dim -- Call setBrightness(7) for maximum brightness.
  • Library not found during compile -- Install DIYables_4Digit7Segment_TM1637 from the Library Manager.
  • Board not recognized -- Make sure you have the Arduino SAMD Boards core installed via the Boards Manager.

Platform Support

Built on Arduino standard APIs - runs on every Arduino-compatible platform (architectures=*).

※ OUR MESSAGES

  • As freelancers, We are AVAILABLE for HIRE. See how to outsource your project to us
  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!