Андрей Смирнов
Время чтения: ~13 мин.
Просмотров: 20

Дисплеи на базе драйвера TM1637 — изучаем возможности

Сегодня мы изучим Четырехразрядный индикатор на TM1637. Он пригодится нам для сборки электронных часов с термометром и медиаплеером, которые мы начали собирать в прошлый раз, см статью DS3231 RTC Arduino.

Варианты применения.  И хотя сейчас на смену индикаторам пришли LED дисплеи, такие индикаторы всё равно применяются в разработках. Например часы, вольтметры, весы, индикаторы электроприборов и другое.  Отличие модуля индикатора на TM1637 от других – это его компактность, они не дорогие, и управление всего по двум проводам.

Вот так выглядит модуль 

Для подключения к Arduino используется всего 4 контакта •    VCC +5 Вольт  •    GND — Земля CLK и DIO в этом модуле не полностью совместимы с шиной I2C  •    CLK — CLOCK •    DIO – Data in Out

Характеристики Индикатора на TM1637: •    Напряжение питание: 5,5В •    Индикаторы, 6 разрядов и 8 элементов •    Потребляемый ток 0.2 — 80мА (в зависимости от горящих сегментов) •    Градаций яркости индикаторов — 8 •    Размеры платы: 42×24мм •    Двух проводной последовательный интерфейс (CLK, DIO).

Более подробно можно посмотреть в datasheet TM1637

Для работы с модулем разработана библиотека TM1637

Как установить библиотеку я писал в статье DS3231 RTC Arduino как установить библиотеку.

Теперь самое интересное, что же может этот модуль: •    Зажигать сразу все знаки или по одному сегменту или символу •    Выводить цифры от 0 до 9 и некоторые буквы. См ниже. •    Показывает цифры от -999 до 999 •    Цифры могут выводиться как с нулями слева, так и без них •    Есть возможность выводить бегущую строку с задержкой. Функция уже заложена в библиотеку. •    8 градаций изменения яркости. •    Различные функции появления символов. Несколько эффектов.   •    Вывод символа в определённую позицию(ячейку).

Описание функций библиотеки TM1637

init() — инициализация set(n) — яркость сегментов от 0 до 7clearDisplay() — очистить экранpoint(True) — выключить/включить разделитель(две вертикальные точки)displayInt(value) — вывести на экран четырёхзначное числоdisplayIntZero(value) — вывести на экран четырёхзначное число с нулями слеваdisplay(posit, Byte) — вывести на экран символ Byte (0-9) в одну из четырёх позиций posit(0-3)display(array) — вывести на экран массив array из четырёх символовdisplayByte(posit, Byte) — вывести на экран символ Byte в одну из четырёх позиций posit(0-3)displayByte(ARRAY_BYTE) — RRAY_BYTE — массив ( 0x7d, 0x7d, 0x7d, 0x7d )displayByte(Byte1, Byte2, Byte3, Byte4) — вывести на экран четыре  знакаrunningString(buf, sizeof(buf), delay) — бегущая строка из массива (массив, размер массива, задержка в мс)scroll(BitAddr, DispData, delayms); — обновить значение пролистыванием (адрес, символ, задержка в мс)scroll(DispData[], delayms); — обновить значение пролистыванием (массив символов, задержка в мс)scrollByte(BitAddr, DispData, delayms); — обновить значение пролистыванием (адрес, БАЙТ, задержка в мс)scrollByte(DispData[], delayms); — обновить значение пролистыванием (массив, задержка в мс)  twist(BitAddr, DispData, delayms) — обновить значение вращением (адрес, символ, задержка в мс)twist(DispData[], delayms) — обновить значение вращением (массив символов, задержка в мс)twistByte(BitAddr, DispData, delayms) — обновить значение вращением (адрес, БАЙТ, задержка в мс)twistByte(DispData[], delayms) — обновить значение вращением (массив, задержка в мс)displayClock(hrs, mins) — выводит часы, минутыdisplayClockScroll(hrs, mins, delayms) — выводит часы, минуты с эффектом пролистывания экрана внизdisplayClockTwist(hrs, mins, delayms) — выводит часы, минуты с эффектом вращения знакоместа

Подключение модуля TM1637 к Arduino

На модуле TM1637 4 провода. Два из них питание, а вот другие два мы и будем подключать. Подключать эти контакты нужно к любым цифровым контактам. Например у Arduino Nano — это pin D2-D13. Подробнее можно почитать в статье Arduino Nano выходы

В следующей статье мы соберём часы DS3231 и TM1637 В третьей статье мы подключим внешний(выносной) датчик температуры DS1820 для измерения на улице, и Фоторезистор GL5506 для управления яркостью свечения индикатора в зависимость от времени или яркости освещения. Температуру внутри, около датчика мы будем снимать с помощью модуля DS3231 Ну и заключительная статья будет, «Как соединить часы с медиаплеером», и включать в качестве будильника случайную мелодию.

Подписывайтесь и вы узнаете, как это сделать первыми.

Дисплеи на базе драйвера TM1637 — изучаем возможности

Подробности
Категория: Дисплеи(Displays)
Опубликовано: 01 мая 2018

5ae63068ac476_preview.png         

          В предыдущей статье, нами было рассмотрено подключение и тест дисплея на базе драйвера TM1637. Тест проходил в формате платы Arduino Rich Uno, и в данном случае, рассматриваемый дисплей уже был смонтирован на данной плате. Не будет лишним рассмотреть и протестировать такие дисплеи в виде отдельных модулей, что ж начнём…

         1. Первый шаг к освоению дисплеев TM1637

       На фото ниже, можно видеть два дисплейных модуля, с виду вроде бы одинаковые, но, есть существенные отличия. Если присмотреться, то отличает их наличие разделительных точек — десятичной и разделителя двоеточие. Что еще можно сказать про них? Логически нетрудно прийти к выводу, что один вид дисплея(с десятичным разделителем) можно использовать для индикации каких либо точных величин, к примеру температура или уровень жидкости. Второй же вид дисплея (с разделителем двоеточие), конечно же удобно использовать в качестве индикации времени.

5ae6a0419a681_panoview.png

         Как подключить данный модуль дисплея к плате Arduino? Это не составит особого труда, если придерживаться нижеследующей таблицы подключений. Модуль дисплея имеет на борту четыре пина подключения, это VCC(+5V), GND, CLK(Пин тактирования), DIO(Пин данных). Подключать питание нужно конечно же на пины VCC и GND, желательно избегать переполюсовки, можеть быть и есть защита от подачи неправильного питания, но всё же лучше не рисковать. Пины CLK и DIO можно подключать на любые пины платы Arduino, самое главное, скачать и подключить библиотеку TM1637, и указать в скетче используемые пины подключения.

5ae6c9f2ce1f5_CTable.png

          Ну что же, пришло время испытать дисплей, первым делом можно попробовать управлять разделителем двоеточие, скетч ниже с этим прекрасно справится, если что то непонятно, то в скетче предусмотрены комментарии. Чтобы испытать дисплей, можно скопировать данный скетч прямо из окна браузера в среду разработки Arduino IDE.

/*Подключаем библиотеку*/#include«TM1637.h»

/*Определяем пины подключения*/#define CLK 6#define DIO 7

/*  Создаём объект tm1637 класса TM1637, в качестве   параметров передаём номера пинов подключения */TM1637 tm1637(CLK, DIO);

/*Выводимый на дисплей массив*/int8_t StringToDisp[] = {1, 2, 3, 4};

voidsetup() {  /*Инициализация дисплея*/  tm1637.init();  /*Устанавливаем яркость свечения дисплея*/  /*BRIGHT_TYPICAL — нормальная яркость*/  /*BRIGHT_DARKEST — затемнённый дисплей*/  /*BRIGHTEST — яркий дисплей*/  tm1637.set(BRIGHT_TYPICAL);}

voidloop() {  /*Задание на включение разделителя*/  tm1637.point(true);  /*Вывод чисел массива на дисплей*/  tm1637.display(StringToDisp);  /*Пауза*/  delay(1000);  /*Задание на выключение разделителя*/  tm1637.point(false);  /*Вывод чисел массива на дисплей*/  tm1637.display(StringToDisp);  /*Пауза*/  delay(1000);}

         На втором этапе, можно попробовать управлять десятичной точкой на дисплее с десятичным разделителем. Второй пример скетча также прокомментирован для более удобного понимания его работы. В данном случае изменён код только в функции loop(), глобальные переменные, объявления классов и функция setup() остались без изменений. 

voidloop() {  /*В данном случае, чтобы управлять десятичной точкой */  /*нужно явно указывать в каком знакоместе её включать*/  /*0-е знакоместо, точка погашена*/  tm1637.point(false);  tm1637.display(0, StringToDisp[0]);

  /*1-е знакоместо, точка погашена*/  tm1637.point(false);  tm1637.display(1, StringToDisp[1]);  /*Задание на включение десятичной точки во втором по */  /*счету знакоместе дисплея*/  tm1637.point(true);  tm1637.display(2, StringToDisp[2]);  /*3-е знакоместо, точка погашена*/  tm1637.point(false);  tm1637.display(3, StringToDisp[3]);}

         Как работают эти примеры, вы можете увидеть посмотрев обзорное видео, оно находится в самом конце статьи.

              2. Генерация пользовательских символов для дисплеев TM1637

          Отдельной темой, которая должна(!) быть рассмотрена, является генерация пользовательских символов для дисплеев данного типа. На сайте уже есть статьи про похожие дисплеи, работающие на базе драйвера MAX7219. Что можно выжать из таких дисплеев, и как генерировать символы используя функции библиотеки LedControl.h вы можете ознакомиться из нижеследующих статей, если пройдёте по ссылкам:

         Прочитав данные статьи, можно убедиться, что разработчики библиотек для дисплеев MAX7219 тщательно постарались реализовать функции генерации пользовательских символов. К сожалению, библиотека для работы с дисплеями TM1637 не содержит в себе аналогичных функций, и поэтому, чтобы сгенерировать какой либо символ нужно модифицировать библиотечный файл TM1637.CPP, исходя из этого, у нас есть два пути. В первом случае, автором статьи уже был изменён файл TM1637.CPP, добавлены различные коды символов. Этот файл можно скачать по следующей ссылке здесь, далее его нужно распаковать и  скопировать, пройти по следующему пути «C:Users*Имя вашего компьютера либо учетной записи*DocumentsArduinolibrariestm1637», вставить и заменить. В нижеследующей таблице, можно видеть какие коды символов уже содержались(левая часть таблицы), и какие были добавлены(правая часть таблицы) в данный файл.

          Чтобы испытать модифицированный и дополненный библиотечный файл TM1637.CPP, попробуем вывести некоторые «символьные» сообщения на дисплей. В нижеследующем скетче, поочерёдно выводятся сообщения SEGA, LEGO, HEAT, init, STOP. Теперь, вывести такие сообщения не составит особого труда, формируя массив из четырех элементов, и инициализируя его порядковыми индексами символов из таблицы, можно составлять самые различные «символьные» сообщения для дисплеев TM1637. Итак, скетч:

/*Подключаем библиотеку*/#include«TM1637.h»

/*Определяем пины подключения*/#define CLK 6#define DIO 7

/*  Создаём объект tm1637 класса TM1637, в качестве   параметров передаём номера пинов подключения */TM1637 tm1637(CLK, DIO);

/*Выводимые на дисплей массивы*/int8_t Sega[] = {5, 14, 16, 10};int8_t Lego[] = {24, 14, 16, 0};int8_t Heat[] = {17, 14, 10, 32};int8_t Init[] = {20, 26, 20, 32};int8_t Stop[] = {5, 32, 0, 29};

voidsetup() {  /*Инициализация дисплея*/  tm1637.init();  /*Устанавливаем яркость свечения дисплея*/  /*BRIGHT_TYPICAL — нормальная яркость*/  /*BRIGHT_DARKEST — затемнённый дисплей*/  /*BRIGHTEST — яркий дисплей*/  tm1637.set(BRIGHT_TYPICAL);}

voidloop() {  /*Сразу же гасим десятичную точку для всех знакомест*/  tm1637.point(false);  /*Вывод «сообщений» на дисплей, период смены 2 сек*/  tm1637.display(Sega);  delay(2000);  tm1637.display(Lego);  delay(2000);  tm1637.display(Heat);  delay(2000);  tm1637.display(Init);  delay(2000);  tm1637.display(Stop);  delay(2000);}

         Ну что же, в первом случае можно в общем то не особо напрягаться с генерацией пользовательских символов. Достаточно заменить файл и пользоваться готовыми кодами символов из таблицы. А что если всё же хочется самостоятельно модифицировать файл TM1637.CPP и добавить свои коды символов? Тогда идем по пути в директорию:

C:Users*Имя вашего компьютера либо учетной записи*DocumentsArduinolibrariestm1637

         Находим файл TM1637.CPP, желательно сохранить его резервную копию, перед тем как что то делать, ну так, на случай. Открываем файл TM1637.CPP текстовым редактором и ищем вот эту строку:

static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

         Массив TubeTab содержит в себе 16 байт, в каждом из них закодирована одна из цифр последовательности от 0 до 15. Нужно конечно учитывать, что цифры от 0 до 9 закодированы в виде обычных цифр, а цифры от 10 до 15 закодированы в виде символов A, B, C, D, E, F. И соответственно на дисплей они будут выводиться в шестнадцатиричном формате от 0 до 9 и от A до F. Сам массив не имеет фиксированного размера, поэтому в него можно добавлять свои байты, хранящие в себе закодированный символ. Сгенерировать тот или иной символ, можно руководствуясь нижеследующей таблицей. После получения двоичного кода символа, используя обычный калькулятор операционной системы Windows можно перевести полученное значение в шестнадцатиричный формат, к примеру:

Символ J в двоичном представлении -> b00011110Символ J в шестнадцатиричном представлении -> 0x1E

        Далее просто дополняем массив TubeTab полученным значением.

         3. А что если… ? Подключение двух дисплеев TM1637 к плате Arduino

         Ну и напоследок, скетч демонстрирующий одновременное подключение двух дисплеев к плате Arduino. За основу возьмем следующее условие — на дисплей с разделителем в виде десятичной точки будет индицироваться температура, а на дисплей с часовым разделителем значение текущего времени. Время и температура будут так сказать чисто условными значениями, главная задача — показать возможности подключения одновременно двух дисплеев. Приведённый скетч при желании можно дополнить и расширить, внеся свои необходимые вычисления и подключив нужное оборудование.

/*Подключаем библиотеку*/#include«TM1637.h»

/*Определяем пины подключения для дисплея*//*с десятичной точкой в качестве разделителя*/#define DISP1_CLK 6#define DISP1_DIO 7/*Определяем пины подключения для дисплея*//*с часовым разделителем двоеточие*/#define DISP2_CLK 8#define DISP2_DIO 9

/*  Создаём два объекта класса TM1637, в качестве   параметров передаём номера пинов подключения   Первый дисплей для индикации температуры*/TM1637 TempDisplay(DISP1_CLK, DISP1_DIO);/*Второй дисплей для индикации времени*/TM1637 TimeDisplay(DISP2_CLK, DISP2_DIO);

/*Выводимые на дисплеи массивы*/int8_t Time[] = {1, 2, 2, 0};int8_t Temp[] = {2, 6, 27, 12};

voidsetup() {  /*Инициализация дисплеев*/  TempDisplay.init();  TimeDisplay.init();  /*Устанавливаем яркость свечения дисплеев*/  /*BRIGHT_TYPICAL — нормальная яркость*/  /*BRIGHT_DARKEST — затемнённый дисплей*/  /*BRIGHTEST — яркий дисплей*/  TempDisplay.set(BRIGHT_TYPICAL);  TimeDisplay.set(BRIGHT_TYPICAL);}

voidloop() {  /*Сразу же гасим десятичную точку для всех знакомест*/  TempDisplay.point(false);  /*Вывод значения температуры на дисплей с десятичной точкой*/  TempDisplay.display(Temp);

  /*Выводим значение времени на дисплей с разделителем двоеточие*/  /*Также управляем зажиганием и гашением разделителя двоеточие*/  TimeDisplay.point(false);  TimeDisplay.display(Time);  delay(1000);  TimeDisplay.point(true);  TimeDisplay.display(Time);  delay(1000);}

         Как и было обещано, обзорное видео по статье, всем приятного просмотра.

display-tm1637.jpg

Всем привет. Сегодня для тестирования, подключаем к Arduino Nano, четырех значный, 7 х 4 сегментный, I2C дисплей TM1637.

И так, перейдем к подключению сегментного экрана к Arduino nano. Подключение занимает всего несколько секунд.

Схема подключения:

tm1637-shem.jpg

Принципиальная схема:

shem-tm1637.jpg

Для того что бы на экране индикатора появилась какая либо информация, нужно скачать и установить библиотеку TM1637, потом запустить Arduino IDE и выбрать «Файлы — примеры — TM1637» и после чего нажать кнопочку «Загрузка в контроллер», кнопку обозначил на изображении

proshivka.jpg

Что бы создать и загрузить в дисплей свой символ, для его расчета нужно воспользоваться инструкций на изображении ниже. Если в двух словах, то значение каждого включенного сегмента нужно суммировать

1637-2.jpg

Например нам нужно на экране получить цифру 4. Для этого нужно суммировать следующие значения 2 + 4 + 32 + 64 = 102. Переводим в шестнадцатеричную систему исчисления и  получаем 0x66.

Ну вот как бы и все, что я хотел Вам рассказать про этот замечательный I2C экранчик. Надеюсь ничего не упустил. Если будут вопросы. Не стесняйтесь задавайте. Я отвечаю всегда, но может не всегда быстро как многим хотелось бы.

И на последок видео демонстрация возможностей сегментного индикатора TM1637

Используемые источники:

  • http://arduino-kid.ru/indicator_tm1637
  • https://proto-constructor.ru/displei/17-displei-na-baze-drajvera-tm1637-izuchaem-vozmozhnosti.html
  • https://duino.ru/blog/all/arduino-displey-tm1637/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации