[ESP32]日の出・日の入り時刻取得方法 with Arduino IDE
はじめに
緯度・経度と日付がわかれば、日の出・日の入り時刻を算出することができます。
その算出計算をしてくれるArduinoのライブラリがありますので、本記事ではそのライブラリを使用して算出します。
日の出日の入り計算サイト👉 https://keisan.casio.jp/exec/system/1184726771
開発環境
OS : Windows 11 Pro
ESP32:ESP-WROOM-32
統合開発環境 : Arduino IDE 2.3.2
Arduino core for the ESP32:1.0.6
使用ライブラリ:Dusk2Dawn(1.0.1)
使用パーツ
ESP32開発ボード(38Pin)
電子工作ステーション https://electronicwork.shop/items/64134541d91711003035a5a6
作業内容
ライブラリインストール
日の出・日の入り時刻を算出するライブラリである「Dusk2Dawn」をインストールします。
が、このように普通にライブラリインストールすると、コンパイルでエラーになりました。
Github から直接入手してライブラリフォルダに配置します。
https://github.com/dmkishi/Dusk2Dawn
緑の「Code」ボタンを押下して、「Download ZIP」を選択します。
ダウンロードしたフォルダを解凍し、ライブラリフォルダに配置します。
先ほど正式にライブラリインストールした時のファイルを全て置き換えます。
スケッチ作成
日本経緯度原点(東京)の日の出・南中・日の入り時刻を算出してみます。
#include <Dusk2Dawn.h>
void setup() {
Serial.begin (115200);
// 緯度・経度・時差
Dusk2Dawn japan(35.658116645992564, 139.74136505854747, 9);
// 日付・サマータイム設定
int jaSunrise = japan.sunrise(2024, 6, 22, false);
int jaSunset = japan.sunset(2024, 6, 22, false);
// 日の出時刻
char time[6];
bool response = Dusk2Dawn::min2str(time, jaSunrise);
if (response == false) {
Serial.println("Sunrise ERROR!!");
}
Serial.println("日の出時刻 = " + String(time)); // 日の出時刻 = 04:26
// 南中時刻
int jaSolarNoon = jaSunrise + (jaSunset - jaSunrise) / 2;
char time2[6];
bool response2 = Dusk2Dawn::min2str(time2, jaSolarNoon);
if (response2 == false) {
Serial.println("SolarNoon ERROR!!");
}
Serial.println("南中時刻 = " + String(time2)); // 南中時刻 = 11:42
// 日の入時刻
char time3[6];
bool response3 = Dusk2Dawn::min2str(time3, jaSunset);
if (response3 == false) {
Serial.println("Sunset ERROR!!");
}
Serial.println("日の入時刻 = " + String(time3)); // 日の入時刻 = 19:00
}
void loop() {
}
コード説明
経度・緯度・時差を設定します。
実際には、GoogoleMAPなどで算出したい地域の緯度経度を取得して設定します。
// 緯度・経度・時差
Dusk2Dawn japan(35.658116645992564, 139.74136505854747, 9);
日付とサマータイムを設定し、日の出・日の入り時刻を算出しています。
ここで取得できるのは、00時00分からの通算分です。
// 日付・サマータイム設定
int jaSunrise = japan.sunrise(2024, 6, 22, false);
int jaSunset = japan.sunset(2024, 6, 22, false);
日の出・南中・日の入り時刻を通算分から時分に変換しています。
// 日の出時刻
char time[6];
bool response = Dusk2Dawn::min2str(time, jaSunrise);
// 南中時刻
int jaSolarNoon = jaSunrise + (jaSunset - jaSunrise) / 2;
char time2[6];
bool response2 = Dusk2Dawn::min2str(time2, jaSolarNoon);
// 日の入時刻
char time3[6];
bool response3 = Dusk2Dawn::min2str(time3, jaSunset);
動作確認
コンパイルで以下のようなエラーになる場合は、ライブラリインストールを確認してください。
👇エラー内容👇
Dusk2Dawn.cpp:52:54: error: cannot declare member function 'static bool Dusk2Dawn::min2str(char*, int)' to have static linkage [-fpermissive]
static bool Dusk2Dawn::min2str(char *str, int minutes) {
Dusk2Dawn.cpp:293:65: error: cannot declare member function 'static bool Dusk2Dawn::zeroPadTime(char*, byte)' to have static linkage [-fpermissive]
static bool Dusk2Dawn::zeroPadTime(char *str, byte timeComponent) {
正常にコンパイルが完了し動作できれば、以下のように出力されます。
日の出日の入り計算サイトでは、以下のような結果となりました。
ほぼ同じ値を算出できています。
おわりに
農業での潅水システムを作る場合は、日の出時間を知る必要があります。明るいときや、暗い時のみ動作するようなシステムにも活用できそうです。
コメント