Hi,
ich habe vor, mir eine Stoppuhr zu bauen, die beim Loslassen eines von 2 Tastern losläuft und bei Betätigung beider Taster wieder anhält.
Die Stoppuhr soll wie folgt aussehen: Stunden, Minuten, Sekunden, Millisekunden. 0:00:00:000
Das habe ich auf einen LCD Display auch binbekommen, doch auf mehreren 7 Segmentanzeigen über den max7219 leider nicht.
Ab den Sekunden läuft alles relativ genau, jedoch die Millisekunden springen nicht zum selben Zeitpunkt um, wie die Sekunden und laufen auch langsamer als die Sekunde.
Ich nehme an dass ich es schlecht programmiert habe, hab erst seit 2 Wochen einen Arduino.
Gibt es wie bei dem LCD eine Möglichkeit, dass Zahlen, die größer als 10 sind, automatisch auf dem nächsten Digit angezeigt werden? So könnte ich mir die Millisekunden z.b. auf Digit 7 anzeigen lassen und wenn diese größer als 10 oder 100 sind, wird die Zahl auf Digit 6 und 5 geschrieben.
Mich interessiert trotzdem noch, warum das nicht so funktioniert, wie es gemacht habe, hier der code:
Danke im Voraus.
#include <StopWatch.h>
#include "LedControl.h"
// Pin 12 to Data In, 11 to Clk, 10 to LOAD
LedControl lc=LedControl(12,11,10,1);
int fsec, f1sec, f2sec, f3sec, esecs, esecs1, emin1, emin2, estd1, emillis, emicros;
StopWatch sw_millis; // MILLIS (default)
StopWatch sw_secs(StopWatch::SECONDS);
StopWatch sw_micros(StopWatch::MICROS);
void setup()
{
// the zero refers to the MAX7219 number, it is zero for 1 chip
lc.shutdown(0,false);// turn off power saving, enables display
lc.setIntensity(0,10);// sets brightness (0~15 possible values)
lc.clearDisplay(0);// clear screen
fsec = 0;
f1sec = 0;
f2sec = 0;
f3sec = 0;
emicros = 0;
emillis =0;
esecs = 0;
esecs1 = 0;
emin1 = 0;
emin2 = 0;
estd1 = 0;
sw_micros.start();
sw_millis.start();
sw_secs.start();
}
void loop()
{
unsigned int emicros = sw_micros.elapsed();
unsigned int emillis = sw_millis.elapsed(); // Zwischenspeicher für verstrichene Millisekunden
unsigned int esecs = sw_secs.elapsed();
if (emicros >= 1000){
sw_micros.reset(); // resetet Microsekunden
sw_micros.start(); // Timer für Microsekunden starten
f1sec++; // Zähler für Millisekunden einer hochzählen
lc.setDigit(0,7,(byte)f1sec,false);
}
if (f1sec >=10){ // Wenn Millisekunden einer >= 10 dann...
f1sec = 0; // Millisekunden einer auf 0
f2sec++; // Millisekunden zehner +1
lc.setDigit(0,7,(byte)f1sec,false);
lc.setDigit(0,6,(byte)f2sec,false);
}
if (f2sec >=10){ // Wenn Millisekunden zehner >= 10 dann...
f2sec = 0; // Millisekunden zehner auf 0
f3sec++; // Millisekunden hunderter +1
lc.setDigit(0,6,(byte)f2sec,false);
lc.setDigit(0,5,(byte)f3sec,false);
}
if (f3sec >=10){ // Wenn Millisekunden hunderter >= 10 dann...
f3sec = 0; // Millisekunden hunderter auf 0
lc.setDigit(0,5,(byte)f3sec,false);
}
// Sekunden, Minuten, Stunden
if (esecs >= 10){ // Wenn Sekunden einer >= 10 dann..
sw_secs.reset(); // resetet Sekunden
sw_secs.start(); // startet Sekunden
esecs = 0; // Sekunden einer auf 0
esecs1 ++; // Sekunden zehner +1
}
if (esecs1 >=6){ // Wenn Sekunden zehner >= 6 dann...
esecs1 = 0; // Sekunden zehner auf 0
emin1 ++; // Minuten einer +1
}
if (emin1 >=10){ // Wenn Minuten einer >= 10 dann...
emin1 = 0; // Minuten einer auf 0
emin2 ++; // Minuten Zehner +1
}
if (emin2 >=6){ // Wenn Minuten zehner >= 6 dann...
emin2 = 0; // Minuten zehner auf 0
estd1 ++; // Stunden einer +1
}
// Anzeigen
lc.setDigit(0,4,(byte)esecs,false);
lc.setDigit(0,3,(byte)esecs1,false);
lc.setDigit(0,2,(byte)emin1,false);
lc.setDigit(0,1,(byte)emin2,false);
lc.setDigit(0,0,(byte)estd1,false);
}