#1 2024-05-13 11:29:20

ip040215
Учасник
Зареєстрований: 2024-02-09
Повідомлень: 1

Проблема аппаратная или програмная? Неправильно считает время

Помогите пожалуйста разобраться. Проблема аппаратная или програмная? Arduino Uno
Неправильно считает время между нажатиями кнопки!?
Задача считать время между нажатиями кнопки. Получаемый результат в разы отличается от времени по секундомеру?!
Заранее спасибо

const int buttonPin = 2;     // номер пина, к которому подключена кнопка
unsigned long previousTime = 0; // время предыдущего нажатия

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int buttonState = digitalRead(buttonPin);
 
  // Если кнопка нажата
  if (buttonState == LOW) {
        unsigned long currentTime = millis(); // текущее время
    if (previousTime > 0) {
      // Если это не первое нажатие, вычисляем и выводим время между нажатиями
      Serial.print("Time between clicks: ");
      Serial.print((currentTime - previousTime)/1000);
      Serial.println(" sec");
    }
    previousTime = currentTime; // обновляем время предыдущего нажатия
    // Ждем, пока кнопка будет отпущена
    while (digitalRead(buttonPin) == LOW) {}
  }
}

Неактивний

#2 2024-05-13 17:26:49

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 138

Re: Проблема аппаратная или програмная? Неправильно считает время

У вас немає ніякого програмного придушення брязкіту контактів (debouncing). Якщо кнопка підʼєднана напряму і debouncing не реалізовано апаратно, то кожне натиснення генерує серію імпульсів.

Приклад, як можна реалізувати програмно:

static const byte buttonPin   { 2 };
static const byte debounce_ms { 20 };

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

static bool pressedPrev  { false };
static bool debounce     { false };
static unsigned long debounceStartTime;

static unsigned long lastPressTime;
static bool firstPress   { true };

void loop() {
  unsigned long now = millis();

  if (debounce && (now - debounceStartTime >= debounce_ms)) {
      debounce = false;
  }

  if (!debounce) {
    bool pressed = digitalRead(buttonPin) == LOW;
    if (pressed != pressedPrev) {
      debounceStartTime = now;
      pressedPrev = pressed;
      debounce = true;

      // тут обробляєте натиснення або відпускання як вам потрібно
      if (pressed) {
        if (!firstPress) {
          Serial.println((now - lastPressTime) / 1000);
        } else {
          firstPress = false;
        }
        lastPressTime = now;
      }

    }
  }
}

Оптимальне значення debounce_ms можна підібрати під конкретну кнопку, наскільки довго вона брязчить при натисканні та відпусканні. Зазвичай декілька мс достатньо.

Зверніть увагу, якщо між натисненнями пройде більше ніж 1193 години (≈49 діб), то результат буде некоректний через переповнення unsigned long.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму