User manual

67 68
8.5 Stoppuhr mit Reedrelais Auslösung
Diese Variante der Stoppuhr lässt sich mit einem Reedrelais anhalten. Dazu wird der Magnet über das Reed-Re-
lais geführt. Mit so einer Anordnung kann man auch Zeiten gut stoppen, wenn ein Gegenstand vorbeikommt.
Idealerweise wird in der Praxis dann mit zwei Reed-Relais gearbeitet.
Hier kann man sich einmal unterschiedliche Möglichkeiten der Zeitnahme ausdenken.
Das Programm ist identisch zu dem vorherigen, denn am Algorithmus ändert sich nichts.
+
-
9V
1A
Reed Relais
C 7-Segment-LED
SCL
SDA
SCL
SDA
+9V
Adr:40,44,48,4C
PCF8574 T
+9V
C 7-Segment-LED
SCL
SDA
SCL
SDA
+9V
Adr:40,44,48,4C
PCF8574 T
+9V
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
C
// DE_23 7segment Anzeige Stoppuhr
#include <Wire.h>
..... wie vorher ...
// Code neu:
#dene PORTSTART 2 // PD2 fuer Start
#dene PORTSTOP 3 // PD3 fuer Stop
void setup() {
Wire.begin(); // I2C initialisieren
pinMode(PORTSTART,INPUT_PULLUP); // PD2 Pullup
pinMode(PORTSTOP,INPUT_PULLUP); // PD3 Pullup
}
void loop() { // Schleifenstart
char buffer[10]; // BUffer fuer Umrechnung nach ASCII
static int startag = 0; // 0=stop 1=Uhrlaeuft
static int stopzeit = 0; // der Zeitzaehler
sprintf(buffer,“%04d“,stopzeit); // Umrechnen in ASCII
// Reed Relais abfragen, kann prellen
if (digitalRead(PORTSTART)==LOW) { // Low->High
delay(20); // 20ms warten bis stabil
// auch Reed Relais koennen prellen
while (digitalRead(PORTSTART)==LOW) { // und wieder High->Low
// warten bis losgelassen !
}
startag = 1; // dann beginnt der Zaehlvorgang
stopzeit = 0; // Bei 0 starten, also gleichzeitig Reset
delay(20); // auch nach dem loslassen nochmal warten
} // Abfrage Start Ende
// Achtung TASTE muss laenger gehalten werden ! > 1/10 sec
if (digitalRead(PORTSTOP)==LOW) { // Stop auslösen
delay(20); // 20ms warten bis stabil
// auch Reed Relais koennen prellen
while (digitalRead(PORTSTART)==LOW) { // und High-Low warten
// warten bis losgelassen !
}
startag = 0;
delay(20); // auch nach dem loslassen nochmal warten
} // Ende Abfrage Stop der Zeitnahme
if ((startag == 1) && (stopzeit < 9999)) { // Zaehlt bis 9999
stopzeit++; // wenn startag=1 dann erhoehren
delay(100); // eigentlich <100 100ms !! MUSS GENAU SEIN
// mit CPU timer genauer zu realisieren
} // Ende Abfrage startag
// Counter ausgeben
display_seg1x(i2cseg7x2bmsb1,buffer[0]); // msb zeichen/ LINKE Anzeige
display_seg1x(i2cseg7x2blsb1,buffer[1]); // ..
display_seg1xbin(i2cseg7x2amsb1,get_7seg(buffer[2]) & 0x7f); // Mit PUNKT
display_seg1x(i2cseg7x2alsb1,buffer[3]); // lsb zeichen
} // Ende Schleife
Was passiert? Die Reedrelais star-
tet den Zählvorgang. Dazu muss
man einen Magneten annähern und
wieder entfernen (erst dann wird
hochgezählt). Gleichzeitig wird der
Zähler auf 0000 gesetzt.
Die untere Taste hält den Zähler
wieder an. Dabei wird der Zähler-
stand auf der Anzeige dargestellt
und zählt im Sekundentakt hoch,
wenn der Zähler gestartet ist.
Bei 9999 wird automatisch ange-
halten.