Семисегментний індикатор це пристрій відображення цифрової інформації, набір звичайних світлодіодів, які зібрані в одному корпусі, викладені у формі «8» (сім індикаторів-смужок) в особливому порядку, що дає змогу виводити на екран арабські цифри від 0 до 9. Також окремим світлодіодом крапка (dp).
Цифра | Сигменти |
---|---|
0 | ABCDEF |
1 | BC |
2 | ABDEG |
3 | ABCDG |
4 | BCFG |
5 | ACDFG |
6 | ACDEFG |
7 | ABC |
8 | ABCDEFG |
9 | ABCDFG |
Індикатори є в різних комбінаціях, найпоширеніші на один знак, два, три та чотири для годинника з двокрапкою.
Є два варіанти індикаторів з загальним анодом та з загальним катодом
Відповідно це враховується в схемі підключення. Для підключення індикатора з загальним анодом, на загальний вивід подається + живлення, а увімкнення світлодіода від мікроконролера відбувається по низькому рівню (LOW). Для загального катод, загальний підключається до мінусу, а увімкнення по високому (HIGH).
Для початку розглянемо схему підключення однознакового індикатора з загальним катодом.
Схема підключення
Код програми
#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);
}
}
Індикатори на два і більше знаків
Розглянемо семисегментний індикатор на три знаки в одному корпусі. Фактично він нічим не відрізняються від індикатора на один знак.
Внутрішня схема трьохзнакового індикатора
Тобто наше завдання почергово вмикати перший, другий та третій знак. При швидкому перемиканні, ми отримаєм враження начебто всі три знаки відобоажаються одночасно. Комфортною частотою для сприйняття людиною, є 25 герц (25 раз на секунду).
Схема підключення трьохзнакового індикатора
Код програми
#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).