Close

Č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.
Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 32)
  • Autor
    Příspěvky
  • #6116
    Le_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?

    #6121
    posjirka
    Účastník

    Samozřejmě že to jde a jak na to?
    No doplnit do kodu funkci cyklovače.
    Co ti jiného mám napsat bez kodu ….

    #6124
    Le_Ze
    Účastník

    No 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ě

    #6126
    posjirka
    Účastník

    dej 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.

    #6127
    Le_Ze
    Účastník

    Nejjednodušší ř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 HIGH

    #6129
    posjirka
    Účastník

    Poží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
    		}
    	}
    }
    
    #6130
    posjirka
    Účastník

    jo 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á …

    #6131
    Le_Ze
    Účastník

    Ty činske relay moduly sepinají při LOW
    Při spuštění arduina je na pinu HIGH

    Poš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();
        }
    
    #6133
    Le_Ze
    Účastník

    Tak 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.

    #6145
    posjirka
    Účastník

    ješ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.

    #6147
    Le_Ze
    Účastník

    Ano mam 4 rele a 4 timery a jednu splečnou funkcí pro vypinaní

    #6151
    posjirka
    Účastník

    ok hlavní je spokojenost .)

    #6161
    Le_Ze
    Účastník

    Tak 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?

    #6164
    Zbyšek Voda
    Správce

    Funkci „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ě.

    #6165
    Le_Ze
    Účastník

    A nedá se časovač programově vynulovat?

Aktuálně je na stránce zobrazeno 15 příspěvků - 1. až 15. (celkem z 32)
  • Pro reakci na toto téma se musíte přihlásit.