[php] Sonnenstand berechnen

wer’s braucht. Ich habe es mal für eine 24h laufende LED-Wand benötigt, die ihre Helligkeit dynamisch anpassen sollte. Sonnenaufgang, goldene und blaue Stunde etc pp.. Die Werte sind ausreichend genau über die Formeln abgebildet.

Eingabewerte sind Längen- und Breitengrad.

<?php 

// Example Berlin/germany
$geogr_L=-13.25;
$geogr_B=52.5;

// n paar Variablen
$yearday=date('z');
$dateYear=date("Y");
$pi=3.1415926535;

// Annahme, dass die Sonne untergegangen ist, wenn sie 5/6° unterm Horiz ist
$h=-5/6*$pi/180;
// siehe wiki Dämmerung
// -6° bürgerliche Dämmerung (lesen im Freien möglich)
// -12° nautische Dämmerung (schon einige Sterne sichtbar)
// -18° astronomische Dämmerung (tiefste Nacht)

// schaltjahr bzw. sommerzeit
function dst_start($year) { 
 return mktime(2,0,0,3,31-date('w', mktime(2,0,0,3,31,$year)),$year); 
} 
function dst_end($year) { 
 return mktime(2,0,0,10,31-date('w', mktime(2,0,0,10,31,$year)),$year); 
}
if($dateNow>dst_start($dateYear)&&$dateNow>dst_end($dateYear))
{ $isDEST = 2;}
else
{ $isDEST = 1;}

$diffTime = 1+$isDEST;

// -- hier passiert das wunder :)
// --
$b=$geogr_B*$pi/180;
$wozmoz=-0.171*sin(0.0337*$yearday+0.465)-0.1299*sin(0.01787*$yearday-0.168);
$dekli=0.4095*sin(0.016906*($yearday-80.086));
// --

// der Winkel steht im ersten sinus, hier also $h
// für $h kann auch -2 für die goldene Stunde oder
// -6 für die blaue Stunde verwendet werden 
$tdiff_s=12*acos((sin($h)-sin($b)*sin($dekli))/(cos($b)*cos($dekli)))/$pi;
// tdiff ist (da die sonnenbewegung symmetrisch ist) die Abweichung von Mittags, 12 Uhr.

$s_auf=(12-$tdiff_s)+$geogr_L/15-$wozmoz+$diffTime; // (Einheit Stunden, Fließkomma)
$s_unt=(12+$tdiff_s)+$geogr_L/15+$wozmoz+$diffTime;

echo "tdiff_s : ".$tdiff_s."<br/><br/>";

// funktion, um Stunden/Fließkomma in Zeit umzurechnen
function dez2time($tdez){
  $tstd=floor($tdez);
  $tmin=floor(60*($tdez-$tstd));
  return str_pad($tstd,2,'0',STR_PAD_LEFT).":".str_pad($tmin, 2 ,'0', STR_PAD_LEFT); 
}

// ausgabe
echo "Sonnenaufgang : ".dez2time($sauf)." Uhr<br/>";
echo "Sonnenuntergang : ".dez2time($sunt)." Uhr<br/>";
?>

Damit sollte es ein Einfaches sein, sich noch eine Kurve zu bauen, die um die errechneten Zeiten herum Werte wie LED-Helligkeit oder ISO/Verschlusszeit/Blende zu ändern. viel Spaß.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert