Если вы захотите в своем проекте использовать четыре обычных семисегментных индикатора, то для управления ими вам потребуется задействовать цифровых контактов микроконтроллера. Для платы Arduino – это почти все ее доступные цифровые контакты. Решить данную проблему с использованием большого количества контактов микроконтроллера можно за счет специализированных модулей семисегментных индикаторов, позволяющих управлять данными индикаторами с помощью относительно небольшого числа контактов. Одним из подобных модулей является модуль 4-х символьного семисегментного индикатора TM1637 (TM1637 Based 4 Bits Red Digital Tube LED Display Module). В данной статье мы рассмотрим принципы его работы и его подключение к плате Arduino.
Также на нашем сайте мы рассматривали и другие проекты с использованием 4-х символьных семисегментных индикаторов:
- подключение семисегментного индикатора к микроконтроллеру PIC;
- часы на Arduino и 4-х разрядном семисегментном индикаторе.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Модуль TM1637 (купить на AliExpress).
Принципы работы модуля семисегментных индикаторов TM1637
Общие принципы работы модуля
TM1637 представляет собой разновидность контроллера светодиодных дисплеев. Также данная микросхема позволяет управлять яркостью подключенных дисплеев (индикаторов). Микросхема поставляется в корпусах типа DIP и SOIC и находит широкое применение в микроволновках, индукционных электроплитах и других бытовых электрических устройствах.
Также микросхема значительно упрощает написание программы управления семисегментными индикаторами с помощью микроконтроллера. В данном случае вам необходимо просто последовательно передать в нее данные, а все заботы по обновлению состояния индикаторов она берет на себя, что снижает нагрузку на микроконтроллер. Также, если присмотреться к модулю TM1637 внимательнее, то между 2-м и 3-м семисегментными индикаторами вы увидите "двоеточие", что делает его применение очень удобным в проектах, в которых требуется отображение времени.
Рабочее напряжение для модуля составляет от 3.3V до 5V, а для приема данных он использует двухпроводную шину (two-wire bus), а не интерфейс I2C как в большинстве ЖК и OLED дисплеях. Для получения более подробной информации по модулю TM1637 вы можете посмотреть даташит на него.
Распиновка модуля семисегментных дисплеев TM1637
Распиновка модуля TM1637 показана на рисунке ниже. Он содержит 4 контакта: CLK, DIO, VCC и GND. Все эти контакты являются цифровыми, за исключением контактов VCC и GND.
Назначение контактов:
CLK – входной контакт синхронизации. Необходимо подключить к любому цифровому контакту платы Arduino Uno.
DIO – контакт приема последовательных данных (Serial Data I/O pin). Необходимо подключить к любому цифровому контакту платы Arduino Uno.
VCC – контакт подачи питания на модуль. Можно подключить к источнику питания с напряжением от 3.3V до 5V.
GND – общий провод (земля).
Компоненты модуля семисегментных дисплеев TM1637
TM1637 – это сравнительно дешевый модуль дисплея с низким энергопотреблением, который можно использовать в разнообразных проектах. Его компоненты показаны на следующем рисунке.
Модуль TM1637 состоит из двух частей: первая – это 4-х символьный семисегментный дисплей, а вторая – микросхема управления им TM1637, которая поддерживает широкий набор функций, начиная включением/выключением дисплеев/индикаторов и заканчивая регулировкой их яркости. Микросхема также содержит буфер данных, что позволяет передавать ей сразу все пакеты данных, а она будет отображать эти данные на дисплеях последовательно, что высвобождает ресурсы микроконтроллера для решения других задач.
Наиболее часто задаваемые вопросы про модуль TM1637
Что представляет собой микросхема TM1637?
Она представляет собой разновидность схемы драйвера светодиодными дисплеями с интерфейсом сканера клавиатуры и внутренне интегрированная с цифровым интерфейсом микроконтроллера, триггером данных, драйвером светодиодов и сканером клавиатуры.
Использует ли модуль интерфейс I2C?
Нет, не использует. Он использует цифровой интерфейс, поэтому его можно подключать к любым цифровым контактам микроконтроллеров (плат).
Какие типы семисегментных индикаторов существуют и какой из них использует модуль TM1637?
Существует два типа семисегментных индикаторов: с общим катодом (CC) и общим анодом (CA). Разница между ними состоит лишь в том, что в дисплее с общим катодом все катоды семи сегментов соединены вместе, а в дисплее с общим анодом вместе соединены все аноды сегментов. Модуль TM1637 использует семисегментный индикатор с общим катодом.
Схема модуля семисегментных дисплеев TM1637
Схема модуля семисегментных дисплеев TM1637 представлена на рисунке ниже. Кроме микросхемы TM1637 она содержит также 4 конденсатора и 2 резистора.
Схема проекта
Схема подключения 4-х символьного семисегментного индикатора TM1637 к плате Arduino представлена на следующем рисунке.
Как видите, его подключение к плате Arduino достаточно просто. Необходимо всего лишь подключить контакты питания модуля к контакту 3.3V или 5V платы Arduino Uno, а его линии данных подключить к цифровым контактам 3 и 4 платы Arduino Uno.
Внешний вид собранной конструкции проекта представлен на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы нам необходимо указать к каким контактам платы Arduino подключен модуль семисегментного дисплея, все остальное за нас сделает библиотека TMS1637. В целях демонстрации мы использовали пример кода из данной библиотеки.
Первым делом в коде программы мы подключим используемые библиотеки и зададим контакты CLK и DIO. Также укажем задержку между демонстрациями работы дисплея.
1 2 3 4 5 6 7 |
#include <Arduino.h> #include <TM1637Display.h> // Module connection pins (Digital Pins) #define CLK 3 #define DIO 4 // The amount of time (in milliseconds) between tests #define TEST_DELAY 2000 |
Затем зададим массив, в нем будет храниться слово dOnE – оно будет отображаться на нашем дисплее.
1 2 3 4 5 6 |
const uint8_t SEG_DONE[] = { SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O SEG_C | SEG_E | SEG_G, // n SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E }; |
Далее создадим объект для работы с ЖК дисплеем и передадим в него номера контактов CLK и DIO.
1 |
TM1637Display display(CLK, DIO); |
После этого в функции setup() инициализируем объект для работы с дисплеем, установим ему яркость и очистим его экран.
1 2 3 4 5 6 7 8 |
void setup() { // Intialize the object myDisplay.begin(); // Set the brightness of the display (0-15) myDisplay.setIntensity(2); // Clear the display myDisplay.displayClear(); } |
В функции void loop() мы будем последовательно отображать на экране дисплея набор символов. Начнем функцию loop() мы с объявления переменной, которая далее будет использоваться как счетчик цикла. Потом объявим два массива. Первый массив будет использоваться для того, чтобы зажечь все сегменты во всех индикаторах, а второй массив – чтобы их потушить. Функция setBrightness() будет использоваться для установки яркости дисплея.
1 2 3 4 |
int k; uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 }; display.setBrightness(0x0f); |
Затем включим все сегменты на время, определяемое указанной ранее величиной задержки.
1 2 3 |
// All segments on display.setSegments(data); delay(TEST_DELAY) |
В следующем фрагменте кода мы отобразим на семисегментных индикаторах цифры 0 1 2 3.
1 2 3 4 5 6 7 |
// Selectively set different digits data[0] = display.encodeDigit(0); data[1] = display.encodeDigit(1); data[2] = display.encodeDigit(2); data[3] = display.encodeDigit(3); display.setSegments(data); delay(TEST_DELAY); |
Далее отобразим число 23.
1 2 3 4 5 6 7 8 9 |
display.clear(); display.setSegments(data+2, 2, 2); delay(TEST_DELAY); display.clear(); display.setSegments(data+2, 2, 1); delay(TEST_DELAY); display.clear(); display.setSegments(data+1, 3, 1); delay(TEST_DELAY); |
Затем отобразим цифры без ведущих нулей.
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 |
// Show decimal numbers with/without leading zeros display.showNumberDec(0, false); // Expect: ___0 delay(TEST_DELAY); display.showNumberDec(0, true); // Expect: 0000 delay(TEST_DELAY); display.showNumberDec(1, false); // Expect: ___1 delay(TEST_DELAY); display.showNumberDec(1, true); // Expect: 0001 delay(TEST_DELAY); display.showNumberDec(301, false); // Expect: _301 delay(TEST_DELAY); display.showNumberDec(301, true); // Expect: 0301 delay(TEST_DELAY); display.clear(); display.showNumberDec(14, false, 2, 1); // Expect: _14_ delay(TEST_DELAY); display.clear(); display.showNumberDec(4, true, 2, 2); // Expect: 04__ delay(TEST_DELAY); display.showNumberDec(-1, false); // Expect: __-1 delay(TEST_DELAY); display.showNumberDec(-12); // Expect: _-12 delay(TEST_DELAY); display.showNumberDec(-999); // Expect: -999 delay(TEST_DELAY); display.clear(); display.showNumberDec(-5, false, 3, 0); // Expect: _-5_ delay(TEST_DELAY); display.showNumberHexEx(0xf1af); // Expect: f1Af delay(TEST_DELAY); display.showNumberHexEx(0x2c); // Expect: __2C delay(TEST_DELAY); display.showNumberHexEx(0xd1, 0, true); // Expect: 00d1 delay(TEST_DELAY); display.clear(); display.showNumberHexEx(0xd1, 0, true, 2); // Expect: d1__ delay(TEST_DELAY); |
В следующем фрагменте кода мы будем управлять яркостью свечения наших семисегментных индикаторов.
1 2 3 4 5 6 7 8 |
// Brightness Test for(k = 0; k < 4; k++) data[k] = 0xff; for(k = 0; k < 7; k++) { display.setBrightness(k); display.setSegments(data); delay(TEST_DELAY); } |
Далее сделаем для дисплея ON/OFF тест.
1 2 3 4 5 6 7 8 9 |
// On/Off test for(k = 0; k < 4; k++) { display.setBrightness(7, false); // Turn off display.setSegments(data); delay(TEST_DELAY); display.setBrightness(7, true); // Turn on display.setSegments(data); delay(TEST_DELAY); } |
И, наконец, отобразим на экране дисплея слово dOnE, которое мы задали с помощью массива в нашей программе.
Тестирование работы модуля дисплея TM1637
Тестирование работы нашего проекта показано на следующем видео. На дисплее мы последовательно будем отображать различные символы через определенные интервалы времени. Весь этот процесс займет примерно 20 секунд, после чего вы сможете наблюдать управление яркостью дисплея.
Возможные проблемы при работе с модулем TM1637
Если вы испытываете затруднения при работе с модулем TM1637, то первым делом необходимо проверить подаваемое на него питающее напряжение – оно должно быть в диапазоне от 3.3V до 5V. Если оно менее 3.3V, то модуль может работать неправильно. Если оно больше 5V – оно может повредить модуль.
Если линии питания и данных модуля работают корректно проверьте конденсаторы внизу модуля. Иногда из-за производственного брака вместо развязывающих конденсаторов нужного номинала вместо них ставят конденсаторы довольно большой емкости (1 или 10 мкФ). В этом случае удаление данных конденсаторов должно решить проблемы с работой модуля.
Также проблемы могут возникнуть из-за неправильной библиотеки для платы Arduino. Внимательно проверьте микросхему модуля и под нее подберите подходящую библиотеку. Иногда бывает так, что новая версия одной и той же микросхемы не поддерживается предыдущей версией библиотеки.
4 973 просмотров
А разве TM1637 управляет индикаторами с общим катодом ? По даташит TM1637, выводы GRID1-6 - P-channel open drain, а выводы SG1-8 - N-channel open drain - при таком раскладе у 7-сегментного индикатора общий должен быть анод.
На сайте с источником статьи указано что TM1637 управляет индикаторами с общим катодом. Возможно, это опечатка. Информация требует уточнения
В даташите на первой странице:
The display mode (8 segments*6 bit) supports output by common anode LED.
т.е. с общим анодом.
Хорошо, спасибо за уточнение