Взаимодействие Arduino с семисегментным индикатором

Добавлено 30 сентября 2017 в 19:35

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

Если вашему приложению на Arduino необходимо отображать только цифры, подумайте об использовании семисегментного индикатора. Семисегментный индикатор имеет семь светодиодов, расположенных в форме восьмерки. Он прост в использовании и экономичен в плане стоимости. На рисунке ниже показан типовой семисегментный индикатор.

Семисегментный индикатор
Семисегментный индикатор

Семисегментные индикаторы бывают двух типов: с общим анодом и общим катодом. Внутренняя структура обоих типов почти одинакова. Разница заключается в полярности светодиодов и общем выводе. В семисегментном индикаторе с общим катодом (такой мы использовали в экспериментах) катоды всех семи светодиодов и светодиода точки подключены к выводам 3 и 8. Чтобы использовать такой индикатор, нам необходимо подключить корпус к выводам 3 и 8 и подать +5В на другие выводы, чтобы отдельные светодиоды загорелись. Следующей схеме показана внутренняя структура семисегментного индикатора с общим катодом:

Семисегментный индикатор с общим катодом
Семисегментный индикатор с общим катодом

Индикатор с общим анодом является полной противоположностью. В индикаторе с общим анодом положительные выводы всех восьми светодиодов соединены вместе и подключены к выводам 3 и 8. Чтобы зажечь отдельный сегмент, вы соединяете его второй вывод с корпусом. На следующей диаграмме показана внутренняя структура семисегментного индикатора с общим анодом:

Семисегментный индикатор с общим анодом
Семисегментный индикатор с общим анодом

Сем сегментов обозначены как a-g, а точка как "dp", как показано на рисунке ниже:

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

Чтобы отобразить конкретную цифру, вы включаете отдельные сегменты, как показано в таблице ниже:

Включение сегментов индикатора для отображения цифр
Цифраgfedcbaabcdefgabcdefg
00x3F0x7Eвклвклвклвклвклвклвыкл
10x060x30выклвклвклвыклвыклвыклвыкл
20x5B0x6Dвклвклвыклвклвклвыклвкл
30x4F0x79вклвклвклвклвыклвыклвкл
40x660x33выклвклвклвыклвыклвклвкл
50x6D0x5Bвклвыклвклвклвыклвклвкл
60x7D0x5Fвклвыклвклвклвклвклвкл
70x070x70вклвклвклвыклвыклвыклвыкл
80x7F0x7Fвклвклвклвклвклвклвкл
90x6F0x7Bвклвклвклвклвыклвклвкл
A0x770x77вклвклвклвыклвклвклвкл
B0x7C0x1Fвыклвыклвклвклвклвклвкл
C0x390x4Eвклвыклвыклвклвклвклвыкл
D0x5E0x3Dвыклвклвклвклвклвыклвкл
E0x790x4Fвклвыклвыклвклвклвклвкл
F0x710x47вклвыклвыклвыклвклвклвкл

Эксперимент 1

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

Необходимые комплектующие

  • 1 x семисегментный индикатор (общий катод);
  • 1 x Arduino MEGA 2560
  • 1 x макетная плата;
  • перемычки.

Схема соединений

В этой схеме выводы семисегментного индикатора подключены к контактам 2-9 платы Arduino, как показано в таблице ниже. Общие выводы (3 и 8) подключены к GND, а dp остается неподключенным, так как точка не используется в этом эксперименте.

Выводы семисегментного индикатораВыводы ArduinoЦвет провода
1(e)6оранжевый
2(d)5белый
3,8(COM)GND 
c4желтый
5(dp)- 
6(b)3красный
7(a)2синий
9(f)7зеленовато-голубой
10(g)8зеленый
Схема подключения семисегментного индикатора к Arduino
Схема подключения семисегментного индикатора к Arduino

Код

void setup()
{
  // определить режимы работы выводов
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
}

void loop() 
{
  // цикл для включения светодиодов сегментов индикатора 
  for(int i=2; i<9; i++)
  {
    digitalWrite(i,HIGH);
    delay(600);
  }
  
  // цикл для выключения светодиодов сегментов индикатора 
  for(int i=2; i<9; i++)
  {
    digitalWrite(i,LOW);
    delay(600);
  }
   
  delay(1000);
}

Эксперимент 2

Описание

В этом руководстве мы свяжем семисегментный индикатор с Arduino Mega и посмотрим, как отобразить на индикаторе значения счетчика, уменьшающиеся на 1 каждую секунду.

Необходимые комплектующие

В этом эксперименте используются те же комплектующие, что и в первом случае.

Схема соединений

Схема соединений в этом эксперименте такая же, как и в первом случае.

Код

// создать массив для хранения конфигурации выводов индикатора для цифр
int num_array[10][7] = {  { 1,1,1,1,1,1,0 },    // 0
                          { 0,1,1,0,0,0,0 },    // 1
                          { 1,1,0,1,1,0,1 },    // 2
                          { 1,1,1,1,0,0,1 },    // 3
                          { 0,1,1,0,0,1,1 },    // 4
                          { 1,0,1,1,0,1,1 },    // 5
                          { 1,0,1,1,1,1,1 },    // 6
                          { 1,1,1,0,0,0,0 },    // 7
                          { 1,1,1,1,1,1,1 },    // 8
                          { 1,1,1,1,0,1,1 }};   // 9
                                       
// объявление функции
void Num_Write(int);

void setup() 
{ 
  // установить режимы работы выводов
  pinMode(2, OUTPUT);   
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT); 
}

void loop() 
{  
  // цикл счетчика
  for (int counter = 10; counter > 0; --counter) 
  {
    delay(1000);
    Num_Write(counter-1); 
  }
  delay(3000);
}

// эта функция записывает значения в выводы, подключенные к индикатору
void Num_Write(int number) 
{
  int pin= 2;
  for (int j=0; j < 7; j++) 
  {
    digitalWrite(pin, num_array[number][j]);
    pin++;
  }
}

Видео


На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.


  • 2019-08-15ecfrtby

    эта программа для того что бы сделать последнюю программу с точкой dp :


    int num_array[10][8] = {
    {1,1,1,1,1,1,0,0}, //0
    {0,1,1,0,0,0,0,0}, //1
    1,1,0,1,1,0,1,0}, //2
    {1,1,1,1,0,0,1,0}, //3
    {0,1,1,0,0,1,1,0}, //4
    {1,0,1,1,0,1,1,0}, //5
    {1,0,1,1,1,1,1,0}, //6
    {1,1,1,0,0,0,0,0}, //7
    {1,1,1,1,1,1,1,0}, //8
    {1,1,1,1,0,1,1,0}}; //9

    void Num_Write(int);

    void setup() {
    pinMode(12,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(8,OUTPUT)
    pinMode(7,OUTPUT);
    pinMode(6,OUTPUT);
    pinMode(5,OUTPUT);
    }
    void loop() {
    for (int counter = 10; counter > 0; --counter)
    {
    delay(1000);
    Num_Write(counter-1);
    }
    delay(3000);
    }
    void Num_Write(int number)
    {
    int pin= 5
    for (int j=0; j < 8; j++)
    {
    digitalWrite(pin, num_array[number][j]);
    pin++;
    }
    }
  • 2019-06-24radioprog

    Возможно, не обрабатываются нажатия на кнопку.
    Для отладки можно параллельно выводить значения счетчика через UART (с помощью Serial.println(counter)) и в Arduino IDE контролировать их в мониторе последовательного порта.
    И лучше обновлять значение на индикаторе только при его изменении:


    void loop()
    {
    debouncer.update(); // Обновляем кнопку
    if ( debouncer.fell() ) // Call code if button transitions from HIGH to LOW
    {
    counter++;
    if (counter >9)
    counter=0;
    Num_Write(counter);
    //Serial.println(counter);
    }
    }


    Если не получится, то скидывайте полный код скетча. Посмотрим, что не так.
    PS. Только просьба, вставлять куски кода между тегами <pre><code>ваш_код</code><pre>, чтобы было читаемо.

  • 2019-06-24Orest Lviv

    интересно , а как выводить свои значения? к примеру простой код по чему не работает(


    void loop()
    {
    debouncer.update(); // Обновляем кнопку
    if ( debouncer.fell() ) { // Call code if button transitions from HIGH to LOW
    counter++;
    if (counter >9){counter=0;}
    }
    Num_Write(counter);
    }


    При нажатии кнопки на индикаторе всегда 0. Как тут быть?
    Хотя если указать Num_Write(7); или любую другую цифру , то ее выводит на индикатор

  • 2019-06-24radioprog

    Спасибо. Исправил.

  • 2019-06-23Orest Lviv

    { 1,1,1,0,0,1,1 }}; // 9
    Здесь должна быть 1. А, так все работает.

  • 2019-04-10Даниил Фоменко

    я просто новичок и лишние функции меня пока смущают, вот я и запихал всё в один цикл

  • 2019-04-10antzol

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

  • 2019-04-10Даниил Фоменко

    Последнюю программу можно сделать гораздо проще и логичнее на вид:


    int num_array [10] [7]=
    {{1,1,1,0,1,1,1}, //0
    {1,1,0,0,0,0,0}, //1
    {0,1,1,1,0,1,1}, //2
    {1,1,1,1,0,1,0}, //3
    {1,1,0,1,1,0,0}, //4
    {1,0,1,1,1,1,0}, //5
    {1,0,1,1,1,1,1}, //6
    {1,1,1,0,0,0,0}, //7
    {1,1,1,1,1,1,1}, //8
    {1,1,1,1,1,1,0}}; //9
    void setup(){
    pinMode(13,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(11,OUTPUT);
    pinMode(10,OUTPUT);
    pinMode(9,OUTPUT);
    pinMode(8,OUTPUT);
    pinMode(7,OUTPUT);
    pinMode(6,OUTPUT);
    }
    void loop(){
    digitalWrite(6,HIGH);
    for (int number=0;number<10;number++){
    int pin=7;
    for(int j=0;j<7;j++){
    digitalWrite(pin,num_array [number] [j]);
    pin++;
    }
    delay(1000);
    }
    }
Сообщить об ошибке