Já taky jsem rád, že ještě žiju
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);
}
}
}