Hallo liebes Forum,
Ich habe eine Stoppuhr programmiert welche mit einer 7 Segment
Anzeige funktioniert. Das Datenblatt der Anzeige findet ihr in den ersten Zeilen des Programms.
Verwendet habe ich einen Arduino Nano aus China aber der Fehler tritt in ähnlicher Weise auch auf meinem Originalen Arduino UNO auf. Und zwar ich kann ganz Normal stoppen. Wenn ich den einen Taster drücke, startet sich und gibt mir Feedback. Und wenn ich dann den anderen Taster drücke stoppt sich und gibt mir auch Feedback. Dann zeigt sie mir auch die richtige Zeit an, aber nur für etwa eine Sekunde, Geht nichts mehr auser de Doppelpunkt der Dauerhaft eingeschalten ist und vieleicht noch von der letzten Ziffer ein paar Striche. Wenn ich den Arduino nicht resete geht gar nichts mehr. an sich wäre es nicht schlimm wenn er sich aufhängt was ich vermute, aber in einer Sekunde kann ich die Zeit nicht wirklich ablesen. Ich habe gedacht dass es ihm vielleicht zu schnell geht, daraufhin habe ich die Wartezeit zwischen den Anzeigen verändert(gespeichert in sw) aber er hängt sich nach DERSELBEN ANZAHL DER DURCHLÄUFEN wieder auf. Das konnte ich herausfinden wie ich eine Serielle Rückmeldung an den Computer eingerichtet habe. Es waren genau 1434 Durchläufe. Ach ja wenn die Serielle Verbindung besteht, hält der Arduino nicht so lange durch als wenn ohne.
//Stoppuhr fuer eine 7 Segment Anzeige
//Link zur 7 Seg. Anzeige: Datenblatt: https://cdn-shop.adafruit.com/datasheets/1264datasheet.pdf
// Amazon Link: https://www.amazon.de/Adafruit-7-Segment-Uhranzeige-rot-Extra-Zeichenh%C3%B6he/dp/B00T31OKY4/ref=mp_s_a_1_33?__mk_de_DE=%C3%85M%C3%85Z%C3%95%C3%91&qid=1537815361&sr=8-33&pi=AC_SX236_SY340_FMwebp_QL65&keywords=7+segment+anzeige&dpPl=1&dpID=51JmMCHtsXL&ref=plSrch
// pin Verbindungen
// Polarität PIN BEZEICHNUNG ARDUINO PIN
/* A = 7
* B = 8
* C = 9
* D = 3
* E = 5
* F = 6
* G = 4
* Dezimalpunkt = 2
* Doppelpunkt = 13
* COM 1 = 1
* COM 2, DIG 1 = 12
* COM 3, DIG 2 = 11
* COM 4, DIG 3 = 10
* COM 5, DIG 4 = 0
*
*
*
*
*/
/* Folgende Pins müssen auf HIGH geschalten werden, damit eine Zahl erscheint
eins[2] = 9,3;
zwei[5] = 8,9,4,6,5;
drei[5] = 8,9,4,3,5;
vier[4] = 7,9,4,3;
funf[5] = 8,7,4,3,5;
sechs[6] = 8,7,4,3,5,6;
sieben[3] = 8,9,3;
acht[7] = 3,4,5,6,7,8,9;
neun[6] = 3,4,5,7,8,9;
nul[6] = 3,5,6,7,8,9;
*/
// Damit die Stoppuhr nicht 2mal startet überprüft
//sie den Wert und setzt ihn dann in die andere Bedienung
int i = 0;
// Diese Werte werden zum Speichern der Zeiten benötigt
unsigned long start, ende, ergebnis;
// In diesen Werten werden die Ziffern fuer die 7 Seg Anzeige gespeichert
// Also aus 13 Sekunden werden dann 1zs und 3s
int zs, s, ds, cs;
// DAs ist die Pause für die Anzeige bevor die nächste Ziffer geladen wird
int sw = 7;
// a ist die Definierung welche Anzeige Ziffer der 7 Seg Anzeige geladen wird
int a = 1;
//Mir ist dann eingefallen dass ich vielleicht den Loopteil bei jedem Durchgang
// Einbinden sollte und hab dann w wingeführt
// wenn w 1 ist soll im Loopteil die Stoppuhr ausgefürt werden wenn aber 0 soll wieder der
// Verwaltungsteil aufgerufen werden
int w = 1;
void setup() {
pinMode(A0, INPUT);
pinMode(A2, INPUT);
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
digitalWrite(2, HIGH);
digitalWrite(1, LOW);
}
void loop() {
if (w == 0){ // Überprüfung ob Stoppuhr oder Anzeige
verwaltung();
}
if ((analogRead(A0) > 300) && (i == 0)){
start = millis(); //Startet Stoppuhr
digitalWrite(0, LOW); // Gibt Benutzer ein Zeichen dass die Stoppuhr gestartet ist
digitalWrite(1, LOW);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
i = 1;
}
if ((analogRead(A2) > 300) && (i == 1)){
ende = millis(); // stoppt die Stoppuhr
digitalWrite(0, LOW); // Gibt Benutzer ein Zeichen, dass die Stoppuhr fertig ist
digitalWrite(1, LOW);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, HIGH);
delay(100);
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
digitalWrite(13, LOW);
i = 0;
auswertung(); //Ergebnis berechnen
}
}
void auswertung(){
ergebnis = ende - start;
zs = ergebnis / 10000;
if (zs > 9){ //Wenn länger als 100 Sekunden gestoppt wird, fängt sie von 0 an
zs = 0;
}
s = ergebnis / 1000 - (zs * 10);
ds = ergebnis / 100 - (s * 10);
cs = ergebnis - (s * 10);
digitalWrite(1, LOW);
digitalWrite(13, HIGH);
w = 0;
verwaltung();
}
void verwaltung(){// Überprüfung welche Ziffer angezeit werden soll
//Serial.println("DA");
if (a == 1){
anzeige1();
}
if (a == 2){
anzeige2();
}
if (a == 3){
anzeige3();
}
if (a == 4){
anzeige4();
}
}
void anzeige1(){// dementsprechender Pin wird auf 0 gesetzt und dann wird zur ZAhlenbildung weitergeleitet
//Ziffer 1
Serial.println("1");
a = 2;
digitalWrite(12, LOW);
if (zs == 1){
fall1();
}
if (zs == 2){
fall2();
}
if (zs == 3){
fall3();
}
if (zs == 4){
fall4();
}
if (zs == 5){
fall5();
}
if (zs == 6){
fall6();
}
if (zs == 7){
fall7();
}
if (zs == 8){
fall8();
}
if (zs == 9){
fall9();
}
if (zs == 0){
fall10();
}
}
void anzeige2(){
//Ziffer 2
Serial.println("2");
a = 3;
digitalWrite(11, LOW);
if (s == 1){
fall1();
}
if (s == 2){
fall2();
}
if (s == 3){
fall3();
}
if (s == 4){
fall4();
}
if (s == 5){
fall5();
}
if (s == 6){
fall6();
}
if (s == 7){
fall7();
}
if (s == 8){
fall8();
}
if (s == 9){
fall9();
}
if (s == 0){
fall10();
}
}
void anzeige3(){
//Ziffer3
Serial.println("3");
a = 4;
digitalWrite(10, LOW);
if (ds == 1){
fall1();
}
if (ds == 2){
fall2();
}
if (ds == 3){
fall3();
}
if (ds == 4){
fall4();
}
if (ds == 5){
fall5();
}
if (ds == 6){
fall6();
}
if (ds == 7){
fall7();
}
if (ds == 8){
fall8();
}
if (ds == 9){
fall9();
}
if (ds == 0){
fall10();
}
}
void anzeige4(){
//Ziffer4
Serial.println("4");
a = 1;
digitalWrite(0, LOW);
if ((cs > 9) && (cs < 20)){
fall1();
}
if ((cs > 19) && (cs < 30)){
fall2();
}
if ((cs > 29) && (cs < 40)){
fall3();
}
if ((cs > 39) && (cs < 50)){
fall4();
}
if ((cs > 49) && (cs < 60)){
fall5();
}
if ((cs > 59) && (cs < 70)){
fall6();
}
if ((cs > 69) && (cs < 80)){
fall7();
}
if ((cs > 79) && (cs < 90)){
fall8();
}
if ((cs > 89) && (cs < 100)){
fall9();
}
if ((cs > -1) && (cs < 10)){
fall10();
}
}
Teil 1 zu Ende da sonst zu lang