Detekce blikání

Odpovědět
PetrS_80
Příspěvky: 2
Registrován: 16 dub 2024, 22:00
Reputation: 0

Detekce blikání

Příspěvek od PetrS_80 » 16 dub 2024, 22:20

Ahoj, začínám s Arduinem a potřeboval bych pomoct s kódem, resp. jeho korekcí. Zadání je celkem jednoduché: sepnout výstup "rele" pokud přijde na vstup "sensor" low signál každých cca. 10s. Pokud nepřijde na vstup sensor low signal více než 10s tak vypnout výstup "rele". Vstup sensor je optický snímač, který detekuje blikání LED diody. Můj pokus o kod je níže, celkem funguje, ale jen cca. 10minut. Pak se Arduino asi zasekne.
Dekuji předem za pomoc. P

Kód: Vybrat vše

int rele = 5;                     //define rele pin 5
int sensor = 2;                   //define sensor pin 2
int led = 4;                      // define led signal ze snimace
unsigned long duration;           //doba trvani bliknuti
int stav_led;

void setup() {
  interrupts();
  pinMode(rele, OUTPUT);          //define rela as output
  pinMode(led, OUTPUT);           //define led as output
  pinMode(sensor, INPUT_PULLUP);  //define sensor as input s pullup
  digitalWrite(rele, HIGH);       //vychozi stav rele vypnuto
  digitalWrite(led, LOW);         //vychozi stav led vypnuto
  attachInterrupt(0, blik, CHANGE);
  }

void loop() {
  duration = pulseIn(sensor, LOW, 10000000);  //doba trvani je rovna low impulsu na vstupu sensor, pokud nenastane do 10s, tak vraci 0
  if (duration == 0) {                        //test zda neprisel impuls
    digitalWrite(rele, HIGH);                 //vypni rele
    delay(50);
  }
  else  {                                     //jinak zapni rele
    digitalWrite(rele, LOW);
    delay(50);
  }
}

void blik() {
    stav_led =! stav_led;
  digitalWrite(led, stav_led);                 //zapni led
  }
Edit: Používej tag code (Tlačítko </>) pro vkládání kódu. Gilhad

Uživatelský avatar
Caster
Příspěvky: 385
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Detekce blikání

Příspěvek od Caster » 16 dub 2024, 23:53

Upřesni, co myslíš tím, že se Arduino zasekne. Relé se přestane spínat ? Jak generuješ to blikání LED diody, které snímá snímač ? Uveď zde celé schéma zapojení, jak máš vše zapojeno vč. té blikající LED. Jaké Arduino používáš a čím ho napájíš ?

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Detekce blikání

Příspěvek od gilhad » 17 dub 2024, 00:00

Já tam taky chybu nevidím (což neznamená, že tam není),

ale je tam drobný rizikový stav - pokud to vytimeoutuje (nebo přijme pulz a zapne relé), tak je tam delay(50), což znamená, že to nic nedělá, ale taky, že pokud zrovna v tu chvíli začne nový pulz, tak bude ignorován celý (dokud neskončí a nezačne a neskončí další pulz).

Což asi samo o sobě je přijatelné riziko, pokud není výsledek kritický, ale pokud by se to relé nějak spolupodílelo na generování pulzů, tak by to mít vliv mohlo.

Asi 10 minut je divná doba, to ještě nic nepřetéká, pokud nejdou pulzy, tak je to 60 smyček (čili celkem málo) a ten program nikde nic nealokuje, takže se nemá jak zahltit.

Je otázkou, jak vznikají ty zasílané pulzy a jak jsou dlouhé, pokud by měly mít konce právě každých 10 sekund, tak by jich to mohlo s trochou smůly ignorovat i několik v řadě.

Ale pokud to vypadá, že je SW v pořádku, tak oblíbeným vyníkem u Arduin je i HW, zejména různá rušení, nevhodně napájené relé, relé bez zpětné diody, relé zapojené přímo na pin Arduina (Arduino toho moc neutáhne a najdou se i tací, co na pin přímo připojí pojezdový motor) a taky pulzy a výpadky napájení způsobené výkonějšími spotřebiči. (A breadboardy samo o sobě taky nejsou zase tak úžasné ani po elektrické ani po mechanické stránce). A pokud je to napájené z baterky, nemůže být už skoro vybitá, že by to chvíli zvládala a pak si potřebovala odpočinout? (Otázky, samé otázky :D )

Zkus poslat, jak to máš zapojené, jak ty pulzy vznikají a co to znamená "asi zasekne".

Máš tam v interruptu to rozsvícení/zhášení LED při příchodu a konci pulzu - funguje to i po zaseknutí?

PetrS_80
Příspěvky: 2
Registrován: 16 dub 2024, 22:00
Reputation: 0

Re: Detekce blikání

Příspěvek od PetrS_80 » 17 dub 2024, 12:26

Děkuji za rychlou reakci a pomoc. Rušení to může být - Arduino je v plastové krabici na DIN liště a kousek od něj je stykač topné patrony.

Zde pár doplňujících informací:
Řešený problém: Solární panely nabijí "Baterybox". Když je Baterybox plně nabitý, což je indikováno blikání LED na panelu, chci připojit topnou patronu přes stykač pro ohřev vody v AKU. Baterybox je v záruce, proto snímám jen stav LED přes optosnímač. LED bliká v intervalu 1s svítí 4s nesvítí. Relé má být sepnuté když dioda bliká v uvedeném intervalu nebo svítí.
Není nutné zaznamenat každé bliknutí, proto interval 10s. Relé spíná stykač topné patrony. Nechci, aby stykač zbytečně "cvičil". Do programu bych pak chtěl přidat ještě prodlevu, aby stykač byl sepnutý min. 15min.

Použité díly:
Zdroj na DIN 12V DC: HDN-1005
Arduino Nano R3 klon: LA100004N
Sensor: LA131079
Relé: LA142000A
Zapojení - úplně jednoduše dle návodu pro jednotlivé komponenty. Tady asi není co zkazit.

Arduino se sekne = přestane spínat relé a blikat dioda, která indikuje změnu vstupu "sensor". Pomůže jedině restart.

Ještě pozn. Chtěl bych aby dioda "led" blikala synchronně se vstupem sensor. Ale kdykoliv dam do přerušení něco jiného než "CHANGE" tak to nefunguje. Teď je to vlastně nahodilý stav: jednou svítí "led" se zapnutým vstupem "sensor" a jednou s vypnutým. Jak to ošetřit?

Děkuji

Uživatelský avatar
Caster
Příspěvky: 385
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Detekce blikání

Příspěvek od Caster » 17 dub 2024, 12:38

To vypadá na nějaké rušení od toho relé. Arduino ale také nemá moc rádo spínaný zdroj 5V na liště.

Zkus v programu dočasně okomentovat řádek pro spínání relé. Mohlo by to ukázat, zda Arduino padá kvůli tomu. LED dioda by měla stále fungovat. Pak bych zkusil dál relé dál od Arduina, případně do nějaké kovové krabičky, aby ho to odstínilo.

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Detekce blikání

Příspěvek od gilhad » 17 dub 2024, 13:53

Pokud chceš, aby blikala synchronně, tak ji musíš zapnout když senzor sepne a vypnout, když vypne a proto potřebuješ zachytávat náběžnou i odběžnou hranu a proto potřebuješ CHANGE.

Co ten blik dělá je zase na tobě (nesmí používat delay, měl by být krátký atd. atd.), takže když nebudeš diodu přepínat, ale nastavíš ji správně, tak by to mělo chodit.

Kód: Vybrat vše

void blik() {
digitalWrite(led, digitalRead(senzor));
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti