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

Описание

Четырёхзначный индикатор состоит из четырёх отдельных семисегментных цифровых индикаторов, которые могут отображать четыре цифры или символа.

В этом проекте мы покажем, как создать проект Arduino, который отображает нужные вам числа с помощью платы разработки UNO R3 (ch340) и 4-значного светодиодного сегментного дисплея.

Аппаратное обеспечение

1. Плата разработки UNO R3 (ch340) x1

2. 4-значный светодиодный сегментный дисплей x1

3. Макетная плата x1

4. Соединительные провода

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

Четырёхзначный индикатор состоит из четырёх отдельных семисегментных цифровых индикаторов, которые могут отображать четыре цифры или символа.

IMG_256

Это уменьшает количество выводов многоразрядного дисплея, но увеличивает сложность управления им. Например, при таком подключении, если мы подадим напряжение на вывод A 4-значного дисплея, сегменты A всех светодиодных блоков включатся. Чтобы контролировать, какой светодиодный блок будет пропускать этот сигнал, у каждого блока есть дополнительный вывод — вывод цифры. Таким образом, в 4-значном дисплее также есть 4 вывода цифр, которые управляют светодиодными блоками индивидуально. Ниже показан 4-значный светодиодный дисплей с дополнительными 4 управляющими входами, по одному для каждого светодиодного блока.

IMG_256Внутреннее соединение 4-значного 7-сегментного светодиодного дисплея, показывающее выводы сегментов и управляющие выводы цифр, которые контролируют, будет ли сигнал с выводов сегментов отображаться на соответствующем светодиодном блоке.

В результате, если мы хотим отобразить число 1111, нам нужно подать напряжение на D1, D2, D3 и D4, потому что все дисплеи должны показать цифру. Также необходимо подать напряжение на входы B и C, как показано ниже:

IMG_257Изображение с красным цветом проводов, которые должны быть активированы для отображения числа «1111»

Технические характеристики

Функция: SDK

Цвет сегмента: Молочно-белый или такой же, как цвет свечения

Высота цифры: 0.28 дюйма

Цвет лицевой панели: Чёрный, серый или красный

Количество цифр: 4

Особенности: Энергосбережение и высокая стабильность

Распиновка

Типичный 4-значный 7-сегментный светодиодный дисплей имеет 12 выводов, по шесть с каждой стороны, как показано на рисунке ниже.

IMG_258

Распиновка 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) на плате.

Img

Установка библиотеки

Перед началом программирования необходимо сначала установить библиотеку 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 секунды.

P15