Код кнопки синхронизации

Я пытаюсь засечь, как долго удерживается кнопка. Код, кажется, работает, но с двумя проблемами:

  1. значения миллиса считываются неправильно. Если вы удержите кнопку в течение 1 секунды, она вернет время удержания около 3000 мс. Быстрый щелчок возвращает время задержки около 1000 мс.

  2. Каждое последующее нажатие кнопки увеличивает предыдущее значение в миллисекундах, поэтому время ожидания становится все больше и больше и не измеряет, как долго только что была нажата кнопка

Любые идеи или советы для новичков приветствуются!

#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;
}

, 👍1

Обсуждение

используйте "длинный без знака" для хранения миллисекунд, @Juraj

Вы можете использовать эту библиотеку: https://arduinogetstarted.com/tutorials/arduino-button-library, вы можете посчитать время, в течение которого кнопка нажата. Приветствия, @k.Cyborg

спасибо за ваш совет - я проверю эти вещи, @j83


1 ответ


1

В вашем источнике есть несколько недостатков и одна ошибка, которая генерирует вывод, который вы видите. Это и есть анализ ошибки.

В цикле() вы начинаете с того, что ждете, пока вывод кнопки наберет HIGH, а затем еще раз считываете состояние вывода, которое, скорее всего, вернет то же самое, ВЫСОКОЕ. Примечание: Только в том случае, если ваша кнопка отскочит точно в нужное время, это последнее считывание вернется на НИЗКИЙ уровень.

while (digitalRead(button1Pin) == LOW) {}
button1State = digitalRead(button1Pin);

Затем вы проверяете состояние вывода, и давайте предположим, что он ВЫСОКИЙ. Выполняется только другая часть, и она вычисляет время ожидания как разницу между конечным и начальным давлением. Первое имеет текущее значение millis(), но последнее равно 0, когда вы его инициализировали.

Вот почему у вас всегда растут ценности.

Как это решить?

Подумайте о циклах while, нужны ли они вам? Помните, что loop() уже вызывается неоднократно.

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

,

спасибо за ваш совет - я проверю эти вещи, @j83