Как использовать общий анодный 7-сегментный, 4-значный дисплей?

9

Пожалуйста, возьмите этот вопрос в качестве примера (моего) ответа ниже.

У меня есть 7-сегментный 4-значный светодиодный дисплей, но я понятия не имею, как его подключить.

Я не понимаю разницу между общим анодом / катодом, и у меня нет 2 выводов на светодиод, что странно. Совсем недавно вопрос об "7-сегментном 4-значном общем аноде" был удален. В тот самый момент я печатал ответ.

Тем не менее, я все еще хочу поделиться своим ответом с вами или человеком, который спросил его. Пожалуйста, проверьте / обновите мой ответ с более подробной информацией. В частности, может ли кто-то добавить рабочий код, я не могу в данный момент.

Павел
источник
Просто любопытно. Вы разместили вопрос, чтобы ответить на него?
PhillyNJ
На самом деле есть вариант для этого. Тем не менее, комментарии в моем вопросе также рассказывают «предысторию». Я отвечал на вопрос, который был удален. И чувствовал необходимость публиковать мой ответ без конца. Так что да, я сделал. Но это правильный метод, и у меня был ответ перед вопросом. Так что это имело смысл для меня. Если у вас есть действительно хороший вопрос (и ответ), я могу только побудить вас сделать то же самое, так как это может пригодиться кому-то в какой-то момент.
Пол

Ответы:

7

В качестве дополнения к ответу Пола я написал короткую программу, чтобы показать, как управлять 7-сегментным четырехзначным дисплеем его фигуры:

электрическая схема

На самом деле это обычный катодный дисплей, поэтому программа предполагает это, а также конкретную разводку рисунка. Интересной частью является refresh_display()функция, которая должна вызываться периодически. Алгоритм выглядит следующим образом:

  • управлять 7 анодами с соответствующими сигналами для одной из цифр, которые мы хотим показать
  • установить HIGHвыход, который управляет катодом этой цифры через NPN-транзистор
  • ждать 2,5 мс (частота обновления 100 Гц)
  • установить LOWкатод-контролирующий выход
  • перейти к следующей цифре.

Следует отметить, что ожидание выполняется без блокировки процессора, используя методику, описанную в руководстве Blink Without Delay Arduino. Вот программа:

const int NB_DIGITS     = 4;  // 4-digit display
const int FIRST_ANODE   = 2;  // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9;  // cathodes, right to left, on pins 9..12

// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];

// Set all the used pins as outputs.
void init_display()
{
    for (int i = 0; i < 7; i++)
        pinMode(FIRST_ANODE + i, OUTPUT);
    for (int i = 0; i < NB_DIGITS; i++)
        pinMode(FIRST_CATHODE + i, OUTPUT);
}

// This should be called periodically.
void refresh_display()
{
    // Our 7-segment "font".
    static const uint8_t font[10] = {
        //abcdefg
        0b1111110, // 0
        0b0110000, // 1
        0b1101101, // 2
        0b1111001, // 3
        0b0110011, // 4
        0b1011011, // 5
        0b1011111, // 6
        0b1110000, // 7
        0b1111111, // 8
        0b1111011  // 9
    };

    // Wait for 2.5 ms before switching digits.
    static uint32_t last_switch;
    uint32_t now = micros();
    if (now - last_switch < 2500) return;
    last_switch = now;

    // Switch off the current digit.
    static uint8_t pos;
    digitalWrite(FIRST_CATHODE + pos, LOW);

    // Set the anodes for the next digit.
    pos = (pos + 1) % NB_DIGITS;
    uint8_t glyph = font[digits[pos]];
    for (int i = 0; i < 7; i++)
        digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));

    // Switch digit on.
    digitalWrite(FIRST_CATHODE + pos, HIGH);
}

/***********************************************************************
 * Example usage.
 */

void setup()
{
    init_display();
}

void loop()
{
    uint32_t now = millis();

    // Change the number displayed every second.
    static uint32_t last_change;
    if (now - last_change >= 1000) {
        digits[3] = digits[2];
        digits[2] = digits[1];
        digits[1] = digits[0];
        digits[0] = (digits[0] + 1) % 10;
        last_change = now;
    }

    refresh_display();
}

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

  • Библиотека управляется прерыванием переполнения Таймера 2. Это должно обеспечить очень устойчивое время за счет выделения одного таймера для этой работы.
  • Приведенный выше код полагается на то, что пользователь refresh_display()достаточно часто звонит . Он не требует выделенных аппаратных ресурсов, но он не очень хорошо работает с программами, которые занимают слишком много времени loop(): вам не понравится ваш вызов delay().
Эдгар Бонет
источник
Вот почему я люблю вещи с открытым исходным кодом. Вы можете поделиться работой с остальным миром и создать что-то действительно хорошее. Которым потом снова делятся с остальным миром :) Вы можете многому научиться у других разработчиков, и эти знания будут постоянными, а не просто скрытыми от всех остальных.
Пол
У меня есть вопрос относительно значения базового резистора Tranistor. У меня большая проблема с вычислением значения резистора. Какова причина использования 4.7K резистора в четырех транзисторах 2N2222? Если один сегмент потребляет 10 мА, то максимальное потребление тока будет 80 мА для всех сегментов, включая DP. Если V (BE * sat) = 1,3 В и I (B) = 15 мА, то достаточно 300 Ом. Есть ли что-то не так с моим расчетом?
Маруф
@maruf: минимальный требуемый I_B - это ожидаемый I_C, деленный на минимальное усиление транзистора. Если вы хотите 80 мА на коллекторе и ожидаете усиления по крайней мере 100 (это может быть оптимистично, я не проверял таблицу данных), то вам нужно по крайней мере 80/100 = 0,8 мА на базе. Тогда максимальным значением базового резистора является падение напряжения на нем (около 5 В - 0,7 В), деленное на этот ток, или около 5,3 кОм.
Эдгар Бонет
5

Я постараюсь познакомить вас со всеми основами светодиодов и т. Д. Так как 4-значные 7-сегментные дисплеи представляют собой комбинацию нескольких «светодиодных технологий».

Проводные светодиоды

Светодиоды, или светодиоды, являются одной из забавных вещей Arduino.

По сути, они просты в использовании, включите их, и они загорятся.

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

Как это ни раздражает, но и весьма полезно.

Катод против Анода

На традиционном светодиоде длинным проводом является (+), анод. Другим лидером является (-) катод.

«Или, если кто-то подрезает ножки, попробуйте найти плоский край на наружном корпусе светодиода. Контакт, ближайший к плоскому краю, будет отрицательным катодным контактом». - Sparkfun

Источник: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

SparkFun

Базовая проводка

Я не уверен, что это правильно, так как я скопировал изображение из интернета.

Базовая светодиодная проводка

Подключить светодиод довольно просто, анод (+) подключается к положительному напряжению, предпочтительно через ограничитель тока. Катод (-) подключается к земле (с токоограничивающим резистором, если у вас его нет на положительной стороне).

Токоограничивающий резистор предотвратит короткое замыкание светодиода, повредив светодиод или микроконтроллер / Arduino.

Несколько светодиодов, матриц, светодиодов RGB

С несколькими светодиодами вы часто подключаете их с положительной стороной (+), «общим анодом» или со всеми (-) «общим катодом».

В основном все сводится к этому.

RGB общий катод / анод

Для обычного катода вы подаете ток на контакты, которые хотите подключить.

Для обычного анода вы пропускаете ток через светодиод.

Мультиплексирование (многозначный, 7-сегментный)

Вы должны проверить учебник параллакса: http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Параллакс 4digit7seg

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

Обычно вы отбираете ток из столбца светодиодов и подаете ток на отдельные светодиоды в ряду.

Или вы подаете ток на столбец светодиодов и снижаете ток от отдельных светодиодов ряда.

Так что вы можете выбрать, какой столбец активировать и какие светодиоды этого столбца загорятся. Быстрое изменение этих столбцов / строк позволит вам управлять несколькими светодиодами с гораздо меньшим количеством выводов.

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

Поэтому, когда у вас есть 4-значный, мультиплексный 7-сегментный, общий анод

Диаграмма будет больше похожа на это:

введите описание изображения здесь

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

Павел
источник