Děkuji, ale přiznám se, že tomu moc nerozumím, program se nevešel celý a když budu křížit dráty, tak v minirozvaděči vznikne cévní pleteň a nikdo se v tom nevyzná.
//definice I/O
#define OUT11 2 //výstup 1 (skupina 1, reflektor 1)
#define OUT12 3 //výstup 2 (skupina 1, reflektor 2)
#define OUT13 4 //výstup 3 (skupina 1, reflektor 3)
#define OUT14 5 //výstup 3 (skupina 1, reflektor 4)
#define OUT15 6 //výstup 3 (skupina 1, reflektor 5)
#define OUT16 7 //výstup 3 (skupina 1, reflektor 6)
#define OUT17 8 //výstup 3 (skupina 1, reflektor 7)
#define OUT21 9 //výstup 1 (skupina 2, reflektor 1)
#define OUT22 10 //výstup 2 (skupina 2, reflektor 2)
#define OUT23 11 //výstup 2 (skupina 2, reflektor 3)
#define OUT24 12 //výstup 2 (skupina 2, reflektor 4)
#define OUT25 13 //výstup 2 (skupina 2, reflektor 5)
#define IN1 A1 //vstup PIR1
#define IN2 A2 //vstup PIR2
#define PROG1 A3 //nastavení programu 1
#define PROG2 A4 //nastavení programu 2
#define PROG3 A5 //nastavení programu 3
#define PROG4 A6 //nastavení programu 4
#define PROG5 A7 //opakování animace
const byte delkaAnimace = 5; //kolik políček bude mít animace (musí být konstanta)
//zde jsou definice jednotlivých animací
//MAX = 127 (SVÍTÍ VŠECHNY)
byte animace[4][delkaAnimace] = {
{ 1, 2, 4, 8, 16 }, //animace 1 - rozsvítí se první, pak druhá, pak třetí, pak čtvrtá, ... ledka
{ 1, 3, 7, 15, 31 }, //animace 2 - rozsvítí se první, pak první a druhá, pak první, druhá a třetí ... ledka
{ 31, 0, 31, 0, 31 }, //animace 3 - rozsvítí se prvních 5 ledek, pak žádná, pak zas 5, pak zas žádná, ...
{ 16, 8, 4, 2, 1 } //animace 4
};
//ČAS
unsigned long timerTime; //proměnná pro časování animace
unsigned long presentTime; //proměnná pro aktuální čas
//ANIMACE
bool animation1Enable; //povolit animaci pro PIR1
bool animation2Enable; //Povolit animaci pro PIR2
bool opakovatAnimaci; //pokud je true, bude se animace stále dokola opakovat
byte nrAnimation1; //typ animace pro 1
byte nrAnimation2; //typ animace pro 2
byte polickoAnimace1; //kolikáté políčko animace se zrovna zobrazuje
byte polickoAnimace2; //kolikáté políčko animace se zrovan zobrazuje
byte stavVytupu1; //jaké jsou rozsvíceny ledky na portu 1?
byte stavVytupu2; //jaké jsou rozsvíceny ledky na portu 1?
void setup() {
pinMode(OUT11, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT12, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT13, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT14, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT15, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT16, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT17, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT21, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT22, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT23, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT24, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
pinMode(OUT25, OUTPUT); //nastavení výstupu 1 (skupina 1, reflektor 1)
}
void loop() {
presentTime = millis(); //uložení aktuálního času do proměnné
//aktivace jednotlivých animací
animation1Enable = digitalRead(IN1); //pir1
animation2Enable = digitalRead(IN2); //pir2
if (presentTime - timerTime >= 750) {
//tato část ovlivňuje rychlost vykreslování animace
timerTime = presentTime; //ulož čas provedení podprogramu 2
//pro animaci 1
if (animation1Enable) {
if (polickoAnimace1 < delkaAnimace) {
//postupně zvětšuje číslo až o jedno políčko přes animaci
//nejvyšší číslo signalizuje rozsvícení všech ledek
polickoAnimace1++;
}
if (opakovatAnimaci && polickoAnimace1 >= delkaAnimace) {
polickoAnimace1 = 0;
}
}
else{
polickoAnimace1 = 0;
}
//pro animaci 2
if (animation2Enable) {
if (polickoAnimace2 < delkaAnimace) {
//postupně zvětšuje číslo až o jedno políčko přes animaci
//nejvyšší číslo signalizuje rozsvícení všech ledek
polickoAnimace2++;
}
if (opakovatAnimaci && polickoAnimace2 >= delkaAnimace) {
polickoAnimace2 = 0;
}
}
else {
polickoAnimace2 = 0;
}
}
ShowAnimation();
}
void GetTypeAnimation() {
//pro PIR1
if (!digitalRead(PROG1) && !digitalRead(PROG2)) nrAnimation1 = 0; // 0 + 0 = 0 (první animace)
if (!digitalRead(PROG1) && digitalRead(PROG2)) nrAnimation1 = 1; // 0 + 1 = 1 (druhá animace)
if (digitalRead(PROG1) && !digitalRead(PROG2)) nrAnimation1 = 2; // 1 + 0 = 2 (třetí animace)
if (digitalRead(PROG1) && digitalRead(PROG2)) nrAnimation1 = 3; // 1 + 1 = 3 (třetí animace)
//pro PIR1
if (!digitalRead(PROG3) && !digitalRead(PROG4)) nrAnimation2 = 0; // 0 + 0 = 0 (první animace)
if (!digitalRead(PROG3) && digitalRead(PROG4)) nrAnimation2 = 1; // 0 + 1 = 1 (druhá animace)
if (digitalRead(PROG3) && !digitalRead(PROG4)) nrAnimation2 = 2; // 1 + 0 = 2 (třetí animace)
if (digitalRead(PROG3) && digitalRead(PROG4)) nrAnimation2 = 3; // 1 + 1 = 3 (třetí animace)
opakovatAnimaci = digitalRead(PROG5); //pokud je true, bude se animace opakovat stále dokola
}
void ShowAnimation() {
//animace 1
if (animation1Enable) {
//animace zapnuta
if (polickoAnimace1 < delkaAnimace) {
//animace je načítána z definice
stavVytupu1 = animace[nrAnimation1][polickoAnimace1];
}
else{
//animace už je za hranou
stavVytupu1 = 127; //rozsvit vše
}
}
else {
//animace zapnuta
stavVytupu1 = 0; //zhasni ledky
}
//animace2
if (animation2Enable) {
//animace zapnuta
if (polickoAnimace2 < delkaAnimace) {
//animace je načítána z definice
stavVytupu2 = animace[nrAnimation2][polickoAnimace2];
}
else {
//animace už je za hranou
stavVytupu2 = 127; //rozsvit vše
}
}
else {
//animace zapnuta
stavVytupu2 = 0; //zhasni ledky
}
ObsluhaVystupu(); //zapni//vypni ty ledky
}
void ObsluhaVystupu() {
bool q11, q12, q13, q14, q15, q16, q17;
bool q21, q22, q23, q24, q25;
//výpočet aktivních výstupů pro PIR1
q11 = (stavVytupu1 / 1) % 2;
q12 = (stavVytupu1 / 2) % 2;
q13 = (stavVytupu1 / 4) % 2;
q14 = (stavVytupu1 / 8) % 2;
q15 = (stavVytupu1 / 16) % 2;
q16 = (stavVytupu1 / 32) % 2;
q17 = (stavVytupu1 / 64) % 2;
//výpočet aktivních výstupů pro PIR2
q21 = (stavVytupu2 / 1) % 2;
q22 = (stavVytupu2 / 2) % 2;
q23 = (stavVytupu2 / 4) % 2;
q24 = (stavVytupu2 / 8) % 2;
q25 = (stavVytupu2 / 16) % 2;
//výpis na výstupy
digitalWrite(OUT11, q11);
digitalWrite(OUT12, q12);
digitalWrite(OUT13, q13);
digitalWrite(OUT14, q14);
digitalWrite(OUT15, q15);
digitalWrite(OUT16, q16);
digitalWrite(OUT17, q17);
//výpis na výstupy
digitalWrite(OUT21, q21);
digitalWrite(OUT22, q22);
digitalWrite(OUT23, q23);
digitalWrite(OUT24, q24);
digitalWrite(OUT25, q25);
}
už se to vešlo celé