цифровая электроника
вычислительная техника
встраиваемые системы

 

Arduino и четырехразрядный семисегментный индикатор

Автор: Mike(admin) от 15-11-2014, 05:01

Подключение семисегментного индикатора к Arduino – это прекрасный проект начального уровня, позволяющий познакомиться с платой Arduino поближе. Но подключение одноразрядного индикатора довольно просто осуществляется. Поэтому мы несколько усложним задачу и подключим четырехразрядный семисегментный индикатор.


четырехразрядный семисегментный индикатор

В данном случае будем использовать модуль четырехзначного светодиодного индикатора с общим катодом.


Каждый сегмент в модуле индикатора мультиплексирован, то есть он разделяет одну анодную точку соединения с другими сегментами своего разряда. И каждый из четырех разрядов в модуле имеет собственную точку подключения с общим катодом. Это позволяет каждую цифру включать или выключать независимо. Кроме того, такой метод мультиплексирования позволяет микроконтроллеру использовать только одиннадцать или двенадцать выводов вместо тридцати двух.


дешевые Arduino

Светодиодные сегменты индикатора требуют подключения токоограничивающих резисторов при питании от 5 В на логическом выводе. Значение резистора обычно берется между 330 и 470 Ом. Также рекомендуется использование транзисторов для обеспечения дополнительного тока, поскольку каждый вывод микроконтроллера может выдавать максимум 40 мА. Если включить все сегменты разряда (цифра 8), то потребляемый ток превысит этот предел. На рисунке ниже показана схема подключения четырехразрядного семисегментного индикатора с применением транзисторов токоограничивающих резисторов.


Arduino и четырехразрядный семисегментный индикатор

Далее приведены схемы подключения индикатора к выводам Arduino. Здесь использованы биполярные npn-транзисторы BC547. Потенциометр 10 КОм, подключенный ко входу платы A0 позволяет изменять отображаемое на индикаторе значение от 0 до 1023.


Arduino и четырехразрядный семисегментный индикатор

Arduino и четырехразрядный семисегментный индикатор

На плате Arduino цифровые выходы D2-D8 в данном случае предназначены для управления сегментами от «a» до «g», а цифровые выходы D9-D12 используются для управления разрядами от D0 до D3. Следует заметить, что в данном примере точка не используется, но в скетче, приведенном ниже, есть возможность ее задействовать. Вывод D13 платы Arduino зарезервирован для управления сегментом точки.


Arduino и четырехразрядный семисегментный индикатор

Ниже представлен код, который позволяет управлять четырехразрядным сегментным индикатором с помощью платы Arduino. В нем в массиве numeral задаются коды чисел от 0 до 9 в двоичной форме. Данный скетч поддерживает как индикаторы с общим катодом (по умолчанию), так и индикаторы с общим анодом (для этого нужно раскомментировать одну строчку в конце скетча).



// биты, представляющие сегменты с A по G (и точки), для чисел 0-9
const int numeral[10] = {
//ABCDEFG /dp
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B00111110, // 6
B11100000, // 7
B11111110, // 8
B11100110, // 9
};
// выводы для точки и каждого сегмента
// DP,G,F,E,D,C,B,A
const int segmentPins[] = { 13,8,7,6,5,4,3,2 };
const int nbrDigits= 4; // количество разрядов светодиодного индикатора
//разряды 0 1 2 3
const int digitPins[nbrDigits] = { 9,10,11,12 };
void setup()
{
for(int i=0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT); // устанавливаем выводы для сегментов и точки на выход
}
for(int i=0; i < nbrDigits; i++) {
pinMode(digitPins[i], OUTPUT);
}
}
 
void loop()
{
int value = analogRead(0);
showNumber(value);
}
 
void showNumber( int number)
{
if(number == 0) {
showDigit( 0, nbrDigits-1) ; // отображаем 0 в правом разряде
} else {
// отображаем значение, соответствующее каждой цифре
// крайняя левая цифра 0, правая на единицу меньше, чем число позиций
for( int digit = nbrDigits-1; digit >= 0; digit--) {
if(number > 0) {
showDigit( number % 10, digit) ;
number = number / 10;
}
}
}
}
 
// Отображаем заданное число на данном разряде 7-сегментного индикатора 
void showDigit( int number, int digit)
{
digitalWrite( digitPins[digit], HIGH );
for(int segment = 1; segment < 8; segment++) {
boolean isBitSet = bitRead(numeral[number], segment);
// isBitSet будет истинным, если данный бит будет 1
// isBitSet = ! isBitSet; // опционально
// раскомментируйте опциональную строчку выше для индикатора с общим анодом
digitalWrite( segmentPins[segment], isBitSet);
}
delay(5);
digitalWrite( digitPins[digit], LOW );
}



© digitrode.ru


<Via>


Теги: Arduino




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Sergey

  • 4 ноября 2015 02:50
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Небольшая неточность. А так, огромное спасибо.

void showDigit( int number, int digit)
{
digitalWrite( digitPins[digit], LOW );
for(int segment = 1; segment < 8; segment++) {
boolean isBitSet = bitRead(numeral[number], segment);
// isBitSet будет истинным, если данный бит будет 1
// isBitSet = ! isBitSet; // опционально
// раскомментируйте опциональную строчку выше для индикатора с общим анодом
digitalWrite( segmentPins[segment], isBitSet);
}
delay(5);
digitalWrite( digitPins[digit], HIGH );
}
Цитата
  • Fantomas12_7

  • 28 мая 2016 17:13
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Sergey работает и без уточнений (с ОА проверено)
Цитата
  • VLad

  • 15 сентября 2017 10:46
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Подскажите пожалуйста почему при кампиляции есит ошибка - showNumber(value); пишет -was not declaredin this scope ?
Цитата
  • Максим

  • 9 января 2018 11:45
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Спасибо, очень подробно. Практически готовые весы?