Дисплеи различного вида как средство вывода информации, это неотъемлемая часть любого проекта, начиная от простых часов и заканчивая сложными таблоидами валютных бирж. Казалось бы, дисплей на базе драйвера TM1637 был во многом рассмотрен и изучен. Но всё же есть ещё белые пятна на карте экспериментов... Сегодня на обзоре не стандартный дисплей на четыре знакоместа, а его можно сказать "средний брат" на шесть знакомест.

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

        В статье я не буду расписывать схемотехнику по которой спаян именно этот дисплей, будет только тестовый скетч. Исходя из тестового скетча, возможно будет дальнейшее использование данного дисплея. Сразу говорю, я ни коим образом не занимаюсь рекламой фирмы Robotdyn, но раз уж мне в руки попался дисплей их производства, я не могу не протестировать его. Возможно есть такие же дисплеи других фирм, возможно они будут иметь совсем другую схемотехнику, которая впоследствии повлияет на написание рабочего скетча. Но если в твои руки попался именно этот дисплей, именно от упомянутой фирмы, то эта статья для тебя. Приступим...

        Для начала хочу привести тестовый скетч, его работа заключается в простом выводе ряда чисел от 0 до 5, заполняя знакоместа слева направо.

/* Подключаем стандартную библиотеку для этих дисплеев */
#include "TM1637.h"


/* Указание пинов подключения к плате Arduino */
#define CLK 8
#define DIO 7


/* Здесь очень важный момент - карта знакомест, Именно в таком */
/* порядке включаются аноды знакомест при использовании функции display() */
uint8_t rankMap[] = {2, 1, 0, 5, 4, 3};


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

void setup()
{
    /* Задание начальной уставки яркости */
    TM1637_Display.set();
    /* Инициализация дисплея заданной уставкой */
    TM1637_Display.init();
}
void loop()
{
    /* Вывод чисел от 0 до 5 с заполнением знакомест слева направо */
    for(int i = 0; i < 6; i ++)
        TM1637_Display.display(rankMap[i], i);
}

        Результат работы скетча можно видеть на нижеследующем фото. В самом скетче используются стандартные функции библиотеки TM1637, но при этом, перед началом вывода ряда цифр, нужно использовать карту знакомест rankMap[]. Делается это для того чтобы было удобнее динамически размещать данные на дисплей.


        Продолжим тест... Нужно вывести на дисплей десятичные точки в каждом знакоместе, если изменив в уже имеющемся скетче строки функции loop():

void loop()
{
    /* Вывод чисел от 0 до 5 с заполнением знакомест слева направо */
    for(int i = 0; i < 6; i ++)
    {
        /* Функция point() зажигает десятичную точку */
        /* может принимать параметр, true - зажечь, false - погасить */
        TM1637_Display.point(true);
        TM1637_Display.display(rankMap[i], i);
    }
}

        Результат работы изменённого скетча можно видеть на фото, во всех шести знакоместах зажжены десятичные точки. Вызов функции point() перед вызовом функции display() подразумевает что перед выводом числа в нужное знакоместо, будет зажжена десятичная точка. При этом, для зажигания нужно явно вызывать функцию point(). Данная функция может принимать два параметра, true - зажечь точку, false - соответственно погасить. Ещё одна особенность, если функция point() явно в коде нигде не вызывается, то по умолчанию на дисплее десятичная точка выводиться не будет.

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

/* Подключаем стандартную библиотеку для этих дисплеев */
#include "TM1637.h"
/* Указание пинов подключения к плате Arduino */
#define CLK 8
#define DIO 7
/* Строка выводимая на дисплей */
uint8_t StringToDisplay[6];
/* Здесь очень важный момент - карта знакомест, Именно в таком */
/* порядке включаются аноды знакомест при использовании функции display() */
uint8_t rankMap[] = {2, 1, 0, 5, 4, 3};
/* Создание объекта TM1637_Display с указанием пинов подключения */
TM1637 TM1637_Display(CLK, DIO);

void setup()
{
    /* Задание начальной уставки яркости */
    TM1637_Display.set();
    /* Инициализация дисплея заданной уставкой */
    TM1637_Display.init();
}
void loop()
{
    /* Заполняем строку перед выводом на дисплей */
    UpdateDisplay();
    /* Вывод чисел от 0 до 5 с заполнением знакомест слева направо */
    for(int i = 0; i < 6; i ++)
    {
        /* Функция point() зажигает десятичную точку */
        /* чтобы разделить число 24.6 зажигаем точку только во втором разряде */
        if(i == 2)
            TM1637_Display.point(true);
        else
            TM1637_Display.point(false);
        /* Вывод сформированной строки */
        TM1637_Display.display(rankMap[i], StringToDisplay[i]);
    }
}

void UpdateDisplay()
{
    /* Сначала заполняем строку для вывода на дисплей */
    /* Она состоит из 6-ти символов, по числу знакомест дисплея */
    /* Первый символ будет пустым */
    StringToDisplay[0] = 0x7F;
    /* Второй символ - цифра 2 */
    StringToDisplay[1] = 2;
    /* Третий символ - цифра 4 */
    StringToDisplay[2] = 4;
    /* Четвёртый символ - цифра 6 */
    StringToDisplay[3] = 6;
    /* Пятый символ - обозначение градуса */
    StringToDisplay[4] = 27;
    /* Шестой символ - единицы измерения, Цельсий */
    StringToDisplay[5] = 12;
}

      Как видно по фото, в выводе сформированной строки слева направо есть пустой символ - 0x7F, есть обычные символы цифр, есть обозначение градуса и символ единиц измерения в Цельсиях. Десятичная точка в этот раз была зажжена во втором знакоместе, по заданному условию в теле цикла for(). В результате, имеем уже более осмысленный вывод показаний на дисплей.

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