Четырёхразрядный семисегментный LED индикатор

Модуль индикации способен показывать цифровую или буквенную информацию и будет незаменим при сборке таймеров, часов или иных технических проектов.

Принцип работы

Один семисегментный индикатор состоит из 7 светодиодов - палочек, восьмой светодиод - точка, каждый светодиод имеет маркировку от A до G, и DP (digital point) для точки. 

Палочки расположены так, чтобы образовать "восьмерку", зажигая определенные светодиоды и их комбинации можно получить все арабские цифры и даже некоторые буквы:
Латинские буквы: A, B, b, C, c, d, E, F, g, H, h, I, i, J, L, n, O, o, P, q, r, S, t, U, u, Y.
Русские буквы: А, Б, В, Г, г, Е, Н, О, о, П, п, Р, С, с, У, Ч, Ь, Э.

Сборка из светодиодов помещается в корпус, который имеет несколько выводов для управления светодиодами и еще один выход - плюс питания или земля, в зависимости от схемы, по которой светодиоды собраны внутри: схема с общим анодом (положительный контакт) или общим катодом (отрицательный контакт).

Существуют индикаторы, в которых возможно отображать не одну цифру, а несколько, в них присутствует несколько разрядов, например четыре. Такой индикатор объединяет в себе 4 семисегментных индикатора и у него появляются выводы, отвечающие за разряд. Поскольку каждый светодиод имеет 2 вывода, то для четырехразрядного индикатора понадобилось бы очень много выводов (8*4=32 светодиода), к тому же зажигать одновременно много светодиодов - не энергоэффективно, поэтому для простоты работы и малого потребления светодиоды объединяют в группы и быстро, но незаметно для человеческого глаза, переключают их.

Выводы одноимённых сегментов всех разрядов соединены вместе, а общие выводы каждого разряда выведены отдельно.

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

Технические характеристики модуля

Габариты: 45 мм х 22 мм
Количество разрядов: 4
Схема соединений: общий катод

Подключение

Модуль имеет следующие выводы:

GND - земля (общий)
DIG4 - разряд 4
DIG3 - разряд 3
DIG2 - разряд 2
DIG1 - разряд 1
A - горизонтальный светодиод сверху
F - вертикальный светодиод слева сверху
B - вертикальный светодиод справа сверху
G - оризонтальный светодиод посередине
C - вертикальный светодиод справа внизу
DP - светодиод - точка
D - горизонтальный светодиод снизу
E - вертикальный светодиод слева снизу

Чтобы начать работу с датчиком его необходимо подключить к микроконтроллеру по схеме ниже. Модуль можно подключить с помощью разделяемого шлейфа 40 пин.

Программа

Для управления индикатором необходимо циклически подавать напряжение на общие выводы всех разрядов и одновременно на выводы сегментов выставляется код из восьми нулей и единиц. Основное правило: в каждый момент времени на индикаторе горит один разряд (одна цифра). Дальше переходят к второй цифре, третьей и четвертой.

int anodPins[] = {A1, A2, A3, A4}; // Задаем пины для каждого разряда DIG1, DIG2, DIG3, DIG4
int segmentsPins[] = {5, 6, 7, 8, 9, 10, 11, 12}; //Задаем пины для каждого сегмента (из 7 + 1(точка))
//Порядок сегментов в массиве: {A, B, C, D, E, F, G, DP}

void setup() {
  // Все выходы программируем как OUTPUT
  for (int i = 0; i < 4; i++) {
    pinMode(anodPins[i], OUTPUT);
  }
  for (int i = 0; i < 8; i++) {
    pinMode(segmentsPins[i], OUTPUT);
  }
}

int seg[11][8] = {
  {1, 1, 1, 1, 1, 1, 0, 0}, //Цифра 0
  {0, 1, 1, 0, 0, 0, 0, 0}, //Цифра 1
  {1, 1, 0, 1, 1, 0, 1, 0}, //Цифра 2
  {1, 1, 1, 1, 0, 0, 1, 0}, //Цифра 3
  {0, 1, 1, 0, 0, 1, 1, 0}, //Цифра 4
  {1, 0, 1, 1, 0, 1, 1, 0}, //Цифра 5
  {1, 0, 1, 1, 1, 1, 1, 0}, //Цифра 6
  {1, 1, 1, 0, 0, 0, 0, 0}, //Цифра 7
  {1, 1, 1, 1, 1, 1, 1, 0}, //Цифра 8
  {1, 1, 1, 1, 0, 1, 1, 0}, //Цифра 9
  {0, 0, 0, 0, 0, 0, 0, 1} //Точка
};

int t = 0;
int digid = 0;

void loop() {
  t += 1;
  if (t > 650) t = 0;
  if ((t % 60) == 0) {
    digid = t / 60; //Каждую секунду отображаем цифры подряд
  }
  for (int i = 0; i < 4; i++) { // Каждый разряд по очереди
    for (int k = 0; k < 8; k++) {// Каждый сегмент по очереди - исходя из заданной карты
      digitalWrite(segmentsPins[k], ((seg[digid][k] == 1) ? LOW : HIGH));
    }
    digitalWrite(anodPins[i], HIGH);
    delay(1);
    digitalWrite(anodPins[i], LOW);
  }
}