// 6x nezavisly casovac se 3 typy ukonceni odpoctu. // // Detailni zadani: https://www.arduino-forum.cz/viewtopic.php?f=30&t=793#p3325 // 22.4.2018 // =============================================================================== // video: https://youtu.be/Bv6RzxyNSfc // https://youtu.be/jMzIZFck-tc // =============================================================================== // Prirazeni pinu // Nuly na zacatku kazdeho seznamu jsou jen kvuli jednodussimu prirazeni indexu a oznaceni casovacu. (index 0 nebude pouzity) const byte pin_vstup[7] = { 0, 2, 4, 6, 8, 10, A0}; // Seznam vstupnich pinu. const byte pin_vystup[7] = { 0, 3, 5, 7, 9, 11, A1}; // Seznam vystupnich pinu. // 0, 4m30s, 30s, 10m35s, 30s, 5m25s, 30s const unsigned int cas[7] = { 0, 2700, 300, 6350, 300, 3250, 300}; // Casy jednotlivych casovacu v desetinach sekundy. //----------------------- // kratsi casy jen pro testy: 0, 5s, 10s, 15s, 5s, 10s, 5s //const unsigned int cas[7] = { 0, 50, 100, 150, 50, 100, 50 }; // Casy jednotlivych casovacu v desetinach sekundy pro TESTY. //----------------------- unsigned int aktualni_odpocet[7]; // Kazdy casovac si tu bude ukladat pocet smycek do cile. // Kdyz je tato promenna 0, znamena to, ze prislusne pocitadlo dobehlo do konce. // Kdyz je tato promenna 1, znamena to pro casovace 1, 2 a 3 ze je vyckavacim stavu s vystupem v LOW. // pro casovace 4, 5 a 6 ze prave probiha zaverecny sekundovy impulz. // Jakekoliv jine cislo udava pocet desetin sekundy do konce odpoctu. byte sekundova_pauza[7]; // Odpocet pro zaverecne sekundove impulzy v casovacich 4, 5 a 6. // Cislo 0 znamena, ze je sekundovy impulz neaktivni. // Jakekoliv jine cislo (10 az 1) udava pocet desetin sekundy do konce zaverecneho LOW impulzu. // (Delka se da zmenit nize v kodu v prikazech "sekundova_pauza[_] = 10;") boolean aktual_vstup[7]; // Aktualni stav vstupniho pinu. boolean predchozi_stav[7]; // Predchozi stav vstupniho pinu (pouzito kvuli detekci sestupne a nabezne hrany). byte i; // Pomocna promenna pro ruzne smycky. //************************************************************************************************ void setup(void) { // Nastaveni smeru pinu pro vsechny casovace 1 az 6. for (i = 1; i < 7 ; i++) { pinMode(pin_vstup[i], INPUT_PULLUP); // Vstupy s pull-upy pridrzuji nezapojene piny v HIGH. pinMode(pin_vystup[i], OUTPUT); // Vystupni piny nastavit na vystup. digitalWrite(pin_vystup[i],HIGH); // Na zacatku jsou vsechny vystupni piny v HIGH. } } //************************************************************************************************ // Kazdy pruchod hlavni smyckou trva desetinu sekundy. Od toho se odviji odpocet vsech aktivnich casovacu. void loop(void) { //************************************************************************************************ // Stav vsech vstupnich pinu se zjisti hned na zacatku hlavni smycky for (i = 1; i < 7 ; i++) { aktual_vstup[i] = digitalRead(pin_vstup[i]); } //************************************************************************************************ // Casovace 1 az 3 //------------------- for (i = 1; i < 4 ; i++) { if (predchozi_stav[i] == HIGH and aktual_vstup[i] == LOW) // Prave doslo k sestupne hrane na vstupu casovacu 1 az 3 (zmena z HIGH do LOW). { delay(50); // Odruseni zakmitu vstupnich pinu. digitalWrite (pin_vystup[i],HIGH); // Vystup pro casovac 1 az 3 zustava v HIGH. aktualni_odpocet[i] = cas[i]; // V okamziku sestupne hrany se nastavi aktualni odpocet na konstantu z pole cas[]. predchozi_stav[i] = LOW; // Znacka aby se pri pristi smycce uz tento cas nenastavoval. } if (aktualni_odpocet[i] > 1) // Kdyz nektery casovac (1 az 3) bezi ... { aktualni_odpocet[i] --; // ... tak se kazdou desetinu sekundy odecita jedno cislo. } if (aktualni_odpocet[i] == 1) // Kdyz nektery casovac prave dobiha do posledniho cyklu ... { digitalWrite (pin_vystup[i],LOW); // ... tak se uz nic neodecte (zustava nastavene cislo 1), ale prislusny vystup se prepne do LOW } if (predchozi_stav[i] == LOW and aktual_vstup[i] == HIGH) // Prave doslo k prepnuti stavu vstupu z LOW do HIGH ... to znamena STOP casovace. { delay(50); // Odruseni zakmitu vstupniho pinu. digitalWrite (pin_vystup[i],HIGH); // Vystup se nastavi na HIGH. aktualni_odpocet[i] = 0; // Aktualni odpocet se nastavi na stav "STOP" (hodnota 0). predchozi_stav[i] = HIGH; // A znacka, ze pristi sestupna hrana na vstupnim pinu bude slouzit ke spusteni casovace. } } //************************************************************************************************ // Casovace 4 a 5 //------------------- for (i = 4; i < 6 ; i++) { if (predchozi_stav[i] == HIGH and aktual_vstup[i] == LOW) // Prave doslo k sestupne hrane na vstupu 4. nebo 5. casovace (zmena z HIGH do LOW). { delay(50); // Odruseni zakmitu vstupnich pinu. digitalWrite (pin_vystup[i],HIGH); // Vystup pro casovac 4 a 5 zustava v HIGH. aktualni_odpocet[i] = cas[i]; // V okamziku nabezne hrany se nastavi aktualni odpocet na konstantu z pole cas[]. predchozi_stav[i] = LOW; // Znacka aby se pri pristi smycce uz tento cas nenastavoval. } if (aktualni_odpocet[i] > 1) // Kdyz nektery casovac (4 nebo 5) bezi ... { aktualni_odpocet[i] --; // ... tak se kazdou desetinu sekundy odecita jedno cislo. } if (aktualni_odpocet[i] == 1 and sekundova_pauza[i] == 0) // Kdyz nektery casovac dobehl temer do cile, ale jeste neni aktivovany zaverecny sekundovy odpocet ... { sekundova_pauza[i] = 10; // ... aktivuje se sekundovy odpocet pro zaverecny LOW impulz ( 10 * 0.1 sekundy). digitalWrite (pin_vystup[i],LOW); // A prislusny vystup se prepne do LOW. } if (sekundova_pauza[i] > 0 and aktualni_odpocet[i] == 1) // Kdyz bezi zaverecny odpocet sekundove pauzy ... { sekundova_pauza[i] --; // ... prislusna pauza se o jednicku snizi. } if (sekundova_pauza[i] == 0 and aktualni_odpocet[i] == 1) // Kdyz dobehne odpocet sekundove pauzy ... { digitalWrite (pin_vystup[i],HIGH); // ... prislusny vystup se prepne zpatky do defaultniho HIGH ... aktualni_odpocet[i] = 0; // ... a odpocet 4 nebo 5 se nastavi na 0 (tim se ukonci). } if (predchozi_stav[i] == LOW and aktual_vstup[i] == HIGH) // Prave doslo k prepnuti stavu vstupu z LOW do HIGH ... to znamena STOP casovace. { delay(50); // Odruseni zakmitu vstupniho pinu. digitalWrite (pin_vystup[i],HIGH); // Vystup se nastavi na HIGH. aktualni_odpocet[i] = 0; // Aktualni odpocet se nastavi na 0 (ukonci se). sekundova_pauza[i] = 0; // Vymaze se i pauza pro zaverecny sekundovy impulz. predchozi_stav[i] = HIGH; // A znacka, ze pristi sestupna hrana bude slouzit ke spusteni casovace. } } //************************************************************************************************ // Casovac 6 //------------------- if (predchozi_stav[6] == HIGH and aktual_vstup[6] == LOW) // Prave doslo k sestupne hrane na 6. vstupu (z HIGH do LOW). { digitalWrite (pin_vystup[6],HIGH); // Vystup pro casovac 6 zustava v HIGH. aktualni_odpocet[6] = cas[6]; // V okamziku nabezne hrany se nastavi aktualni odpocet na konstantu z pole cas[]. predchozi_stav[6] = LOW; // Znacka aby se pri pristi smycce uz tento cas nenastavoval. } if (aktualni_odpocet[6] > 1) // Kdyz 6. casovac bezi ... { aktualni_odpocet[6] --; // ... tak se kazdou desetinu sekundy odecita jedno cislo. } if (aktualni_odpocet[6] == 1 and sekundova_pauza[6] == 0) // Kdyz casovac 6 dobehl temer do konce, ale jeste neni aktivovany zaverecny sekundovy odpocet ... { sekundova_pauza[6] = 10; // ... aktivuje se sekundovy odpocet pro zaverecny LOW impulz ( 10 * 0.1 sekundy) ... digitalWrite (pin_vystup[6],LOW); // ... a prislusny vystup se prepne do LOW. } if (sekundova_pauza[6] > 0 and aktualni_odpocet[6] == 1) // Kdyz bezi zaverecny odpocet sekundove pauzy ... { sekundova_pauza[6] --; // ... sekundova pauza pro 6. casovac se o jednicku snizi. } if (sekundova_pauza[6] == 0 and aktualni_odpocet[6] == 1) // Kdyz dobehne odpocet sekundove pauzy do konce... { digitalWrite (pin_vystup[6],HIGH); // ... prislusny vystup se prepne zpatky do defaultniho HIGH ... aktualni_odpocet[6] = 0; // ... a odpocet 6. casovace se nastavi na 0 (ukonci se). predchozi_stav[6] = HIGH; // Tady je zmena proti minulym casovacum 4 a 5: Dalsi odpocet zacne v pristi smycce automaticky. // Program bude totiz predpokladat, ze v teto smycce byl 6. vstupni pin v HIGH, takze aktualni stav vstupniho pinu, // ktery zustava v LOW spusti odpocet. } if (predchozi_stav[6] == LOW and aktual_vstup[6] == HIGH) // Prave doslo k prepnuti stavu vstupu z LOW do HIGH ... to znamena STOP casovace. { delay(50); // Odruseni zakmitu vstupniho pinu. digitalWrite (pin_vystup[6],HIGH); // Vystup se nastavi na HIGH. aktualni_odpocet[6] = 0; // Aktualni odpocet se nastavi na 0 (ukonci se). sekundova_pauza[6] = 0; // Vymaze se i pauza pro zaverecny sekundovy impulz. predchozi_stav[6] = HIGH; // A znacka, ze pristi sestupna hrana bude slouzit ke spusteni casovace. } //************************************************************************************************ // hlavni pauza pro kazdou smycku delay(100); }