Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer
Onderdelen en benodigdheden
| Arduino UNO | Aantal: 1 |
| Drukknop (niet vasthoudend) | Aantal: 1 |
| Weerstand 10k Ω | Aantal: 1 |
Apps en online diensten
| Arduino IDE |
Over dit project
Ik was bezig met een leuk project en had een Arduino-chronometer nodig die start/stop werkt met één drukknop. Het is niet complex, maar de code kan anderen veel tijd besparen.
Ik heb je waarschijnlijk 1 uur coderen bespaard.
EEPROM

EEPROM is het niet-vlatile geheugen van de Arduino: data blijft bewaard na stroomuitval of reset. Ik gebruik de standaard #include <EEPROM.h> bibliotheek.
Interrupts

Interrupts laten de Arduino onderbreken wat hij doet en direct een specifieke functie (ISR) uitvoeren wanneer een pin van laag naar hoog (of omgekeerd) gaat. Geen extra bibliotheek nodig.


De projectcode
Definities en includes
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0 // EEPROM-adres (float = 4 bytes)
float starttime = 0;
float endtime = 0;
float resulttime = 0, oldresulttime = 0;
We kiezen pin 2 voor de knop (ondersteund interrupt). EEPROM-adres 0 gekozen voor overzichtelijkheid (Arduino Uno heeft 1024 bytes).
setup()
void setup() {
Serial.begin(9600);
while (!Serial) { ; } // Wacht op seriële poort (alleen native USB)
Serial.println("Seriële communicatie gereed!");
attachInterrupt(digitalPinToInterrupt(interruptPin), refreshTime, CHANGE);
}
attachInterrupt activeert refreshTime bij elke verandering op de pin (zowel LOW→HIGH als HIGH→LOW). De pulldown-weerstand (1kΩ) houdt de pin standaard LOW.
loop()
void loop() {
// Je eigen code hier!
}
De lus is leeg – alle logica zit in de interrupt-functie.
Overige functies
void refreshTime() {
if (digitalRead(interruptPin)) { // LOW → HIGH (knop ingedrukt)
starttime = millis();
Serial.print("Starttijd: ");
Serial.println(starttime);
} else { // HIGH → LOW (knop losgelaten)
endtime = millis();
resulttime = endtime - starttime;
Serial.print("Eindtijd: ");
Serial.println(endtime);
Serial.print("Resultaattijd: ");
Serial.println(resulttime);
WhatsNewEeprom(); // Slaat op in EEPROM
}
}
De interrupt triggert twee keer per knopdruk: bij indrukken (start) en loslaten (stop). millis() geeft de tijd in milliseconden. Het verschil is de gemeten duur.
void WhatsNewEeprom() {
Serial.println("-----------EEPROM controleren");
EEPROM.get(eeAddress, oldresulttime);
Serial.print("Oude tijd: "); Serial.println(oldresulttime);
Serial.print("Nieuwe tijd: "); Serial.println(resulttime);
if (resulttime != oldresulttime) {
EEPROM.put(eeAddress, resulttime);
Serial.print("-----Ding! Nieuwe tijd opgeslagen: "); Serial.println(resulttime);
} else {
Serial.println("Geen nieuwe tijd, EEPROM ongewijzigd");
}
}
Vergelijkt de nieuwe met de oude waarde in EEPROM. Alleen bij verschil wordt er overschreven (bespaart schrijfcycli).
Extra: Debouncing van de knop

Menselijke knopdrukken zijn "langzaam" voor de Arduino; het signaal "bounct" (snelle HIGH/LOW wisselingen) voordat het stabiel wordt. Dit kan via software of hardware opgelost worden.
- Software debounce: Wacht even na eerste flank, lees opnieuw.
- Hardware debounce (mijn keuze): Een condensator (220nF) parallel over de knop (van sense-pin naar GND). De condensator "slokt" snelle spanningswisselingen op.


Code
Arduino Chronometer (volledige sketch)
// Gecodeerd door Javier Muñoz 23/10/2017
// Vragen naar javimusama@gmail.com
#include <EEPROM.h>
#define interruptPin 2
#define eeAddress 0
float starttime = 0;
float endtime = 0;
float 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() {
// Jouw code hier
// (EEPROM opgeslagen) laatste gemeten tijd in ms: "float resulttime"
}
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 in eeprom: "); Serial.println(resulttime);
} else {
Serial.println("No new time found, eeprom was not disturbed");
}
}
Schema
Simpele aansluiting van een drukknop met een pulldown-weerstand.

Productieproces
- Een stijlvolle wandklok bouwen met Adafruit 60-LED Neopixel Ring & Arduino
- DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
- Bouw een 20 kHz Arduino Oscilloscoop op een Nokia 5110 LCD – Eenvoudige DIY Handleiding
- Bluetooth-gecontroleerde Arduino Spybot bouwen
- FlickMote: Gebarengecontroleerde IR-afstandsbediening voor Slimme Huizen
- DIY Arduino TV-B-Gone: Universele TV-uit-schakelaar
- Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Find Me: Slimme Item Locator met Arduino en Bluetooth
- Geoptimaliseerde Voedingsoplossingen voor Arduino Projecten
- Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO