С чего можно было бы начать эксперименты с платой Arduino Rich Uno ? Ну конечно же с включения дисплея... Дисплей в данном случае, по сути представляет собой модуль многоразрядного семисегментного индикатора на базе драйвера TM1637.

         На сайте уже есть статья про дисплей на базе драйвера MAX7219, есть также и различные статьи, описывающие применение дисплеев данного типа, ознакомиться можно к примеру здесь, здесь и здесь. Несмотря на то что дисплеи являются по типу многоразрядными семисегментными, всё же управление ими осуществляется разными драйверами, и разными библиотеками. В данной статье, ещё раз повторюсь, речь пойдет о дисплее на базе драйвера TM1637

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

         После того как библиотека скачана, её нужно установить для среды Arduino IDE. Делается это так - сначала распаковываем её из .rar архива, далее в программе Arduino IDE следуем по ветке меню "Скетч" -> "Подключить библиотеку" -> "Добавить .ZIP библиотеку"

 

 

         Далее, в открывшемся окне поиска и выбора файла находим распакованную папку, заходим в неё и выбираем файл RichUno.zip, если архив был скачан в папку по умолчанию, и распакован в ней же, то путь к файлу должен быть таким "C:\Users\*Имя вашего компьютера*\Downloads\Arduino libraries for Rich UNO R3\Arduino libraries for Rich UNO R3".

 

 

          Итак, краткий ликбез по установке библиотек закончен, библиотека от производителя установлена, теперь нам доступны примеры и подключаемые заголовочные файлы для работы с модулями и датчиками. Пришло время разобрать пример теста дисплея, найти и открыть его можно следуя по ветке меню "Файл" -> "Примеры" -> "RichUNO" -> "L2_Display".  Листинг скетча L2_Display, удалено всё ненужное и добавлены комментарии:

 

//Подключаем необходимый заголовочный файл
#include "RichUNOTM1637.h"

//Пин CLK модуля TM1637 привязан к пину D10 контроллера Atmega328
//Пин DIO модуля TM1637 привязан к пину D11 контроллера Atmega328

#define CLK 10
#define DIO 11

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

void setup()
{
  //Инициализация дисплея
  disp.init();
}

void loop()
{
  //Создаём проинициализированный массив
  int8_t ListDisp[4] = {3, 4, 5, 6};

  //Отрисовываем его на дисплей
  disp.display(ListDisp);
  //Пауза перед отрисовкой следующего значения
  delay(1000);

  //Отрисовываем знаковое целое число
  disp.display(-50);
  delay(1000);

  //Отрисовываем беззнакове целое число
  disp.display(256);
  delay(1000);
}

          Однако прежде чем "заливать" скетч в контроллер, необходимо установить DIP-переключатели подключения дисплея в положение ON. На фото ниже, можно видеть как это сделать, показана группа переключателей SIGNAL ON/OFF, два переключателя группы(выделены желтой рамкой) DISPLAY(D10 и D11) установлены в ON.

 

 

          Работу вышеуказанного скетча можно описать следующим образом - вывод на дисплей TM1637 трех значений, сначала массив ListDisp, затем на дисплее показывается отрицательное значение и в конце показывается положительное значение. Задержка межу выводом значений - 1 секунда. При отображении отрицательного значения, отрисовку на дисплее символа минуса реализует заголовочный подключаемый файл RichUnoTM1637.h, при использовании же стандартной библиотеки TM1637.h такой возможности нет. Вот поэтому выбор и был очевиден - использовать библиотеку от производителя. Далее, ниже, еще один пример скетча, демонстрирующий работу дисплейного модуля TM1637. В примере реализованы простые часы, через мигающий разделитель двоеточие. Миганием разделителя управляет первый таймер контроллера Atmega328P-PU, также, счет часов-минут и обновление значения на дисплее реализовано через прерывание, подключенное к первому таймеру. Что бы всё это успешно работало нужно подключить в начале скетча библиотеку TimerOne.h, кому интересно может почитать соответствующую статью на сайте как это работает.  Итак, скетч я думаю отлично прокомментирован, для теста его можно скопировать прямо из браузера в среду разработки Arduino IDE:

 

/*Подключение необходимых библиотек*/
#include "TimerOne.h"
#include "RichUNOTM1637.h"

#define ON 1
#define OFF 0

/*
  Пин CLK модуля TM1637 привязан к пину D10 контролера Atmega328
  Пин DIO модуля TM1637 привязан к пину D11 контролера Atmega328
*/
#define CLK 10
#define DIO 11

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

/*Массив TimeDisp хранит значение выводимое на дисплей*/
int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00};

/*Переменые необходимые для работы таймера*/
unsigned char ClockPoint = 1;
unsigned char Update;
unsigned char halfsecond = 0;
unsigned char second;
unsigned char minute = 0;
unsigned char hour = 12;

void setup()
{
  /*Инициализация дисплея TM1637*/
  disp.init();
  /*
    Установка прерывания для TimerOne
    с периодичностью 500 миллисекунд
  */
  Timer1.initialize(500000);
  /*
    Подключаем функцию обработчик прерывания
    для TimerOne: TimingISR
  */
  Timer1.attachInterrupt(TimingISR);
}

void loop()
{
  /*Обновлять значение на дисплее по состоянию переменной Update*/
  if(Update == ON)
  {
    TimeUpdate();
    disp.display(TimeDisp);
  }
}

/*Функция счета часов и минут*/
void TimingISR()
{
  halfsecond ++;
  Update = ON;
  if(halfsecond == 2)
  {
    second ++;
    if(second == 60)
    {
      minute ++;
      if(minute == 60)
      {
        hour ++;
        if(hour == 24) hour = 0;
        minute = 0;
      }
      second = 0;
    }
    halfsecond = 0;
  }
  ClockPoint = (~ClockPoint) & 0x01;
}

/*Функция обновления значения выводимого на дисплей*/
void TimeUpdate(void)
{
  if(ClockPoint)
    disp.point(POINT_ON);
  else
    disp.point(POINT_OFF);

  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;
  Update = OFF;
}

    Конечно, как полноценные часы реализация данного скетча не возможна. Но, в качестве яркого примера, описывающего работу дисплейного модуля TM1637 в связке с первым таймером контроллера Atmega328 этот скетч очень даже необходим. Как вывести значение текущего времени на дисплей TM1637, использовав установленный на плате модуль часов реального времени DS1307, вы сможете узнать из следующей статьи. Ну а пока, вашему вниманию предлагается обзорное видео по данной статье, в нём будет продемонстрированы вышеописанные тестовые скетчи в работе на плате Arduino Rich Uno, всем приятного просмотра !!!