Динамічна індикація

Робота Arduino з 4-розрядною семисегментною матрицею.

Мета: одержати уявлення про динамічну індикації, що дозволяє використовувати одні піни Arduino під час виведення інформації на кілька семисегментних індикаторів.

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

Для виведення цифри необхідно запалити потрібні світлодіоди на контактах A-G і DP і вибрати потрібну матрицю подачею LOW на вивід 6, 8, 9 або 12.Підключимо контакти матриці до плати Arduino і будемо виводити цифри на різні розряди матриці. Для підключення нам знадобляться 12 пінів Arduino. Схема з'єднань для підключення 4-розрядної матриці до плати Arduino показана на рис. 2. При підключенні контактів використовуються обмежувальні резистори 510 Ом.

Обладнання:

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

  • резистори 510 Ом;

  • резистор 10 кОм;

  • кнопка;

  • bredboard;

  • Arduino uno;

  • конектори

Скетч 1:

// список выводов Arduino для подключения к разрядам a-g

// семисегментного индикатора

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);

}

}

Скетч 2:

// список выводов Arduino для подключения к разрядам a-g

// семисегментного индикатора

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; // возвращаем состояние кнопки

}

}