MAX7219 и Ардуино
Я начинаю запускать этот светодиод 8x8 на Arduino. Независимо от того, какой скетч учебника я пробовал, я никогда не получал прокручиваемый текст, который я ожидал. То, что происходит, кажется, только к одному (из четырех) светодиодному модулю, адресуемому одновременно, в результате чего, например, сообщение прокручивается на одном модуле за раз, но на всех четырех последовательно. Может проблема в модуле?
@nkuck, 👍-1
1 ответ
▲ 1
Это немного заработало, изменив:
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
to:
#define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW
But still a little problem with the last character in a message not showing all leds lit until it starts to scroll after the initial program delay. Then all is fine.
Anyone want to address that issue? My sketch follows:
{ // Используем библиотеку Parola для прокрутки текста на дисплее
//
// Демонстрирует использование функции прокрутки для отображения полученного текста
// из последовательного интерфейса
//
// Пользователь может ввести текст на последовательном мониторе, и он будет отображаться как
// прокрутка сообщения на дисплее.
// Скорость дисплея регулируется потенциометром на аналоговом входе SPEED_IN.
// Направление прокрутки контролируется переключателем на цифровом входе DIRECTION_SET.
// Инверсия ВКЛ/ВЫКЛ устанавливается переключателем на цифровом входе INVERT_SET.
//
// Библиотеку UISwitch можно найти по адресу https://github.com/MajicDesigns/MD_UISwitch
// Библиотеку MD_MAX72XX можно найти по адресу https://github.com/MajicDesigns/MD_MAX72XX
//
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// устанавливаем в 1, если мы реализуем потенциометр пользовательского интерфейса, переключатель и т. д.
#define USE_UI_CONTROL 0
#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif
// Включаем операторы отладки для последовательного вывода
#define DEBUG 0
#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif
// Определяем количество устройств у нас в цепочке и аппаратный интерфейс
// ПРИМЕЧАНИЕ. Эти номера контактов, вероятно, не будут работать с вашим оборудованием и могут
// нужно адаптировать
//#определить HARDWARE_TYPE MD_MAX72XX::FC16_HW
//#определить HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
#define HARDWARE_TYPE MD_MAX72XX::ICSTATION_HW
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
// АППАРАТНЫЙ SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// ПРОГРАММНЫЙ SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
// параметры прокрутки
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8; // изменить эффект
const uint8_t INVERT_SET = 9; // меняем инверт
const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL
uint8_t scrollSpeed = 25; // значение задержки кадра по умолчанию
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // в миллисекундах
// Глобальные буферы сообщений, совместно используемые функциями Serial и Scrolling
#define BUF_SIZE 75
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "Got Signals?" };//{ "Привет! Введите новое сообщение?" };
bool newMessageAvailable = true;
#if USE_UI_CONTROL
MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);
void doUI(void)
{
// устанавливаем скорость, если она изменилась
{
int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);
if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
(speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
{
P.setSpeed(speed);
scrollSpeed = speed;
PRINT("\nChanged speed to ", P.getSpeed());
}
}
if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // НАПРАВЛЕНИЕ ПРОКРУТКИ
{
PRINTS("\nChanging scroll direction");
scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
P.setTextEffect(scrollEffect, scrollEffect);
P.displayClear();
P.displayReset();
}
if (uiInvert.read() == MD_UISwitch::KEY_PRESS) // ИНВЕРТИРОВАТЬ РЕЖИМ
{
PRINTS("\nChanging invert mode");
P.setInvert(!P.getInvert());
}
}
#endif // USE_UI_CONTROL
void readSerial(void)
{
static char *cp = newMessage;
while (Serial.available())
{
*cp = (char)Serial.read();
if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // конец символа сообщения или полный буфер
{
*cp = '\0'; // конец строки
// перезапускаем индекс для следующего заполнения и отмечаем, что у нас есть ожидающее сообщение
cp = newMessage;
newMessageAvailable = true;
}
else // перемещаем указатель char в следующую позицию
cp++;
}
}
void setup()
{
Serial.begin(57600);
Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");
#if USE_UI_CONTROL
uiDirection.begin();
uiInvert.begin();
pinMode(SPEED_IN, INPUT);
doUI();
#endif // USE_UI_CONTROL
P.begin();
P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}
void loop()
{
#if USE_UI_CONTROL
doUI();
#endif // USE_UI_CONTROL
if (P.displayAnimate())
{
if (newMessageAvailable)
{
strcpy(curMessage, newMessage);
newMessageAvailable = false;
}
P.displayReset();
}
readSerial();
}
,
@nkuck
Смотрите также:
- Почему светодиоды заметно мерцают?
- Случайные светодиоды загораются на 10 модулях MAX7219
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Остановить мигание светодиодов
- max7219 связанный дисплей, показывающий зеркальный текст
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
Я предложил изменить формат кода, но это ваш окончательный ответ на вопрос? Если в этом коде все еще есть проблемы, возможно, вам лучше добавить описание того, что не так, и вместо этого отредактировать его в своем вопросе., @PeterJ
"Чуть-чуть работает?", @Duncan C
Да, переход на ICSTATION решил проблему. Спасибо за ваш интерес., @nkuck