Как прочитать значение таймера после остановки?

Я скачал библиотеку Timer1, но, к сожалению, похоже, из нее удален метод read(). Я также попробовал библиотеку SimpleTimer с веб-сайта Arduino, но программа не скомпилировалась из-за неопределенной ссылки на ошибку SimpleTimer::SimpleTimer(). Кто-нибудь знает, как решить эту ошибку или просто другую библиотеку таймера, имеющую функцию чтения?

Чтобы быть более конкретным, мне нужно запускать таймер при нажатии кнопки и останавливать его при отпускании.

, 👍2

Обсуждение

Рассматривали ли вы вместо этого поиск библиотеки захвата ввода?, @Ignacio Vazquez-Abrams

Чтобы запустить таймер, задайте ему тактовую частоту, установив биты CSn2..0. Один набор этих битов останавливает часы и, следовательно, таймер. Прочтите технический паспорт, чтобы быть уверенным., @dannyf


2 ответа


0

Чтобы использовать этот скетч, вам нужно будет загрузить и установить библиотеку Debounce отсюда: https://playground.arduino.cc/Code/Debounce. Подключите один конец кнопочного переключателя NO к GND, а другой конец — к контакту 4 Arduino. ПРИМЕЧАНИЕ: если кнопка удерживается нажатой меньше времени задержки debounce, прошедшее время будет временем задержки debounce. ПРИМЕЧАНИЕ 2: Функция millis() переполняется примерно через 49 дней.

#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(){
  pinMode(SWITCH, INPUT_PULLUP);
  Serial.begin(9600);
}

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

1

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

const uint8_t button_pin = 2;

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

void loop()
{
    static int last_button_state = HIGH;
    static unsigned int push_count;
    static unsigned long last_press_time;
    int button_state = digitalRead(button_pin);
    unsigned long now = millis();

    // Запись момента нажатия кнопки.
    if (last_button_state == HIGH && button_state == LOW) {
        push_count++;
        last_press_time = now;
    }

    // Сообщаем об отпускании кнопки.
    if (last_button_state == LOW && button_state == HIGH) {
        unsigned long push_duration = now - last_press_time;
        if (push_duration < 10) {  // отбросить отскок
            push_count--;
        }
        else {
            Serial.print(F("pushes: "));
            Serial.print(push_count);
            Serial.print(F(", duration: "));
            Serial.print(push_duration);
            Serial.println(F(" ms"));
        }
    }

    last_button_state = button_state;
}
,