По совету для того чтобы работала кнопка, заменил delay, теперь после того как режим повторился два раза, всё начинает сходить сума, что делать?

Суть проблемы заключается в том, что использование функции delay в коде Arduino может привести к блокировке выполнения других операций во время задержки. Это может стать причиной схода системы, если в коде Arduino имеются другие задачи, которые должны выполняться одновременно с ожиданием задержки.

Для избежания этой проблемы можно использовать концепцию многозадачности, которая позволяет выполнять несколько задач одновременно в микроконтроллере Arduino. Одним из подходов к реализации многозадачности является использование функции millis() вместо функции delay().

Функция millis() возвращает количество миллисекунд, прошедших с момента запуска Arduino. Этот метод позволяет создавать задержки без блокировки выполнения других задач. Вместо того, чтобы ждать определенное количество времени, вы можете использовать millis() для проверки, сколько времени прошло с момента выполнения определенной операции. Если прошло достаточно времени, вы можете перейти к следующему шагу в вашем коде.

Например, вместо использования кода с функцией delay:

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

можно использовать код с функцией millis:

void loop() {
  static unsigned long previousMillis = 0;
  const unsigned long interval = 1000; // интервал времени в миллисекундах
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    digitalWrite(ledPin, HIGH);
    // ваш код для выполнения операции после задержки
    digitalWrite(ledPin, LOW);
    // ваш код для выполнения операции после задержки
  }
}

Этот код будет включать и выключать светодиод с использованием временного интервала в 1 секунду без блокировки выполнения других задач.

Если вы используете несколько задержек в коде, вы можете применить тот же подход, но с использованием нескольких переменных previousMillis и interval для каждой задачи.

Таким образом, замена функции delay() на функцию millis() позволит избежать блокировки выполнения других задач и, как следствие, проблем с работой системы.