Hallo zusammen,
mögt Ihr mir bitte Tipps geben, wie ich meine Sketch optimieren/verkleinern kann?
Der Sketch soll lediglich einen Zähler von 0-99 darstellen und auf 2x 7Segment Anzeigen via BCD ausgeben. Vor beiden 7Seg-Anzeigen befinden sich Decoder-IC's von BCD auf a-g.
Demnächst versuche ich noch einen einstellbaren Timer ohne delay einzubauen (Eieruhr).
Besten Dank
Max
neue Version
//BCD_7SEG Zaehler v1.4 (Max B. 26.09.2017)
//Zaehler +/-/reset, Ausgabe auf BCD 7-Segment 2 Digits
//min.=0; max.=99
//wenn +/- >=1s = +/- 1Hz Takt
//(UnoArduSim) #include <pgmspace.h>
//Ein-/Ausgaenge (const uint8_t / byte)
const uint8_t S0_CU = 2; bool plus = 0;
const uint8_t S1_CD = 3; bool minus = 0;
const uint8_t S2_CR = 4; bool reset = 0;
//------------BCD_Einer------------------BCD_Zehner----
const uint8_t BCD_1_1 = 5; const uint8_t BCD_1_10 = 9;
const uint8_t BCD_2_1 = 6; const uint8_t BCD_2_10 = 10;
const uint8_t BCD_4_1 = 7; const uint8_t BCD_4_10 = 11;
const uint8_t BCD_8_1 = 8; const uint8_t BCD_8_10 = 12;
const uint8_t alarm = 13;
//Variablen
bool s_x = 0; //Merker fuer Eingabe
bool m_reset = 0; //Merker fuer Reset
byte zaehler_dec = 0; //DEC Zaehler 0-100
word zaehler_bcd = 0; //BCD Zaehler 0-160(byte)
const uint16_t M_1s = 1000; //1 Sekunde
unsigned long j_ms = 0; //Zeitpunkt "jetzt"
unsigned long l_ms = 0; //Zeitpunkt "zuletzt"
unsigned long alarm_ms = 0; //Zeitpunkt "alarm"
void setup() //(OB100)
{//Start setup
Serial.begin(19200);
pinMode(S0_CU, INPUT); pinMode(S1_CD, INPUT); pinMode(S2_CR, INPUT);
pinMode(BCD_1_1, OUTPUT); pinMode(BCD_1_10, OUTPUT);
pinMode(BCD_2_1, OUTPUT); pinMode(BCD_2_10, OUTPUT);
pinMode(BCD_4_1, OUTPUT); pinMode(BCD_4_10, OUTPUT);
pinMode(BCD_8_1, OUTPUT); pinMode(BCD_8_10, OUTPUT);
pinMode(alarm, OUTPUT);
while (!Serial) {/*NICHTS*/} //auf serielle Uebertragung warten
Serial.println(F("\nEingabe Pin: 2=plus, 3=minus, 4=reset"));
Serial.println(F("Ausgabe Pin: BCD_1=5-8, BCD_10=9-12"));
Serial.println(F("\nBetriebsbereit..."));
DEC_zu_BCD();
}//Ende setup
void loop() //(OB1)
{//Start loop
//Eingaenge einlesen (erspart Platz)
plus = digitalRead(S0_CU);
minus = digitalRead(S1_CD);
reset = digitalRead(S2_CR);
j_ms = millis();
//Freigabe fuer weitere Eingabe, sobald keine Taste gedrueckt ist.
if (plus == 0 && minus == 0 && reset == 0)
{
s_x = 0;
l_ms = millis(); //1Hz zaehler blockieren
}
//Taster reset
if (reset == 1 && s_x == 0 && m_reset == 0)
{
Serial.println(F("\nReset..."));
zaehler_dec = 0;
zaehler_bcd = 0;
s_x = 1;
m_reset = 1;
Bit_lesen();
}
//Taster plus
if (plus == 1 && minus == 0 && reset == 0 && s_x == 0 && zaehler_dec < 99)
{
zaehler_dec += 1;
s_x = 1;
m_reset = 0;
DEC_zu_BCD();
Bit_lesen();
}
//Taster minus
if (minus == 1 && plus == 0 && reset == 0 && s_x == 0 && zaehler_dec > 0)
{
zaehler_dec -= 1;
s_x = 1;
m_reset = 0;
DEC_zu_BCD();
Bit_lesen();
}
//zaehlen mit 1Hz
if ((j_ms - l_ms >= M_1s) && ((plus == 1 && zaehler_dec < 99) || (minus == 1 && zaehler_dec > 0)))
{
s_x = 0; //weiteres zaehlen freigeben
l_ms = millis();
}
//Alarm ab 99 oder ab 0 wenn minus aktiv
if ((zaehler_dec >= 99 || (zaehler_dec < 1 && minus == 1)) && (j_ms - alarm_ms >= M_1s))
{
digitalWrite(alarm, digitalRead(alarm) ^ 1);
alarm_ms = millis();
}
else if ((zaehler_dec < 99 && minus == 0) || (zaehler_dec > 0 && minus == 1))
{
digitalWrite(alarm, LOW);
}
return;
}//Ende loop
void DEC_zu_BCD() //(FC1)
{//Start DEC_zu_BCD()
//|-BCD-----=--------DEC-------HEX----+-------MOD(10)-|
zaehler_bcd = (zaehler_dec / 10 * 16) + (zaehler_dec % 10);
Serial.print(F("Zaehlerstand = "));
Serial.print(zaehler_dec);
Serial.print(F(" | BCD = "));
Serial.println(zaehler_bcd, BIN);
}//Ende DEC_zu_BCD()
void Bit_lesen() //(FC2)
{//Start Bit_lesen()
//erste 4Bit "Einer"
digitalWrite(BCD_1_1, bitRead(zaehler_bcd, 0));
digitalWrite(BCD_2_1, bitRead(zaehler_bcd, 1));
digitalWrite(BCD_4_1, bitRead(zaehler_bcd, 2));
digitalWrite(BCD_8_1, bitRead(zaehler_bcd, 3));
//letzte 4Bit "Zehner"
digitalWrite(BCD_1_10, bitRead(zaehler_bcd, 4));
digitalWrite(BCD_2_10, bitRead(zaehler_bcd, 5));
digitalWrite(BCD_4_10, bitRead(zaehler_bcd, 6));
digitalWrite(BCD_8_10, bitRead(zaehler_bcd, 7));
}//Ende Bit_lesen()