В этом уроке мы научимся использовать 4-разрядный 7-сегментный светодиодный дисплей TM1637 вместе с платой Raspberry Pi Pico. Эти дисплеи дешевле и лучше всего подходят для отображения данных датчиков, времени, секундомера, случайных чисел и т. д. Он похож на другие 4-разрядные 7-сегментные дисплеи, но имеет встроенную в него микросхему драйвера светодиода TM1637. Это устраняет дополнительную проводку и позволяет управлять дисплеем с помощью всего 2 проводов.
В этом руководстве мы узнаем о том, как управлять дисплеем TM1637 с платы Raspberry Pi Pico с использованием кода на MicroPython. Мы отобразим текст, случайные числа или что угодно, используя библиотеку и код MicroPython.
Ранее на нашем сайте мы рассматривали аналогичного семисегментного индикатора к другим микроконтроллерам/платам:
Также на нашем сайте рассматривался проект часов на Arduino и 4-х разрядном семисегментном индикаторе.
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Модуль TM1637 (купить на AliExpress).
- Кабель Micro-USB.
- Макетная плата.
- Соединительные провода/перемычки.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
4-разрядный 7-сегментный светодиодный дисплей TM1637
Для 4-разрядных 7-сегментных дисплеев нам обычно требуется 12 соединительных контактов. Но интегральная схема (ИС) TM1637 устанавливается на задней стороне модуля дисплея, что сокращает общее количество проводов до 4. Два контакта требуются для подключения питания, а два других контакта используются для управления сегментами.
Модуль TM1637 включает четыре 0,36-дюймовых 7-сегментных дисплея. Модуль имеет «двоеточие» в центре, используемое для создания часов или проектов на основе времени. На задней стороне дисплея находится недорогой последовательный светодиодный драйвер от Titan MicroElectronics под названием TM1637. Драйвер TM1637 поддерживает множество функций, включая включение/выключение и управление яркостью светодиодов, а также доступ к каждому из сегментов.
Модуль работает в диапазоне от 3,3 В до 5 В с потреблением тока 80 мА. Мы можем подключить TM1637 к Raspberry Pi Pico или любому другому микроконтроллеру, используя два контакта данных. Для TM1637 существует специальная библиотека MicroPython Library, которая устраняет сложности и упрощает взаимодействие с дисплеем.
Распиновка модуля TM1637
Для подключения на модуле имеется 4-контактный штекерный разъем.
1. GND: Контакт заземления.
2. VCC: Контакт питания 3,3–5 В.
3. DIO: Контакт ввода/вывода данных.
4. CLK: Контакт входа тактового сигнала (сигнала синхронизации).
Схема проекта
Схема подключения 4-разрядного 7-сегментного дисплея TM1637 к плате Raspberry Pi Pico представлена на следующем рисунке.
Подключите контакты VCC, GND, DIO и CLK TM1637 к контактам 3,3 В, GND, GP27 и GP26 Raspberry Pi Pico.
Код программы на MicroPython
Для взаимодействия модуля TM1637 с платой Raspberry Pi Pico требуется библиотека MicroPython. Поэтому у нас есть будет два файла: «tm1637.py» и «main.py».
tm1637.py
Откройте Thonny IDE и вставьте следующий код в Thonny Editor. Сохраните файл на Raspberry Pi Pico под именем 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
Откройте другую вкладку и сохраните этот файл на Raspberry Pi Pico под именем 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.
Теперь вы сможете увидеть как на дисплее TM1637 будут отображаться символы и цифры.