Menu
CoddyTech

Stoper z przyciskiem

Część sekcji Odmierzanie czasu bez delay() ścieżki Arduino w Coddy. Lekcja 18 z 18.

Stoper ma dwa stany: uruchomiony i zatrzymany, a naciśnięcie przełącza go z jednego na drugi. Mierzy czas w bezpieczny sposób: zapisz wartość millis() na początku, a na końcu ją odejmij.

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

Przycisk jest eliminowany z drgań styków tak samo jak przycisk trybu: zareaguj, gdy odczyt się zmieni, a następnie odczekaj 20 ms. Oba naciśnięcia wymagają odczekania tych samych 20 ms, więc czas między nimi pozostaje prawidłowy.

LED pokazuje stan: świeci, gdy stoper działa.

challenge icon

Wyzwanie

Średni

Przycisk jest już odczytywany i poddawany eliminacji drgań styków, a onPress() uruchamia się raz przy każdym naciśnięciu. Napisz onPress():

  • jeśli stoper nie działa: uruchom go, zapisz millis() w startTime i zapal LED
  • jeśli działa: zatrzymaj go, zgaś LED i wypisz czas w milisekundach

Naciśnij Run, naciśnij przycisk dwa razy, a następnie Check.

Spróbuj swoich sił

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

// Wywoływana raz przy każdym naciśnięciu.
void onPress() {
  // nie działa: uruchom, zapamiętaj czas, zapal LED
  // działa: zatrzymaj, zgaś LED, wypisz czas w ms
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // poczekaj, aż styki przestaną drgać
  }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Odmierzanie czasu bez delay()

Poćwicz samodzielnie: Edytor online Arduino