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();
}