Проект 7: Таблиця 4-розрядна з 7-сегментних індикаторів. Робимо динамічну індикацію
В цьому експерименті ми розглянемо роботу Arduino з 4-розрядною семисегментною матрицею. Одержимо уявлення про динамічну індикацію, що дозволяє використовувати одні виводи Arduino при поданні інформації на кілька семисегментних індикаторів.
Необхідні компоненти:
- контролер Arduino UNO R3;
- плата для прототипування;
- 4-розрядна семисегментного матриця;
- резистор 510 Ом - 8 штук;
- кнопка;
- резистор 10 кОм;
- дроти тато-тато.
Матриця 4-розрядна з семисегментних індикаторів складається з чотирьох семисегментних індикаторів і призначена для одночасного виведення на матрицю 4 цифр, також є можливість виведення десяткового дробу. Схема 4-розрядної матриці на 7-сегментних індикаторах показана на рис. 7.1.

Рис. 7.1. Схема 4-розрядної матриці на 7-сегментних індикаторах
Для виведення цифри необхідно запалити потрібні світлодіоди на контактах A-G і DP і вибрати потрібну матрицю подачею LOW на вивід 6, 8, 9 або 12.Підключемо контакти матриці до плати Arduino і будемо виводити цифри на різні розряди матриці. Для підключення нам знадобляться 12 виводів Arduino. Схема з'єднань для підключення 4-розрядної матриці до плати Arduino показана на рис. 7.2. При підключенні контактів використовуються обмежувальні резистори 510 Ом.

Рис. 7.2. Схема підключення 4-розрядної матриці до Arduino
Напишемо скетч послідовного виведення цифр (0-9) на довільний регістр матриці. Для вибору випадкового значення з діапазону будемо використовувати функцію random (). У масиві numbers [] зберігаються значення, відповідні даними для відображення цифр 0-9 (старший розряд байта відповідає мітці сегмента A індикатора, а молодший - сегменту G), в масиві pins [] - значення контактів для сегментів A-G і DP, в масиві pindigits [] - значення контактів для вибору розряду матриці. Вміст скетчу показано в лістингу 7.1.
// список виводів Arduino для підключення до розрядів ag
// семисегментний індикатор
int pins [8] = {9,13,4,6,7,10,3,5};
// значення для виведення цифр 0-9
byte numbers [10] = {B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,
B10111110, B11100000, B11111110,
B11110110};
// змінна для зберігання значення поточної цифри
int number = 0;
// семисегментний індикатор
int pindigits [4] = {2,8,11,12};
// змінна для зберігання поточного розряду
int digit = 0;
void setup ()
{
// Конфігурувати контакти як виходи
for (int i = 0; i <8; i ++)
pinMode (pins [i], OUTPUT);
for (int i = 0; i <4; i ++)
{PinMode (pindigits [i], OUTPUT);
digitalWrite (pindigits [i], HIGH);
}
}
void loop ()
{
number = (number + 1)% 10;
showNumber (number); // DS
for (int i = 0; i <4; i ++)
digitalWrite (pindigits [i], HIGH);
digit = random (0,4);
digitalWrite (pindigits [digit], LOW);
delay (3000);
}
// функція виведення цифри на семисегментний індикатор
void showNumber (int num)
{
for (int i = 0; i <7; i ++)
{
if (bitRead (numbers [num], 7-i) == HIGH) // запалити сегмент
digitalWrite (pins [i], HIGH);
else // загасити сегмент
digitalWrite (pins [i], LOW);
}
}
Порядок підключення:
- Підключаємо семисегментний індикатор за схемою на рис. 7.3.
- Завантажуємо в плату Arduino скетч з лістингу 7.2.
- Натисканням кнопки запускаємо або зупиняємо секундомір.
// семисегментний індикатор
int pins [8] = {9,13,4,6,7,10,3,5};
// значення для виведення цифр 0-9
byte numbers [10] = {B11111100, B01100000, B11011010,
B11110010, B01100110, B10110110,
B10111110, B11100000, B11111110,
B11110110};
// змінна для зберігання і обробки поточного значення
int number = 0;
int number1 = 0;
int number2 = 0;
// семисегментний індикатор
int pindigits [4] = {2,8,11,12};
// змінна для зберігання поточного розряду
int digit = 0;
// для відмірювання 100 мс
unsigned long millis1 = 0;
// режим 1 - секундомір працює
mode = 0;
const int BUTTON = 14; // Контакт 14 (A0) для підключення кнопки
int tekButton = LOW; // Змінна для збереження поточного стану кнопки
int prevButton = LOW; // Змінна для збереження попереднього стану
// до нопкі
boolean ledOn = false; // Поточний стан світлодіода (ввімкнутий/вимкнений)
void setup ()
{
// Конфігурувати контакт кнопки як вхід
pinMode (BUTTON, INPUT);
// Конфігурувати контакти як виходи
for (int i = 0; i <8; i ++)
pinMode (pins [i], OUTPUT);
for (int i = 0; i <4; i ++)
{PinMode (pindigits [i], OUTPUT);
digitalWrite (pindigits [i], HIGH);
}
}
void loop ()
{
tekButton = debounce (prevButton);
if (prevButton == LOW && tekButton == HIGH) // якщо натискання ...
{
mode = 1-mode; // зміна режиму
if (mode == 1)
number = 0;
}
if (millis () - millis1> = 100 && mode == 1)
{Millis1 = millis1 + 100;
number = number + 1;
if (number == 10000)
number = 0;
}
number1 = number;
for (int i = 0; i <4; i ++)
{
number2 = number1% 10;
number1 = number1 / 10;
showNumber (number2, i);
for (int j = 0; j <4; j ++)
digitalWrite (pindigits [j], HIGH);
digitalWrite (pindigits [i], LOW);
delay (1);
}
}
// функція виведення цифри на семисегментний індикатор
void showNumber (int num, int dig)
{
for (int i = 0; i <8; i ++)
{
if (bitRead (numbers [num], 7-i) == HIGH) // запалити сегмент
digitalWrite (pins [i], HIGH);
else // загасити сегмент
digitalWrite (pins [i], LOW);
}
if (dig == 1) // десяткова точка для другого розряду
digitalWrite (pins [7], HIGH);
}
// Функція згладжування брязкоту. Приймає в якості
// аргументу попередній стан кнопки і видає фактичне.
boolean debounce (boolean last)
{
boolean current = digitalRead (BUTTON); // Вважати стан кнопки,
if (last! = current) // якщо змінилося ...
{
d elay (5); // ж дем 5 м з
current = digitalRead (BUTTON); // зчитуємо стан кнопки
return current; // повертаємо стан кнопки
}
}

Рис. 7.3. Схема підключення для секундоміра