Menu
CoddyTech

Секундомер с кнопкой

Часть раздела Отсчёт времени без delay путешествия по Arduino на Coddy. Урок 18 из 18.

У секундомера два состояния: запущен и остановлен, и нажатие переключает его из одного в другое. Он измеряет время надёжным способом: сохраните millis() в начале, а в конце вычтите это значение.

if (!running) {
  running = true;
  startTime = millis();
} else {
  running = false;
  Serial.println(millis() - startTime);
}

Кнопка устраняет дребезг так же, как кнопка режима: реагируйте на изменение показания, а затем подождите 20 мс. После обоих нажатий выдерживается одинаковая пауза в 20 мс, поэтому время между ними остаётся точным.

LED показывает состояние: горит, пока секундомер запущен.

challenge icon

Задание

Средне

Кнопка уже считывается, и дребезг устранён; onPress() запускается при каждом нажатии. Напиши onPress():

  • если секундомер не запущен: запусти его, сохрани millis() в startTime и включи LED
  • если он запущен: останови его, выключи LED и выведи время в миллисекундах

Нажми Run, нажми кнопку дважды, затем нажми Check.

Попробуйте сами

const int ledPin = 13;
const int buttonPin = 2;

bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// Вызывается один раз при каждом нажатии.
void onPress() {
  // не работает: запустить, запомнить время, включить светодиод
  // работает: остановить, выключить светодиод, вывести время в мс
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // дать контактам перестать дребезжать
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Отсчёт времени без delay

Потренируйтесь самостоятельно: Песочница Arduino