В этом эксперименте мы рассмотрим работу Arduino с 4-разрядной семисегментной матрицей. Получим представление о динамической индикации, позволяющей использовать одни выводы Arduino при выводе информации на несколько семисегментных индикаторов.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• 4-разрядная семисегментная матрица;
• резистор 510 Ом – 8 штук;
• кнопка;
• резистор 10 кОм;
• провода папа-папа.
Матрица 4-разрядная из семисегментных индикаторов состоит из четырех семисегментных индикаторов и предназначена для одновременного вывода на матрицу 4 цифр, также есть возможность вывода десятичной точки. Схема 4-разрядной матрицы на 7-сегментных индикаторах показана на рис. 7.1.
Необходимые компоненты:
• контроллер Arduino UNO R3;
• плата для прототипирования;
• 4-разрядная семисегментная матрица;
• резистор 510 Ом – 8 штук;
• кнопка;
• резистор 10 кОм;
• провода папа-папа.
Матрица 4-разрядная из семисегментных индикаторов состоит из четырех семисегментных индикаторов и предназначена для одновременного вывода на матрицу 4 цифр, также есть возможность вывода десятичной точки. Схема 4-разрядной матрицы на 7-сегментных индикаторах показана на рис. 7.1.
Рис. 7.1. Схема 4-разрядной матрицы на 7-сегментных индикаторах
Для вывода цифры необходимо зажечь нужные светодиоды на контактах A–G и DP и выбрать нужную матрицу подачей LOW на вывод 6, 8, 9 или 12.
Подключим контакты матрицы к плате Arduino и будем выводить цифры на различные разряды матрицы. Для подключения нам понадобятся 12 выводов Arduino. Схема соединений для подключения 4-разрядной матрицы к плате Arduino показана на рис. 7.2. При подключении контактов используются ограничительные резисторы 510 Ом.
Рис. 7.2. Схема подключения 4-разрядной матрицы к Arduino
Напишем скетч последовательного вывода цифр (0–9) на произвольный регистр матрицы. Для выбора случайного значения из диапазона будем использовать функцию random(). В массиве numbers[] хранятся значения, соответствующие данным для отображения цифр 0–9 (старший разряд байта соответствует метке сегмента A индикатора, а младший – сегменту G), в массиве pins[] – значения контактов для сегментов A–G и DP, в массиве pindigits[] – значения контактов для выбора разряда матрицы. Содержимое скетча показано в листинге 7.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);
}
}
Порядок подключения:
1. Подключаем семисегментный индикатор по схеме на рис. 7.3.
2. Загружаем в плату Arduino скетч из листинга 7.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; // возвращаем состояние кнопки
}
}
3. Нажатием кнопки запускаем или останавливаем секундомер.
Рис. 7.3. Схема подключения для секундомера
Листинги программ скачать