Проблемы с 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
На данном этапе трудно сказать, связана ли проблема с аппаратным обеспечением или с настройкой. Если бы кто-нибудь мог дать мне некоторое представление или, возможно, запустить его, если бы у него было такое же оборудование, это было бы здорово.
Спасибо!
@Kc Gibson, 👍0
Обсуждение2 ответа
Лучший ответ:
Это был неожиданный результат. @Dougie был в курсе. Я не знал, как настроить тайминги, так как был уверен, что библиотека позаботится об этом, поэтому единственное, о чем я мог думать, это переделать всю проводку заново. Именно тогда я заметил, что контакт заземления на плате наполовину торчал.
На видео вы можете увидеть контакт заземления в правом верхнем углу. Так вот делал подключение (иначе все это дело не работало бы), но после замены провода заводится нормально. Таким образом, это могло бы привести к нарушению синхронизации, если бы соединение было нестабильным.
Ну, это могло изменить значения, распознаваемые чипом. Если вы теряете позиции (не каламбур), эталонный уровень теряется. «Низкий» (значение бита 0) может быть прочитан как «высокий» (значение бита 1) или наоборот. Время не изменится из-за отсутствия заземления., @the busybee
Я не эксперт в этом, но я предполагаю, что Arduino отправлял сообщения, но, поскольку он не был должным образом заземлен, он отключался и, следовательно, получал смешанные сообщения во время каждого цикла синхронизации., @Kc Gibson
@the bussybee, мне нужно провести некоторое исследование того, как земля на самом деле влияет на него, поскольку я думал, что он только что завершил цепь., @Kc Gibson
Последний цикл превышает лимит в 8 цифр. Вы повторяете 9 раз (0-8).
for (int a = 7; a >= 0; a--){
lc.setDigit(0, a, a, false);
delay(100);
}
Почти наверняка проблема в этом. (проголосовали.) Проблемы с выходом за границы массива вызывают множество странных симптомов., @Duncan C
Досадно, что это не исправило. Я предполагаю, что если бы это было так, то он рухнул бы на первом основном «цикле», но некоторое время работает, прежде чем сходить с ума., @Kc Gibson
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Пользовательская функция сна для Nextion
- Как заставить текст мигать на экране ssd1306 i2c
- TFT-дисплей ST7789 показывает правильное изображение только при нажатой кнопке сброса Arduino - Почему?
- Adafruit 128x64 OLED не включается
- Нужна помощь с программой для кнопки смены отображения на OLED-дисплее
- Чтение оперативной памяти с OLED-контроллера SH1106 через I2C
- OLED 'SH1106_WHITE' was not declared in this scope
Вы должны включить дисплей. Ваш вызов
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? В прямой версии идет 7a < 8;
. Кстати: мне понравился вопрос из-за видео. Крутая идея. ;-), @Peter Paul Kiefer@ Дуги, ты был очень близок. Я опубликовал ответ на исправление, так как на самом деле провод заземления был нестабильным. Ранее я заменил все провода, которые управляют цифрой 8, однако я никогда не думал менять провода питания и заземления на плату. Отсутствие стабильного провода заземления испортило бы связь и сильно повлияло бы на тайминги., @Kc Gibson
@PeterPaulKiefer это видео было единственным способом показать людям, чтобы они поверили, как странно это действовало :), @Kc Gibson