Arduino UNO R4 зависает во время третьего выполнения класса void

Вопрос или проблема

Я начинающий пользователь Arduino и купил UNO R4 WiFi как практическую плату для проекта освещения, который хочу построить из-за встроенной матрицы LED 8×12. Я пытаюсь узнать, как работают классы, потому что у меня есть код для LED-матрицы, который всегда зависает. Он состоит из 3 массивов (двух 8×12 и одного 10×14), которые быстро влияют друг на друга. Моя цель – освободить место массивов, если эта часть кода не выполняется, и в процессе визуально улучшить код.

Чтобы попрактиковаться с классами, я сделал маленькую программу, которая должна отображать текст различными способами на LED-матрице UNO R4. Она всегда зависает в третий раз, когда вызывается функция “Text::Display” сразу на matrix.begin();.

Код основной программы выглядит так:

#include "Arduino.h"
#include "Text.h"

Text Test1(46, 2, 0, 0, 50);
Text Test2(46, 2, 0, 1, 100);
Text Test3(57, 1, 0, 1, 50);

void setup() {
  Serial.begin(9600);
  delay(5000);
  Serial.println("Start");
}

void loop() {
  Test1.Display("Test1");
  Test2.Display("Test2");
  Test3.Display("Test3");
}

Код заголовка выглядит так:

#ifndef Text_h
#define Text_h
#include "Arduino.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
//ArduinoLEDMatrix matrix;

class Text {
private:
  int Size_l, x_start_l, y_start_l, speed_l;
  boolean scroll_l;
public:
  Text(int Size, int x_start, int y_start, boolean scroll, int speed);
  void Display(String text_l);
  ~Text();
};

#endif

А код файла класса выглядит так:

#include "Arduino.h"
#include "Text.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;

Text::Text(int Size, int x_start, int y_start, boolean scroll, int speed) {
  Size_l = Size;
  x_start_l = x_start;
  y_start_l = y_start;
  scroll_l = scroll;
  speed_l = speed;
}

void Text::Display(String text_l) {
  Serial.println(text_l);

  matrix.begin();
  matrix.beginDraw();
  matrix.stroke(0xFFFFFFFF);

  if (scroll_l) {
    text_l = "   " + text_l + "   ";
    matrix.textScrollSpeed(speed_l);
  };
  switch (Size_l) {
    case 46:
      {
        matrix.textFont(Font_4x6);
        Serial.println("4x6");
      };
      break;
    case 57:
      {
        matrix.textFont(Font_5x7);
        Serial.println("5x7");
      };
      break;
  };

  matrix.beginText(y_start_l, x_start_l, 0xFFFFFF);
  matrix.println(text_l);
  if (scroll_l) {
    matrix.endText(SCROLL_LEFT);
    matrix.endDraw();
  } else {
    matrix.endText();
    matrix.endDraw();
    delay(2000);
  };
}

Text::~Text() {
}

Как я уже говорил, программа всегда зависает в третий раз, когда выполняется функция “Text::Display” сразу на matrix.begin();. Я знаю это, потому что Serial.println(); выполняется, если matrix.begin(); размещен после (как сейчас) и не выполняется, когда matrix.begin(); размещен перед ним. Это также не имеет значения, какой из 3 экземпляров класса “Text” является третьим для “Отображения”, даже если внутри цикла только 2.

Ответ или решение

Проблема зависания Arduino UNO R4 при выполнении метода "Display" класса

На основе предоставленной информации, существует несколько возможных причин, почему ваша плата Arduino UNO R4 WiFi зависает во время выполнения метода Display. Давайте подробно рассмотрим потенциальные причины и решения, чтобы вы могли продолжать работу над вашим проектом.

Анализ кода и потенциальные проблемы

  1. Инициализация матрицы:
    Поскольку вы упоминаете, что зависание происходит в строке matrix.begin();, первое, что следует сделать — проверить, как реализован метод begin() в вашем классе ArduinoLEDMatrix. Возможно, в этом методе происходит блокирующая операция или внутреннее состояние не сбрасывается корректно.

  2. Управление памятью:
    Плата Arduino имеет ограниченные ресурсы по сравнению с более мощными платформами. Если вы создаете и уничтожаете объекты (в данном случае экземпляры класса Text), это может приводить к фрагментации памяти. Убедитесь, что вы не создаете переменные, которые не используются, и четко управляете памятью — например, избегайте вызова конструктора и деструктора больше раз, чем это необходимо.

  3. Выход за пределы массива:
    Если в вашем коде используются массивы, убедитесь, что вы не выходите за их пределы. Это может привести к неопределенному поведению и зависанию вашей программы.

  4. Блокирующие операции:
    Если в методы LED-матрицы (например, draw(), beginText(), и т.д.) входит ожидание завершения операции (блокировка), это также может вызвать зависания. Убедитесь, что ваши методы не застревают на бесконечном ожидании. Возможно, стоит провести дебаг, добавив дополнительные выводы в консоль перед вызовом этих методов.

  5. Проблема с многократным вызовом:
    Кажется, у вас могут быть проблемы с многократным вызовом инициализации. Попробуйте вызывать begin() только один раз в методе setup(), а не каждый раз при вызове метода Display(). Это поможет избежать повторной инициализации, которая может привести к ошибкам:

    void setup() {
       Serial.begin(9600);
       delay(5000);
       Serial.println("Start");
       matrix.begin(); // Инициализация матрицы один раз
    }

Рекомендации по улучшению кода

  • Инициализация: Инициализируйте матрицу в секции setup(), чтобы избежать вызовов в цикле loop(), тем самым уменьшив вероятность зависания.
ArduinoLEDMatrix matrix;

void setup() {
    Serial.begin(9600);
    matrix.begin(); // Инициализация происходит один раз
    delay(5000);
    Serial.println("Start");
}
  • Проверка состояния перед использованием: Добавьте проверки состояния матрицы перед её использованием:
if (!matrix.isAvailable()) {
    Serial.println("Matrix not ready");
    return; // не продолжать выполнение, если матрица не готова
}
  • Профилирование кода: Применяйте различные методы для профилирования вашего кода, чтобы выявить узкие места. Например, запишите время выполнения всех методов, связанных с LED-матрицей.

Заключение

Согласование кода с архитектурными принципами и оптимизация использования памяти помогут избежать зависания на вашем устройстве. Важно понимать, что у Arduino есть свои ограничения, и любые ресурсоемкие операции требуют особого внимания. Следуя приведенным рекомендациям и проверяя код на предмет потенциальных ошибок, вы сможете значительно улучшить функциональность вашего проекта на базе Arduino UNO R4.

Оцените материал
Добавить комментарий

Капча загружается...