Časovane spinaní pinu
Úvodní stránka › Fórum › Vaše projekty › Arduino › Časovane spinaní pinu
- Toto téma obsahuje celkem 31 odpovědí. Do diskuze (5 diskutujících) se naposledy zapojil uživatel posjirka a poslední změna proběhla před 7 roky a 6 měsíci.
-
AutorPříspěvky
-
21.2.2016 v 19:01 #6116Le_ZeÚčastník
Zdravim.
Mam uno,433Mhz RF receiver, modul 4 rele a 4 kanal dalkač.
Zmačknutím tlačitek spinam relatka.
1 zmačknutí sepnu, 2 zmačknutí rozepnu.Znameho však zajima jak na to, kdyby je chtěl spinat časově.
Zmačkne tlačitko a sepne se rele třeba na 5 minut.
a pokud ho zmačkne znovu třeba po minutě, aby čas šel odznova.
Poradí někdo?21.2.2016 v 22:41 #6121posjirkaÚčastníkSamozřejmě že to jde a jak na to?
No doplnit do kodu funkci cyklovače.
Co ti jiného mám napsat bez kodu ….21.2.2016 v 23:23 #6124Le_ZeÚčastníkNo dalkač mi vrací kod jako číslo
Podmínkou IF hlídám ten správný.
Pokud je pominka splněna tedy spustit třeba thead.Nějak však nemohu pochopit princip toho vlakna.
Proč je u vlakna setInterval()
Ve škole jsme měli delphi a bud bylo vlakno co vykonalo svou funkcí a ukončilo se, nebo vlakno ktere běželo furt dokola.
Interval byl u timeru.A i kdybych to dal s tym theadem, nevím jak vyřešit to druhe zmačknutí po minutě
22.2.2016 v 16:15 #6126posjirkaÚčastníkdej sem jednoduchý kod s funkcionalitou co potřebuješ a já ti řeknu jak to upravit.
Chápeš, že se ptáš ze svého pohledu na věc …..? Nevidím ti do hlavy, tak ti nemůžu odpovědět. Navíc arduino nemá thead. Je jednoprocesorový 1 vláknový. Tudíž nemůže řešit 2 paralelní procesy. umí pouze mezi procesy přepínat a to ještě na základě interních časovaču resp. na principu přerušení. Jsme tu v „c++“ deplhi je trochu jinde.22.2.2016 v 18:14 #6127Le_ZeÚčastníkNejjednodušší řešení by bylo tady.
https://playground.arduino.cc/Code/Timer
Do kažede podminky dat t.pulse.#include "Timer.h" Timer t; int pin = 3; void setup() { pinMode(pin, OUTPUT); t.pulse(pin, 10 * 60 * 1000, HIGH); // 10 minutes } void loop() { t.update(); }
Proč toto nefunguje jak má?
Zapnu arduino.
Po najetí mam na pinu 3 10 vteřin HIGH
Pak 10 vteřin LOW
A pak až se začne odpočitavat těch 10 minut HIGH22.2.2016 v 20:53 #6129posjirkaÚčastníkPožíváš knihovny, které nevíš jak fungují a proto se pak divíš.
Navíc je to jak jít s bazukou na komára. Jde to mnohem elegantnějí:// zpozdeni tlacitka // v1 // by JP 2016 // program po stisku tlačítka rozsvítí LED diodu a nechá jí 5s rozsvícenou, pak ji zhasne a opět čeká na stisk tlačítka const int LED = 13; // led dioda const int TLACITKO = 10; // tlacitko proti zemi boolean CEKAM = false; // kdyz je true tak ceka na zhasnuti. unsigned long OLDTIME = 0; // strojní čas posledního stitku tlačítka unsigned long ZPOZDENI = 5000; // čas zpoždění zahsnutí LED diody v ms. unsigned long MYTIME = 0; // aktuální čas -zpoždění void setup() { pinMode(LED, OUTPUT); // nastaveni jako vystup pinMode(TLACITKO, INPUT_PULLUP); // nastaveni jako vystup OLDTIME = millis();// zapamatuj si aktuální strojní čas } void loop() { digitalWrite(LED, CEKAM); // zapis stav na LED if (digitalRead(TLACITKO) == 0) { // při stisku tlačitka if (CEKAM == false) { // a zhasnuté LED diodě CEKAM = true; // změn stav OLDTIME = millis(); // zapamatuj aktuální strojový čas } } if (CEKAM == true) { MYTIME = millis()-ZPOZDENI; // výpočet času zpoždění if (MYTIME > OLDTIME){ // porovnání aktuálního čas a OLDTIME se zpožděním CEKAM = false; // když překročím zpoždění zhasni LED diodu } } }
22.2.2016 v 20:58 #6130posjirkaÚčastníkjo to uvodní 10s přepnutí může mít 2 příčiny:
1, start Arduina kdy bootloader čeká na rest pro nahrání programu nebo pokračuje dál v aktuálním programu
2, knihovna timer má na začátku reset proměnných a registru. To chvilku trvá …22.2.2016 v 21:28 #6131Le_ZeÚčastníkTy činske relay moduly sepinají při LOW
Při spuštění arduina je na pinu HIGHPošlu přes serial 1
pin se přepne na Low na 10 vteřin a rele sepne.
Pak je na pinu HIGH 10 vteřin.
Po 10 vteřinach zase LOW a už se to nepřekopí a rele zustava furt seple.#include "Timer.h" Timer t; int pin = 4; void setup() { Serial.begin(9600); pinMode(pin,INPUT_PULLUP); pinMode(pin, OUTPUT); } void loop() { int val = Serial.parseInt(); if(val == 1){ t.pulse(pin, 10 * 60 * 1000, LOW); } t.update(); }
23.2.2016 v 12:26 #6133Le_ZeÚčastníkTak vyřešene a odzkoušené přes tu knihovnu timer :).
Přimo v if zapnu pin.
digitalWrite(pin, HIGH);
t.after(10 * 60 * 10000, vypnirele);
a pak se po určité době spusti funkce, která ho vypne.
Pokud si při volaní funkce pošlu i čislo pinu, postači mi 1 funkce pro všechny rele.23.2.2016 v 23:30 #6145posjirkaÚčastníkještě si vyzkoušej jestli ti dovolí pracovat dál s jiným pinem.
myslím tím, když aktivuješ 1 pin na zpoždění, můžeš aktivovat hned i druhý?
Myslím, že minimálně budeš muset udělat druhou instanci timer aby se ti nemíchali proměnné z knihovny….
originální řešení je uděláno jako aktivace časovače a ve smyčce loop si aktualizuje strojní čas do rozhodovacího procesu.24.2.2016 v 7:13 #6147Le_ZeÚčastníkAno mam 4 rele a 4 timery a jednu splečnou funkcí pro vypinaní
24.2.2016 v 19:00 #6151posjirkaÚčastníkok hlavní je spokojenost .)
26.2.2016 v 10:48 #6161Le_ZeÚčastníkTak zbyla chvilka času a ja chtěl vzykoušet i to s millis.
Dočet jsem se, že u funkce millis dochazí co 50 dní k přetečení.
Da se to nějak pořešít?26.2.2016 v 12:24 #6164Zbyšek VodaSprávceFunkci „nepřetíkat“ nedonutíte, ale můžete s tím v kódu počítat.
Když najednou funkce millis nevrací něco přes čtyři miliardy (kdy přetéká),
ale jede od nuly, musíte s tím v programu počítat a například si vynulovat nějaký čítač, nebo podobně.26.2.2016 v 12:42 #6165Le_ZeÚčastníkA nedá se časovač programově vynulovat?
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.