MAX7219 и Ардуино

Я начинаю запускать этот светодиод 8x8 на Arduino. Независимо от того, какой скетч учебника я пробовал, я никогда не получал прокручиваемый текст, который я ожидал. То, что происходит, кажется, только к одному (из четырех) светодиодному модулю, адресуемому одновременно, в результате чего, например, сообщение прокручивается на одном модуле за раз, но на всех четырех последовательно. Может проблема в модуле?

, 👍-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();
}

,

Я предложил изменить формат кода, но это ваш окончательный ответ на вопрос? Если в этом коде все еще есть проблемы, возможно, вам лучше добавить описание того, что не так, и вместо этого отредактировать его в своем вопросе., @PeterJ

"Чуть-чуть работает?", @Duncan C

Да, переход на ICSTATION решил проблему. Спасибо за ваш интерес., @nkuck