Проблема с вызовом конструктора вне setup () в Arduino - PullRequest
0 голосов
/ 07 мая 2020

У меня был OLED-дисплей SPI 128x64, и я использовал Adafruit_GFX и Adafruit_SSD1306 для управления им. У меня было имя класса Engine, у которого был конструктор publi c, например:

Engine::Engine() {
    display.begin(2U, 0U, true, false);

  // Define some pinmode not a problem
    pinMode(button1Pin, INPUT_PULLUP);
    pinMode(button2Pin, INPUT_PULLUP);
    pinMode(xPin, INPUT);
    pinMode(yPin, INPUT);
    pinMode(buzzerPin, OUTPUT);

  //clear the screen and display
    clearScreen();
    display.display();
    time = 0;
}

Затем в моем файле .ino у меня есть что-то вроде этого:

Engine engine = Engine();

void setup() {
    Serial.begin(115200);
    Serial.println("testing...");
}

Проблема в что программа зависла. Не знаю, работал ли код или нет (думаю, что нет). Я попытался отладить его, и если у меня есть объявление двигателя внутри настройки, все будет в порядке. Или если я удалю строку display.begin() и оставлю объявление вне настройки. Зачем? Мне нужно было позвонить display.begin() внутри setup(). Как с этим уйти?

PS: Я использовал для этого визуальный микро. Но после этого я перемещаю код на Arduino, и проблема все равно появляется.

1 Ответ

2 голосов
/ 07 мая 2020

Вам нужно разделить этот конструктор на две части. Прямо сейчас ваш конструктор выполняет действия с оборудованием, например вызывает pinMode. Но если вы вызовете его в глобальной области до вызова установки, он будет вызван до того, как основные вызовы init () и настроят оборудование. По сути, вы вызываете pinMode до того, как плата будет готова установить pinMode. Что вам нужно сделать, так это разделить все оборудование на метод begin () или init () в классе, который вы можете вызвать настройкой формы. Все, что должен сделать конструктор, - это инициализировать все переменные, которые в нем нуждаются, и построить объект. У вас должен быть engine.begin (), который вы можете вызвать из установки, чтобы выполнять все функции pinMode и оборудования, когда оборудование будет готово к работе. Посмотрите, как ваш ЖК-код работает с методом begin.

...