Подключение 4-разрядного 7-сегментного дисплея TM1637 к Arduino
Будь то цифровые часы, секундомер или простой счётчик — 4-разрядный 7-сегментный дисплей часто является идеальным способом отображения числовых данных в понятном и компактном формате. Но если вы когда-либо пробовали подключить обычный 7-сегментный дисплей к Arduino, вы знаете, что это может быстро занять десяток пинов и превратить вашу макетную плату в клубок проводов. К счастью, есть способ лучше.
Встречайте модуль TM1637 — маленький, но мощный драйвер, который позволяет легко управлять 4-разрядным 7-сегментным дисплеем, используя всего два пина Arduino. Всё верно: с помощью только двух линий данных вы можете управлять всеми четырьмя разрядами, а также двоеточиями и десятичными точками.
В этом руководстве мы покажем, как подключить TM1637 к Arduino, загрузить нужную библиотеку и начать отображать числа в кратчайшие сроки.
Давайте приступим!
Основы 7-сегментного дисплея
7-сегментный дисплей состоит из семи отдельных светодиодов, расположенных в форме цифры «8». Каждый из этих светодиодов называется сегментом.
Интересно, как устроена разводка этих дисплеев. Каждый сегмент имеет две точки электрического подключения, как и любой обычный светодиод. Однако только одна из этих точек подключения выведена наружу из пластикового корпуса в виде отдельного вывода. Эти выводы обозначены буквами от „a“ до „g“ — по одной букве на каждый сегмент. Другие точки подключения все соединены вместе внутри пластикового корпуса, образуя общий вывод (COM).
Чтобы зажечь дисплей, можно управлять каждым сегментом индивидуально, устанавливая его вывод в HIGH или LOW, точно так же, как с обычным светодиодом. Включая различные комбинации сегментов, можно создавать все цифры от 0 до 9. Проявив немного креативности, можно даже отображать некоторые буквы алфавита!
Обзор модуля TM1637
Модуль TM1637 объединяет 4-разрядный 7-сегментный дисплей размером 0.36 дюйма с микросхемой драйвера TM1637 производства Titan MicroElectronics. Эта удобная комбинация позволяет управлять всеми четырьмя разрядами, используя всего два пина микроконтроллера.
Этот модуль идеально подходит для проектов, где нужно отображать числа, таких как таймеры, счётчики, показания датчиков или температура. Он также имеет двоеточие посередине, что делает его отличным выбором для часов и проектов, связанных со временем.
Одно из лучших свойств TM1637 заключается в том, что он самостоятельно обновляет дисплей после обновления данных. Это означает, что ваш микроконтроллер свободен для выполнения других важных задач, вместо постоянного обновления дисплея.
Потребляемая модулем мощность зависит от количества включённых сегментов и установленного уровня яркости. Когда все сегменты включены на максимальной яркости, модуль потребляет около 80мА тока. Вы можете сэкономить энергию, снизив яркость дисплея.
Модуль TM1637 работает с напряжением питания от 3.3В до 5В. Это делает его совместимым как с 5В микроконтроллерами, такими как обычный Arduino, так и с 3.3В микроконтроллерами, такими как ESP32.
Модуль использует собственный специальный двухпроводный протокол связи. Хотя это не стандартный протокол, такой как I2C, существуют простые в использовании библиотеки Arduino, которые скрывают все сложности и делают общение с дисплеем простым.
Технические характеристики
Вот основные характеристики:
Рабочее напряжение |
3.3 – 5 В пост. тока |
|---|---|
Максимальное потребление тока |
80мА |
Защита от обратной полярности |
Да |
Размер дисплея |
42 мм x 24 мм (1.65″ x .95″) |
Высота дисплея |
12 мм (0.47″) (типичная) |
Высота символа |
9.14 мм (0.36″) |
Для получения более подробной информации о микросхеме драйвера TM1637 обратитесь к техническому описанию ниже.
Распиновка модуля TM1637
Модуль TM1637 имеет всего четыре вывода, что делает его очень простым в использовании. Вот распиновка:
CLK — вход тактового сигнала.
DIO — вывод ввода/вывода данных.
VCC — вывод питания. Подключите его к источнику питания от 3.3В до 5В.
GND — вывод заземления.
Подключение модуля TM1637 к Arduino
Подключить TM1637 к Arduino очень просто. Поскольку модуль имеет всего четыре вывода, вам понадобятся только четыре провода: два для питания и два для связи.
Начните с подключения вывода VCC модуля к выходу 5V на Arduino, а вывода GND — к одному из выводов заземления (GND) Arduino. Затем подключите вывод CLK к цифровому пину 3 на Arduino, а вывод DIO — к цифровому пину 4.
Вот краткая справочная таблица подключений:
| TM1637 Module | Arduino | |
| VCC | 5V | |
| GND | GND | |
| DIO | 4 | |
| CLK | 3 |
Эта схема показывает, как именно всё подключить:
Отличительная особенность модуля TM1637 в том, что ему не нужны определённые пины, поэтому вы можете использовать другие цифровые пины. Просто помните, что если вы используете другие пины, вам нужно будет обновить номера пинов в коде Arduino в соответствии с вашей разводкой.
Установка библиотеки
Для общения с микросхемой TM1637 вам понадобится библиотека. Отличный вариант — `библиотека TM1637Display `_, созданная Avishay Orpaz. Эта библиотека имеет множество встроенных функций, которые делают управление дисплеем простым и удобным.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на иконку Менеджер библиотек на левой боковой панели.
Введите «tm1637» в поле поиска для фильтрации результатов.
Найдите библиотеку TM1637 от Avishay Orpaz.
Нажмите кнопку Install (Установить), чтобы добавить её в Arduino IDE.
После установки библиотеки вы готовы к программированию!
Пример 1 для Arduino — базовая тестовая программа
Ниже приведена базовая тестовая программа, которая проходит через множество различных процедур. Попробуйте её; мы разберём, как работает код, чуть позже.
// Include the library
#include <TM1637Display.h>
// Define the connections pins
#define CLK 3
#define DIO 4
// Create a display object of type TM1637Display
TM1637Display display = TM1637Display(CLK, DIO);
// Create an array that turns all segments ON
const uint8_t allON[] = { 0xff, 0xff, 0xff, 0xff };
// Create an array that turns all segments OFF
const uint8_t allOFF[] = { 0x00, 0x00, 0x00, 0x00 };
// Create an array that sets individual segments per digit to display the word "dOnE"
const uint8_t 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
};
// Create degree celsius symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Degree symbol
SEG_A | SEG_D | SEG_E | SEG_F // C
};
void setup() {
// Set the brightness to 5 (0=dimmest 7=brightest)
display.setBrightness(5);
// Set all segments ON
display.setSegments(allON);
delay(2000);
display.clear();
// Show counter 0-9
int i;
for (i = 0; i < 10; i++) {
display.showNumberDec(i);
delay(50);
}
delay(2000);
display.clear();
display.showNumberDec(-12); // Prints _-12
delay(2000);
display.clear();
display.showNumberDec(-999); // Prints -999
delay(2000);
display.clear();
display.showNumberDec(31, false); // Prints __31
delay(2000);
display.clear();
display.showNumberDec(31, true); // Prints 0031
delay(2000);
display.clear();
display.showNumberDec(14, false, 2, 1); // Prints _14_
delay(2000);
display.clear();
display.showNumberDec(-5, false, 2, 1); // Prints _-5_
delay(2000);
display.clear();
// Prints 12:34
display.showNumberDecEx(1234, 0b01000000, false, 4, 0);
delay(2000);
display.clear();
// Prints 15°C
int temperature = 15;
display.showNumberDec(temperature, false, 2, 0);
display.setSegments(celsius, 2, 2);
delay(2000);
display.clear();
// Prints dOnE
display.setSegments(done);
}
void loop() {
}
После загрузки скетча в Arduino вы должны увидеть:
Объяснение кода:
Мы начинаем с подключения библиотеки TM1637 и указания программе, какие два пина Arduino подключены к модулю дисплея — один для тактового сигнала (CLK) и другой для ввода/вывода данных (DIO).
#include <TM1637Display.h>
#define CLK 3
#define DIO 4
Далее мы создаём объект display из класса TM1637Display. Этот объект позволяет отправлять команды на TM1637. При создании объекта мы должны указать, какие два пина используются.
TM1637Display display = TM1637Display(CLK, DIO);
Библиотека TM1637 позволяет управлять каждым сегментом дисплея индивидуально. Так можно отображать числа, буквы и даже несколько простых символов на экране.
Для демонстрации мы подготавливаем четыре массива. Первый массив — для включения всех сегментов. Второй — для выключения всех сегментов. Третий массив заставит дисплей показать слово «dOnE», а четвёртый покажет символ градуса (°), за которым следует буква C. Мы используем функцию setSegments() для отправки этих массивов на дисплей и их отображения.
Есть два способа определения этих массивов.
1. С использованием шестнадцатеричных чисел: При этом методе вы создаёте шестнадцатеричное число, следуя определённому порядку сегментов: (точка) G F E D C B A. Каждая буква обозначает один сегмент на дисплее, и каждый сегмент может быть включён (1) или выключен (0).
Например, шестнадцатеричное число 0xFF (которое в двоичном виде равно 11111111) включает все сегменты, включая точку. С другой стороны, 0x00 (которое в двоичном виде равно 00000000) выключает все сегменты.
Если вы хотите отобразить букву «C», вы используете шестнадцатеричное число 0x39. В двоичном виде это 00111001. Этот шаблон включает сегменты A, D, E и F, оставляя остальные выключенными.
// Create an array that turns all segments ON
const uint8_t allON[] = {0xff, 0xff, 0xff, 0xff};
// Create an array that turns all segments OFF
const uint8_t allOFF[] = {0x00, 0x00, 0x00, 0x00};
2. С использованием имён сегментов: Второй способ создания этих массивов ещё проще. Мы можем просто перечислить имена сегментов, которые хотим включить, используя такие имена, как SEG_A, SEG_B, SEG_C и так далее.
// Create an array that sets individual segments per digit to display the word "dOnE"
const uint8_t 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
};
// Create °C symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // °
SEG_A | SEG_D | SEG_E | SEG_F // C
};
В секции setup() кода мы используем несколько функций из библиотеки TM1637:
Эта функция управляет яркостью дисплея. Вы можете выбрать любое значение от 0 (очень тусклый) до 7 (очень яркий).
Существует также необязательный второй параметр: если вы передадите false, дисплей выключится; если передадите true или оставите без указания, дисплей останется включённым. Так что, когда вы пишете display.setBrightness(5), вы устанавливаете среднюю яркость. Если же вы пишете display.setBrightness(5, false), вы фактически выключаете дисплей, даже несмотря на указанный уровень яркости.
Эта функция позволяет управлять отдельными сегментами дисплея. Мы передаём ей три части информации: массив с данными о том, какие сегменты зажечь, сколько разрядов мы хотим обновить (от 0 до 4) и с какой позиции начинать отображение (позиция 0 — крайний левый разряд, позиция 3 — крайний правый).
Обратите внимание, что второй и третий аргументы необязательны. Если вы хотите обновить весь дисплей, не беспокоясь о длине или позиции, просто пропустите их. Например, когда мы хотим отобразить слово «dOnE», мы зажигаем все 4 разряда, начиная с крайней левой позиции (позиция 0). Поэтому мы просто вызываем функцию так:
// Prints dOnE
display.setSegments(done);
Но иногда мы не хотим обновлять все четыре разряда. Например, когда мы хотим показать символ «°C», нам нужно обновить только последние два разряда. В этом случае мы также указываем функции, сколько разрядов (2) и с какой позиции (2) начинать.
// Prints __°C
display.setSegments(celsius, 2, 2);
Ещё одна очень важная функция, которую мы используем, — showNumberDec(). Эта функция отлично подходит для быстрого отображения чисел. Мы просто указываем, какое число хотим показать, и она сама определяет, какие сегменты зажечь. Например, если вы хотите посчитать от 0 до 9, можете использовать цикл с showNumberDec() вот так:
// Show counter 0-9
int i;
for (i = 0; i < 10; i++) {
display.showNumberDec(i);
delay(50);
}
Вы также можете использовать эту функцию для отображения отрицательных чисел. Она автоматически добавит знак минуса в нужное место:
display.showNumberDec(-12); // Prints _-12
display.showNumberDec(-999); // Prints -999
Второй аргумент определяет, хотите ли вы добавить ведущие нули. Если установить true, дисплей добавит нули спереди, чтобы число заполнило все четыре разряда. Если установить false, число будет показано как есть.
display.showNumberDec(31, false); // Prints __31
display.showNumberDec(31, true); // Prints 0031
Третий и четвёртый аргументы работают так же, как и раньше. Они позволяют решить, сколько разрядов вы хотите обновить и с какой позиции должно начинаться число на дисплее. Так, если вы хотите, чтобы число отображалось по центру дисплея, напишите:
display.showNumberDec(14, false, 2, 1); // Prints _14_
display.showNumberDec(-5, false, 2, 1); // Prints _-5_
Эта функция является расширенной версией showNumberDec(). Главное отличие в том, что второй аргумент теперь управляет точками или двоеточием на дисплее, что идеально подходит для отображения времени или десятичных чисел. Для управления этими точками используется двоичное число, которое сообщает дисплею, какие именно точки включить. Каждая позиция в двоичном числе соответствует определённой точке на дисплее. Например:
Если у вас дисплей с точками между каждым разрядом, вот как это работает:
Аргумент |
Точки |
Пример |
|---|---|---|
0b10000000 |
. |
1.234 |
0b01000000 |
. |
12.34 |
0b00100000 |
. |
123.4 |
0b11100000 |
… |
1.2.3.4 |
Некоторые дисплеи TM1637 имеют двоеточие вместо точек. В этом случае:
Аргумент |
Точки |
Пример |
|---|---|---|
0b01000000 |
: |
12:34 |
Существуют даже дисплеи, которые имеют и точки, и двоеточие. На таких дисплеях:
Аргумент |
Точки |
Пример |
|---|---|---|
0b11100000 |
. : . |
1.2:3.4 |
Допустим, вы хотите сделать цифровые часы, показывающие «12:34». Вы используете функцию так:
// Prints 12:34
display.showNumberDecEx(1234, 0b01000000, false, 4, 0);
Сначала вы указываете отображение числа 1234. Затем используете двоичный код 0b01000000 для включения двоеточия посередине. Последние аргументы сообщают функции не добавлять ведущие нули, обновить все четыре разряда и начать с первой позиции.
Поскольку в этом примере нет ничего, что нужно выполнять повторно, мы оставляем функцию loop() пустой.
void loop() {
}
Пример 2 для Arduino — цифровой термометр с TM1637 и DHT11/DHT22
Модуль TM1637 идеально подходит для отображения числовых значений, таких как температура, влажность, напряжение или скорость. В этом примере мы будем использовать его для отображения показаний температуры с датчика DHT11.
Если вы ранее не работали с модулем DHTxx, вам может быть полезно ознакомиться с этим руководством:
Подключение
Подключение аналогично первому примеру, но мы добавляем датчик DHT11 в схему.
Подключите вывод VCC датчика DHT11 к пину 5V на Arduino, а вывод GND — к любому пину GND на Arduino. Подключите вывод Data к цифровому пину #2 на Arduino. Вам также потребуется добавить подтягивающий резистор 10КОм между выводом Data и выводом VCC. Однако если у вас DHT11 на готовой плате, резистор уже встроен, и этот шаг можно пропустить.
Установка библиотеки
Мы будем использовать библиотеку `DHTlib `_ для связи с DHT11, поэтому убедитесь, что вы установили её перед продолжением.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на иконку Менеджер библиотек на левой боковой панели.
Введите «dhtlib» в поле поиска для фильтрации результатов.
Найдите библиотеку «DHTlib» от Rob Tillaart.
Нажмите кнопку Install (Установить), чтобы добавить её в Arduino IDE.
Код Arduino
Скетч ниже обменивается данными с датчиком DHT11 и отображает показания температуры на дисплее TM1637. Температура будет показана как в градусах Цельсия, так и в градусах Фаренгейта, переключаясь каждые две секунды.
// Include the libraries
#include <TM1637Display.h>
#include <dht.h>
// Define the connections pins
#define CLK 3
#define DIO 4
#define DHTPIN 2
// Create °C symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Circle
SEG_A | SEG_D | SEG_E | SEG_F // C
};
// Create °F symbol
const uint8_t fahrenheit[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Circle
SEG_A | SEG_E | SEG_F | SEG_G // F
};
// Create display object of type TM1637Display
TM1637Display display = TM1637Display(CLK, DIO);
// Creates a DHT object
dht DHT;
void setup() {
// Set the display brightness (0-7)
display.setBrightness(5);
// Clear the display
display.clear();
}
void loop() {
//Uncomment whatever type you're using!
//DHT.read22(DHTPIN); // DHT22/AM2302
DHT.read11(DHTPIN); // DHT11
int temperature_celsius = DHT.temperature; // Gets the values of the temperature
int temperature_fahrenheit = (temperature_celsius * 9.0) / 5.0 + 32.0; // Convert temperature to fahrenheit
// Display the temperature in celsius format
display.showNumberDec(temperature_celsius, false, 2, 0);
display.setSegments(celsius, 2, 2);
delay(2000);
// Display the temperature in fahrenheit format
display.showNumberDec(temperature_fahrenheit, false, 2, 0);
display.setSegments(fahrenheit, 2, 2);
delay(2000);
}
После загрузки скетча в Arduino вы должны увидеть:
Объяснение кода
Этот скетч похож на предыдущий. Однако есть несколько ключевых отличий.
В начале кода, наряду с подключением библиотеки TM1637Display, мы также подключаем библиотеку DHT для считывания температуры с датчика.
#include <DHT.h>
Затем мы определяем, какие пины Arduino подключены к дисплею TM1637 и какой пин подключён к датчику DHT11.
#define CLK 3
#define DIO 4
#define DHTPIN 2
Далее мы создаём два небольших массива, хранящих шаблоны сегментов для отображения символов «°C» и «°F» на TM1637.
// Create °C symbol
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Circle
SEG_A | SEG_D | SEG_E | SEG_F // C
};
// Create °F symbol
const uint8_t fahrenheit[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Circle
SEG_A | SEG_E | SEG_F | SEG_G // F
};
После этого мы создаём объект для дисплея и ещё один для датчика DHT.
TM1637Display display = TM1637Display(CLK, DIO);
dht DHT;
В секции setup() кода мы устанавливаем среднюю яркость дисплея (5), что делает его легко читаемым без излишней яркости. Мы также очищаем дисплей, чтобы он начал с чистого экрана.
void setup() {
// Set the display brightness (0-7)
display.setBrightness(5);
// Clear the display
display.clear();
}
В секции loop() мы начинаем с чтения данных температуры с датчика. Если вы используете датчик DHT11, используйте функцию read11(). Если используете DHT22, используйте вместо неё read22(). В вашем коде должна быть активна только одна из них — закомментируйте строку для датчика, который вы не используете, и оставьте правильную раскомментированной.
//Uncomment whatever type you're using!
//DHT.read22(DHTPIN); // DHT22/AM2302
DHT.read11(DHTPIN); // DHT11
После считывания данных мы получаем температуру в градусах Цельсия, используя точечную нотацию . объекта DHT, и сохраняем её в переменную temperature_celsius. Затем вычисляем значение по Фаренгейту по формуле (Цельсий x 9 / 5) + 32 и сохраняем в другую переменную temperature_fahrenheit.
int temperature_celsius = DHT.temperature; // Gets the values of the temperature
int temperature_fahrenheit = (temperature_celsius * 9.0) / 5.0 + 32.0; // Convert temperature to fahrenheit
Теперь переходим к отображению. Сначала мы показываем температуру в Цельсиях. Используем функцию showNumberDec() для отображения числа на первых двух разрядах дисплея TM1637. Затем используем функцию setSegments() для отображения символа «°C» на последних двух разрядах. Это остаётся на экране две секунды.
После этого мы делаем то же самое для температуры по Фаренгейту. Она также отображается две секунды.
// Display the temperature in celsius format
display.showNumberDec(temperature_celsius, false, 2, 0);
display.setSegments(celsius, 2, 2);
delay(2000);
// Display the temperature in fahrenheit format
display.showNumberDec(temperature_fahrenheit, false, 2, 0);
display.setSegments(fahrenheit, 2, 2);
delay(2000);
Цикл продолжает повторяться, поэтому дисплей продолжает переключаться между Цельсием и Фаренгейтом каждые две секунды.
Пример 3 для Arduino — цифровые часы с TM1637 и DS3231
В этом примере мы будем использовать дисплей TM1637 вместе с модулем часов реального времени (RTC) DS3231 для создания простых 24-часовых цифровых часов.
Если вы не знакомы с модулем DS3231, рекомендуется сначала прочитать руководство по нему.
Подключение
Подключение аналогично первому примеру, но теперь мы добавляем модуль DS3231 в нашу схему.
Нужно подключить вывод VCC модуля DS3231 к пину 5V на Arduino, а вывод GND — к земле. Выводы SDA и SCL модуля DS3231 должны быть подключены к выводам SDA и SCL Arduino. Обычно они расположены возле вывода AREF, но если вы используете более старую плату, например Arduino Uno, вы также можете использовать аналоговые пины A4 (SDA) и A5 (SCL).
Установка библиотеки
Мы будем использовать библиотеку `uRTCLib `_ для связи с DS3231. Эта библиотека делает чтение данных времени из RTC очень простым.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на иконку Менеджер библиотек на левой боковой панели.
Введите «urtclib» в поле поиска для фильтрации результатов.
Найдите библиотеку uRTCLib от Naguissa.
Нажмите кнопку Install (Установить), чтобы добавить её в Arduino IDE.
Код Arduino
Скетч ниже обменивается данными с модулем DS3231 и показывает время на дисплее TM1637 в 24-часовом формате.
// Include the libraries
#include <TM1637Display.h>
#include "uRTCLib.h"
// Define the connections pins
#define CLK 3
#define DIO 4
// Create rtc and display object
uRTCLib rtc(0x68);
TM1637Display display = TM1637Display(CLK, DIO);
void setup() {
URTCLIB_WIRE.begin();
// Comment out below line once you set the date & time.
// Following line sets the RTC with an explicit date & time
// for example to set April 14 2025 at 12:56 you would call:
rtc.set(0, 56, 12, 2, 14, 4, 25);
// rtc.set(second, minute, hour, dayOfWeek, dayOfMonth, month, year)
// set day of week (1=Sunday, 7=Saturday)
// Set the display brightness (0-7)
display.setBrightness(5);
// Clear the display
display.clear();
}
void loop() {
// Get the current time
rtc.refresh();
// Create time format to display
int displaytime = (rtc.hour() * 100) + rtc.minute();
// Display the current time in 24 hour format with leading zeros and a center colon enabled
display.showNumberDecEx(displaytime, 0b01000000, true);
delay(1000);
}
После загрузки скетча в Arduino вы должны увидеть:
Объяснение кода
В коде мы начинаем с подключения необходимых библиотек: одной для дисплея TM1637 и одной для модуля RTC.
#include "uRTCLib.h"
Затем мы создаём два объекта — один для модуля RTC и один для дисплея. Объект RTC инициализируется с I2C-адресом модуля DS3231, который фиксирован как 0x68. Этот адрес позволяет Arduino находить модуль при обмене данными через I2C.
uRTCLib rtc(0x68);
Внутри функции setup() мы инициализируем связь I2C с помощью URTCLIB_WIRE.begin(). Это позволяет Arduino общаться с модулем RTC.
URTCLIB_WIRE.begin();
Сразу после этого мы устанавливаем дату и время с помощью функции rtc.set(). Эта функция принимает семь значений: секунды, минуты, часы, день недели (где 1 означает воскресенье), день месяца, месяц и последние две цифры года.
В нашем примере мы устанавливаем часы на 12:56 в понедельник, 14 апреля 2025 года. Эта строка выглядит так:
rtc.set(0, 56, 12, 2, 14, 4, 25);
Вам нужно выполнить эту строку только один раз для установки правильного времени. После этого следует её закомментировать, чтобы RTC сохранял время и не сбрасывался каждый раз при загрузке кода.
После установки времени мы устанавливаем среднюю яркость дисплея (5), что делает цифры хорошо видимыми без излишней яркости. Затем очищаем дисплей, чтобы он начал с чистого экрана.
// Set the display brightness (0-7)
display.setBrightness(5);
// Clear the display
display.clear();
В функции loop() первое, что мы делаем, — обновляем значения времени из модуля RTC с помощью rtc.refresh(). Это гарантирует, что актуальное время загружено в память Arduino.
rtc.refresh();
Затем мы создаём переменную displaytime, которая объединяет часы и минуты в одно 4-значное число. Для этого мы умножаем часы на 100 и добавляем минуты. Например, если время 09:45, результат будет 945. Если 14:08, результат будет 1408.
int displaytime = (rtc.hour() * 100) + rtc.minute();
Для отображения времени на дисплее TM1637 мы используем функцию showNumberDecEx(). Мы передаём ей 4-значное значение времени, указываем включить двоеточие по центру (чтобы время выглядело как «14:08», а не «1408») и включаем ведущие нули, чтобы время всегда отображалось четырьмя цифрами, например «09:05» вместо «905».
display.showNumberDecEx(displaytime, 0b01000000, true);
Наконец, мы добавляем delay(1000), чтобы дисплей обновлялся раз в секунду, как обычные часы.