Проект 7: Таблиця 4-розрядна з 7-сегментних індикаторів. Робимо динамічну індикацію

В цьому експерименті ми розглянемо роботу Arduino з 4-розрядною семисегментною матрицею. Одержимо уявлення про динамічну індикацію, що дозволяє використовувати одні виводи Arduino при поданні інформації на кілька семисегментних індикаторів.

Необхідні компоненти:

Матриця 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);
}
}

Порядок підключення:

  1. Підключаємо семисегментний індикатор за схемою на рис. 7.3.
  2. Завантажуємо в плату Arduino скетч з лістингу 7.2.
  3. // список виводів 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 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; // повертаємо стан кнопки
    }
    }

     

  4. Натисканням кнопки запускаємо або зупиняємо секундомір.

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