7 сегментный дисплей и Ардуино

Подключение 7 сегментного индикатора к Ардуино

7-сегментные индикаторы состоят из 8 светодиодных сегментов. Они используются для отображения цифр (0 — 9) и некоторых букв алфавита (например, C, A, H, P и т. д.).

7 из этих светодиодных сегментов имеют форму линии, тогда как 1 сегмент имеет круглую форму и используется для десятичной точки.

Каждый из 8 элементов связан с контактом, через который происходит управление состоянием ВКЛ или ВЫКЛ (ВЫСОКИМ или НИЗКИМ уровнем напряжения).

Чтобы отобразить число или букву, нам нужно включить определенные светодиодные сегменты дисплея.    Для получения дополнительной информации о 7-сегментном светодиодном дисплее и о том, как его использовать, ознакомьтесь со статьем 7-сегментный светодиодный дисплей в разделе Датчики и модули.

Модуль 7-сегментного индикатора для Ардуино

На рынке доступны различные модули 7-сегментного индикатора, в которых используются микросхемы, такие как MAX7219, для управления несколькими 7-сегментными дисплеями с использованием интерфейса связи SPI. Один из таких модулей показан на изображении ниже.

Модуль 7 сегментного индикатора на 8 символов
Рисунок 1. Восьми символьный модуль из семи сегментных индикаторов

Эти модули компактны и требуют меньше контактов и проводов по сравнению с использованием отдельных 7-сегментных дисплеев в каскаде.

Давайте теперь посмотрим, как взаимодействовать как с одним 7-сегментным индикатором, так и с модулем 7-сегментного дисплея, на котором установлено восемь 7-сегментных индикаторов, на примере платы Arduino Uno.

Примеры использования 7 сегментного индикатора с Arduino Uno

Подключение одного индикатора

Подключение одного 7 сегментного индикатора к ардуино уно
Рисунок 2. Подключение одного 7 сегментного индикатора к Ардуино

Здесь 7-сегментный индикатор управляется напрямую через Arduino. Резисторы необходимо подключать между индикатором и платой Arduino UNO. В зависимости от того, какая цифра или буква должны светиться, применяются  необходимые управляющие сигналы.

Примечание

Мы использовали общий анод, поэтому общий вывод (com) подключен к 5 В. Если используется индикатор с общим катодом, то вывод необходимо соединить с землей (GND).

Для включения сегмента на индикаторе с общим анодом, установите на выводе низкий уровень напряжения LOW.

Для включения сегмента на индикаторе с общим катодом, установите на выводе низкий уровень напряжения HIGH.

Скетч для управления 7-сегментным индикатором в Arduino

int disp_pin[7];    

void define_segment_pins(int a, int b, int c, int d, int e, int f, int g) {  
  disp_pin[0] = a;
  disp_pin[1] = b;
  disp_pin[2] = c;
  disp_pin[3] = d;
  disp_pin[4] = e;
  disp_pin[5] = f;
  disp_pin[6] = g;
}

void display_number(int num)    
{
  switch(num)
  {
    case 0:
    digitalWrite(disp_pin[0], LOW);    
    digitalWrite(disp_pin[1], LOW);    
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], LOW);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], HIGH); 
    break;
    case 1:
    digitalWrite(disp_pin[0], HIGH);    
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], HIGH);    
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], HIGH);
    digitalWrite(disp_pin[6], HIGH);
    break;
    case 2:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], HIGH);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], LOW);
    digitalWrite(disp_pin[5], HIGH);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 3:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], HIGH);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 4:
    digitalWrite(disp_pin[0], HIGH);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], HIGH);
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 5:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], HIGH);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 6:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], HIGH);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], LOW);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 7:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], HIGH);
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], HIGH);
    digitalWrite(disp_pin[6], HIGH);
    break;
    case 8:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], LOW);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], LOW);
    break;
    case 9:
    digitalWrite(disp_pin[0], LOW);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], HIGH);
    digitalWrite(disp_pin[5], LOW);
    digitalWrite(disp_pin[6], LOW);
    break;
    default:
    digitalWrite(disp_pin[0], HIGH);
    digitalWrite(disp_pin[1], LOW);
    digitalWrite(disp_pin[2], LOW);
    digitalWrite(disp_pin[3], LOW);
    digitalWrite(disp_pin[4], LOW);
    digitalWrite(disp_pin[5], HIGH);
    digitalWrite(disp_pin[6], LOW);
    break;
  }
}

void setup() {
  pinMode(6, OUTPUT);    
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  define_segment_pins(12,11,10,9,8,7,6);    
}

void loop() {
  int i;
  for(i = 9; i>=0; i--)
  {
    display_number(i);
    delay(1000);
  }
  for(i = 0; i<=9; i++)
  {
    display_number(i);
    delay(1000);
  }
}

Подключение одного индикатора через драйвер

Подключение одного 7 сегментного индикатора к Ардуино через драйвер
Рисунок 3. Подключение одного 7 сегментного индикатора к Ардуино через драйвер

На рисунке выше,  7-сегментный дисплей управляется микросхемой SN7446AN. Данное подключение уменьшает количество контактов, необходимых для управления 7-сегментным индикатором.

Скетч для управления 7-сегментным индикатором в Arduino через драйвер SN7446AN

int bcd_pins[4];    
void bcd_control_pins(int a, int b, int c, int d)    
{  
  bcd_pins[0] = a;    
  bcd_pins[1] = b;
  bcd_pins[2] = c;
  bcd_pins[3] = d;
}

void display_number(int num)    
{
  switch(num)
  {
    case 0:
    digitalWrite(bcd_pins[0], LOW);    
    digitalWrite(bcd_pins[1], LOW);    
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], LOW);    
    break;
    case 1:
    digitalWrite(bcd_pins[0], HIGH);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 2:
    digitalWrite(bcd_pins[0], LOW);
    digitalWrite(bcd_pins[1], HIGH);
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 3:
    digitalWrite(bcd_pins[0], HIGH);    
    digitalWrite(bcd_pins[1], HIGH);    
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 4:
    digitalWrite(bcd_pins[0], LOW);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], HIGH);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 5:
    digitalWrite(bcd_pins[0], HIGH);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], HIGH);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 6:
    digitalWrite(bcd_pins[0], LOW);
    digitalWrite(bcd_pins[1], HIGH);
    digitalWrite(bcd_pins[2], HIGH);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 7:
    digitalWrite(bcd_pins[0], HIGH);
    digitalWrite(bcd_pins[1], HIGH);
    digitalWrite(bcd_pins[2], HIGH);
    digitalWrite(bcd_pins[3], LOW);
    break;
    case 8:
    digitalWrite(bcd_pins[0], LOW);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], HIGH);
    break;
    case 9:
    digitalWrite(bcd_pins[0], HIGH);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], HIGH);
    break;
    default:
    digitalWrite(bcd_pins[0], LOW);
    digitalWrite(bcd_pins[1], LOW);
    digitalWrite(bcd_pins[2], LOW);
    digitalWrite(bcd_pins[3], LOW);
    break; 
  }
}

void setup() {
  pinMode(8, OUTPUT);        
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  bcd_control_pins(11,10,9,8);    /* A-D of driver IC to Arduino */
}

void loop() {
  int i;
  for(i = 9; i>=0; i--)
  {
    display_number(i);
    delay(1000);
  }
  for(i = 0; i<=9; i++)
  {
    display_number(i);
    delay(1000);
  }
}

Подключение модуля 7 сегментных светодиодных индикаторов

Подключение к ардуино модуля 7 сегментного индикатора
Рисунок 4. Подключение к Ардуино модуля 7 сегментного индикатора

При таком подключении необходимо использовать библиотеку LED Control от Wayoda из GitHub.

Используя эту библиотеку, можно управлять до восьми 7-сегментными модулями на основе интерфейса SPI (каждый модуль в свою очередь может иметь до восьми 7-сегментных индикаторов), соединенных каскадом, используя всего 3 контакта.

Загрузить эту библиотеку можно отсюда.

Извлеките библиотеку и добавьте в папку с библиотеками Arduino IDE.

Информацию о том, как добавить пользовательскую библиотеку в среду разработки Arduino и использовать примеры из нее, смотрите в статье «Подключение библиотек в Arduino IDE».

Скетч для управления модулем 7-сегментного индикатора в Arduino

#include "LedControl.h"

LedControl new_disp = LedControl(7,5,6,1);    

void setup() {
  new_disp.shutdown(0,false);    
  new_disp.setIntensity(0,8);    
  new_disp.clearDisplay(0);         
}

void loop() {
  new_disp.setDigit(0,0,0,false);    
  delay(1000);
  new_disp.setDigit(0,1,2,false);
  delay(1000);
  new_disp.setDigit(0,2,4,false);
  delay(1000);
  new_disp.setDigit(0,3,6,false);
  delay(1000);
  new_disp.setChar(0,4,'F',false);    
  delay(1000);
  new_disp.setChar(0,5,'P',false);
  delay(1000);
  new_disp.setChar(0,6,'c',false);
  delay(1000);
  new_disp.setChar(0,7,'A',false);
  delay(1000);
  new_disp.clearDisplay(0);        
  delay(1000);
}

Описание библиотеки LedControl

LedControl new_disp = LedControl(dataPin, clkPin, csPin, Devices)

Эта функция создает объект класса LEDControl (в данном конкретном случае объект с именем — new_disp; пользователь также может использовать любое другое допустимое имя), который взаимодействует с MAX7219 на модуле с 7-сегментным дисплеем.

dataPin — это контакт Arduino, который подключен к контакту DataIn на модуле. Это контакт на Arduino, куда передаются данные.

clkPin — это контакт Arduino, который подключен к контакту CLK на модуле.

csPin — это контакт Arduino, который подключен к контакту CS/Load на модуле. Это контакт для выбора устройства, на которое должны быть отправлены данные.

Devices  — определяет максимальное количество устройств, которыми можно управлять. Оно может быть от 1 до 8. Это количество устройств, соединенных каскадом. Устройство, непосредственно подключенное к определенным выводам, имеет адрес 0. Устройство, непосредственно следующее за ним в каскаде, имеет адрес 1. Устройство 8 (последнее устройство в каскадном соединении) имеет адрес 7.


new_disp.shutdown (addr, status)

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


new_disp.setIntensity(addr, intensity)

Эта функция используется для установки яркости дисплея с адресом addr. Параметр интенсивности свечения intensity может быть от 1 до 15. 1 — минимум, 15 — максимум.


new_disp.setDigit (addr, digit, value, dp)

Эта функция используется для отображения числа, переданного в параметре value, на дисплее с адресом addr.

Число отображается в позиции (единицы, десятки и т. д.), указанной в параметре digit (может быть от 0 до 7).

dp устанавливает десятичную точку. Если dp ложно false, десятичная точка отключена.


new_disp.setChar (addr, digit, value, dp)

Эта функция используется для отображения символа (значения), переданного в параметре value, на дисплее с адресом addr.

Символ отображается в позиции (единицы, десятки и т. д.), указанной в параметре digit (может быть от 0 до 7). dp устанавливает десятичную точку.

Если dp ложно , десятичная точка отключена.

Могут отображаться только определенные символы, например:

0, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , A , b , c , d , E , F , H , L , P , . , — , _ .

Загрузки

Где купить

  • Набор выводных резисторов
  • 7-ми сегментные индикаторы (одно-, двух-, трех- и четырехразрядные, можно выбрать как с общим катодом, так и с общим анодом)
  • Микросхема драйвера SN7446N
  • Модуль 4-цифрового светодиодного дисплея TM1637 (5 цветов)
  • Arduino NANO
  • Arduino UNO
  • Arduino MEGA
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии