7-сегментний індикатор

Ми маємо справу знову з набором світлодіодів, тільки на цей раз їх 8 (сім смужок і один кружечок) і вони розташовані не один за одним, а в певному порядку, які дозволяють вам виводити цифри від 0 до 9.

Важлива відмінна риса - у індикатора є загальні ніжки для катода (ніжки 3 і 8). Всього їх дві і вони рівноцінні. Це зручно, вам не потрібно буде від кожного катода вести окремий провід на землю. Досить вибрати один із загальних катодів і від неї з'єднатися з GND. Аноди у всіх окремі.

На 7-сегментний індикатор поширюються ті ж правила, що і на стандартні світлодіоди - у кожного повинен бути свій резистор. Схематично можна зобразити таким чином.

Обладнання:

  • 7-сегментний індикатор;

  • 8 резисторів 220 Ом;

  • bredboard;

  • Arduino uno;

  • конектори

Схема з'єднання (для загального анода). Якщо індикатор з загальним катодом, опір під'єднуємо на GND:

Якщо ми хочемо запалити цифру 1, то нам треба використовувати світлодіоди 4 і 6, які йдуть на порти 4 і 6 плати мікроконтролера.

Якщо ми захочемо вивести цифру 5, то знадобиться працювати з п'ятьма світлодіодами, цифру 8 - вже сім світлодіодів. При складних проектах працювати з такою кількістю стає важко. Доведеться кожного разу дивитися на схему, що згадати, які світлодіоди потрібно включити для відображення кожної цифри.

Але можна піти іншим шляхом. А допоможе нам одиниця інформації - байт. Байт в своєму двійковому поданні складається з 8 біт. Кожен біт може приймати значення 0 або 1. А наш світлодіодний індикатор якраз і складається з восьми світлодіодів. Таким чином ми можемо уявити цифру на індикаторі у вигляді набору байт, де одиниця відповідатиме за включений діод, а нуль - за вимкнений діод.

Число в двійковому вигляді записується в такий спосіб: 0b00000000

Перші два символи 0b дають зрозуміти, що мова йде про двійковий рахунок. Всі нулі означають, що всі світлодіоди будуть вимкнені.

У нас задіяні порти від 2 по 9. Другий порт записується в саму праву позицію. Щоб його включити, поставимо одиницю. 0b00000001

Можна самостійно включати окремо кожен діод, переміщаючи одиницю в представленому байті. Зрозумівши принцип, можна, наприклад, помітити, що за точку відповідає четвертий біт праворуч. Якщо ми його не будемо використовувати, то він завжди буде дорівнює 0. За риску посередині індикатора відповідає найостанніший байт (або перший зліва). Комбінуючи набір нулів і одиниць, можна створити потрібні нам цифри. Наприклад, цифра 0 буде представлена ​​як 0b01110111.

Скетч Arduino приклад виведення цифри 0

#define FIRST_SEGMENT_PIN 2

#define SEGMENT_COUNT 8


byte number0 = 0b01110111;


void setup() {

for (int i = 0; i < SEGMENT_COUNT; ++i)

pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);

}


void loop() {

int mask = number0;

// для кожного з 7 сегментів індикатора визначаємо:

// чи повинен він бути включений.

// Для цього зчитуємо біт, що відповідає поточному

// сегменту «i». Істина - він встановлений (1), брехня - немає (0)

for (int i = 0; i < SEGMENT_COUNT; ++i) {

boolean enableSegment = bitRead(mask, i);

// вмикаємо / вимикаємо сегмент на основі отриманого значення

digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);

}

}

Скетч Arduino приклад зміни цифр 0-9

#define FIRST_SEGMENT_PIN 2

#define SEGMENT_COUNT 8


// Всего цифр 10, поэтому в массиве 10 чисел.

byte numberSegments[10] = {

0b01110111,

0b00010100,

0b10110011,

0b10110110,

0b11010100,

0b11100110,

0b11100111,

0b00110100,

0b11110111,

0b11110110,

};

void setup()

{

for (int i = 0; i < SEGMENT_COUNT; ++i)

pinMode(i + FIRST_SEGMENT_PIN, OUTPUT);

}

void loop()

{

// визначаємо число, яке слід відобразити.

// Нехай їм буде номер поточної секунди, зациклений на десятці

int number = (millis() / 1000) % 10;

// отримуємо код з масиву, в якому міститься отримана цифра

int mask = numberSegments[number];

// для кожного з 7 сегментів індикатора

for (int i = 0; i < SEGMENT_COUNT; ++i) {

// визначаємо: чи повинен він бути включений.

boolean enableSegment = bitRead(mask, i);

// вмикаємо / вимикаємо сегмент на основі отриманого значення

digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment);

}

}