Arduino:
Запис до стандартної помилки

Як робити:

Arduino за замовчуванням не розрізняє стандартний вивід та стандартну помилку, як це роблять звичайні комп’ютерні системи. Методи Serial.print() і Serial.println() записують у той самий серійний вивід, який зазвичай переглядається в моніторі серійного порту Arduino IDE. Однак, ми можемо емулювати запис до stderr, виділяючи повідомлення про помилки спеціальним форматуванням або перенаправляючи їх на альтернативний вивід, наприклад, у файл на SD-карті або через мережеве з’єднання.

Для емуляції stderr ви можете додати перед повідомленнями про помилки тег, наприклад, “ERROR:”, аби відрізнити їх у моніторі серійного порту:

void setup() {
  Serial.begin(9600); // Ініціалізація серійного зв'язку на швидкості 9600 бод
}

void loop() {
  int result = someFunction();
  if (result == -1) {
    // Емуляція stderr за допомогою додавання перед повідомленням про помилку
    Serial.println("ERROR: Функція не вдалась.");
  } else {
    Serial.println("Функція виконана успішно.");
  }
  delay(1000); // Очікування секунди перед перезапуском циклу
}

int someFunction() {
  // Умовна функція, що повертає -1 у разі помилки
  return -1;
}

Приклад виводу в моніторі серійного порту Arduino IDE виглядатиме так:

ERROR: Функція не вдалась.

Для проєктів, котрі вимагають більш складного підходу, зокрема запису на різні фізичні носії, може знадобитися використання сторонніх бібліотек або додаткового обладнання. Наприклад, для журналювання повідомлень про помилки на SD-карті потрібна бібліотека SD:

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
  Serial.begin(9600);
  if (!SD.begin()) {
    Serial.println("ERROR: Не вдалося ініціалізувати SD-карту!");
    return;
  }
  
  myFile = SD.open("error.log", FILE_WRITE);
  if (myFile) {
    myFile.println("ERROR: Функція не вдалась.");
    myFile.close(); // Обов'язково закрийте файл, аби зберегти вміст
  } else {
    Serial.println("ERROR: Не вдалося відкрити error.log!");
  }
}

void loop() {
  // Тут міг би бути ваш основний код
}

З цим підходом ви фізично розділяєте звичайний вивід програми та повідомлення про помилки, перенаправляючи останні до файлу error.log на SD-карті, що дозволяє проводити аналіз після завершення роботи без засмічення основного каналу виводу.