Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

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

Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

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

Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

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.

Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer
Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

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

Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

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.
Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer
Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

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.

Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer

Productieproces

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