Mit micros() messen
Teil des Abschnitts Timing ohne Delay der Arduino-Journey von Coddy. Lektion 16 von 18.
millis() zählt ganze Millisekunden, was für kurze Zeitspannen zu grob ist: Ein Tastendruck von 2.5 ms würde als 2 oder 3 gemessen. micros() ist dieselbe Art Uhr, zählt aber Mikrosekunden, Millionstel einer Sekunde: 1000 davon entsprechen einer Millisekunde.
Auf dem Uno erhöht sich der Wert in Schritten von 4 Mikrosekunden, und auch diese Funktion gibt einen unsigned long zurück. Um etwas zu messen, lies den Wert davor und danach ab und ziehe den ersten vom zweiten ab:
unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took); // etwa 110: ein analogRead() dauert etwa 0.1 msWeil micros() so schnell zählt, gehen ihm die Zahlen viel früher aus als millis(): Nach etwa 70 Minuten beginnt die Zählung wieder bei 0. Verwende sie für kurze Zeitspannen und millis() für alles, was länger als ein paar Minuten dauert.
Aufgabe
EinfachMiss, wie lange die Taste in Mikrosekunden gedrückt gehalten wird:
- wenn die Taste gedrückt wird, speichere
micros()inpressedAt - wenn sie losgelassen wird, gib
micros() - pressedAtaus
Klicke auf Run, drücke kurz die Taste und klicke dann auf Check.
Probier es selbst
const int buttonPin = 2;
bool wasPressed = false;
unsigned long pressedAt = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// Die Taste wurde gerade gedrückt: Zeitpunkt merken
}
if (!pressed && wasPressed) {
// Die Taste wurde gerade losgelassen: Ausgeben, wie lange sie gedrückt war, in Mikrosekunden
}
wasPressed = pressed;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Timing ohne Delay
Übe selbstständig: Arduino-Playground