Код кнопки синхронизации
Я пытаюсь засечь, как долго удерживается кнопка. Код, кажется, работает, но с двумя проблемами:
значения миллиса считываются неправильно. Если вы удержите кнопку в течение 1 секунды, она вернет время удержания около 3000 мс. Быстрый щелчок возвращает время задержки около 1000 мс.
Каждое последующее нажатие кнопки увеличивает предыдущее значение в миллисекундах, поэтому время ожидания становится все больше и больше и не измеряет, как долго только что была нажата кнопка
Любые идеи или советы для новичков приветствуются!
#include <LiquidCrystal.h>
const int button1Pin = 1; // pushbutton 1 pin
const int ledPin = 13; // LED pin
int button1State, button2State; // variables to hold the pushbutton states
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int startPressed = 0;
int endPressed = 0;
int holdTime = 0;
void setup() {
// Set up the pushbutton pins to be an input:
pinMode(button1Pin, INPUT);
// Set up the LED pin to be an output:
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
\
}
void loop() {
while (digitalRead(button1Pin) == LOW) {}
button1State = digitalRead(button1Pin);
startPressed = 0;
endPressed =0;
holdTime = 0;
// if button1 or button 2 are pressed (but not both)
if (button1State == LOW) {
digitalWrite(ledPin, LOW); // turn the LED on
startPressed = millis();
} else {
digitalWrite(ledPin, HIGH); // turn the LED off
endPressed = millis();
holdTime = endPressed - startPressed;
}
lcd.print("You pressed for");
lcd.setCursor(0, 1);
lcd.print(holdTime);
lcd.print("ms");
while (digitalRead(button1Pin) == LOW) {}
lcd.clear();
startPressed =0;
endPressed =0;
holdTime = 0;
}
@j83, 👍1
Обсуждение1 ответ
В вашем источнике есть несколько недостатков и одна ошибка, которая генерирует вывод, который вы видите. Это и есть анализ ошибки.
В цикле()
вы начинаете с того, что ждете, пока вывод кнопки наберет HIGH, а затем еще раз считываете состояние вывода, которое, скорее всего, вернет то же самое, ВЫСОКОЕ. Примечание: Только в том случае, если ваша кнопка отскочит точно в нужное время, это последнее считывание вернется на НИЗКИЙ уровень.
while (digitalRead(button1Pin) == LOW) {}
button1State = digitalRead(button1Pin);
Затем вы проверяете состояние вывода, и давайте предположим, что он ВЫСОКИЙ. Выполняется только другая
часть, и она вычисляет время ожидания
как разницу между конечным
и начальным давлением
. Первое имеет текущее значение millis()
, но последнее равно 0, когда вы его инициализировали.
Вот почему у вас всегда растут ценности.
Как это решить?
Подумайте о циклах while, нужны ли они вам? Помните, что
loop()
уже вызывается неоднократно.
Вам может понадобиться переменная состояния, в которой хранится состояние последнего вывода, чтобы вы могли обнаруживать изменения.
спасибо за ваш совет - я проверю эти вещи, @j83
- Кнопка с таймером переключения и функцией сброса времени + светодиод обратной связи
- Та же кнопка одним кликом и двойным кликом
- Кнопка переключения переключает между операторами обращения с разблокированием кнопки
- Перезапустите последовательность NeoPixel с помощью кнопки в любое время.
- Как справиться с rollover millis()?
- Как переключить светодиод при нажатии кнопки?
- Использование millis() и micros() внутри процедуры прерывания
- Определение того, была ли нажата и отпущена кнопка
используйте "длинный без знака" для хранения миллисекунд, @Juraj
Вы можете использовать эту библиотеку: https://arduinogetstarted.com/tutorials/arduino-button-library, вы можете посчитать время, в течение которого кнопка нажата. Приветствия, @k.Cyborg
спасибо за ваш совет - я проверю эти вещи, @j83