Avee
26.08.2013, 10:09
Guten Morgen zusammen ...
Da ich hier neu bin möchte ich mich kurz vorstellen .
Ich habe eigentlich nicht das geringste mit Mikrocontrollern zu tun(auch wenn ich aus der Elektrotechnik komme) und bin eher aus Verzweiflung an das Thema gekommen.
Hintergrund meines Vorhabens ist die Notlage eines Sportvereins, da mein Sohn dort spielt habe ich mich der Umsetzung dieses Projekts angenommen.
Der Verein spielt Kanupolo , da diese Sportart nicht olympisch ist fehlt es an Geld. Da nun keine Wettkampfuhren mehr zur Verfügung stehen und eine Neuanschaffung je Gerät ca. 5000€ kostet habe ich mir gedacht das müsste doch auch einfacher gehen .
Nach diversen Recherchen im Internet bin ich auf die Arduino Plattform gestoßen, und habe mir dieses (Mega 2560) besorgt .
Nach diversen Versuchen mit LED 7-Segment-Anzeigen bin ich zu dem Ergebnis gekommen das meine Idee damit umsetzbar wäre.
Jetzt aber zu meinem Vorhaben .
Bitte sagt mir ob es überhaupt umsetzbar ist und ob es (da ich Anfänger bin ) mit Hilfe der Community (also euch ;) ) machbar ist .
Ich benötige eine "Stadionuhr" die frei einstellbar ist .
Hier mal meine ersten Gedankengänge :
26272
zu 1 (Zeichnung) Spielstandanzeige 2x 2stellige Anzeige manuelle einstellbar ( je Anzeige Taster +,Taster - und Taster Reset auf 00)
zu 2 (Zeichnung) Spielzeitanzeige 1x 4stellige Anzeige mit 10 bzw. 5 Min. Countdown(Taster Start/Pause und Taster Reset auf 10 Min. und Taster Reset auf 5 Min., Buzzer wenn 00)
zu 3 (Zeichnung) Shotclock 2x 2stellige Anzeige mit je 60 Sek. Countdown, beide Anzeigen synchron (Pause mit Spielzeitanzeige zusammen ,Taster für Reset auf 60 ,Countdown läuft wenn die Uhr läuft, Buzzer wenn 00)
zu 4 (Zeichnung) Halbzeitanzeige 1x 1stellige Anzeige ( je Anzeige Taster +, Taster - )
zu 5 (Zeichnung) 2x 3stellige Anzeige mit je 120 Sek. Countdown (Pause mit Spielzeitanzeige zusammen ,Taster für Reset auf 120 ,Countdown läuft wenn die Uhr läuft, Buzzer wenn 00)
LED-Ziffer-Segmente bestehen aus 12 cm LED-Streifen die über Transistoren angesteuert werden, ein erster Test ergab eine gute Sichtbarkeit auch bei Sonnenlicht
Angefangen habe ich mit einem fertigen Code für die Spielzeituhr um erst mal zu verstehen wie das Ganze gehen kann ....
/*
Arduino 4 digits 7 segments LED countdown timer with buzzerm from
electronicsblog.net. If You share/use this code elsewhere on the internet
please meantion this code source.
*/
// segment | Arduino board PIN number
#define G 22
#define F 23
#define A 24
#define B 25
#define E 26
#define D 27
#define C 28
#define DP 29
// Commonn cathodes control
#define GND1 52
#define GND2 53
#define GND3 50
#define GND4 51
// buttons
/*
Button_start - start/pause timer and in setup mode inreases minutes
and seconds values
Button_set - if timer is paused it resets timer to start. Long press
activates setup mode in which button is for going through minutes, seconds setup
and leaving setup mode.
*/
#define Button_start 48
#define Button_set 49
///
#define Buzzer 46
#define LED 47 // or relay insted
int i=0;
char run=0; // shows if timer is runnig
int b=0; //for buttons
int c=0;
int d=0; // for buzzer
char set_mode=0; // shows if timer is in setup mode
char alarm =0; // if "1" buzzer is on
//timer variables
// user setted and "turn on" values
int default_Sec=00;
int default_Min=10;
// current values
int Sec;
int Min;
//timer interrupt
ISR(TIMER1_OVF_vect) {
Sec--; // timer values decreases
TCNT1=0x0BDC;
}
// functions to display digits
void digit0 () {
// for 0 needed to turn ON F A B C D E segments, so:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);
};
void digit1 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};
void digit2 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};
void digit3 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};
void digit4 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit5 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit6 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit7 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};
void digit8 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit9 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
};
};
// showing 4 digits
// not only shows 4 digit number, but also there is option to turn on
//only selected digits and decimal point.
void showdigits (int number, char digit_on, char decimal_point)
{
digitalWrite(GND4, LOW);
// e.g. we have "1234"
showdigit(number/1000); // segments are set to display "1"
if (decimal_point&8) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&8) {
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
}
delay (1);
number = number%1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number/100); //// segments are set to display "2"
if (decimal_point&4) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&4) {
digitalWrite(GND2, HIGH); // second digit is on
} delay (1);// and so on....
number =number%100;
digitalWrite(GND2, LOW);
showdigit(number/10);
if (decimal_point&2) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&2) {
digitalWrite(GND3, HIGH);
}
delay (1);
number =number%10;
digitalWrite(GND3, LOW);
showdigit(number);
if (decimal_point&1) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&1) {
digitalWrite(GND4, HIGH);
}
delay (1);
};
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);
pinMode(Button_start, INPUT);
digitalWrite(Button_start, HIGH); //pull up resistor
pinMode(Button_set, INPUT);
digitalWrite(Button_set, HIGH); //pull up resistor
pinMode(Buzzer, OUTPUT);
pinMode(LED, OUTPUT);
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation 148 page (mode0);
TCNT1=0x0BDC;
TCCR1B = 0x00; // stop hardware timer
// loading default timer values
Sec = default_Sec ;
Min = default_Min ;
};
void loop ()
{
//////////// button_start//////////
if (!digitalRead(Button_start)&&!b) {
if (!set_mode) { if (run) {TCCR1B=0x00; run=0;} else {TCCR1B=0x04; run=1;}}
if (set_mode==1) {Min++;}
if (set_mode==2) {Sec++;}
if (set_mode) {b=25;} else b=100;
};
if (!digitalRead(Button_start)&&b==1) {
};
if (!b==0) b--;
//////////// button_set/////////
if (!digitalRead(Button_set)&&!c) {
if(!run&&!set_mode) {Min=default_Min; Sec=default_Sec;}
if (set_mode>0) set_mode++;
if (set_mode==3) {set_mode=0; default_Sec = Sec ;
default_Min = Min; }
c=100; };
if (!digitalRead(Button_set)&&c==1&&!run) {
set_mode=1;
c=100;
};
if (!c==0) c--;
////////////////////////////
if (set_mode) {if (Sec==60) {Sec=00;}
if (Min==100) {Min=0;} }
else {
if (Sec==-1) {Min--;Sec=59;}
}
//decimal point indication control
if (!set_mode) {
if (!(Sec%2)) { showdigits (Min*100+Sec,0x0F,0x04); } //0X00
else {showdigits (Min*100+Sec,0x0F,0x00); }; //0000
} else {
if (set_mode==1) {
showdigits (Min*100+Sec,0x0F,0x0C); //XX00
} else {
showdigits (Min*100+Sec,0x0F,0x03); } //00XX
}
if (run) { // to do while timer is running; e.g. control relay
digitalWrite(LED, HIGH);
} else digitalWrite(LED, LOW);
if ((Min==0)&&(Sec==0)&&run) {
run=0;
TCCR1B=0x00; //stop timer
//// to do after count down is finished e.g. start alarm as in this example
alarm=1;
d=500;
}
// Alarm part
if (alarm) { if (!(d%100)) { // sound 500/100= 5 times ;
tone(Buzzer, 440, 200); }
d--;
if (d==0) {alarm=0; Sec = default_Sec ;
Min = default_Min ; // After alarm is off, timer goes to start
}
}
};
Da ich hier neu bin möchte ich mich kurz vorstellen .
Ich habe eigentlich nicht das geringste mit Mikrocontrollern zu tun(auch wenn ich aus der Elektrotechnik komme) und bin eher aus Verzweiflung an das Thema gekommen.
Hintergrund meines Vorhabens ist die Notlage eines Sportvereins, da mein Sohn dort spielt habe ich mich der Umsetzung dieses Projekts angenommen.
Der Verein spielt Kanupolo , da diese Sportart nicht olympisch ist fehlt es an Geld. Da nun keine Wettkampfuhren mehr zur Verfügung stehen und eine Neuanschaffung je Gerät ca. 5000€ kostet habe ich mir gedacht das müsste doch auch einfacher gehen .
Nach diversen Recherchen im Internet bin ich auf die Arduino Plattform gestoßen, und habe mir dieses (Mega 2560) besorgt .
Nach diversen Versuchen mit LED 7-Segment-Anzeigen bin ich zu dem Ergebnis gekommen das meine Idee damit umsetzbar wäre.
Jetzt aber zu meinem Vorhaben .
Bitte sagt mir ob es überhaupt umsetzbar ist und ob es (da ich Anfänger bin ) mit Hilfe der Community (also euch ;) ) machbar ist .
Ich benötige eine "Stadionuhr" die frei einstellbar ist .
Hier mal meine ersten Gedankengänge :
26272
zu 1 (Zeichnung) Spielstandanzeige 2x 2stellige Anzeige manuelle einstellbar ( je Anzeige Taster +,Taster - und Taster Reset auf 00)
zu 2 (Zeichnung) Spielzeitanzeige 1x 4stellige Anzeige mit 10 bzw. 5 Min. Countdown(Taster Start/Pause und Taster Reset auf 10 Min. und Taster Reset auf 5 Min., Buzzer wenn 00)
zu 3 (Zeichnung) Shotclock 2x 2stellige Anzeige mit je 60 Sek. Countdown, beide Anzeigen synchron (Pause mit Spielzeitanzeige zusammen ,Taster für Reset auf 60 ,Countdown läuft wenn die Uhr läuft, Buzzer wenn 00)
zu 4 (Zeichnung) Halbzeitanzeige 1x 1stellige Anzeige ( je Anzeige Taster +, Taster - )
zu 5 (Zeichnung) 2x 3stellige Anzeige mit je 120 Sek. Countdown (Pause mit Spielzeitanzeige zusammen ,Taster für Reset auf 120 ,Countdown läuft wenn die Uhr läuft, Buzzer wenn 00)
LED-Ziffer-Segmente bestehen aus 12 cm LED-Streifen die über Transistoren angesteuert werden, ein erster Test ergab eine gute Sichtbarkeit auch bei Sonnenlicht
Angefangen habe ich mit einem fertigen Code für die Spielzeituhr um erst mal zu verstehen wie das Ganze gehen kann ....
/*
Arduino 4 digits 7 segments LED countdown timer with buzzerm from
electronicsblog.net. If You share/use this code elsewhere on the internet
please meantion this code source.
*/
// segment | Arduino board PIN number
#define G 22
#define F 23
#define A 24
#define B 25
#define E 26
#define D 27
#define C 28
#define DP 29
// Commonn cathodes control
#define GND1 52
#define GND2 53
#define GND3 50
#define GND4 51
// buttons
/*
Button_start - start/pause timer and in setup mode inreases minutes
and seconds values
Button_set - if timer is paused it resets timer to start. Long press
activates setup mode in which button is for going through minutes, seconds setup
and leaving setup mode.
*/
#define Button_start 48
#define Button_set 49
///
#define Buzzer 46
#define LED 47 // or relay insted
int i=0;
char run=0; // shows if timer is runnig
int b=0; //for buttons
int c=0;
int d=0; // for buzzer
char set_mode=0; // shows if timer is in setup mode
char alarm =0; // if "1" buzzer is on
//timer variables
// user setted and "turn on" values
int default_Sec=00;
int default_Min=10;
// current values
int Sec;
int Min;
//timer interrupt
ISR(TIMER1_OVF_vect) {
Sec--; // timer values decreases
TCNT1=0x0BDC;
}
// functions to display digits
void digit0 () {
// for 0 needed to turn ON F A B C D E segments, so:
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
//////////////////////// G segment should be turn OFF
digitalWrite(G, LOW);
};
void digit1 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};
void digit2 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};
void digit3 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, HIGH);
};
void digit4 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit5 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit6 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit7 () {
digitalWrite(A,HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
};
void digit8 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
void digit9 () {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
digitalWrite(D, HIGH);
digitalWrite(E, LOW);
digitalWrite(F, HIGH);
digitalWrite(G, HIGH);
};
//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
};
};
// showing 4 digits
// not only shows 4 digit number, but also there is option to turn on
//only selected digits and decimal point.
void showdigits (int number, char digit_on, char decimal_point)
{
digitalWrite(GND4, LOW);
// e.g. we have "1234"
showdigit(number/1000); // segments are set to display "1"
if (decimal_point&8) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&8) {
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
}
delay (1);
number = number%1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number/100); //// segments are set to display "2"
if (decimal_point&4) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&4) {
digitalWrite(GND2, HIGH); // second digit is on
} delay (1);// and so on....
number =number%100;
digitalWrite(GND2, LOW);
showdigit(number/10);
if (decimal_point&2) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&2) {
digitalWrite(GND3, HIGH);
}
delay (1);
number =number%10;
digitalWrite(GND3, LOW);
showdigit(number);
if (decimal_point&1) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&1) {
digitalWrite(GND4, HIGH);
}
delay (1);
};
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);
pinMode(Button_start, INPUT);
digitalWrite(Button_start, HIGH); //pull up resistor
pinMode(Button_set, INPUT);
digitalWrite(Button_set, HIGH); //pull up resistor
pinMode(Buzzer, OUTPUT);
pinMode(LED, OUTPUT);
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation 148 page (mode0);
TCNT1=0x0BDC;
TCCR1B = 0x00; // stop hardware timer
// loading default timer values
Sec = default_Sec ;
Min = default_Min ;
};
void loop ()
{
//////////// button_start//////////
if (!digitalRead(Button_start)&&!b) {
if (!set_mode) { if (run) {TCCR1B=0x00; run=0;} else {TCCR1B=0x04; run=1;}}
if (set_mode==1) {Min++;}
if (set_mode==2) {Sec++;}
if (set_mode) {b=25;} else b=100;
};
if (!digitalRead(Button_start)&&b==1) {
};
if (!b==0) b--;
//////////// button_set/////////
if (!digitalRead(Button_set)&&!c) {
if(!run&&!set_mode) {Min=default_Min; Sec=default_Sec;}
if (set_mode>0) set_mode++;
if (set_mode==3) {set_mode=0; default_Sec = Sec ;
default_Min = Min; }
c=100; };
if (!digitalRead(Button_set)&&c==1&&!run) {
set_mode=1;
c=100;
};
if (!c==0) c--;
////////////////////////////
if (set_mode) {if (Sec==60) {Sec=00;}
if (Min==100) {Min=0;} }
else {
if (Sec==-1) {Min--;Sec=59;}
}
//decimal point indication control
if (!set_mode) {
if (!(Sec%2)) { showdigits (Min*100+Sec,0x0F,0x04); } //0X00
else {showdigits (Min*100+Sec,0x0F,0x00); }; //0000
} else {
if (set_mode==1) {
showdigits (Min*100+Sec,0x0F,0x0C); //XX00
} else {
showdigits (Min*100+Sec,0x0F,0x03); } //00XX
}
if (run) { // to do while timer is running; e.g. control relay
digitalWrite(LED, HIGH);
} else digitalWrite(LED, LOW);
if ((Min==0)&&(Sec==0)&&run) {
run=0;
TCCR1B=0x00; //stop timer
//// to do after count down is finished e.g. start alarm as in this example
alarm=1;
d=500;
}
// Alarm part
if (alarm) { if (!(d%100)) { // sound 500/100= 5 times ;
tone(Buzzer, 440, 200); }
d--;
if (d==0) {alarm=0; Sec = default_Sec ;
Min = default_Min ; // After alarm is off, timer goes to start
}
}
};