// Піни для світлодіода і кнопки
const int ledPin = 5;    // GPIO 5 для світлодіода
const int buttonPin = 4; // GPIO 4 для кнопки

// Змінні для зберігання часу
volatile unsigned long lastPressTime = 0;
volatile unsigned long previousTime = 0;
volatile unsigned long interval = 0;
volatile bool measureFinished = false;

const unsigned long debounceDelay = 200; // 200 мс для захисту від дребезгу

void IRAM_ATTR handleButtonPress() {
  unsigned long currentPressTime = millis();

  // Захист від дребезгу: перевіряємо чи пройшло більше 200 мс
  if (currentPressTime - previousTime > debounceDelay) {
    if (lastPressTime == 0) {
      // Перше натискання
      lastPressTime = currentPressTime;
    } else {
      // Друге натискання
      interval = currentPressTime - lastPressTime;
      lastPressTime = 0;
      measureFinished = true;
    }
    previousTime = currentPressTime;
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);  // Внутрішній підтягуючий резистор для кнопки
  
  // Налаштування переривання для кнопки
  attachInterrupt(digitalPinToInterrupt(buttonPin), handleButtonPress, FALLING);
}

void loop() {
  if (measureFinished) {
    Serial.print("Інтервал між натисканнями: ");
    Serial.print(interval);
    Serial.println(" мс");
    
    // Засвічуємо світлодіод на 1 секунду для індикації завершення
    digitalWrite(ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    
    // Скидаємо змінну після виведення результатів
    measureFinished = false;
  }
}
Loading
esp32-devkit-c-v4