74HC595 к 4 значному 7 сегменту с использованием библиотеки SevSegShift

У меня есть вопрос относительно использования библиотеки SevSegShift. Я правильно последовал примеру и проверил его, чтобы увидеть, работает ли он. Он смог включить семь сегментов и осветить все светодиоды (даже десятичные), но он не показывает выход, который я хочу показать.

Основываясь на приведенном ниже коде, я хочу показать число 500, но это не так. Даже попробовал sevsegshift.setChars("abcd")- никаких изменений.

Это мой код:

#include <SevSegShift.h>

#define SHIFT_PIN_SHCP 6
#define SHIFT_PIN_STCP 5
#define SHIFT_PIN_DS   4

SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP, 1, true);

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {9, 10, 11, 12}; // Это КОНТАКТЫ ** ардуино **
  byte segmentPins[] = {0, 1, 2, 3, 4, 5, 6, 7}; // это контакты ** сдвигового регистра **
  bool resistorsOnSegments = false; // 'false' означает, что резисторы находятся на разрядных контактах
  byte hardwareConfig = COMMON_CATHODE; // См. README.md для вариантов
  bool updateWithDelays = false; // По умолчанию рекомендуется "false"
  bool leadingZeros = false; // Используйте "true", если вы хотите сохранить ведущие нули
  bool disableDecPoint = true; // Используйте "true", если ваша десятичная точка не существует или не подключена
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
  sevseg.setBrightness(10);
}

void loop() {
  sevseg.setNumber(500);
  //delay(1000);
  sevseg.refreshDisplay(); // Должен выполняться повторно; не используйте блокирующий код (например, delay()) в функции loop (), иначе это не сработает правильно
}

Это моя схема макета внизу.

Breadboard

(резисторы 220 Ом на цифровых выводах и сегментных выводах подключены к регистру сдвига)

, 👍3

Обсуждение

См. Комментарий к последнему утверждению. Он говорит: "не используйте блокирующий код в цикле for, например" delay ()", а одной строкой выше вы используете delay(). Хммм, возможно ?! Наверное, сдвиговый регистр обновляется очень быстро., @Peter Paul Kiefer

@PeterPaulKiefer Спасибо, это была оплошность с моей стороны. Вынул delay() и все тот же вывод :(, @fireblazer10

Вы подключили +5V и заземлили к макету? Ваша схема их не показывает., @StarCat

@StarCat Yep! Извини, что забыл эту часть. Будет редактировать его :D, @fireblazer10

Для меня это была самая очевидная возможность неудачи. Но есть и другие. Яркость 10 кажется мне очень низкой (макс 100). Если у вас есть светодиоды COMMON_ANODE, но вы настроили COMMON_CATHODEs, это инвертирует яркость. Темно - это Ярко, а Ярко-это Темно. Возьмите это вместе, и я мог бы привести к вашим наблюдениям. И, вероятно, проводка не правильная. Если вы добавите фотографию в пост, мы можем проверить это. Кстати. pin 12 не может обеспечить выход PWM (no ~ symbol), поэтому он не может быть использован для регулирования яркости подключенной цифры., @Peter Paul Kiefer

@PeterPaulKiefer Это действительно имело большой смысл! Я изменил его на "COMMON_ANODE" и установил яркость на 100, так что мне не нужно менять контакт 12. Это очень помогло! Единственная проблема сейчас заключается в том, что дисплей показывает в обратном порядке, а десятичная точка показывает, даже если я установил "disableDecPoint" на "true", но я смог исправить это, перевернув цифровые контакты, а также установив "disableDecPoint" на "false". Я поставлю обновленный код, а также некоторые выходные данные изображения :D, @fireblazer10

поменяйте местами контакты выбора цифр, @Juraj

Пожалуйста, забудьте последнее предложение в моем последнем комментарии. Я заглянул в lib-код, и они не используют ШИМ для управления яркостью. Вместо этого они используют пользовательский метод контроля яркости над включением и временем работы светодиода., @Peter Paul Kiefer

@PeterPaulKiefer, PWM wit 595?, @Juraj

@Juraj. Если вы контролируете обратную дорожку (контакты селектора цифр), она должна работать. Конечно, сдвиговый регистр не может быть использован для ШИМ ;-). И да, их собственный метод гораздо более умен, чем ШИМ. Должен признаться., @Peter Paul Kiefer

@PeterPaulKiefer, PWM on digit selection pins? это имеет еще меньше смысла. только одна цифра может быть зажжена одновременно. перерисовка быстро высвечивает цифры одну за другой. время между перерисовками определяет яркость дисплея, @Juraj

@Juraj Как я писал, это не умная альтернатива, но это зависит от скорости ШИМ, если это возможно или нет. Признаюсь, идея PWM не самая лучшая из тех, что у меня были, а также было бы лучше, если бы я попытался подумать, прежде чем писать. ;-), @Peter Paul Kiefer

здравствуйте, я сделал это, но у меня есть вопрос, как мы можем включить точки??, @user75738

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


1 ответ


Лучший ответ:

4

Наконец, мне удалось исправить это с помощью @PeterPaulKiefer, и я смог найти проблему. Проблема в самом коде (схема в порядке. Никаких изменений там нет) и это обновленный код.

#include <SevSegShift.h>

#define SHIFT_PIN_SHCP 6
#define SHIFT_PIN_STCP 5
#define SHIFT_PIN_DS   4

SevSegShift sevseg(SHIFT_PIN_DS, SHIFT_PIN_SHCP, SHIFT_PIN_STCP, 1, true);

void setup() {
  byte numDigits = 4;
  byte digitPins[] = {12, 11, 10, 9}; // Это контакты ** Arduino **
  byte segmentPins[] = {0, 1, 2, 3, 4, 5, 6, 7}; // это контакты ** сдвигового регистра **
  bool resistorsOnSegments = false; // "false" означает, что резисторы находятся на разрядных выводах
  byte hardwareConfig = COMMON_ANODE; // См. README.md для опций
  bool updateWithDelays = false; // По умолчанию "false" рекомендуется
  bool leadingZeros = false; // Используйте "true", если вы хотите, чтобы начальные нули
  bool disableDecPoint = false; //  Используйте "true", если ваша десятичная точка не существует или не подключена
  
  sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
  sevseg.setBrightness(100);
}

void loop() {
  sevseg.setNumber(500);
  sevseg.refreshDisplay(); // Должен выполняться повторно; не используйте блокирующий код (например, delay()) в функции loop (), иначе это не будет работать правильно
}

Что изменилось:

  1. Оказывается, мой 7-сегмент-это COMMON_ANODE, поэтому я изменил свою жесткую настройку
  2. Установите яркость на 100 (На этом этапе он показывает число в обратном порядке, но с десятичной запятой в каждой цифре)
  3. Установите для параметра disableDecPoint значение false (В этот момент дисплей отображается, но в обратном порядке, но не более десятичной точки) reverse
  4. Чтобы исправить это, я установил цифры[] в обратном порядке, и теперь он показывает правильный формат Correct Output

Большое спасибо Питеру за то, что помог мне разобраться, в чем дело!

Кроме того, светодиодная панель, которую я использую, состоит из 4-значного светодиода 0,36", 7-сегментного дисплея с общим анодом. (Ссылка на магазин, в котором я его купил)

,