飯田 百葉箱センサー修理

■飯田の百葉箱

温湿度気圧センサーBME280が壊れたので、Aliexpressで再購入して交換したところ、米国のNIST(https://tf.nist.gov/tf-cgi/servers.cgi)からの時間が取得できない。あるいは時々データが取れるが不安定である。(それで、富士見の雨量データも日付がずれているのだ・・・。)

しかし、ネット検索してもNISTのタイムサーバーに問題があるような記事は見当たらない。さて困ったとさらにネット検索すると、日本のNICTもタイムサーバーを公開していることがわかった。(参考URL:http://arms22.blog91.fc2.com/blog-entry-445.html)

そこで、ArduinoのProgramを下記のように書き換えたところ、正常に時刻を取得することができた。ただ、いつタイムサービスが終了するからわからないので、定期的な確認が必要かも。

   ///// execute NTP HTTP PHP every 120sec (2min)////
   /////----------------------------------------------------------------------
  
   if ( millis() - lastSendPacketTime > 120000 ){
    // NTPサーバへ時刻リクエストを送信
    sendNTPpacket(timeServer);<a href="http://miyasan.sakura.ne.jp/wordpress/wp-content/uploads/2018/11/tcave_temp.png"><img class="alignnone size-full wp-image-6753" src="http://miyasan.sakura.ne.jp/wordpress/wp-content/uploads/2018/11/tcave_temp.png" alt="" width="800" height="600" /></a>
    // 時間を更新
    lastSendPacketTime = millis();

    // NTPサーバからのパケット受信
    if ( Udp.parsePacket() ) {
    // バッファに受信データを読み込む
      Udp.read(packetBuffer, NTP_PACKET_SIZE);

    // 時刻情報はパケットの40バイト目からはじまる4バイトのデータ
      unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
      unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);

    // NTPタイムスタンプは64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)
    // 1900年1月1日0時との相対的な差を秒単位で表している
    // 小数部は切り捨てて、秒を求めている
      unsigned long secsSince1900 = highWord << 16 | lowWord;
      Serial.print("Seconds since Jan 1 1900 = " );
      Serial.println(secsSince1900);

    // NTPタイムスタンプをUNIXタイムに変換する
    // UNITタイムは1970年1月1日0時からはじまる
    // 1900年から1970年の70年を秒で表すと2208988800秒になる
      const unsigned long seventyYears = 2208988800UL;
    // NTPタイムスタンプから70年分の秒を引くとUNIXタイムが得られる
      unsigned long epoch = secsSince1900 - seventyYears; 
      Serial.print("Unix time = ");
      Serial.println(epoch);

    // Timeライブラリに時間を設定(UNIXタイム)
    // 日本標準時にあわせるために+9時間しておく
      setTime(epoch + (9 * 60 * 60));

      Serial.print("JST is ");
      Serial.print(year());
      Serial.print('/');
      Serial.print(month());
      Serial.print('/');
      Serial.print(day());
      Serial.print(' ');
      Serial.print(hour());
      Serial.print(':'); 
      Serial.print(minute());
      Serial.print(':'); 
      Serial.println(second());
      Serial.println();
    }      

//-------------------------------------------------------------
// send an NTP request to the time server at the given address 
unsigned long sendNTPpacket(IPAddress& address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE); 
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49; 
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  // NTP requests are to port 123
  Udp.beginPacket(address, 123);
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}
 

 

■横穴と池の水の温度トレンド

昨年10月に作成した温度計の1年分のデータを整理してみた。(計測間隔1分のデータを1時間ごとに平均化してプロット)

赤線:外気温、青線:池の底の温度、緑色:横穴内の温度
・横穴の温度は11~18度。外気温の変化に対して約1か月から40日遅れての変化を示す。
・水温の範囲は4~28度。

 

 

カテゴリー: 歳時記, Arduino パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です