Комутація
Виводи 3 і 8 семисегментного індикатору є катодами, до землі можа підключати будь-який з них.
Уважно розгляньте схему, співставте сегменти індикатора з номерами його ніжок, а ті, в свою чергу, з пінами Arduino, до яких ми їх підключаємо.
Вивід 5 індикатора - це "крапка". Ми не використовуємо її в цьому експерименті
Сегменти індикатора за конструкцією є просто світлодіодами, тому ми використовуємо резистор з кожним з них для обмеження струму.
#define FIRST_SEGMENT_PIN 2
#define SEGMENT_COUNT 7
// префікс «0b» означає, що ціле число за ним записано в
// в двійковому коді. Одиницями ми позначимо номера сегментів
// індикатора, які повинні бути включені для відображення
// арабської цифри. Всього цифр 10, тому в масиві 10 чисел.
// Нам достатньо всього байта (англ. Byte, 8 біт) для зберігання
// комбінації сегментів для кожної з цифр.
byte numberSegments [ 10 ] = {
0b00111111 , 0b00001010 , 0b01011101 , 0b01011110 , 0b01101010 ,
0b01110110 , 0b01110111 , 0b00011010 , 0b01111111 , 0b01111110 ,
} ;
void setup ( )
{
for ( int i = 0 ; i < SEGMENT_COUNT ; ++ i )
pinMode ( i + FIRST_SEGMENT_PIN, OUTPUT ) ;
}
Void loop ( )
{
// визначаємо число, яке збираємося відображати. Нехай їм
// буде номер поточної секунди, зациклений на десятці
int number = ( millis ( ) / 1 000 ) % 10 ;
// отримуємо код, в якому зашифрована арабська цифра
int mask = numberSegments [ number ] ;
// для кожного з 7 сегментів індикатора ...
for ( int i = 0 ; i < SEGMENT_COUNT ; ++ i ) {
// ... визначаємо: чи повинен він бути включений. Для цього
// зчитуємо біт (англ. Read bit), що відповідає поточному
// сегменту «i». Істина - він встановлений (1), брехня - немає (0)
boolean enableSegment = bitRead ( mask, i ) ;
// включаємо / вимикаємо сегмент на основі отриманого значення
digitalWrite ( i + FIRST_SEGMENT_PIN, enableSegment ) ;
}
}
Розяснення до коду роботи семисегментного індикатора
- Ми створили масив типу byte: кожен його елемент це 1 байт, 8 біт, може приймати значення від 0 до 255.
- Символи арабських цифр закодовані станом пинов, які з'єднані з висновками відповідних сегментів: 0, якщо сегмент повинен бути вимкнений, і 1, якщо включений.
- У змінну maskми поміщаємо той елемент масиву numberSegments, який відповідає поточній секунді, обчисленої в попередньої інструкції.
- У циклі forми пробігаємо по всіх сегментах, витягуючи з допомогою вбудованої функції bitRead потрібний стан для поточного Піна, в яке його і наводимо за допомогою digitalWriteі змінної enableSegment
- bitRead(x, n) повертає boolean значення: n -ний біт праворуч в байті x