日の出、日の入り時刻からアナレンマを描く(Ambientに描くテスト)
久しぶりの記事の更新です。このところ書くネタが無くて困っています。
で今回は、前回に引き続き日の出、日の入り時刻からアナレンマを描く話です。アナレンマ(もどき)の出力先として Ambient を使うと、結果がリアルタイムで見れるので便利なはずです。とは言っても、どういう感じの出力になるのか事前に確かめておかないと不安です。何しろ全部の作図には1年かかる訳で、途中で「こんなはずじゃなかった、」なんてことになると困ります。
ということで、ダミーのデーターを Ambient に登録して、どんな感じのグラフになるか確認してみました。ちなみにアナレンマのグラフは散布図で書くのですが、調べた限りでは散布図が描けるのは今のところ Ambient だけのようでした。
ダミーのデーターと言っても、使ったのはこの前の記事で使った国立天文台から公開されている日の出/日の入りのデーターです。つまりこれは測定誤差が無い理想的なデーターということになります。このデーターを予備加工し、ESP8266を経由してAmbientに送って作図したのが以下のグラフです。
▼Ambient のグラフ出力結果(クリックで別窓にもう少し大きな図)

一番下の8の字がアナレンマのグラフになります。実際にAmbient で公開しているグラフはこちら。データーは散布図で描いています。
なかなかうまくいってます。これなら大丈夫そうです。 欲を言えばプロットの点や線が指定出来るともっと見栄えが良くなるはずですが、贅沢は言ってられません。もっとかっこ良くしたいなら、EXCELで加工すれば済む話です。
あと、Ambient のユーザー用のリードキーを使えば登録データーをダウンロード出来そうな気配なので、データーの一時保存先としても使えそうです。
▼プログラム (これ以外に Ambient.cpp と Ambient.h が必要です)
1年分の日の出と日の入り時刻のデーターを浮動小数点形式で配列で定義しています。これだけで3kバイト近いデーター量になりますが、ESP8266はメモリ容量が大きいのでこういう乱暴ができるので楽ちんです。なお、このプログラムでは1年分の日の出/日の入り時刻などのデーターを Ambient に送信しています。この時5秒以上間隔を空ける必要があるので、余裕をみて10秒間隔で送信しています。
あと、ESP8266を安全に停止させる方法が判らなかったので、122行のdelayで適当に一時停止させているので、ここでケーブルを抜いてデーターの送信を止めます。なお、単純な無限ループに入れて止めると、ゾンビのように復活してきます。
▼実行結果(シリアルモニタ)

◆まとめ
ということで出力先は Ambient でいけそうです。外の明るさを見るセンサー(実際には30Wの太陽光発電パネル)からESP8266までの配線は済んでいるので、あとはソフトだけ書けば完成するはずです。やり始めればけっこう速いはずなのですが、なかなか集中してやっている時間が無い (というかあれこれ浮気して集中していない)のが悩みです。冬至までに何とかしたいと思っているのですが、残り時間はあまりありません。
で今回は、前回に引き続き日の出、日の入り時刻からアナレンマを描く話です。アナレンマ(もどき)の出力先として Ambient を使うと、結果がリアルタイムで見れるので便利なはずです。とは言っても、どういう感じの出力になるのか事前に確かめておかないと不安です。何しろ全部の作図には1年かかる訳で、途中で「こんなはずじゃなかった、」なんてことになると困ります。
ということで、ダミーのデーターを Ambient に登録して、どんな感じのグラフになるか確認してみました。ちなみにアナレンマのグラフは散布図で書くのですが、調べた限りでは散布図が描けるのは今のところ Ambient だけのようでした。
ダミーのデーターと言っても、使ったのはこの前の記事で使った国立天文台から公開されている日の出/日の入りのデーターです。つまりこれは測定誤差が無い理想的なデーターということになります。このデーターを予備加工し、ESP8266を経由してAmbientに送って作図したのが以下のグラフです。
▼Ambient のグラフ出力結果(クリックで別窓にもう少し大きな図)

一番下の8の字がアナレンマのグラフになります。実際にAmbient で公開しているグラフはこちら。データーは散布図で描いています。
なかなかうまくいってます。これなら大丈夫そうです。 欲を言えばプロットの点や線が指定出来るともっと見栄えが良くなるはずですが、贅沢は言ってられません。もっとかっこ良くしたいなら、EXCELで加工すれば済む話です。
あと、Ambient のユーザー用のリードキーを使えば登録データーをダウンロード出来そうな気配なので、データーの一時保存先としても使えそうです。
▼プログラム (これ以外に Ambient.cpp と Ambient.h が必要です)
/*
アナレンマをAmbient http://ambidata.io/ch/channels.html に作図するテスト
日の出/日の入りデーターをアップロード
2016/11/24 ラジオペンチ http://radiopench.blog96.fc2.com/
*/
#include <ESP8266WiFi.h> // ESP8266用ライブラリ
#include <WiFiUdp.h> // UDP通信を行うライブラリ
#include "Ambient.h" // Ambient用のライブラリの組み込み
#define PIN_LED 13 // IO 13(5番ピン)にLEDを接続する
#define SSID "*******************" // 無線LANアクセスポイントのSSID
#define PASS "*******************" // パスワード
#define AmbientChannelId 201 // チャネルID(整数)
#define AmbientWriteKey "*****************" // ライトキー(16桁の16進数)
#define SLEEP_P 300000000 // スリープ時間
// 日の出時刻 (2016年 うるう年なので366日分ある)
float t1[] = {
0.2847, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2854, 0.2847, 0.2847, 0.2847, 0.2847, 0.2840, 0.2840, 0.2840,
0.2833, 0.2833, 0.2826, 0.2826, 0.2819, 0.2819, 0.2813, 0.2806, 0.2806, 0.2799, 0.2792, 0.2792, 0.2785, 0.2778, 0.2771, 0.2771, 0.2764, 0.2757, 0.2750, 0.2743,
0.2736, 0.2729, 0.2722, 0.2715, 0.2708, 0.2701, 0.2694, 0.2688, 0.2681, 0.2667, 0.2660, 0.2653, 0.2646, 0.2639, 0.2632, 0.2618, 0.2611, 0.2604, 0.2597, 0.2583,
0.2576, 0.2569, 0.2556, 0.2549, 0.2542, 0.2528, 0.2521, 0.2514, 0.2500, 0.2493, 0.2479, 0.2472, 0.2465, 0.2451, 0.2444, 0.2431, 0.2424, 0.2417, 0.2403, 0.2396,
0.2382, 0.2375, 0.2361, 0.2354, 0.2347, 0.2333, 0.2326, 0.2313, 0.2306, 0.2292, 0.2285, 0.2278, 0.2264, 0.2257, 0.2243, 0.2236, 0.2229, 0.2215, 0.2208, 0.2194,
0.2188, 0.2181, 0.2167, 0.2160, 0.2153, 0.2139, 0.2132, 0.2125, 0.2118, 0.2104, 0.2097, 0.2090, 0.2083, 0.2069, 0.2063, 0.2056, 0.2049, 0.2042, 0.2028, 0.2021,
0.2014, 0.2007, 0.2000, 0.1993, 0.1986, 0.1979, 0.1972, 0.1965, 0.1958, 0.1951, 0.1944, 0.1938, 0.1931, 0.1931, 0.1924, 0.1917, 0.1910, 0.1910, 0.1903, 0.1896,
0.1889, 0.1889, 0.1882, 0.1882, 0.1875, 0.1868, 0.1868, 0.1868, 0.1861, 0.1861, 0.1854, 0.1854, 0.1854, 0.1847, 0.1847, 0.1847, 0.1840, 0.1840, 0.1840, 0.1840,
0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1840, 0.1847, 0.1847, 0.1847, 0.1854, 0.1854, 0.1854, 0.1861,
0.1861, 0.1861, 0.1868, 0.1868, 0.1875, 0.1875, 0.1882, 0.1882, 0.1889, 0.1889, 0.1896, 0.1896, 0.1903, 0.1910, 0.1910, 0.1917, 0.1924, 0.1924, 0.1931, 0.1938,
0.1938, 0.1944, 0.1951, 0.1951, 0.1958, 0.1965, 0.1972, 0.1972, 0.1979, 0.1986, 0.1993, 0.1993, 0.2000, 0.2007, 0.2014, 0.2014, 0.2021, 0.2028, 0.2035, 0.2042,
0.2042, 0.2049, 0.2056, 0.2063, 0.2069, 0.2069, 0.2076, 0.2083, 0.2090, 0.2090, 0.2097, 0.2104, 0.2111, 0.2118, 0.2118, 0.2125, 0.2132, 0.2139, 0.2139, 0.2146,
0.2153, 0.2160, 0.2160, 0.2167, 0.2174, 0.2181, 0.2181, 0.2188, 0.2194, 0.2201, 0.2201, 0.2208, 0.2215, 0.2222, 0.2222, 0.2229, 0.2236, 0.2243, 0.2243, 0.2250,
0.2257, 0.2264, 0.2271, 0.2271, 0.2278, 0.2285, 0.2292, 0.2292, 0.2299, 0.2306, 0.2313, 0.2313, 0.2319, 0.2326, 0.2333, 0.2340, 0.2340, 0.2347, 0.2354, 0.2361,
0.2368, 0.2368, 0.2375, 0.2382, 0.2389, 0.2396, 0.2403, 0.2403, 0.2410, 0.2417, 0.2424, 0.2431, 0.2438, 0.2444, 0.2451, 0.2458, 0.2458, 0.2465, 0.2472, 0.2479,
0.2486, 0.2493, 0.2500, 0.2507, 0.2514, 0.2521, 0.2528, 0.2535, 0.2542, 0.2549, 0.2556, 0.2563, 0.2569, 0.2576, 0.2583, 0.2590, 0.2597, 0.2604, 0.2611, 0.2618,
0.2625, 0.2632, 0.2639, 0.2646, 0.2653, 0.2660, 0.2667, 0.2667, 0.2674, 0.2681, 0.2688, 0.2694, 0.2701, 0.2708, 0.2715, 0.2722, 0.2729, 0.2736, 0.2743, 0.2750,
0.2750, 0.2757, 0.2764, 0.2771, 0.2778, 0.2778, 0.2785, 0.2792, 0.2792, 0.2799, 0.2806, 0.2806, 0.2813, 0.2819, 0.2819, 0.2826, 0.2826, 0.2833, 0.2833, 0.2840,
0.2840, 0.2840, 0.2847, 0.2847, 0.2847, 0.2847
};
// 日の入り時刻
float t2[] = {
0.6931, 0.6938, 0.6944, 0.6944, 0.6951, 0.6958, 0.6965, 0.6972, 0.6979, 0.6986, 0.6986, 0.6993, 0.7000, 0.7007, 0.7014, 0.7021, 0.7028, 0.7035, 0.7042, 0.7049,
0.7056, 0.7063, 0.7069, 0.7076, 0.7083, 0.7090, 0.7097, 0.7104, 0.7111, 0.7125, 0.7132, 0.7139, 0.7146, 0.7153, 0.7160, 0.7167, 0.7174, 0.7181, 0.7188, 0.7194,
0.7201, 0.7208, 0.7215, 0.7222, 0.7229, 0.7236, 0.7243, 0.7250, 0.7257, 0.7264, 0.7271, 0.7278, 0.7285, 0.7292, 0.7299, 0.7306, 0.7313, 0.7313, 0.7319, 0.7326,
0.7333, 0.7340, 0.7347, 0.7354, 0.7361, 0.7368, 0.7375, 0.7382, 0.7382, 0.7389, 0.7396, 0.7403, 0.7410, 0.7417, 0.7424, 0.7424, 0.7431, 0.7438, 0.7444, 0.7451,
0.7458, 0.7458, 0.7465, 0.7472, 0.7479, 0.7486, 0.7493, 0.7493, 0.7500, 0.7507, 0.7514, 0.7521, 0.7528, 0.7528, 0.7535, 0.7542, 0.7549, 0.7556, 0.7563, 0.7563,
0.7569, 0.7576, 0.7583, 0.7590, 0.7590, 0.7597, 0.7604, 0.7611, 0.7618, 0.7625, 0.7625, 0.7632, 0.7639, 0.7646, 0.7653, 0.7660, 0.7660, 0.7667, 0.7674, 0.7681,
0.7688, 0.7694, 0.7694, 0.7701, 0.7708, 0.7715, 0.7722, 0.7729, 0.7729, 0.7736, 0.7743, 0.7750, 0.7757, 0.7764, 0.7764, 0.7771, 0.7778, 0.7785, 0.7792, 0.7792,
0.7799, 0.7806, 0.7813, 0.7813, 0.7819, 0.7826, 0.7833, 0.7833, 0.7840, 0.7847, 0.7847, 0.7854, 0.7854, 0.7861, 0.7868, 0.7868, 0.7875, 0.7875, 0.7882, 0.7882,
0.7889, 0.7889, 0.7896, 0.7896, 0.7903, 0.7903, 0.7903, 0.7910, 0.7910, 0.7910, 0.7917, 0.7917, 0.7917, 0.7917, 0.7924, 0.7924, 0.7924, 0.7924, 0.7924, 0.7924,
0.7924, 0.7924, 0.7924, 0.7924, 0.7924, 0.7924, 0.7917, 0.7917, 0.7917, 0.7917, 0.7910, 0.7910, 0.7910, 0.7903, 0.7903, 0.7903, 0.7896, 0.7896, 0.7889, 0.7889,
0.7882, 0.7875, 0.7875, 0.7868, 0.7861, 0.7861, 0.7854, 0.7847, 0.7847, 0.7840, 0.7833, 0.7826, 0.7819, 0.7813, 0.7806, 0.7799, 0.7792, 0.7785, 0.7778, 0.7771,
0.7764, 0.7757, 0.7750, 0.7743, 0.7736, 0.7729, 0.7722, 0.7715, 0.7701, 0.7694, 0.7688, 0.7681, 0.7667, 0.7660, 0.7653, 0.7646, 0.7632, 0.7625, 0.7618, 0.7604,
0.7597, 0.7590, 0.7576, 0.7569, 0.7556, 0.7549, 0.7542, 0.7528, 0.7521, 0.7507, 0.7500, 0.7493, 0.7479, 0.7472, 0.7458, 0.7451, 0.7438, 0.7431, 0.7417, 0.7410,
0.7396, 0.7389, 0.7375, 0.7368, 0.7361, 0.7347, 0.7340, 0.7326, 0.7319, 0.7306, 0.7299, 0.7285, 0.7278, 0.7264, 0.7257, 0.7250, 0.7236, 0.7229, 0.7215, 0.7208,
0.7201, 0.7188, 0.7181, 0.7167, 0.7160, 0.7153, 0.7139, 0.7132, 0.7125, 0.7111, 0.7104, 0.7097, 0.7090, 0.7076, 0.7069, 0.7063, 0.7056, 0.7049, 0.7035, 0.7028,
0.7021, 0.7014, 0.7007, 0.7000, 0.6993, 0.6986, 0.6979, 0.6972, 0.6965, 0.6958, 0.6951, 0.6944, 0.6938, 0.6938, 0.6931, 0.6924, 0.6917, 0.6917, 0.6910, 0.6903,
0.6903, 0.6896, 0.6889, 0.6889, 0.6882, 0.6882, 0.6882, 0.6875, 0.6875, 0.6868, 0.6868, 0.6868, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861,
0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6861, 0.6868, 0.6868, 0.6868, 0.6868, 0.6875, 0.6875, 0.6882, 0.6882, 0.6889, 0.6889, 0.6896, 0.6896, 0.6903,
0.6903, 0.6910, 0.6917, 0.6917, 0.6924, 0.6931
};
Ambient ambient;
WiFiClient client;
void setup() { //
int waiting = 0; // アクセスポイント接続待ち用
pinMode(PIN_LED, OUTPUT);
digitalWrite(PIN_LED, HIGH); // LED点灯
Serial.begin(115200); // 動作確認のためのシリアル出力開始
Serial.println();Serial.println("Upload Analemma test data"); //
WiFi.mode(WIFI_STA); // 無線LANをSTAモードに設定
// 固定IPアドレスの設定 IP Address, Gate way, Subnet mask の順に指定
WiFi.config(IPAddress(192, 168, 0, 27), IPAddress(192, 168, 0, 1), IPAddress(255, 255, 255, 0));
WiFi.begin(SSID, PASS); // 無線LANアクセスポイントへ接続
while (WiFi.status() != WL_CONNECTED) { // 接続に成功するまで待つ
delay(100); // 待ち時間処理
waiting++; // 待ち時間カウンタを1加算する
if (waiting % 10 == 0)Serial.print('.'); // 進捗表示
if (waiting > 300) sleep(); // 300回(30秒)を過ぎたらスリープ
}
Serial.println(WiFi.localIP()); // 本機のIPアドレスをシリアル出力
ambient.begin(AmbientChannelId, AmbientWriteKey, &client); // Ambient開始
}
void loop() {
char s[10];
float fdata;
for (int i = 0; i <= 365; i++) {
dtostrf(i + 1, 4, 0, s); // floatを右詰めの文字列に変換
Serial.print(s); Serial.print(", ");
ambient.set(1, s); // data1: 日付連番 (1月1日 = 1)
dtostrf(t1[i], 6, 4, s);
Serial.print(s); Serial.print(", ");
ambient.set(2, s); // data2: 日の出時刻
dtostrf(t2[i], 6, 4, s);
Serial.print(s); Serial.print(", ");
ambient.set(3, s); // data3: 日の入り時刻
fdata = t2[i] - t1[i];
dtostrf(fdata, 6, 4, s);
Serial.print(s); Serial.print(", ");
ambient.set(4, s); // data4: 昼の長さ
fdata = (t2[i] + t1[i]) / 2.0; // 日の出入りの中央が南中時刻と見なす
dtostrf(fdata, 6, 4, s);
Serial.println(s);
ambient.set(5, s); // data5: 南中時刻
ambient.send(); // Ambientへ送信
delay(10000); // 5秒以上待つ
}
delay(500000); // 適当に待つ
}
void sleep() {
delay(200); // 送信待ち時間
ESP.deepSleep(SLEEP_P, WAKE_RF_DEFAULT); // スリープモードへ移行する
while (1) { // 繰り返し処理
delay(100); // 100msの待ち時間処理
} // 繰り返し中にスリープへ移行
}
1年分の日の出と日の入り時刻のデーターを浮動小数点形式で配列で定義しています。これだけで3kバイト近いデーター量になりますが、ESP8266はメモリ容量が大きいのでこういう乱暴ができるので楽ちんです。なお、このプログラムでは1年分の日の出/日の入り時刻などのデーターを Ambient に送信しています。この時5秒以上間隔を空ける必要があるので、余裕をみて10秒間隔で送信しています。
あと、ESP8266を安全に停止させる方法が判らなかったので、122行のdelayで適当に一時停止させているので、ここでケーブルを抜いてデーターの送信を止めます。なお、単純な無限ループに入れて止めると、ゾンビのように復活してきます。
▼実行結果(シリアルモニタ)

◆まとめ
ということで出力先は Ambient でいけそうです。外の明るさを見るセンサー(実際には30Wの太陽光発電パネル)からESP8266までの配線は済んでいるので、あとはソフトだけ書けば完成するはずです。やり始めればけっこう速いはずなのですが、なかなか集中してやっている時間が無い (というかあれこれ浮気して集中していない)のが悩みです。冬至までに何とかしたいと思っているのですが、残り時間はあまりありません。