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);
// Состояния реле
display.setCursor(76, 51);
display.print(relay1Active ? F("R1+") : F("R1-"));
display.setCursor(100, 51);
display.print(relay2Active ? F("R2+") : F("R2-"));
display.display();
}