Загрузка данных



void updateDisplay() {
  if (millis() - lastDisplayUpdate < DISPLAY_INTERVAL) {
    return;
  }

  lastDisplayUpdate = millis();

  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);

  // Заголовки P и N
  display.setTextSize(1);

  display.setCursor(0, 0);
  display.print(F("P"));

  display.setCursor(76, 0);
  display.print(F("N"));

  // Крупные значения параметров
  display.setTextSize(3);

  display.setCursor(0, 10);
  display.print(pulseDuration);

  char nBuffer[4];
  snprintf(nBuffer, sizeof(nBuffer), "%d", targetCycles);

  int nWidth = strlen(nBuffer) * 18;
  int nX = 124 - nWidth;

  if (nX < 64) {
    nX = 64;
  }

  display.setCursor(nX, 10);
  display.print(nBuffer);

  // Температура или сообщение об ошибке
  display.setTextSize(1);
  display.setCursor(0, 39);
  display.print(F("TEMP:"));

  if (temperatureFault) {
    display.print(F("ERROR"));
  } else if (overheatLock) {
    display.print(F("OVERHEAT"));
  } else if (temperatureC != DEVICE_DISCONNECTED_C) {
    display.print(temperatureC, 1);
    display.print(F(" C"));
  } else {
    display.print(F("--.- C"));
  }

  // Счётчик TRIG слева внизу
  display.setCursor(0, 51);
  display.print(F("TRIG:"));
  display.print(triggerCount);

  // R1 у правого края с обратным отсчётом
  display.setCursor(88, 51);

  if (relay1Active) {
    unsigned long elapsed = millis() - relay1StartTime;
    unsigned long remaining = 0;

    if (elapsed < RELAY1_DURATION) {
      remaining = (RELAY1_DURATION - elapsed + 999UL) / 1000UL;
    }

    display.print(F("R1:"));
    display.print(remaining);
    display.print(F("s"));
  } else {
    display.print(F("R1:OFF"));
  }

  display.display();
}