Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Benötigte Komponenten

Arduino UNO (oder kompatibel) 1
Taster (nicht rastend) mit Pull-Down-Widerstand (1 kΩ) 1
Widerstand 10 kΩ 1

Software

Projektbeschreibung

Für ein spaßiges Projekt benötigte ich einen Arduino-Chronometer, der startet, sobald ein Taster gedrückt wird, und stoppt, wenn er losgelassen wird. Keine komplexe Sache, aber der Code spart anderen vielleicht eine Stunde Entwicklungszeit.

Besonderheiten: Nutzung des EEPROM (nicht-flüchtiger Speicher) zum Speichern der letzten gemessenen Zeit und Interrupts für präzise Taster-Erkennung ohne Polling.

EEPROM

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Der EEPROM behält Daten auch nach Stromausfall oder Reset. Die Bibliothek #include <EEPROM.h> ist standardmäßig installiert. Ich nutze Adresse 0 (Float = 4 Bytes) – der Uno bietet 1024 Bytes (ATmega328).

Interrupts

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Interrupts unterbrechen den Hauptprogrammfluss, wenn ein Pin seinen Pegel ändert (z. B. LOW → HIGH). Keine zusätzliche Bibliothek nötig. Der Taster ist an Pin 2 (Interrupt-fähig) angeschlossen, mit Pull-Down-Widerstand auf LOW gehalten.

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Projekt-Code

Definitionen & Includes

#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0       // EEPROM-Adresse für Zeit-Speicherung
float starttime = 0;
float endtime = 0;
float resulttime = 0, oldresulttime = 0;

setup()

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; } // Warten auf Serial (nur bei nativem USB)
  Serial.println("Serial comms ready!");
  attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}

attachInterrupt(..., CHANGE) löst bei jeder Flanke aus: Drücken (LOW→HIGH) und Loslassen (HIGH→LOW).

loop()

void loop() {
  // Hier Platz für eigenen Code
  // In 'resulttime' (bzw. EEPROM) steht die letzte gemessene Zeit in ms
}

Interrupt-Service-Routine: refreshTime()

void refreshTime() {
  if (digitalRead(interruptPin)) { // Rising Edge: Taster gedrückt
    starttime = millis();
    Serial.print("Start time: "); Serial.println(starttime);
  } else { // Falling Edge: Taster losgelassen
    endtime = millis();
    resulttime = endtime - starttime;
    Serial.print("End time: "); Serial.println(endtime);
    Serial.print("Result time: "); Serial.println(resulttime);
    WhatsNewEeprom(); // In EEPROM speichern
  }
}

EEPROM-Prüfung & Speichern

void WhatsNewEeprom() {
  Serial.println("--- checking eeprom");
  EEPROM.get(eeAddress, oldresulttime);
  Serial.print("old: "); Serial.println(oldresulttime);
  Serial.print("new: "); Serial.println(resulttime);
  if (resulttime != oldresulttime) {
    EEPROM.put(eeAddress, resulttime);
    Serial.print("--- Ding! New time stored: "); Serial.println(resulttime);
  } else {
    Serial.println("No change, eeprom untouched");
  }
}

Entprellen des Tasters (Debouncing)

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Menschen sind für Arduino langsam: Ein Tastendruck erzeugt mehrfaches Prellen (HIGH-LOW-HIGH...). Lösungen:

  • Software: Wartezeit nach Flanke (z. B. 50 ms)
  • Hardware: Kondensator (z. B. 220 nF) parallel vom Sense-Pin nach GND – „frisst“ schnelle Spannungsschwankungen.
Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Ich nutze die Hardware-Lösung mit 220 nF.

Kompletter Code

// coded by Javier Muñoz 23/10/2017
// questions to javimusama@gmail.com
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0
float starttime = 0, endtime = 0, resulttime = 0, oldresulttime = 0;

void setup() {
  Serial.begin(9600);
  while (!Serial) { ; }
  Serial.println("Serial comms are ready sir!:.. bip bip");
  attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}

void loop() {
  // your stuff here
}

void refreshTime() {
  if (digitalRead(interruptPin)) {
    starttime = millis();
    Serial.print("Start time: "); Serial.println(starttime);
  } else {
    endtime = millis();
    resulttime = endtime - starttime;
    Serial.print("End time: "); Serial.println(endtime);
    Serial.print("Result time: "); Serial.println(resulttime);
    WhatsNewEeprom();
  }
}

void WhatsNewEeprom() {
  Serial.println("-----------checking eeprom");
  EEPROM.get(eeAddress, oldresulttime);
  Serial.print("oldresulttime"); Serial.println(oldresulttime);
  Serial.print("resulttime"); Serial.println(resulttime);
  if (resulttime != oldresulttime) {
    EEPROM.put(eeAddress, resulttime);
    Serial.print("-----Ding! New time recorded: "); Serial.println(resulttime);
  } else {
    Serial.println("No new time found, eeprom was not disturbed");
  }
}

Schaltplan

Einfache Taster-Schaltung mit Pull-Down-Widerstand (1 kΩ) an Pin 2.

Einfacher Arduino-Stoppuhr: Taster-gesteuerter Chronometer

Herstellungsprozess

  1. Stilvolle Wanduhr mit Adafruit 60-LED Neopixel-Ring & Arduino
  2. DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
  3. 20-kHz-Arduino-Oszilloskop mit Nokia 5110 LCD – Einfacher DIY-Bau
  4. Bluetooth-gesteuerter Arduino-Spybot bauen – Überwachungsroboter mit IP-Kamera
  5. FlickMote: Gestensteuerung per Ultraschall & IR für Smart Home (Arduino 101)
  6. DIY Arduino TV-B-Gone: Universelle TV-Aus-Fernbedienung
  7. Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
  8. Einfachen Hindernissensor mit Arduino bauen – IR-LED & Photodiode Tutorial
  9. Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
  10. Zuverlässigen Wecker mit DS1302 RTC und Arduino UNO bauen