User manual

65 66
8.4 Stoppuhr mit 7-Segment-Anzeigen
Die 7-Segment-Anzeige als Stoppuhr mit zwei Tastern Start/Stopp und einer Auösung von 1/10 Sec = 100ms.
Bisher haben wir immer Tastendrücke oder die Tastendruckdauer gezählt. Die klassische Stoppuhr ist aber auch
nicht weiter kompliziert. Eine Taste löst den Zählvorgang aus, die andere hält ihn wieder an. Dazu gibt es eine
weitere statische Variable „startag“ genannt. Wenn diese auf 1 ist, wird gezählt, sonst nicht. Eine Taste setzt
den Wert auf 1, die andere auf 0. Entprellen müsste man eigentlich in dem Beispiel nicht, es ist aber eine gute
Angewohnheit, Tasten immer zu entprellen, wenn diese eine andere Funktion übernehmen sollen. Die Zeitnah-
me ist so noch nicht genau, denn unser „delay(100)“ bestimmt die 100ms zwar recht genau, aber die weiteren
Befehle werden nicht berücksichtigt. Man müsste den delay etwas kleiner als 100ms angeben, dann ist
die Uhr aber ggf. schon zu schnell. Es gibt aber noch eine elegantere Möglichkeit,
Zeitabschnitte zu bestimmen, doch dazu später mehr.
+
-
9V
1A
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 obere Tas-
te startet den Zählvorgang, die
untere Taste hält ihn wieder an.
Dabei wird der Zählerstand auf
der Anzeige dargestellt und zählt
im Sekundentakt hoch, wenn der
Zähler gestartet ist.
Die obere Taste setzt auch den
Zähler wieder auf 0 zurück. Bei
9999 wird automatisch angehal-
ten.