Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Arduino, uvítací světelná schow reflektorů na cestě domů a zároveň posvícení na cestu.

Dobrý den
Prosím, moc prosím, neporadil by mi nějaký hodný člověk (i za mírnou úplatu) kde je chyba v prográmku, který mi tu někdo vytvořil, ale už nereaguje?
Jsou to dvě nezávislé sekce (cesta domů brankou a druhá cesta domů bránou), jako furtošlap spínaný PIR mi to fungzje, ale já potřebuji mezi to vřadit (po elektronické stránce to je pro mě sranda) mozek Arduina, který to rozpohybuje.
Namísto PIR na vstupu a Reflektorů na výstupu používám na stole u PC tlačítka na vstupu a LED na výstupu – vřadit to tam = žádný problém.

V čem spočívá závada?
1.Druhý nezávislý okruh pro pět LED chodí naprosto správně, ale první okruh rozsvítí jen do páté Led a pak se vše hned rozsvítí. 6tou led to vynechá, ale jako celek jí to rozsvítí.

2. Vstupy A3 až A7 na přepínání různých animací naprosto nefungují, ať je spínám 0 nebo 1

3. Bylo by moc složité přehodit výstupy??? Tzn. Že tlačítkem A1 bych spínal Led např. 0 – 4 a tlačítkem A2 bych spínal výstupy 5 – 11??? Nebo nějak podobně. Jde o již hotový následný tišťák, abych neměl moc škrábání.
Prosím, moc prosím dobří lidé poraďte nešťasníkovy elektronikovi. Děkuji, děkuji, děkuji předem.
Přikládám kód, který je (až na výše vypsané závady) funkční. Děkuji předem.
Michal
//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
}
kód se sem nevešel celý

Předmět Autor Datum
Ať hledám jak hledám, tak ve skeči, který jsi přiložil nikde nevidím nastavení žádného pinu jako vst…
czcharlie 18.06.2018 17:49
czcharlie
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…
medvidek181 18.06.2018 19:46
medvidek181
Stále tam nikde nevidím nastavení nějakého pinu jako vstup...
czcharlie 18.06.2018 23:30
czcharlie
no to by mělo být A1 a A2 a k přepínání prgramů A3 až A7
medvidek181 19.06.2018 00:24
medvidek181
"no to by mělo být A1 a A2" no to víš ty, to vím já, ale jak se to dozví Arduino? Stjně jako jsou de…
czcharlie 19.06.2018 00:42
czcharlie
Děkuji, ale moc tomu nerozumím. Michal
medvidek181 19.06.2018 17:40
medvidek181
Piny Arduina ("nožičky") se musí nakonfigurovat jako vstupní (pak Arduino z těchto pinů čte hodnotu…
Pavel 20.06.2018 16:16
Pavel
Děkuji za radu. M.
medvidek181 20.06.2018 16:43
medvidek181
Pokud je nenastavis, sou defaultne input.
Odoaker 20.06.2018 00:53
Odoaker
Díky. M. poslední
medvidek181 20.06.2018 16:51
medvidek181

Ať hledám jak hledám, tak ve skeči, který jsi přiložil nikde nevidím nastavení žádného pinu jako vstupního. Tím pádem Arduino netuší, že jsi na některý pin přivedl log 1 nebo log 0. A ano, piny lze samozřejmě jednoduše přehodit tím, že v definici přiřadíš jiné číslo pinu. Např. místo #define OUT11 2 napíšeš #define OUT11 12 chceš-li pin 2 nahradit pinem 12... A ještě jednodušeji to uděláš tak, že přehodíš vodič od konkrétního reflektoru na jiný pin Arduina, nepředpokládám, že bys celou tu šarádu měl udělanou jako shield k Arduinu.

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é

Zpět do poradny Odpovědět na původní otázku Nahoru