/* Současné ovladače 5587904 5587760 5587952 5587724 5587916 5587772 1377728 1377584 1377776 1377548 1377740 1377596 1377788 1377539 */ #include #include int stav = 0; // 1=nastaveni, 2=readytostart, 3=polocas1, 4=pauza, 5=polocas2, 6=konec int minuta, delka = 45, vynulovani; boolean debug = 0, i; int domaci; int hoste; Tasker tasker; RCSwitch mySwitch = RCSwitch(); void change() { if (stav > 1) { vynulovani++; if (vynulovani >= 30) { vynulovani = 0; stav = 1; tasker.cancel(polocas); tasker.cancel(blinking, 0); tasker.cancel(blinking, delka); tasker.cancel(blinking, 2 * delka); minuta = 0; } } else { if (delka == 45) { delka = 35; displayminutes(delka); } else if (delka == 35) { delka = 30; displayminutes(delka); } else if (delka == 30) { delka = 45; displayminutes(delka); } delay(500); } } void enter() { if (stav == 1) { stav = 2; // Ready to start tasker.setInterval(blinking, 500, 0); blinking(0); delay(3000); } else if (stav == 2) { tasker.cancel(blinking, 0); stav = 3; // Poločas 1 displayminutes(0); tasker.setInterval(polocas, 60000); } else if (stav == 4) { tasker.cancel(blinking, minuta); stav = 5; //Poločas 2 displayminutes(minuta); tasker.setInterval(polocas, 60000); } } void minutym() { if ((stav == 3 && minuta > 0) || (stav == 5 && minuta > delka)) { minuta--; displayminutes(minuta); delay(500); } } void minutyp() { if ((stav == 3 && minuta < delka) || (stav == 5 && minuta < 2 * delka)) { minuta++; displayminutes(minuta); delay(500); } } void polocas() { minuta++; displayminutes(minuta); if (minuta == delka && stav == 3) { stav = 4; tasker.cancel(polocas); tasker.setInterval(blinking, 500, minuta); } else if (minuta == 2 * delka && stav == 5) { stav = 6; tasker.cancel(polocas); tasker.setInterval(blinking, 500, minuta); } } void setup() { if (debug) { Serial.begin(9600); } mySwitch.enableReceive(0); // Receiver on interrupt 0 => that is pin #2 pinMode(1, 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); pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); pinMode(A4, OUTPUT); pinMode(A5, OUTPUT); //Test zobrazení domaci = 18; hoste = 18; displayscore(); displayminutes(88); delay(60000); //88 na začátku //tasker.setInterval(displayminutes, 500); domaci = 0; hoste = 0; displayscore(); displayminutes(delka); stav = 1; } void loop() { tasker.loop(); if (mySwitch.available()) { long value = mySwitch.getReceivedValue(); if (value == 5587916 || value == 1377740) { change(); } else if (value == 5587772 || value == 1377596) { enter(); } else if (value == 5587952 || value == 1377776) { minutym(); } else if (value == 5587724 || value == 1377548) { minutyp(); } else if (value == 5587904 || value == 1377728) { domaci += 1; if (domaci == 20) { domaci = 0; } displayscore(); delay(1000); } else if (value == 5587760 || value == 1377584) { hoste += 1; if (hoste == 20) { hoste = 0; } displayscore(); delay(1000); } mySwitch.resetAvailable(); } } void blinking(int dig) { if (!i) { digitalWrite(6, 1); digitalWrite(A0, 1); digitalWrite(13, 1); digitalWrite(A1, 1); digitalWrite(A5, 1); digitalWrite(A3, 1); digitalWrite(A2, 1); digitalWrite(A4, 1); if (debug) { Serial.println("blank"); } i = 1; } else { displayminutes(dig); i = 0; } } void displayscore() { boolean domaci_b[4], hoste_b[4]; int_to_bin_digit(domaci % 10, domaci_b); int_to_bin_digit(hoste % 10, hoste_b); digitalWrite(5, domaci_b[3]); digitalWrite(3, domaci_b[2]); digitalWrite(1, domaci_b[1]); digitalWrite(4, domaci_b[0]); digitalWrite(7, domaci / 10); digitalWrite(12, hoste_b[3]); digitalWrite(10, hoste_b[2]); digitalWrite(9, hoste_b[1]); digitalWrite(11, hoste_b[0]); digitalWrite(8, hoste / 10); } void displayminutes(int dig) { boolean minuta1[4], minuta2[4]; int_to_bin_digit(dig / 10, minuta1); int_to_bin_digit(dig % 10, minuta2); digitalWrite(A5, minuta1[3]); digitalWrite(A3, minuta1[2]); digitalWrite(A2, minuta1[1]); digitalWrite(A4, minuta1[0]); digitalWrite(6, minuta2[3]); digitalWrite(A0, minuta2[2]); digitalWrite(13, minuta2[1]); digitalWrite(A1, minuta2[0]); } void int_to_bin_digit(unsigned int in, boolean* out) { /* assert: count <= sizeof(int)*CHAR_BIT */ unsigned int mask = 1U << 3; int i; for (i = 0; i < 4; i++) { out[i] = (in & mask) ? 1 : 0; in <<= 1; } }