Overview
In this tutorial, we will learn how to use the TM1637 4-digit 7-segment LED display with Raspberry Pi Pico. These displays are cheaper & best for displaying sensor data, time, stopwatch, random numbers, etc. It is similar to other 4-digit 7-segment displays but has a TM1637 LED Driver IC embedded in it. This removes the extra wiring and using only 2 wires the display can be controlled.
In this guide, we will learn about the method to use TM1637 with Raspberry Pi Pico using the MicroPython Code. We will display some text, random numbers, or anything you like using the TM1637 MicroPython library and code. Earlier we used TM1637 with Arduino to display various numbers and characters.
Components Required
In this guide, I used Elecrow Raspberry Pi Pico Starter Kit to test different Modules. You can buy the kit and perform some other operations as well. From this kit, you can use the following components.
- Raspberry Pi Pico Board -1
- TM1637 Module – 1
- Breadboard -1
- Jumper Wires – 4
- Micro-USB Cable
TM1637 4-digit 7-segment LED display
The Bare 4-digit 7-segment displays usually require 12 connection pins. But the TM1637 IC is mounted on the back of the display module, which reduces the total wire to 4. Two pins are required for the power connections and the other two pins are used to control the segments.
The TM1637 module includes four 0.36″ segment 7-segment displays. The module has a ‘colon’ at the center useed to create clock or time-based projects. At the back of the display, there is an inexpensive serial LED driver from Titan MicroElectronics called TM1637. The TM1637 supports many functions – including ON/OFF and brightness control of the LEDs as well as access to each of the segments.
The module operates between 3.3V to 5V with a current consumption of 80mA. We can interface TM1637 with Raspberry Pi Pico or any other microcontroller using the two data pins. There is a dedicated MicroPython Library Library for TM1637 that removes the complexities and makes it easier to communicate with the display.
TM1637 Module Pinout
There is a 4-pin male header on the module for making connections.
1. GND: Ground Pin
2. VCC: 3.3V to 5V power supply Pin
3. DIO: Data Input/Output Pin
4. CLK: Clock Input Pin
Interfacing TM1637 with Raspberry Pi Pico
Now let us interface the TM1637 4-Digit 7-Segment Display with the Raspberry Pi Pico Board using the MicroPython Code. Here is the connection diagram.
Connect the VCC, GND, DIO & CLK pin of TM1637 to 3.3V, GND, GP27 & GP26 of Raspberry Pi Pico.
MicroPython Code/Program
The TM1637 requires MicroPython library for interfacing with Raspberry Pi Pico. Therefore we have codes here as “tm1637.py” & “main.py“.
tm1637.py
Open your Thonny IDE and paste the following code in Thonny Editor. Save the file to Raspberry Pi Pico with the name tm1637.py.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 |
from micropython import const from machine import Pin from time import sleep_us, sleep_ms TM1637_CMD1 = const(64) # 0x40 data command TM1637_CMD2 = const(192) # 0xC0 address command TM1637_CMD3 = const(128) # 0x80 display control command TM1637_DSP_ON = const(8) # 0x08 display on TM1637_DELAY = const(10) # 10us delay between clk/dio pulses TM1637_MSB = const(128) # msb is the decimal point or the colon depending on your display # 0-9, a-z, blank, dash, star _SEGMENTS = bytearray(b'\x3F\x06\x5B\x4F\x66\x6D\x7D\x07\x7F\x6F\x77\x7C\x39\x5E\x79\x71\x3D\x76\x06\x1E\x76\x38\x55\x54\x3F\x73\x67\x50\x6D\x78\x3E\x1C\x2A\x76\x6E\x5B\x00\x40\x63') class TM1637(object): """Library for quad 7-segment LED modules based on the TM1637 LED driver.""" def __init__(self, clk, dio, brightness=7): self.clk = clk self.dio = dio if not 0 <= brightness <= 7: raise ValueError("Brightness out of range") self._brightness = brightness self.clk.init(Pin.OUT, value=0) self.dio.init(Pin.OUT, value=0) sleep_us(TM1637_DELAY) self._write_data_cmd() self._write_dsp_ctrl() def _start(self): self.dio(0) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) def _stop(self): self.dio(0) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.dio(1) def _write_data_cmd(self): # automatic address increment, normal mode self._start() self._write_byte(TM1637_CMD1) self._stop() def _write_dsp_ctrl(self): # display on, set brightness self._start() self._write_byte(TM1637_CMD3 | TM1637_DSP_ON | self._brightness) self._stop() def _write_byte(self, b): for i in range(8): self.dio((b >> i) & 1) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) self.clk(1) sleep_us(TM1637_DELAY) self.clk(0) sleep_us(TM1637_DELAY) def brightness(self, val=None): """Set the display brightness 0-7.""" # brightness 0 = 1/16th pulse width # brightness 7 = 14/16th pulse width if val is None: return self._brightness if not 0 <= val <= 7: raise ValueError("Brightness out of range") self._brightness = val self._write_data_cmd() self._write_dsp_ctrl() def write(self, segments, pos=0): """Display up to 6 segments moving right from a given position. The MSB in the 2nd segment controls the colon between the 2nd and 3rd segments.""" if not 0 <= pos <= 5: raise ValueError("Position out of range") self._write_data_cmd() self._start() self._write_byte(TM1637_CMD2 | pos) for seg in segments: self._write_byte(seg) self._stop() self._write_dsp_ctrl() def encode_digit(self, digit): """Convert a character 0-9, a-f to a segment.""" return _SEGMENTS[digit & 0x0f] def encode_string(self, string): """Convert an up to 4 character length string containing 0-9, a-z, space, dash, star to an array of segments, matching the length of the source string.""" segments = bytearray(len(string)) for i in range(len(string)): segments[i] = self.encode_char(string[i]) return segments def encode_char(self, char): """Convert a character 0-9, a-z, space, dash or star to a segment.""" o = ord(char) if o == 32: return _SEGMENTS[36] # space if o == 42: return _SEGMENTS[38] # star/degrees if o == 45: return _SEGMENTS[37] # dash if o >= 65 and o <= 90: return _SEGMENTS[o-55] # uppercase A-Z if o >= 97 and o <= 122: return _SEGMENTS[o-87] # lowercase a-z if o >= 48 and o <= 57: return _SEGMENTS[o-48] # 0-9 raise ValueError("Character out of range: {:d} '{:s}'".format(o, chr(o))) def hex(self, val): """Display a hex value 0x0000 through 0xffff, right aligned.""" string = '{:04x}'.format(val & 0xffff) self.write(self.encode_string(string)) def number(self, num): """Display a numeric value -999 through 9999, right aligned.""" # limit to range -999 to 9999 num = max(-999, min(num, 9999)) string = '{0: >4d}'.format(num) self.write(self.encode_string(string)) def numbers(self, num1, num2, colon=True): """Display two numeric values -9 through 99, with leading zeros and separated by a colon.""" num1 = max(-9, min(num1, 99)) num2 = max(-9, min(num2, 99)) segments = self.encode_string('{0:0>2d}{1:0>2d}'.format(num1, num2)) if colon: segments[1] |= 0x80 # colon on self.write(segments) def temperature(self, num): if num < -9: self.show('lo') # low elif num > 99: self.show('hi') # high else: string = '{0: >2d}'.format(num) self.write(self.encode_string(string)) self.write([_SEGMENTS[38], _SEGMENTS[12]], 2) # degrees C def show(self, string, colon=False): segments = self.encode_string(string) if len(segments) > 1 and colon: segments[1] |= 128 self.write(segments[:4]) def scroll(self, string, delay=250): segments = string if isinstance(string, list) else self.encode_string(string) data = [0] * 8 data[4:0] = list(segments) for i in range(len(segments) + 5): self.write(data[0+i:4+i]) sleep_ms(delay) class TM1637Decimal(TM1637): """Library for quad 7-segment LED modules based on the TM1637 LED driver. This class is meant to be used with decimal display modules (modules that have a decimal point after each 7-segment LED). """ def encode_string(self, string): """Convert a string to LED segments. Convert an up to 4 character length string containing 0-9, a-z, space, dash, star and '.' to an array of segments, matching the length of the source string.""" segments = bytearray(len(string.replace('.',''))) j = 0 for i in range(len(string)): if string[i] == '.' and j > 0: segments[j-1] |= TM1637_MSB continue segments[j] = self.encode_char(string[i]) j += 1 return segments |
main.py
Open another tab and save this file on Raspberry Pi Pico with name main.py.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import tm1637 from machine import Pin from utime import sleep mydisplay = tm1637.TM1637(clk=Pin(26), dio=Pin(27)) # Show a word mydisplay.show("Pico") sleep(1) #blank the screen mydisplay.show(" ") sleep(1) #show numbers mydisplay.number(-123) sleep(1) #show a time with colon mydisplay.numbers(12,59) sleep(1) #adjust the brightness to make it loewr mydisplay.brightness(0) sleep(1) #show scrolling text mydisplay.scroll("Hello World 123", delay=200) sleep(1) #show temperature mydisplay.temperature(99) sleep(1) #blank the screen again mydisplay.show(" ") |
Run the script by clciking on play button.
Now you will be able to see the TM1637 Display displaying so many characters and numbers.
This is how you can use 4-Digit 7-Segment LED Display with Raspberry Pi Pico using the MicroPython Code. You can also make Traffic Light Controller using this TM1637 Display













1 Comment
Thank you very much ; that’s really helpful!