[ESP32]日の出・日の入り時刻取得方法

ArduinoIDE

[ESP32]日の出・日の入り時刻取得方法

はじめに

緯度・経度と日付がわかれば、日の出・日の入り時刻を算出することができます。
その算出計算をしてくれる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」を選択します。
ダウンロードしたフォルダを解凍し、ライブラリフォルダに配置します。

ライブラリフォルダ(「ファイル」→「基本設定」でスケッチブックの場所を確認)

スケッチブックの場所\libraries\Dusk2Dawn」

先ほど正式にライブラリインストールした時のファイルを全て置き換えます。

スケッチ作成

日本経緯度原点(東京)の日の出・南中・日の入り時刻を算出してみます。

#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) {

正常にコンパイルが完了し動作できれば、以下のように出力されます。

日の出日の入り計算サイトでは、以下のような結果となりました。

ほぼ同じ値を算出できています。

おわりに

農業での潅水システムを作る場合は、日の出時間を知る必要があります。明るいときや、暗い時のみ動作するようなシステムにも活用できそうです。

コメント

タイトルとURLをコピーしました