google-site-verification: google3bd66dd162ef54c7.html

日の出、日の入り時刻からアナレンマを描く(Ambientに描くテスト)

 久しぶりの記事の更新です。このところ書くネタが無くて困っています。

 で今回は、前回に引き続き日の出、日の入り時刻からアナレンマを描く話です。アナレンマ(もどき)の出力先として Ambient を使うと、結果がリアルタイムで見れるので便利なはずです。とは言っても、どういう感じの出力になるのか事前に確かめておかないと不安です。何しろ全部の作図には1年かかる訳で、途中で「こんなはずじゃなかった、」なんてことになると困ります。

 ということで、ダミーのデーターを Ambient に登録して、どんな感じのグラフになるか確認してみました。ちなみにアナレンマのグラフは散布図で書くのですが、調べた限りでは散布図が描けるのは今のところ Ambient だけのようでした。

 ダミーのデーターと言っても、使ったのはこの前の記事で使った国立天文台から公開されている日の出/日の入りのデーターです。つまりこれは測定誤差が無い理想的なデーターということになります。このデーターを予備加工し、ESP8266を経由してAmbientに送って作図したのが以下のグラフです。

▼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までの配線は済んでいるので、あとはソフトだけ書けば完成するはずです。やり始めればけっこう速いはずなのですが、なかなか集中してやっている時間が無い (というかあれこれ浮気して集中していない)のが悩みです。冬至までに何とかしたいと思っているのですが、残り時間はあまりありません。

日の出、日の入り時刻からアナレンマを描く(基本検討)

 アナレンマ(Analemma)とは、均時差によって1年のうちに太陽の位置が8の字型を描いて運動する現象のことなのですが、文章だと判り難いので詳しくはリンク先のWikiのページなどをご覧ください。

 電子工作を中心に書いているこのブログのタイトルの言葉としてはちょっと唐突なのですが、最終的にはマイコン工作の方向にもって行くつもりです。(たぶん)

 さて、和時計作りや太陽光発電をやっていると、正午の太陽の位置がけっこう変化していることに気付きます。これは均時差による太陽位置の変動によるもので、これを視覚的に判りやすく表現したものがアナレンマです。ただこれは撮影に1年かかるし、やっかいな問題がいっぱいあるので簡単に撮影出来るものではありません。(ドライブレコーダーをうまく使えば案外簡単かも知れません)

 アナレンマの写真は太陽の二次元の位置を記録していることになりますが、これをもっと簡単な仕掛けで表現出来ないか考えてみます。すると、日の出と日の入りの時刻の情報から同じような図形が書けそうな気がしてきました。

◆日の出/日の入りと南中時刻の関係
明るさの変化
 日の出の時刻 (t1) と日の入り時刻 (t2) より以下の式で太陽の南中時刻と太陽高度が計算出来るはずです。また、昼間の時間が長いほど南中時の太陽高度は高いはずです。
 ・南中時刻 = (t1 + t2 ) / 2
 ・太陽高度 = k * ( t2 - t1 )       kは適当な係数

 太陽の方位角を測定するのは大変ですが、日の出/日の入り時刻なら屋外の明るさを見ているだけでいいので簡単そうです。でも 本当にこんな方法でいけるのでしょうか。何か考え違えをしているとまずいので、国立天文台の暦計算室の各地のこよみのデーターで確認してみます。

▼日の出入りのデーター (@東京)
日の出/日の入りデータ
 これは、2016年の東京の日の出入りのデーターで、1年分ありますがその先頭部分だけ表示しています。右の二列はこちらで計算して追加したもので、上の式で求めた南中時刻と、太陽高度の相対値です。

 このデーターからアナレンマの図を書いてみたのが以下の図です。なお、アナレンマの定義が一定の時刻における天空における太陽の位置、つまり方位角で表すという決まりなら、以下の図は誤りです。以下の図の横軸は時刻になっています。また縦軸も太陽の高度ではありません。

 まずは「各地のこよみ」のデーターを使った、太陽の南中時刻と高度の関係です。

▼南中時刻と太陽高度の関係
南中時刻と高度でアナレンマ
 ちゃんとアナレンマの8の字になっています。但し、本来のアナレンマとは画面のデイメンジョンが違うのでこの図では横長になっています。あと、上が少し右にスライドしていますが、このあたりの話はややこしくなるので今回は省略します。

▼昼の中心時刻と昼間の時間
昼の時間からアナレンマ
 日の出/日の入り時刻の情報だけを使っても上の図と同じ8の字が書けています。この図の元データーは地球の軌道から計算で求めたものだと思いますが、これを実測データーでプロットするとどうなるか、興味深いところです。

◆まとめ
 日の出/日の入り時刻の情報だけでアナレンマ(もどき?)の図を書くことが出来そうな気がしてきました。日の出/日の入りは屋外の明るさを検出することで簡単に検出出来るはずです。また時刻情報もマイコンを使えば何とかなるので無人観察でいけるはずです。

 とは言っても、天候や地形の影響でデーターに誤差が入り理論通りの結果にはならないと思います。それでもアナレンマの8の字の確認が出来るかどうか、これは実際にやってみるしか無いでしょう。

 ということで自然科学の実験やマイコンの応用として面白そうなので具体的にどうやればいいか、検討を始めたいと思います。とりあえず以下の点がポイントだと思います。

1. 時刻は1年経っても1分以内の誤差に収める必要があるので、NTPかGPS、あるいは電波時計を使う必要がありそう。

2. 結果はどこかのWebに投げてリアルタイムで表示更新(と言っても一日一回)させたい。但し途中でエラーなどが発生した場合でもデーターを失わない仕掛けが必要。綺麗な図を出力させるために、EXCELにもデーターを喰わせたい。

3. 出来るだけ簡単なハードで消費電力も出来るだけ少なくしたい。

4. 天候などの影響で実際の日の出、日の入りの検出結果が大きくばらつく可能性があり、アナレンマの8の字の確認が難しくなる恐れがある。平均化、あるいは1日が24時間という知識を使って誤差の影響を減らす手も。

ESP8266のアナログリードで嵌る

 久しぶりの更新です。実は、以前に、ESP8266のアナログポートの挙動がおかしい、という記事を書いたのですが、この問題を何とか解決出来ないかいろいろ試していたのですが、どうしてもうまくいかなくて時間だけ経ってしまいました。

 このまま続けても解決出来そうに無い感じなので、ここまでにやってみたことを書いておこうと思います。まあ、頭の整理をしつつ自分へのメモ代わりを兼ねています。

 問題になっている環境は、ESP-WROOM-02 (ESP8266) を Arduino の IDE(1.6.5)で実行した場合で、現象としてはsystem_adc_read(); を高速で繰り返し呼ぶと実行時間が短くなることがあるというものです。ちゃんとAD変換やった結果ならそれでもいいのですが、どうもAD変換を実際にやらないで、単に以前の値を返してきている疑いがあります。

 詳しい現象は以前の記事を見ていただくとして、おっと今回試したのは以前の記事の最後に書いた for ループで回数を指定してAD変換を実行させた場合の話です。

 以下のようなプログラムでテストしました。AD変換がうまくいかない現象の対策として、割り込みを禁止したり、タイミングを調整したりいろいろやったのですが、全部ダメでした。コメントに 対策・・・・ と書いてあるのが試した内容の痕跡です。

◆テストプログラム
/* ESP8622-WROOM-02
* アナログデーターを高速で連続読み取りするテスト
* 2016/10/30 ラジオペンチ
* 最初は良いが、15から35回くらい繰り返すとAD変換しないで
* 値を返してくる場合がある。(実行時間が短い)
*
*/
int dataNN = 0;
int dataN, AdcData;
long SumAdc, SumAdc2;
unsigned long TimeStart, TimeElapsed;

//ESP-WROOM-02でアナログ入力をするための設定
extern "C" { // ADCを使うためのおまじない
#include "user_interface.h"
}

void setup() {
// noInterrupts(); // 対策テスト、割り込み禁止
Serial.begin(115200);
pinMode(13, OUTPUT); // 観察用ポート
loops(); // 自前のloopで実行
}

void loops() { // loop()では無い場所でループ
for (;;) {
dataN = 0; SumAdc = 0; SumAdc2 = 0; // 変数初期化
dataNN++;
digitalWrite(13, HIGH);
//system_timer_reinit(); // ダメ対策 タイマー初期化
wdt_disable(); // ダメ対策 WDT禁止
TimeStart = micros();
for (int i = 0; i < 1058; i++) { // 約100msのループを実行
// __asm__ __volatile__ ("nop"); // 対策 nopでタイミング調整
// __asm__ __volatile__ ("nop");
noInterrupts(); // 対策 割り込み禁止
delayMicroseconds(100); // 対策 delayMicrosecondsでタイミング調整
AdcData = system_adc_read(); // アナログ電圧読み出し
// AdcData = 700; // 固定値代入テスト
// Interrupts(); // 対策 でもこんな関数無かった
// __asm__ __volatile__ ("nop");
// __asm__ __volatile__ ("nop");

SumAdc = SumAdc + AdcData; // ΣXi
SumAdc2 = SumAdc2 + AdcData * AdcData; // ΣXi^2
dataN++; //
}
TimeElapsed = micros() - TimeStart; // ループ通過時間を求める
delay(10); // 対策 シリアル出力前にちょっと待つ
digitalWrite(13, LOW);
Serial.print(dataNN); Serial.print(", "); // 平均値
Serial.print(SumAdc / dataN); Serial.print(", "); // 平均値
Serial.print(sqrt(SumAdc2 / dataN)); Serial.print(", "); // 実効値
Serial.print(TimeElapsed); Serial.print(", "); // 測定時間
Serial.println(dataN); // ループ回数

delay(400); // 適当に待つ
}
}

void loop() {
delay(1); // 対策 意味の無いdelay
}

 どうやってもリセット後ある程度の時間経過後、具体的には数秒以上経つとAD変換の実行時間が短い場合が発生します。裏にデーモンのようなプロセスが走っていてそいつが悪さをしている気がします。

 この現象の対策につきいろいろ検索しているのですが、うまい情報がヒットしません。system_adc_read() の中で何をやっているのか調べた方が早いのかも知れません。

 あるいは、いつまでもやっていてもダメそうなので、外付けのADCを使った方が早道なのかも知れません。んと、これは7月頃に考えていた話で、ちっとも進歩してません。トホ、
カレンダー
11 | 2016/12 | 01
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
カテゴリ
最新記事
最新コメント
この記事内へのリンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード