Підключення семисегментних індикаторів до Arduino

Семисегментний індикатор це пристрій відображення цифрової інформації, набір звичайних світлодіодів, які зібрані в одному корпусі, викладені у формі «8» (сім індикаторів-смужок) в особливому порядку, що дає змогу виводити на екран арабські цифри від 0 до 9. Також окремим світлодіодом крапка (dp).

ЦифраСигменти
0ABCDEF
1BC
2ABDEG
3ABCDG
4BCFG
5ACDFG
6ACDEFG
7ABC
8ABCDEFG
9ABCDFG
7-segments-indicator-marking

Індикатори є в різних комбінаціях, найпоширеніші на один знак, два, три та чотири для годинника з двокрапкою.

7-segment-indicators

Є два варіанти індикаторів з загальним анодом та з загальним катодом

Відповідно це враховується в схемі підключення. Для підключення індикатора з загальним анодом, на загальний вивід подається + живлення, а увімкнення світлодіода від мікроконролера відбувається по низькому рівню (LOW). Для загального катод, загальний підключається до мінусу, а увімкнення по високому (HIGH).

Для початку розглянемо схему підключення однознакового індикатора з загальним катодом.

7-segments-1

A10
B9
C8
D5
E4
F2
G3
dp7
CC1, 6

Схема підключення

indicator-scheme

Код програми

#include <Arduino.h>

// #define ANOD  // Розкоментувати для загального анода

#ifdef ANOD
#define ON 0
#define OFF 1
#else
#define ON 1
#define OFF 0
#endif

#define A_1 2
#define B_1 3
#define C_1 4
#define D_1 5
#define E_1 6
#define F_1 7
#define G_1 8
#define DP_1 9

void zero()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, ON);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, OFF);
}

void one()
{
  digitalWrite(A_1, OFF);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, OFF);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, OFF);
  digitalWrite(G_1, OFF);
}

void two()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, OFF);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, ON);
  digitalWrite(F_1, OFF);
  digitalWrite(G_1, ON);
}

void three()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, OFF);
  digitalWrite(G_1, ON);
}

void four()
{
  digitalWrite(A_1, OFF);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, OFF);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, ON);
}

void five()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, OFF);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, ON);
}

void six()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, OFF);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, ON);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, ON);
}

void seven()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, OFF);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, OFF);
  digitalWrite(G_1, OFF);
}

void eight()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, ON);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, ON);
}

void nine()
{
  digitalWrite(A_1, ON);
  digitalWrite(B_1, ON);
  digitalWrite(C_1, ON);
  digitalWrite(D_1, ON);
  digitalWrite(E_1, OFF);
  digitalWrite(F_1, ON);
  digitalWrite(G_1, ON);
}

void setup()
{
  pinMode(A_1, OUTPUT);
  pinMode(B_1, OUTPUT);
  pinMode(C_1, OUTPUT);
  pinMode(D_1, OUTPUT);
  pinMode(E_1, OUTPUT);
  pinMode(F_1, OUTPUT);
  pinMode(G_1, OUTPUT);
  pinMode(DP_1, OUTPUT);
}

void loop()
{
  one();
  delay(1000);
  two();
  delay(1000);
  three();
  delay(1000);
  four();
  delay(1000);
  five();
  delay(1000);
  six();
  delay(1000);
  seven();
  delay(1000);
  eight();
  delay(1000);
  nine();
  delay(1000);
}

Компактніший код

#include <Arduino.h>

#define GENERAL_ANOD 1
#define GENERAL_CATOD 0

#define TYPE GENERAL_ANOD // Вказати свій тип

#define A_1 2
#define B_1 3
#define C_1 4
#define D_1 5
#define E_1 6
#define F_1 7
#define G_1 8
#define DP_1 9

int nums[10][7] = {{1, 1, 1, 1, 1, 1, 0},  // 0
                   {0, 1, 1, 0, 0, 0, 0},  // 1
                   {1, 1, 0, 1, 1, 0, 1},  // 2
                   {1, 1, 1, 1, 0, 0, 1},  // 3
                   {0, 1, 1, 0, 0, 1, 1},  // 4
                   {1, 0, 1, 1, 0, 1, 1},  // 5
                   {1, 0, 1, 1, 1, 1, 1},  // 6
                   {1, 1, 1, 0, 0, 0, 0},  // 7
                   {1, 1, 1, 1, 1, 1, 1},  // 8
                   {1, 1, 1, 1, 0, 1, 1}}; // 9

void disp_num(int *num)
{
  if (TYPE)
  {
    digitalWrite(A_1, !num[0]);
    digitalWrite(B_1, !num[1]);
    digitalWrite(C_1, !num[2]);
    digitalWrite(D_1, !num[3]);
    digitalWrite(E_1, !num[4]);
    digitalWrite(F_1, !num[5]);
    digitalWrite(G_1, !num[6]);
  }
  else
  {
    digitalWrite(A_1, num[0]);
    digitalWrite(B_1, num[1]);
    digitalWrite(C_1, num[2]);
    digitalWrite(D_1, num[3]);
    digitalWrite(E_1, num[4]);
    digitalWrite(F_1, num[5]);
    digitalWrite(G_1, num[6]);
  }
}

void display(int num)
{
  if ((num < 0) | (num > 9))
  {
    disp_num(nums[0]);
  }
  else
  {
    disp_num(nums[num]);
  }
}

void setup()
{
  pinMode(A_1, OUTPUT);
  pinMode(B_1, OUTPUT);
  pinMode(C_1, OUTPUT);
  pinMode(D_1, OUTPUT);
  pinMode(E_1, OUTPUT);
  pinMode(F_1, OUTPUT);
  pinMode(G_1, OUTPUT);
  pinMode(DP_1, OUTPUT);
}

void loop()
{
  for (int i = 0; i < 10; i++)
  {
    display(i);
    delay(500);
  }
}

Індикатори на два і більше знаків

Розглянемо семисегментний індикатор на три знаки в одному корпусі. Фактично він нічим не відрізняються від індикатора на один знак.

Внутрішня схема трьохзнакового індикатора

3-digit-indicator-scheme

Тобто наше завдання почергово вмикати перший, другий та третій знак. При швидкому перемиканні, ми отримаєм враження начебто всі три знаки відобоажаються одночасно. Комфортною частотою для сприйняття людиною, є 25 герц (25 раз на секунду).

Схема підключення трьохзнакового індикатора

3-diget-indicator connect

Код програми

#include <Arduino.h>
#define GENERAL_ANOD 1
#define GENERAL_CATOD 0
#define TYPE GENERAL_ANOD // Вказати свій тип
#define A_1 2
#define B_1 3
#define C_1 4
#define D_1 5
#define E_1 6
#define F_1 7
#define G_1 8
#define DP_1 9
#define DIG_1 10
#define DIG_2 11
#define DIG_3 12
volatile uint8_t dig1;
volatile uint8_t dig2;
volatile uint8_t dig3;

bool change = true;
bool change_dig1 = false;
bool change_dig2 = false;
bool change_dig3 = false;
bool change_dp = false;
bool flag_float = false;
uint8_t nums[11][7] = {{1, 1, 1, 1, 1, 1, 0},  // 0
                       {0, 1, 1, 0, 0, 0, 0},  // 1
                       {1, 1, 0, 1, 1, 0, 1},  // 2
                       {1, 1, 1, 1, 0, 0, 1},  // 3
                       {0, 1, 1, 0, 0, 1, 1},  // 4
                       {1, 0, 1, 1, 0, 1, 1},  // 5
                       {1, 0, 1, 1, 1, 1, 1},  // 6
                       {1, 1, 1, 0, 0, 0, 0},  // 7
                       {1, 1, 1, 1, 1, 1, 1},  // 8
                       {1, 1, 1, 1, 0, 1, 1},  // 9
                       {0, 0, 0, 0, 0, 0, 1}}; // -
void disp_num(uint8_t *num, bool dp)
{
    if (TYPE)
    {
        digitalWrite(A_1, !num[0]);
        digitalWrite(B_1, !num[1]);
        digitalWrite(C_1, !num[2]);
        digitalWrite(D_1, !num[3]);
        digitalWrite(E_1, !num[4]);
        digitalWrite(F_1, !num[5]);
        digitalWrite(G_1, !num[6]);
        digitalWrite(DP_1, !dp);
    }
    else
    {
        digitalWrite(A_1, num[0]);
        digitalWrite(B_1, num[1]);
        digitalWrite(C_1, num[2]);
        digitalWrite(D_1, num[3]);
        digitalWrite(E_1, num[4]);
        digitalWrite(F_1, num[5]);
        digitalWrite(G_1, num[6]);
        digitalWrite(DP_1, dp);
    }
}
void display(int num)
{
    bool minus = false;
    if (num < -99)
    {
        dig1 = 10;
        dig2 = 9;
        dig3 = 9;

        change_dig1 = true;
        change_dig2 = true;
        change_dig3 = true;
        return;
    }
    if (num < 0)
    {
        minus = true;
        num = num * -1;
    }

    if (num > 999)
    {
        dig1 = 9;
        dig2 = 9;
        dig3 = 9;
        change_dig1 = true;
        change_dig2 = true;
        change_dig3 = true;
        return;
    }
    if (num < 10)
    {
        dig3 = num;
        change_dig3 = true;
        if (minus)
        {
            if (flag_float)
            {
                change_dig1 = true;
                dig1 = 10;
                dig2 = 0;
            }
            else
            {
                dig2 = 10;
            }
            change_dig2 = true;
        }
        else
        {
            if (flag_float)
            {
                change_dig2 = true;
                dig2 = 0;
            }
            else
            {
                change_dig2 = false;
            }
            change_dig1 = false;
        }
    }
    else if (num < 100)
    {
        change_dig2 = true;
        change_dig3 = true;
        dig2 = num / 10;
        dig3 = num - dig2 * 10;
        if (minus)
        {
            dig1 = 10;
            change_dig1 = true;
        }
        else
        {
            change_dig1 = false;
        }
    }
    else
    {
        dig1 = num / 100;
        int _dig2 = num % 100;
        dig2 = _dig2 / 10;
        dig3 = (_dig2 % 10);
        change_dig1 = true;
        change_dig2 = true;
        change_dig3 = true;
    }
}

void display(float num)
{

    if ((num > -10) & (num < 100))
    {
        display(int(num * 10));
        change_dp = true;
        flag_float = true;
    }
    else
    {
        change_dp = false;
        display(int(num));
        flag_float = false;
    }
}

void output()
{
    static uint8_t _dig = 1;
    static unsigned long timer = 0;
    if ((millis() - timer) >= 7)
    {
        timer = millis();
        if (_dig > 3)
        {
            _dig = 1;
        }
        switch (_dig)
        {
        case 1:
            if (change_dig1)
            {
                digitalWrite(DIG_1, HIGH);
                digitalWrite(DIG_2, LOW);
                digitalWrite(DIG_3, LOW);
                disp_num(nums[dig1], false);
            }
            break;
        case 2:
            if (change_dig2)
            {
                digitalWrite(DIG_1, LOW);
                digitalWrite(DIG_2, HIGH);
                digitalWrite(DIG_3, LOW);
                disp_num(nums[dig2], change_dp);
            }
            break;
        case 3:
            if (change_dig3)
            {
                digitalWrite(DIG_1, LOW);
                digitalWrite(DIG_2, LOW);
                digitalWrite(DIG_3, HIGH);
                disp_num(nums[dig3], false);
            }
            break;
        default:
            break;
        }
        _dig++;
    }
}
void setup()
{
    pinMode(A_1, OUTPUT);
    pinMode(B_1, OUTPUT);
    pinMode(C_1, OUTPUT);
    pinMode(D_1, OUTPUT);
    pinMode(E_1, OUTPUT);
    pinMode(F_1, OUTPUT);
    pinMode(G_1, OUTPUT);
    pinMode(DP_1, OUTPUT);
    pinMode(DIG_1, OUTPUT);
    pinMode(DIG_2, OUTPUT);
    pinMode(DIG_3, OUTPUT);
}
void loop()
{
    output();
    static float count = -14.1;
    static unsigned long timer = 0;
    if ((millis() - timer) > 200)
    {
        timer = millis();
        count += 0.1;
        display(count);
    }
}

Даний приклад відображає цілі значення від -99 до 999. Значення з рухомою комою від – 9.9 до 99.9, якщо значення менше – 9.9 або більше 99.9, тоді на дисплей буде виводитись значення як ціле число без округлення, тобто (154.8 >> 154), (-45.3 >> -45).

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *