Arduino - Расчет времени, в течение которого кнопка нажата и удерживается без отпускания

Я работаю над проектом, который требует расчета времени, в течение которого кнопка удерживается нажатой без отпускания. Есть ли фрагмент кода, который я могу использовать для этой конкретной потребности?

, 👍1

Обсуждение

Ограничьте свой вопрос. Вы говорите о минутах? Секундах? Миллисекундах? Если миллисекундах, как вы планируете бороться с дребезгом переключателя?, @st2000

Всего лишь миллисекунды. Я пока не нашел решения проблемы с отскоком., @VishwaV

Не спрашивал, как вы собираетесь это решать. Хотел узнать, как вы собираетесь это интерпретировать. Предполагая, я бы сказал, что вы хотите начать отсчет с шагом в миллисекунду при первом контакте. Затем я предполагаю, что вы хотите прекратить отсчет при последнем контакте. Но хитрость: вы не узнаете о последнем контакте, пока (в зависимости от качества вашего коммутатора) не пройдут 10 миллисекунд без дополнительных контактов. Поэтому, какое бы решение вы ни выбрали, вам нужно будет рассмотреть эти вопросы и угадать время, попробовать их, а затем скорректировать, пока не получите желаемые результаты., @st2000

Да, именно так я и интерпретирую этот вопрос. Хорошо, попробую вернуться сюда. Спасибо, приятель., @VishwaV


1 ответ


1

Существует библиотека под названием "Debounce", которую вы можете найти здесь: playground.arduino.cc. На основе этой библиотеки вот простой скетч, который отображает время нажатия кнопки.

// Подключите один конец кнопочного переключателя NO к GND, а другой
// конец к выводу 4 Arduino.
// ПРИМЕЧАНИЕ: Если кнопка удерживается нажатой меньше времени, чем задержка устранения дребезга
// время, прошедшее время отобразит время задержки устранения дребезга.
#include <Debounce.h>
const byte SWITCH = 4;
unsigned long startTime = 0;
unsigned long endTime = 0;
unsigned long elapsedTime = 0;
const byte debounceDelayTime = 50;

Debounce debouncer = Debounce(debounceDelayTime, SWITCH);

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

void loop(){
  if(debouncer.update()){
    if(debouncer.read() == 0){
      startTime = millis();
      Serial.println("Button Pressed");
    }
    else if(debouncer.read() == 1){
      endTime = millis();
      Serial.println("Button Released");
      elapsedTime = endTime - startTime;
      Serial.print("Button Held Down For ");
      Serial.print(elapsedTime);
      Serial.println(" ms.");
    }
  }
}
,

Переполнение millis() не должно быть проблемой, так как вычитание endTime - startTime также приведет к переполнению, поскольку elapsedTime также является unsigned long., @chrisl

Привет, VE7JRO, я получаю эту ошибку, что-то не так с импортом библиотеки? :Arduino: 1.8.5 (Windows 7), плата: "Arduino/Genuino Uno" C:\Users\user\Desktop\buttonpresstrial3\buttonpresstrial3.ino:1:22: фатальная ошибка: debounce.h: Такого файла или каталога нет #include <debounce.h> ^ компиляция прекращена. статус выхода 1 Ошибка компиляции для платы Arduino/Genuino Uno. В этом отчете будет больше информации «Показывать подробный вывод во время компиляции» опция включена в Файл -> Настройки., @VishwaV

Извините @VishwaV, вы можете найти его здесь: https://playground.arduino.cc/uploads/Code/Debounce.zip. Я обновлю свой ответ. Я использую версию 1.0.6.2 IDE, и предполагаю, что более новые версии используют обновленные библиотеки Bounce2., @VE7JRO

Привет @VE7JRO, Даже после импорта в папку библиотек в arduino я получаю эту ошибку: D:\arduino-1.8.5\libraries\Debounce\Debounce.cpp:2:22: фатальная ошибка: WProgram.h: такого файла или каталога нет. Что мне делать?, @VishwaV

В строке 2 Debounce.cpp удалите это: #include "WProgram.h" и замените это на это: #include "Arduino.h"., @VE7JRO

Я заменил его с помощью блокнота, но ошибка все еще сохраняется @VE7JRO, @VishwaV

Попробуйте добавить пару пустых строк в начало Debounce.cpp. Ошибка была в строке 22 (Debounce.cpp:2:22) в первый раз. Добавление пустых строк должно изменить номер строки ошибки. Нам нужно убедиться, что вы редактируете правильный файл., @VE7JRO

Привет @VE7JRO, я добавил пару пустых строк в начало файла debounce.cpp, но ошибка все еще остается на строке 22. Тогда я редактирую не тот файл?, @VishwaV

Да, вы редактируете не тот файл., @VE7JRO

Ой, ладно, подождите, вот что я сделал, я увидел файл Debounce.cpp. Конвертировал его в формат Wordpad и изменил строку, как вы сказали. После этого я сохранил его обратно в формате Word. Мне следует изменить его обратно на формат cpp или что-то в этом роде?, @VishwaV

И теперь ошибка имеет дополнительную строку: Для «Debounce.h» найдено несколько библиотек. Используется: C:\Users\user\Documents\Arduino\libraries\Debounce Не используется: D:\arduino-1.8.5\libraries\Debounce, @VishwaV

Похоже, IDE не может решить, использовать ли библиотеку на диске C или D. Я бы удалил одну из дублирующих библиотек. Имя файла должно быть: Debounce.cpp. Я не знаком с Wordpad. У вас есть простой текстовый редактор?, @VE7JRO

Привет @VE7JRO, ты был прав, я удалил одну из этих дублирующих библиотек и все получилось. Твой код теперь работает абсолютно нормально, спасибо., @VishwaV