Control equipments according to sunrise and sunset.
知り合いの技術者と話をしていた際に、「日の出」や「日の入り」の時刻に合わせて機器を制御するにはどうしたら良いか、という話題になりました。
一般に、屋外の照明機器などの制御では、周囲の明るさに応じてオン・オフするのが普通だと思いますが、場合によっては、天候や周辺光に左右されずに、日の出や日の入りの時刻に合わせて機器を制御したい、という場合もあるでしょう。
これは、Python であれば簡単に実現できます。(C 言語でも可能のようです。)
こちらのウェブサイトを御参考ください。
以下に、観測地の緯度と経度と時刻から、太陽の高度を計算する簡単なプログラムを示します。
from datetime import datetime
import ephem
LAT = 35.5 # 緯度
LON = 139.4 # 経度
sun = ephem.Sun()
observer = ephem.Observer()
observer.lat = str(LAT) # 角度は文字列で指定する
observer.lon = str(LON) # 角度は文字列で指定する
observer.date = datetime.utcnow()
# observer.date = "2023/5/6 10:00:00" # 協定世界時で指定する場合
print(observer.date)
sun.compute(observer)
print(sun.az, sun.alt)
print(sun.alt + 0.0) # ラジアンで表示する場合
if sun.alt > 0:
print("日は出ています")
else:
print("日は沈んでいます")
簡単ですね。素晴らしいライブラリを提供なさっている方々に感謝です!
補足(もう少し厳密な話)
ところで、日の出や日の入りについて計算する場合に、いくつかの注意点があります。その一つとして、日の出や日の入りの定義があります。一般に、日の出や日の入りの時刻は、太陽の上端が地平線に重なった時刻と定義されます。(月や、他の天体では異なります。)
そのため、上記プログラムでは sun.alt > 0
を使って日の出と日の入りを判断していますが、これは正確ではありません。太陽の視半径は(角度で)16分ほどとされていますので、より正確には sun.alt
が(約)-0.0046 ラジアンになる時刻が、日の出、日の入りとなります。(国立天文台のウェブサイト、理科年表、新聞などに記載されている値は、全てこれを考慮して掲載されています。)
他にも、天体の位置計算について調べていくと、非常に込み入った話がたくさんあります。御興味のある方のために、以下にいくつか参考資料を挙げさせて頂きます。
- PyEphem のドキュメントより: Right Ascension and Declination — PyEphem home page
- 日本語で書かれた専門書より: 地人書館 天体の位置計算(増補版)長沢 工 著
今日はここまで。(なお、アイキャッチ画像は Stellarium によるものです。)