Проблемы с 8-значным 7-сегментным дисплеем

Я пытался следовать нескольким руководствам о том, как заставить сегмент 7 отображать простой вывод, но ни одно из них не работает на 100%.

Все начинается хорошо. Он увеличивает число на экране, а затем записывает 8 для всех из них, а затем реверсирует. Однако после нескольких циклов он начинает вести себя странно. Вот ссылка на видео, где он ведет себя немного странно (несколько цифр пишутся неправильно и исправляются сами), а затем, в конце, он отображает только половину 8-значного дисплея, прежде чем он переходит на 8 и падает. https://youtu.be/LD_C7I_bGyc

Вот код:

//Мы всегда должны подключать библиотеку
#include "LedControl.h"

// контакт 4 подключен к контакту DIN
// вывод 2 подключен к выводу CLK
// вывод 3 подключен к выводу CS
// 1, так как мы используем только 1 MAX7219
LedControl lc = LedControl(4, 2, 3, 1);

void setup(){
    // ноль относится к номеру MAX7219, это ноль для 1 чипа
    lc.shutdown(0, false);// отключить энергосбережение, включить отображение
    lc.setIntensity(0, 0);// устанавливает яркость (0~15 возможных значений)
    lc.clearDisplay(0);// очистить экран
}

void loop(){
    // числа от 7 до 0
    for (int a = 0; a < 8; a++){
        lc.setDigit(0, a, a, false);
        delay(100);
    }
    delay(1000);
    // отображаем число 8 на всех сегментах
    for (int a = 0; a < 8; a++){
        lc.setDigit(0, a, 8, false);
        delay(100);
    }
    delay(1000);

    for (int a = 8; a >= 0; a--){
        lc.setDigit(0, a, a, false);
        delay(100);
    }
}

Оборудование: Arduino Uno: https://www.jaycar.com.au/duinotech-uno -r3-development-board/p/XC4410 8-разрядный дисплей: https://www.jaycar.com.au/ 8-разрядный 7-сегментный дисплейный модуль/p/XC3714

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

Спасибо!

, 👍0

Обсуждение

Вы должны включить дисплей. Ваш вызов setup() для lc.setIntensity(0, 0) меняет яркость дисплея на ноль, попробуйте установить ее на 15., @Dougie

Вот только яркость. Изначально днем было 15, но ночью я выключил его, потому что было слишком ярко., @Kc Gibson

Интересно, у вас слишком быстрое время? В таблице данных по адресу https://datasheets.maximintegrated.com/en/ds/MAX7219-MAX7221.pdf есть временные значения, попробуйте немного замедлить все., @Dougie

for (int a = 8; a >= 0; a--){ -- Почему вы начинаете с 8, а не с 7? В прямой версии идет 7 a < 8;. Кстати: мне понравился вопрос из-за видео. Крутая идея. ;-), @Peter Paul Kiefer

@ Дуги, ты был очень близок. Я опубликовал ответ на исправление, так как на самом деле провод заземления был нестабильным. Ранее я заменил все провода, которые управляют цифрой 8, однако я никогда не думал менять провода питания и заземления на плату. Отсутствие стабильного провода заземления испортило бы связь и сильно повлияло бы на тайминги., @Kc Gibson

@PeterPaulKiefer это видео было единственным способом показать людям, чтобы они поверили, как странно это действовало :), @Kc Gibson


2 ответа


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

2

Это был неожиданный результат. @Dougie был в курсе. Я не знал, как настроить тайминги, так как был уверен, что библиотека позаботится об этом, поэтому единственное, о чем я мог думать, это переделать всю проводку заново. Именно тогда я заметил, что контакт заземления на плате наполовину торчал.

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

,

Ну, это могло изменить значения, распознаваемые чипом. Если вы теряете позиции (не каламбур), эталонный уровень теряется. «Низкий» (значение бита 0) может быть прочитан как «высокий» (значение бита 1) или наоборот. Время не изменится из-за отсутствия заземления., @the busybee

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

@the bussybee, мне нужно провести некоторое исследование того, как земля на самом деле влияет на него, поскольку я думал, что он только что завершил цепь., @Kc Gibson


2

Последний цикл превышает лимит в 8 цифр. Вы повторяете 9 раз (0-8).

   for (int a = 7; a >= 0; a--){
        lc.setDigit(0, a, a, false);
        delay(100);
    }
,

Почти наверняка проблема в этом. (проголосовали.) Проблемы с выходом за границы массива вызывают множество странных симптомов., @Duncan C

Досадно, что это не исправило. Я предполагаю, что если бы это было так, то он рухнул бы на первом основном «цикле», но некоторое время работает, прежде чем сходить с ума., @Kc Gibson