Ви не увійшли.
Помогите пожалуйста разобраться. Проблема аппаратная или програмная? 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) {}
}
}
Неактивний
У вас немає ніякого програмного придушення брязкіту контактів (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.
Неактивний