Проект 15: 4-значный светодиодный сегментный дисплей

Описание
Четырёхзначный индикатор состоит из четырёх отдельных семисегментных цифровых индикаторов, которые могут отображать четыре цифры или символа.
В этом проекте мы покажем, как создать проект Arduino, который отображает нужные вам числа с помощью платы разработки UNO R3 (ch340) и 4-значного светодиодного сегментного дисплея.
Аппаратное обеспечение
1. Плата разработки UNO R3 (ch340) x1
2. 4-значный светодиодный сегментный дисплей x1
3. Макетная плата x1
4. Соединительные провода
Принцип работы
Четырёхзначный индикатор состоит из четырёх отдельных семисегментных цифровых индикаторов, которые могут отображать четыре цифры или символа.

Это уменьшает количество выводов многоразрядного дисплея, но увеличивает сложность управления им. Например, при таком подключении, если мы подадим напряжение на вывод A 4-значного дисплея, сегменты A всех светодиодных блоков включатся. Чтобы контролировать, какой светодиодный блок будет пропускать этот сигнал, у каждого блока есть дополнительный вывод — вывод цифры. Таким образом, в 4-значном дисплее также есть 4 вывода цифр, которые управляют светодиодными блоками индивидуально. Ниже показан 4-значный светодиодный дисплей с дополнительными 4 управляющими входами, по одному для каждого светодиодного блока.
Внутреннее соединение 4-значного 7-сегментного светодиодного дисплея, показывающее выводы сегментов и управляющие выводы цифр, которые контролируют, будет ли сигнал с выводов сегментов отображаться на соответствующем светодиодном блоке.
В результате, если мы хотим отобразить число 1111, нам нужно подать напряжение на D1, D2, D3 и D4, потому что все дисплеи должны показать цифру. Также необходимо подать напряжение на входы B и C, как показано ниже:
Изображение с красным цветом проводов, которые должны быть активированы для отображения числа «1111»
Технические характеристики
Функция: SDK
Цвет сегмента: Молочно-белый или такой же, как цвет свечения
Высота цифры: 0.28 дюйма
Цвет лицевой панели: Чёрный, серый или красный
Количество цифр: 4
Особенности: Энергосбережение и высокая стабильность
Распиновка
Типичный 4-значный 7-сегментный светодиодный дисплей имеет 12 выводов, по шесть с каждой стороны, как показано на рисунке ниже.

Распиновка 4-значного 7-сегментного светодиодного дисплея
Четыре из этих выводов (D1, D2, D3 и D4) используются для управления отдельными цифрами и определения, какие сигналы проходят через светодиодные блоки. Остальные выводы соответствуют отдельным сегментам.
Схема подключения
Подключите катодные выводы (D1, D2, D3, D4) цифрового индикатора к цифровым выводам (D2, D3, D4, D5) на плате.
Подключите анодные выводы (a, b, c, d, e, f, g, dp) цифрового индикатора к цифровым выводам (D6, D7, D8, D9, D10, D11, D12, D13) на плате.

Установка библиотеки
Перед началом программирования необходимо сначала установить библиотеку TimerOne.
Откройте менеджер библиотек: Нажмите на меню «Инструменты», затем выберите «Управление библиотеками…».

Поиск библиотеки:
В появившемся окне менеджера библиотек вы увидите поле поиска. Введите название библиотеки “TimerOne”.

Выбор и установка библиотеки:
Найдите нужную библиотеку в результатах поиска и кликните по ней.
Справа появится кнопка «Установить». Нажмите на неё.

Ожидание установки: Arduino IDE автоматически загрузит и установит выбранную библиотеку. После завершения установки кнопка «Установить» изменится на «Установлено», что означает успешную установку.
Пример кода
/*
Electronics Learning Starter Kit for Arduino
Project 15
4 digit LED Segment Display
Edit By Keyes
*/
#include <TimerOne.h>
//the pins of 4-digit 7-segment display attach to pin2-13 respectively
int a = 6;
int b = 7;
int c = 8;
int d = 9;
int e = 10;
int f = 11;
int g = 12;
int p = 13;
int d4 = 5;
int d3 = 4;
int d2 = 3;
int d1 = 2;
long n = 0;// n represents the value displayed on the LED display. For example, when n=0, 0000 is displayed. The maximum value is 9999.
int x = 100;
int del = 5;//Set del as 5; the value is the degree of fine tuning for the clock
int count = 0;//Set count=0. Here count is a count value that increases by 1 every 0.1 second, which means 1 second is counted when the value is 10
void setup()
{
//set all the pins of the LED display as output
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(p, OUTPUT);
Timer1.initialize(100000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
Timer1.attachInterrupt( add ); // attach the service routine here
}
/*************************************\**/
void loop()
{
clearLEDs();//clear the 7-segment display screen
pickDigit(0);//Light up 7-segment display d1
pickNumber((n/1000));// get the value of thousand
delay(del);//delay 5ms
clearLEDs();//clear the 7-segment display screen
pickDigit(1);//Light up 7-segment display d2
pickNumber((n%1000)/100);// get the value of hundred
delay(del);//delay 5ms
clearLEDs();//clear the 7-segment display screen
pickDigit(2);//Light up 7-segment display d3
pickNumber(n%100/10);//get the value of ten
delay(del);//delay 5ms
clearLEDs();//clear the 7-segment display screen
pickDigit(3);//Light up 7-segment display d4
pickNumber(n%10);//Get the value of single digit
delay(del);//delay 5ms
}
/**************************************/
void pickDigit(int x) //light up a 7-segment display
{
//The 7-segment LED display is a common-cathode one. So also use digitalWrite to set d1 as high and the LED will go out
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch(x)
{
case 0:
digitalWrite(d1, LOW);//Light d1 up
break;
case 1:
digitalWrite(d2, LOW); //Light d2 up
break;
case 2:
digitalWrite(d3, LOW); //Light d3 up
break;
default:
digitalWrite(d4, LOW); //Light d4 up
break;
}
}
//The function is to control the 7-segment LED display to display numbers. Here x is the number to be displayed. It is an integer from 0 to 9
void pickNumber(int x)
{
switch(x)
{
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
void clearLEDs() //clear the 7-segment display screen
{
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(p, LOW);
}
void zero() //the 7-segment led display 0
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, LOW);
}
void one() //the 7-segment led display 1
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void two() //the 7-segment led display 2
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, LOW);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void three() //the 7-segment led display 3
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, HIGH);
}
void four() //the 7-segment led display 4
{
digitalWrite(a, LOW);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void five() //the 7-segment led display 5
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void six() //the 7-segment led display 6
{
digitalWrite(a, HIGH);
digitalWrite(b, LOW);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void seven() //the 7-segment led display 7
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}
void eight() //the 7-segment led display 8
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
void nine() //the 7-segment led display 9
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, LOW);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
/*****************************************\**/
void add()
{
// Toggle LED
count ++;
if(count == 10)
{
count = 0;
n++;
if(n == 10000)
{
n = 0;
}
}
}
Объяснение кода
#include <TimerOne.h>
Эта строка подключает библиотеку TimerOne, которая используется для создания таймеров и прерываний.
int a = 6;
int b = 7;
int c = 8;
int d = 9;
int e = 10;
int f = 11;
int g = 12;
int p = 13;
int d4 = 5;
int d3 = 4;
int d2 = 3;
int d1 = 2;
long n = 0;
int x = 100;
int del = 5;
int count = 0;
Эти строки определяют ряд переменных и констант:
a по g и p — выводы, используемые для подключения 7-сегментного светодиода.
d1 по d4 — выводы, используемые для выбора отображаемой цифры.
n хранит число, которое будет отображаться.
x задаёт частоту мигания светодиода, установленную в 100 раз в секунду.
del — задержка между обновлениями каждой цифры в миллисекундах.
count используется для подсчёта интервалов по 0.1 секунды для обновления дисплея.
void setup() {
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(p, OUTPUT);
Timer1.initialize(100000);
Timer1.attachInterrupt( add );
}
В функции setup():
Все выводы для светодиодов и цифр устанавливаются как выходы.
Таймер инициализируется с интервалом 100 000 микросекунд (0.1 секунды).
К таймеру привязывается функция обработки прерывания add.
void loop() {
clearLEDs();
pickDigit(0);
pickNumber((n/1000));
delay(del);
clearLEDs();
pickDigit(1);
pickNumber((n%1000)/100);
delay(del);
clearLEDs();
pickDigit(2);
pickNumber(n%100/10);
delay(del);
clearLEDs();
pickDigit(3);
pickNumber(n%10);
delay(del);
}
В функции loop() повторяются следующие шаги для отображения цифр:
Очистка дисплея.
Последовательный выбор каждой цифры и отображение соответствующего числа.
void pickDigit(int x) {
digitalWrite(d1, HIGH);
digitalWrite(d2, HIGH);
digitalWrite(d3, HIGH);
digitalWrite(d4, HIGH);
switch(x) {
case 0:
digitalWrite(d1, LOW);
break;
case 1:
digitalWrite(d2, LOW);
break;
case 2:
digitalWrite(d3, LOW);
break;
default:
digitalWrite(d4, LOW);
break;
}
}
Функция pickDigit(int x) используется для подсветки конкретной цифры:
Сначала все цифры выключаются.
В зависимости от значения параметра x выбирается цифра для подсветки.
void pickNumber(int x) {
switch(x) {
default:
zero();
break;
case 1:
one();
break;
case 2:
two();
break;
case 3:
three();
break;
case 4:
four();
break;
case 5:
five();
break;
case 6:
six();
break;
case 7:
seven();
break;
case 8:
eight();
break;
case 9:
nine();
break;
}
}
Функция pickNumber(int x) используется для выбора отображаемого числа на основе параметра x и вызывает соответствующую функцию отображения цифры.
void clearLEDs() {
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
digitalWrite(p, LOW);
}
Функция clearLEDs() используется для выключения всех светодиодов и очистки дисплея.
void add() {
count ++;
if(count == 10) {
count = 0;
n++;
if(n == 10000) {
n = 0;
}
}
}
Функция add() — это обработчик прерывания таймера, используемый для обновления отображаемого числа:
Увеличивает count каждые 0.1 секунды.
Когда count достигает 10, сбрасывает его в 0 и увеличивает n.
Если n достигает 10 000, сбрасывает его в 0 для циклического отображения.
Результат проекта
После загрузки кода на плату Arduino вы увидите, как четырёхзначный 7-сегментный светодиодный дисплей начнёт мигать числами с заданным интервалом. Отображаемые числа будут постепенно увеличиваться от 0 до 9999, а затем снова начинаться с 0. Светодиод будет мигать 5 раз в секунду, обновляя число каждые 0.1 секунды.
