Pokud až tak moc nejde o přesnost, zkuste si následující jednoduchý program.
Pro souřadnice [N50.000, E15.000] dosahuje celoročně maximální odchylky méně, než 30 minut od skutečného východu, nebo západu Slunce.
Jak je vidět na spodním grafu po většinu roku je odchylka dokonce pod 20 minut.
Jde o zjednodušení pohybu Zeměkoule kolem Slunce z elipsy na kružnici.
Funkce východů a západů jsou tam proto nahrazeny jednoduchou funkcí sinus, která prochází nulou při jarní rovnodennosti a maxim dosahuje při slunovratech.
Pro zeměpisné souřadnice více na východ stačí od vypočtených časů odečítat několik minut (pro Košice to bylo asi 35 minut)
Víc na západ se naopak nějaké minuty přičtou (Pro Frankfurt asi 25 minut).
Změna souřadnic v severojižním směru je pro podlouhlé Československo v rámci té půlhodinové přesnosti nevýznamná.
Výhoda je, že je to spojitá funkce. Sice není přesná, ale nejsou tam žádné velké skoky mezi dny - chyba narůstá postupně během několika měsíců.
V příloze je excelovský soubor s porovnáním skutečných časů východů a západů a zjednodušených funkcí sinus.
Kód: Vybrat vše
void setup(void)
{
Serial.begin(9600);
Serial.print("Priblizny vychod Slunce pro 25.1. [minuty od půlnoci]: ");
Serial.println(360 - plus_minus_minuty(25,1)); // 360 je počet minut od půlnoci při východu Slunce pri rovnodennosti
Serial.print("Priblizny zapad Slunce pro 16.8. [minuty od půlnoci]: ");
Serial.println(1080 + plus_minus_minuty(16,8)); // 1080 je počet minut od půlnoci při západu Slunce pri rovnodennosti
// ukázkový výpis pro všechny dny v roce
/*
for (byte m = 1; m < 13 ; m++)
{
for (byte d = 1 ; d < 32 ; d++) // pro zjednodušení smyček mají všechny měsíce 31 dní (nesmyslné datumy se pak budou muset ručně smazat (např: 31.9.))
{
unsigned int vychod_minut = 360 - plus_minus_minuty(d,m) ; // 360 = 6:00 rano v minutach
unsigned int zapad_minut = 1080 + plus_minus_minuty(d,m) ; // 1080 = 18:00 vecer v minutach
Serial.print(d);
Serial.print('.');
Serial.print(m);
Serial.print(".;");
Serial.print(vychod_minut);
Serial.print(';');
Serial.println(zapad_minut);
}
}
*/
}
void loop(void)
{
}
int plus_minus_minuty (byte den, byte mesic)
{ // X , Led, Úno, Bře, Dub, Kvě, Čer, Čec, Srp, Zář, Říj, Lis, Pro
int pocet_dni_pro_zacatek_mesice [] = {0 , 0, 31, 59, 90, 120, 151, 181, 212, 242, 272, 303, 333};
int pocet_dni_od_1_1 = pocet_dni_pro_zacatek_mesice[mesic] + den;
int pocet_dni_od_jara = pocet_dni_od_1_1 - 79; // (aktuální datum minus 20. března) může jít i do mínusu
float prevod_na_2_PI = pocet_dni_od_jara * 6.28 / 365;
int vychod = sin(prevod_na_2_PI) * 110 ; // maximální "rozkmit" času je pro ČR a SR zhruba +/- = 110 minut
return vychod;
}