====== Модуль 4 - разрядного индикатора ======
===== Описание =====
Для упрощения работы с 4-разрядным 7-сегментным индикатором был создан данный модуль. На плате с одной стороны размещается дисплей, с другой стороны находится чип для работы с дисплеем - TM1637. Модуль имеет 4 вывода - что значительно упрощает работу с дисплеем, избавляя от большого количества проводов, дополнительных радиоэлектронных компонентов, делая легче подключение к контроллеру.

==== Технические характеристики ====
  * Напряжение питания: 5 В
  * Потребляемый ток: 60 мА
  * Рабочая температура: -40 °С - +85 °С

<WRAP center round tip 60%>
На практике, модуль также работает от напряжения в 3,3 В. Однако, данный режим работы не представлен в документации производителя чипа, поэтому подключение к 3,3 В электронике осуществляется Вами на свой страх и риск!
</WRAP>


==== Физические размеры ====
  * Модуль (Д х Ш х В): 65 х 25 х 12 мм

==== Плюсы использования ====
  * Избавляет от проводов в проекте
  * Существенно упрощает подключение к контроллеру
  * Экономит пространство
  * Регулируемая яркость свечения дисплея (программно)
  * Нет необходимости подключать дополнительные компоненты (резисторы, регистры)

==== Минусы использования ====
  * Модуль дороже обычного индикатора

==== Библиотека для работы с дисплеем ====
  * [[http://files.smartelements.ru/know_libs/tm1637.zip|Скачать]]

==== Смотрите также ====
  * [[main:sensors:kb874#Вывод_значений_на_дисплей|Использование индикатора в проекте подсчёта количества посетителей]]

===== Примеры подключения и использования  =====
==== Пример 1. Вывод символов и цифр на дисплей ====
В примере демонстрируется подключение дисплея к контроллеру, вывод различных надписей, а также чисел от 0 до 1000. Примеры тестировались на контроллере Smart UNO.

**Для этого нам понадобится:**
^ Что нужно:                                                                                                                                                      ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер                              ]]                                        | 1           |
| [[http://smartelements.ru/collection/displei-i-indikatory/product/modul-4-razryadnogo-indikatora-krasnyy| Модуль 4 - разрядного индикатора (красный)]]                                                                                                                                        | 1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]]                                          | 4           |

**Подключение:**
{{ :главная:дисплеи:4_digit.fzz.jpg?nolink |}}

**Пример кода:**
<file Arduino>
#include "SevenSegmentTM1637.h" //подключение библиотеки для работы с дисплеем

const byte PIN_CLK = 4;   // подключение контакта CLK
const byte PIN_DIO = 5;   // подключение контакта DIO
SevenSegmentTM1637    display(PIN_CLK, PIN_DIO); //создание объекта дисплея

void setup() {
  display.begin();            // инициализация дисплея
  display.setBacklight(100);  // установка яркости в 100%
  display.print("INIT");      // отображение надписи INIT (инициализация) на дисплее
  delay(1000);                // задержка в 1 секунду
};

void loop() {
  display.print("LOOP");                // отображение надписи LOOP (цикл)
  delay(1000);                          // задержка 1 секунда
  display.print("COUNTING SOME DIGITS");// написать "COUNTING SOME DIGITS" - подсчёт нескольких цифр
  display.clear();                      // очистка дисплея
  
  for (uint8_t i=0; i < 1000; i++) {     // цикл от 0 до 1000
    display.print(i);                   // вывод текущего числа на дисплей
    delay(100);                         // задержка в 100 мс
  };
  
  display.clear();                      // очистить дисплей
  display.print("SUCC");                // вывести надпись SUCC (успешно)
  display.blink();                      // помигать надписью SUCC
  delay(1000);                          // задержка в 1 секунду

  display.clear();                      // очистить дисплей
  display.print("SMARTELEMENTS.RU - OFFICIAL STORE");                // вывести надпись
  display.clear();                      // очистить дисплей

};
</file>

==== Пример 2. Вывод символов и цифр на дисплей ====
В примере демонстрируется подключение дисплея к контроллеру, вывод различных надписей, а также подключения режима игрового табло и часов. Примеры тестировались на контроллере Smart UNO.

**Для этого нам понадобится:**
^ Что нужно:                                                                                                                                                      ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер                              ]]                                        | 1           |
| [[http://smartelements.ru/collection/displei-i-indikatory/product/modul-4-razryadnogo-indikatora-krasnyy| Модуль 4 - разрядного индикатора (красный)]]                                                                                                                                        | 1           |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]]                                          | 4           |

**Подключение:**
{{ :главная:дисплеи:4_digit.fzz.jpg?nolink |}}

**Пример кода:**
<file Arduino>
#include "SevenSegmentTM1637.h" //подключение библиотеки для работы с дисплеем
#include "SevenSegmentExtended.h" // библиотека для подключения доп функций (например отображение времени)

const byte PIN_CLK = 4;   // подключение контакта CLK
const byte PIN_DIO = 5;   // подключение контакта DIO
SevenSegmentExtended    display(PIN_CLK, PIN_DIO); //создание объекта дисплея

void setup() {
  display.begin();            // инициализация дисплея
  display.setBacklight(100);  // установка яркости в 100%
  display.print("INIT");      // отображение надписи INIT (инициализация) на дисплее
  delay(1000);                // задержка в 1 секунду
};

void loop() {

  display.clear(); //очистка дисплея

  //вывод очков игры "Семёрочка" из набора Смарт 30
  //предположим что у игрока 1 - 1 очко, у игррока 2 после очередной партии - 3 победных очка
  //и необходимо на дисплей вывести результат игры
  byte player1Score = 1; //количество очков игрока 1
  byte player2Score = 3; //количество очков игрока 3

  display.print("THE GAME IS OVER, SCORE IS"); //вывод надписи
  display.printDualCounter(player1Score, player2Score); // вывот счёта "1:3" на дисплей
  display.blink(); //помигать дисплеем
  delay(1500); //задержка в полторы секунды

  display.clear(); //очистка дисплея
  display.print("NOW IS CLOCK TIME"); //вывод надписи
  display.clear(); //очистка дисплея

  for (byte hours = 0 ; hours < 24; hours++) {                // подсчёт часов с 0 до 23
    for (byte minutes = 0 ; minutes < 60; minutes++) {          // минуты с 0 до 59
      display.printTime(hours, minutes, true);  // display time
      delay(10);                // задержка перед увеличением минуты (реально - 60 секунд, но для демонстрации - 10 мс)
    };
  };
}
</file>

==== Пример 3. Засыпать и просыпаться по будильнику часов ====
В данном примере формируется минипроект - часы с будильником. Часы показывают время на черырёхразрядном индикаторе. У устройства имеется кнопка - которая переводит контроллер в режим сна до следующей минуты, устанавливая на часах будильник на следующую за текущей минуту. Индикацией установки будильника служит появление на индикаторе надписи "ALAR" - от английского alarm (будильник). Для демонстрации того, что устройство находится в режиме сна, на дисплей выводится информация в виде четырёх тире (- - - -). По пробуждению, дисплей снова отображает время.

**Библиотеки**

Помимо библиотеки для работы с  индикатором, понадобятся библиотеки для режимов сна и модуля часов. Их можно загрузить со страниц в Базе Знаний: [[main:info:sleep]] и [[main:modules:pcf8563]]

^ Что нужно                                                                                                               ^  Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                   |  1           |
| [[https://smartelements.ru/collection/shildy/product/sensor-shield|Sensor Shield]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-chasov-pcf8563|Модуль часов PCF8563]]                      |  1           |
| [[https://smartelements.ru/collection/displei-i-indikatory/product/modul-4-razryadnogo-indikatora-krasnyy|Модуль 4-разрядного индикатора ]]                      |  1           |
| [[https://smartelements.ru/collection/moduli/product/modul-knopki|Модуль кнопки]]                      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h4-20-sm|Шлейф "мама-мама" х4]]      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/shleyf-mama-mama-h3-20-sm|Шлейф "мама-мама" х3]]      |  1           |
| [[https://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-mama-mama|Провода мама-мама]]  |  5          |

**Скетч для загрузки**
<file Arduino>
#include "SevenSegmentTM1637.h" //подключение библиотеки для работы с дисплеем
#include "SevenSegmentExtended.h" //подключение расширенных функций дисплея
#include <Wire.h>  //библиотека для работы с I2C
#include <Rtc_Pcf8563.h> //библиотека для работы с часами
#include <Sleep_n0m1.h> //подключение библиотеки для режимов сна

const int wakeUpPin = 3; //вывод прерывания
const int button = 6; //вывод подключения кнопки

Rtc_Pcf8563 rtc; //инициализация часов
SevenSegmentExtended display(13, 12); //создание объекта дисплея
Sleep sleep; //объект для ввода контроллера в сон

void setup() {
  display.begin(); //инициализация дисплея
  display.setBacklight(100); //установка яркости в 100%
  display.print("INIT"); //отображение надписи INIT (инициализация) на дисплее
  delay(1000); //задержка в 1 секунду
  pinMode(button, INPUT); //режим вывода кнопки

}

void loop() {

  rtc.getTime(); //получение времени с часов
  byte hour = rtc.getHour(); //запись в переменную количество часов
  byte minute = rtc.getMinute(); //запись в переменную количество минут
  display.printTime(hour, minute, false); //вывод времени

  if (digitalRead(button)) { //была нажата кнопка

    set_alarm(minute); //установить будильник

    display.print("----"); //вывести четыре тире, означающие что контроллер спит

    sleep.pwrDownMode(); //установка режима сна PWR_DOWN

    //сон будет продолжаться пока на выводе wakeUpPin не поменяется уровень сигнала
    //в данном случае с "HIGH" на "LOW"
    sleep.sleepPinInterrupt(wakeUpPin, FALLING); //(номер вывода прерывания, состояние прерывания)

    //очистка будильника
    clr_alarm();
  }
}

/* Процедура очищает регистры будильника на часах.
 *  Требуется для корректной работы модуля часов.
 */
void clr_alarm() {
  detachInterrupt(1); //отключить прерывание номер 1 (вывод контроллера - 3)

  rtc.clearAlarm(); //очистить будильник
  delay(1000); //секундная задержка
}

/* Процедура устанавливает будильник на часах на одну минуту больше.
 *  Здесь можно устанавливать будильник на любое время методом setAlarm(), 
 *  который принимает четыре параметра:
 *  - минуты будильника
 *  - часы будильника
 *  - день будильника
 *  - день недели будильника
 *  Если любое из значений равно 99 - значит берется значение текущего времени.
 */
void set_alarm(const int& minute) {

  rtc.setAlarm(minute + 1, 99, 99, 99); //установка будильника на одну минуту

  display.clear(); //очистить дисплей
  display.print("ALAR"); //вывести надпись ALAR (ALARM)
  delay(1000); //подождать секунду
  display.clear(); //очистить дисплей
}
</file>