Časovač s prodloužením času

Le-Ze
Příspěvky: 88
Registrován: 31 kvě 2017, 15:37

Re: Časovač s prodloužením času

Příspěvek od Le-Ze »

Zdravím Tě. Jsem rad, že ještě žiješ. :mrgreen:
https://github.com/JChristensen/Timer
Zas v tom nejsem tak dobrý a knihovný moc nedavam. Spiš examples.

Něco takoveho.

Kód: Vybrat vše

#include "Timer.h"
Timer t;

void loop() {
  if (digitalRead(2) == HIGH) {
    t.every(60 * 1000UL, odesli);  // nastavi časovač na 1 minutu
  }
}
Po jedne minutě, se zavola funkce odešli.

Da se u jednoho časovač, zavolat 2 funkce?
Když tento časovač dovrši 1 minuty, zavola funkci odesli.
Ale potřeboval bych, aby něco udělal třeba 10 sekund, než tu funkci zavola.
Když jsem použil 2 tyto časovače, tk to funguje.

Přes millis bych to asi dal, ale zaji ma mně jestli je i řešeni s touto knihovnou.
DavidO
Příspěvky: 1160
Registrován: 01 kvě 2013, 21:27

Re: Časovač s prodloužením času

Příspěvek od DavidO »

Já taky jsem rád, že ještě žiju :lol:
Jestli do toho koukám dobře, tak myslím, že odpověď je, že vypsat ten zbývající čas rozumně nejde. Z timeru se nedozvíš, kolik ještě zbývá (leda bys sis tu knihovnu sám upravil). Navíc tahle knihovna není pro tvůj účel vhodná vůbec, tedy alespoň tak, jak ji používáš. Každé zavolání t.every přidá povel, aby se každých X sekund zavolala tebou určená funkce. Těch povelů může být celkem 10, pak už to nepůjde. Trochu lepší to je, když voláš t.after, protože to po vypršení času ten povel vymaže, ale tak jako tak, když třeba zavoláš t.after třikrát po sobě, tak se taky pak po určené době třikrát zavolá ta tvoje funkce. To tam máš v tom minulém kódu - pokaždé, když se zjistí, že je tlačítko zmáčknuté, se přidá ten povel, aby se za 30s něco provedlo.
Z toho taky plyne odpověď na otázku, jestli jde u jednoho časovače zavolat dvě funkce: ano. Dvakrát zavoláš t.every nebo t.after. Technicky to bude chviličku po sobě, ale člověkem nepostřehnutelně později. Anebo si můžeš napsat malou funkci, která zavolá ty dvě tvoje a tuhletu funkci pak předhodit tomu timeru.

Nicméně celkově bych řekl, že lepší to budeš mít ručně bez té knihovny, baj voko takhle :

Kód: Vybrat vše

// casovac s prodlouzenim casu
// pin VYSTUP je normalne na vysoke urovni
// aktivaci tlacitka pripojeneho k pinu VSTUP se na cas urceny konstantou 'prodleva' prehodi pin VYSTUP do nizke urovne
// opetovna aktivace tlacitka dobu patricne prodluzuje
// v prubehu aktivace se opakovane vypisuje zbyvajici cas, a to kazdych 'vypisovat' milisekund.

// nastaveni - casy:
constexpr unsigned long prodleva = 30*1000ul; // prodleva v milisekundach
constexpr unsigned long vypisovat = 5*1000ul; // vypisovat po kazdych X milisekundach, kolik zbyva

// nastaveni - pouzite piny:
constexpr uint8_t VSTUP = 7; // pin s tlacitkem
constexpr uint8_t VYSTUP = 8; // pin pro vystup

void naZacatku()
{ // provede nastaveni na stav, ktery chceme, aby platil od zacatku
  digitalWrite(VYSTUP, HIGH);
}

void priStartuCasovace()
{ // provede neco, co se ma provest, kdyz se spousti casovac.
  digitalWrite(VYSTUP, LOW);
}

void naKonciCasovace()
{ // provede neco, co se ma provest, kdyz dobehne casovac.
  naZacatku(); // udela se to same, jako pri celkovem startu (resetu)
}

void setup()
{
  Serial.begin(9600); // jakoproctakmalo? Dneska kazdy Ardujino frci na 115200 ...
  
  pinMode(VYSTUP, OUTPUT); // nastavení vystupniho pinu na vystup
  naZacatku(); // uvedeni do provozu
 
  pinMode(VSTUP, INPUT_PULLUP); 
}

void loop()
{
  // promenne
  static unsigned long zacatek; // zacatek cekani
  static unsigned long naposled; // cas, kdy naposled vypsal, kolik zbyva
  static bool bezi = false; // provozni indikator

  if (digitalRead(VSTUP) == LOW) // zmacknute tlacitko?
    {
      zacatek = naposled = millis();
      bezi = true;
      priStartuCasovace();
      Serial.println("Jedu!");
    }
  if (bezi)
    {
      if (millis()-zacatek>=prodleva) // konec timeru? (doba od zacatku je vetsi nebo rovna pozadovane prodleve)
        {
          bezi = false;
          naKonciCasovace();
          Serial.println("Konec.");
        }
      else
      if (millis()-naposled>=vypisovat) // mam uz vypsat, kolik zbyva? (doba od posledniho vypisu je rovna nebop vetsi intervalu vypisovani
        {
          naposled += vypisovat; // i kdyby neco jineho trvalo dlouho, nebudou se mi ztracet vypisy
          Serial.print("Zbyva sec: ");Serial.println((prodleva-(naposled-zacatek))/1000);
        }
    }
}
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
DavidO
Příspěvky: 1160
Registrován: 01 kvě 2013, 21:27

Re: Časovač s prodloužením času

Příspěvek od DavidO »

Teda jestli potřebuješ jen jednou před tím, co vyprší timer, něco udělat, tak třeba takhle:

Kód: Vybrat vše

t.after(50*1000ul,varuj);
t.after(60*1000ul,bum);
(ale to neřeší to opakované mačkání tlačítka s požadovaným prodloužením času)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
Odpovědět