Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lukas
Člen
Avatar
Lukas:7.2.2016 20:20

Ahoj, snažím se nastavit Arduino UNO tak, aby po stisku tlačítka se sepnulo relé do stavu ON a po uběhnutí 5min zase vypnulo. Je možné pro tuto funkci použít millis? Nemůžu použít delay, potřebuji ještě číst ze senzorů.
Nikde se o tom nic nepíše, tak nevím jsetli je to možné.
Děkuji za radu, případně za návrhy.

Více zde: http://arduino8.webnode.cz/diskuze/

 
Odpovědět
7.2.2016 20:20
Avatar
Adam Ježek
Tvůrce
Avatar
Odpovídá na Lukas
Adam Ježek:7.2.2016 20:28

Při stisknutí si do nějaké proměnné typu long uložíš číslo, co ti vrátí funkce millis. Na začátku loopu jenom zkontroluješ, jestli to co vrací millis teď není o pět minut větší než to co máš uložené a a pokud ano, uběhlo 5 minut a vypneš si to.

Nahoru Odpovědět
7.2.2016 20:28
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Lukas
Martin Dráb:7.2.2016 20:30

Podle dokumentace mi přijde, že by v tom neměl být problém. Ta funkce ti řekne, kolik milisekund aktuálně uplynulo od počátku vesmíru (startu aktuálního programu), takže ji můžeš využít ke měření "relativního" času.

https://www.arduino.cc/…rence/Millis

Nahoru Odpovědět
7.2.2016 20:30
2 + 2 = 5 for extremely large values of 2
Avatar
Lukas
Člen
Avatar
Lukas:9.2.2016 19:26

Prosím, mohli by jste mi pomoct?
Pořád řeším to zpoždění relé, a nedaří se mi nastavit to zpoždění vypnutí.
Předem děkuji.

#include <IRremoteInt.h>
#include <IRremote.h>

int recv_pin = 11;
IRrecv irrecv(recv_pin);
decode_results results;

int led_pin_1 = 13;
int rele_pin_1 = 10;

unsigned long otvira = 2000;
unsigned long cas_akce = 0;
unsigned long aktualni_cas = 0;


void setup()
{
  pinMode(led_pin_1, OUTPUT);
  pinMode(rele_pin_1, OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
}

void loop()
{
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    if (results.value == 16580863) {
      digitalWrite(led_pin_1, HIGH);
      digitalWrite(rele_pin_1, HIGH);
      cas_akce = millis();
    }
    if (millis() > cas_akce - otvira) {
      digitalWrite(rele_pin_1, LOW);
    }

    irrecv.resume();
  }
}
 
Nahoru Odpovědět
9.2.2016 19:26
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Lukas
ostrozan:10.2.2016 21:06

neměl bys tam mít

if (millis() > cas_akce + otvira)

??

 
Nahoru Odpovědět
10.2.2016 21:06
Avatar
Karel Trojan
Člen
Avatar
Karel Trojan:2.3.2017 11:00

Řešíte někdo nebezpečí, že to takto budete počítat cca 50 dní po startu, kdy se millis opět mění na 0?

 
Nahoru Odpovědět
2.3.2017 11:00
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Karel Trojan
Martin Dráb:2.3.2017 22:38

Pokud budeš testovat, že uplynul určitý časový interval takto

if (milis() - start > velikost_intervalu)

problém by to být neměl.

Ale jinak máš samozřejmě pravdu.

Nahoru Odpovědět
2.3.2017 22:38
2 + 2 = 5 for extremely large values of 2
Avatar
Karel Trojan
Člen
Avatar
Karel Trojan:3.3.2017 8:22

Asi to nechápu.
Pokud akce nastane méně než velikost intervalu před překlopením millis na 0, tak bude millis - start záporné. Tudíž bude menší, než velikost intervalu.

 
Nahoru Odpovědět
3.3.2017 8:22
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Karel Trojan
Martin Dráb:3.3.2017 10:20

millis vrací bezznaménkové číslo, takže zápornost nehrozí. Pak jde jenom o to pracovat s rozdílem hodnot vrácených touto funkcí, ne s hodnotami samotnými. Pak přetečení nevadí.

Nahoru Odpovědět
3.3.2017 10:20
2 + 2 = 5 for extremely large values of 2
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Karel Trojan
ostrozan:5.3.2017 21:07

No a tomu všemu se vyhneš tím, že nebudeš millis() vůbec používat - protože na časování má Atmega časovač - dokonce několik, který běží nezávisle na procesoru a když odpočítá nastavený čas tak ti dá vědět - vyvolá přerušení ve kterém si to relé shodíš
Výhody: nemusíš neustále porovnávat čas, běží asynchronně, odpadne ti ta opičárna s testováním a přepočítáváním při přetečení.
Moc mi neleze do hlavy, že tvůrci Arduina timer/counter totálně ignorují a časy řeší funkcemi milllis/micros , nebo hůř pomocí delay
naštěstí na Gitu je knihoven pro timer/counter hned několik.

funkce millis má snad opodstatnění u časů v řádech jednotek milisekund

Editováno 5.3.2017 21:09
 
Nahoru Odpovědět
5.3.2017 21:07
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na ostrozan
Martin Dráb:5.3.2017 21:12

Možná proto, že pro ty, co se s tím ještě moc nesetkali, jsou obecně přerušení či vícevláknové věci dosti zdrádné, takže se snažili (autoři) jimž život zjednodušit.

Pokud vím, tak Arduino knihovny časovače využívají interně, takže se můžeš dostat do průšvihu, pokud některý ze "zabraných" časovačů použiješ pro vlastní účely. Co si pamatuju, tak zrovna funkce delay je implementována přes TimerCounter0.

Nahoru Odpovědět
5.3.2017 21:12
2 + 2 = 5 for extremely large values of 2
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Martin Dráb
ostrozan:5.3.2017 21:38

Ano a PWM požívá timer 2 - proto ty knihovny na Gitu jsou pro timer 1 nebo 3, ale taky nemusíš vůbec použít delay, nebo PWM - pak ti to žádnou paseku nenadělá - to už je ale mimo začátečníky :-)

Jinak o vláknech bych se na osmibitovém procesoru snad ani nebavil, časovače , stejne jako všechny sériovky jsou periferie - tedy HW záležitost nezávislá na samotném procesoru - u 32 bitových mcu mají tyto periferie dokonce autonomní napájení a hodiny, takže procesor, timer a třeba SPI můžou jet každý na jiném taktu

 
Nahoru Odpovědět
5.3.2017 21:38
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na ostrozan
Martin Dráb:5.3.2017 22:54

Vím, že opravdová vlákna tam nejsou a že je to rozumné (vzhledem k režii). Prostě je to o tom, že je třeba myslet na to, že vykonávání kódu může být v každém okamžiku přerušeno (vyjma těch pevně definovaných). Toj e všechno.

Nahoru Odpovědět
5.3.2017 22:54
2 + 2 = 5 for extremely large values of 2
Avatar
Matyáš Kratochvíl:20.10.2020 10:19

Dobrý den nevíte někdo jak tohle vytvořit? s diagramem?

Napište program pro střídavé blikání LED L2 a L3 na desce Tinylab (právě jedna LED bude svítit). Perioda blikání je 1s. Pro přepínání stavů použijte funkci millis().
Program včetně hlavičky a vývojového diagramu

 
Nahoru Odpovědět
20.10.2020 10:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.