16. 7. 2017

Arduino - výpočet dne v týdnu

Modul reálného času DS3231 resp. DS1307 umí udržovat přesný čas a datum ve své paměti, ale bohužel už ne den v týdnu který se může hodit na množství aplikací. Výpočet je sice složitý...


... ale s funkcí od Tomihiko Sakamoty pro arduino založené na vzorcích Christiana Zellera z roku 1883 je to hračka.

Když potřebujeme dostat den v týdnu pro nějakou aplikaci, třeba pro kalendář, meteostanici a nebo ovládání nějakého zařízení v určitý den, je asi nejlepší sáhnout po téhle funkci.

//*** Implementace výpočtu dne v týdnu podle Tomohiko Sakamoto
byte DoW(int y, byte m, byte d) { // funkce očekává platné datum
  static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
  y -= m < 3;
  // výsledek výpočtu je: 1 - 7, 1 = neděle
  return ((y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7) + 1; 
}

Volat funkci můžeme kdekoliv v kódu. Formát předání data do funkce je v závorce (rok, měsíc, den) a z5 dostaneme číslo dne v týdnu 1 - 7, neděle = 1, pondělí = 2, ... sobota = 7

byte den_v_tydnu = DoW(2017, 7, 16);

A to je všechno, přátelé.

1 komentář:

  1. Geniální! Po mnoha pokusech (neúspěšných), jak z NTP vypočítat den v týdnu, toto konečně chodí skvěle.

    OdpovědětVymazat