hiro yamamoto works

ESP8266 Web logger
RaspberryPi HiRes Audio
Mini Solar power system
当ブログ掲載内容は無保証です。利用は自己責任でお願いいたします。

 

カレンダー

2021
June
Sun Mon Tue Wed Thu Fri Sat
    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      

QRコード

検索



このブログを検索

カウンター

本日のアクセス
昨日のアクセス
総アクセス数

ブログサービス

Powered by

teacup.ブログ
RSS

調査中NTPで取得した時刻をRTCへセットする(ESP32)

ESP-WROOM-32でやってみました。
調査結果により書き直したので、記事タイトルと内容に
ズレがあります。

調べてわかったこと

起動時のNTP時刻取得後は、1時間毎のgetLocalTime()時に
NTP時刻同期していました。
よって、提供される時刻の精度は問題ないと思われます。
つまり、NTP又はネットワーク内タイムサーバに接続できる
環境なら、RTCモジュール追加の必要はない?
かもしれません。タイムサーバ接続不可能な環境で使うなら
RTCは有ったほうが良いと思います。

getLocalTime()
ローカル時刻を取得する。
失敗時10ms毎に取得繰返し5000mS(デフォルト)でタイムアウト
取得成功でtrue返す。失敗でfalse返す。
例 getLocalTime(&timeinfo, 5000)

getLocalTime()後のsntp_get_sync_statusをシリアルモニタ
表示してみた。
クリックすると元のサイズで表示します
前半 10分間隔 後半 11分間隔でgetLocalTime()してます。
約60分毎に sntp_get_sync_status = COMPLETED とあります。

スケッチ例 「SimpleTime」で実験中
(ESP32 Dev Module用のスケッチ例 ESP32→TIME→SimpleTime)

コメントとテストを追記したスケッチ
WiFi.disconnect(true);とWiFi.mode(WIFI_OFF);の2行は
接続を継続するため無効にしました。
include行は < から < へ修正して下さい。
#include <WiFi.h>
#include "time.h"

const char* ssid = "my-ssid";
const char* password = "my-password";

const char* ntpServer = "pool.ntp.org"; // NTPサーバ,IP Address指定できるか?
const long gmtOffset_sec = 9 * 3600; // 時差を秒で設定・・・9時間
const int daylightOffset_sec = 0; // サマータイム設定・・・0

void printLocalTime() {
//追記 NTP同期確認のため ・・・COMPLETEDで同期完了と思う
if (sntp_get_sync_status() == SNTP_SYNC_STATUS_COMPLETED) {
Serial.println("sntp_get_sync_status = COMPLETED");
}
struct tm timeinfo;
if (!getLocalTime(&timeinfo, 5000)) {
// コメント追記 タイムアウトデフォルト5000mS
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %m %d %Y %H:%M:%S");
// コメント追記 A 曜日英語表記,B 月英語表記,m 月の数字,d 日,Y 年,H時:M分:S秒
}

void setup() {
Serial.begin(115200);

//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");

//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();

//disconnect WiFi as it's no longer needed
//WiFi.disconnect(true); //無効にしました
//WiFi.mode(WIFI_OFF); // 無効にしました
}

void loop() {
//delay(1000); // 無効にしました
printLocalTime();
delay(660000); // 追記しました
}

(スケッチ例を公開している方々に感謝します。)
RTC時刻合わせするスケッチもよかったらどうぞ
#include <WiFi.h>
#include "time.h"
#include <Wire.h>
#include <RTClib.h>

const char* ssid = "my-ssid";
const char* password = "my-password";

const char* ntpServer = "pool.ntp.org"; // pool.ntp.org
const long gmtOffset_sec = 9 * 3600; // 時差を秒で設定・・・9時間
const int daylightOffset_sec = 0; // サマータイム設定・・・0

unsigned long interval_t = 60000 * 60 * 1; // 60000(mS)*60*1=1h 1000*60mS=60000(1min)
unsigned long previousMillis_t = 0;
unsigned long previous_t = 0;

char date_ymdhms[21]; // yyyy/mm/dd,hh:mm:ssn0

RTC_DS3231 rtc;//select use RTC DS3231

void printLocalTime() {
//時間同期のステータスを取得します。
//更新が完了すると、ステータスはSNTP_SYNC_STATUS_COMPLETEDとして返されます。
if (sntp_get_sync_status() == SNTP_SYNC_STATUS_COMPLETED) {
Serial.println("sntp_get_sync_status = COMPLETED");
}
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %m %d %Y %H:%M:%S");
}

void setup() {
Serial.begin(115200);
Wire.begin();

//connect to WiFi
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" CONNECTED");

//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();

if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
struct tm timeInfo;
if (!getLocalTime(&timeInfo)) {
/* 失敗 メッセージ表示 コンパイル時刻をRTCへセット 成功 取得時刻をRTCへセット */
Serial.println("Failed to obtain time Set to compile time"); rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // コンパイル日時を仮設定
DateTime now = rtc.now();
sprintf(date_ymdhms, "%04d/%02d/%02d,%02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
Serial.println(date_ymdhms);
} else {
rtc.adjust(DateTime(timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday,
timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec));
//tm_year:1900年からの年数 tm_mon:1月からの月数
Serial.println("adjust RTC !!");
DateTime now = rtc.now();
sprintf(date_ymdhms, "%04d/%02d/%02d,%02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
Serial.println(date_ymdhms);
}
}
//disconnect WiFi as it's no longer needed
//WiFi.disconnect(true);
//WiFi.mode(WIFI_OFF);
}

void loop() {
unsigned long currentMillis_t = millis();
if (currentMillis_t - previousMillis_t >= interval_t) {
previousMillis_t = currentMillis_t;
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
rtc.adjust(DateTime(timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday,
timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec));
//tm_year:1900年からの年数 tm_mon:1月からの月数
Serial.println("adjust RTC !!");
} else {
Serial.println("Failed to obtain time");
}
}
//delay(60000);
unsigned long current_t = millis();
if (current_t - previous_t >= 60000 * 10) {
previous_t = current_t;
printLocalTime();
DateTime now = rtc.now();
sprintf(date_ymdhms, "%04d/%02d/%02d,%02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
Serial.println(date_ymdhms);
}
}

(スケッチ例を公開している方々に感謝します。)
無保証自己責任でよろしくおねがいします。
0
タグ: ESP32_Arduino
投稿者:管理人

RasPi OSでSeeeduino XIAO「書き込み中にエラーが発生しました」

お気に入りアイテムSeeeduinoXIAO
CPU: 256KB Flashと2KB SRAMを搭載したARM® Cortex®-M0+ 32bit 48MHz マイクロコントローラー(SAMD21G18)

RasberryPi OSでは問題発生しますが、
Windows10 PCでは何も問題なく使えます。

Raspberry Pi OSや、Raspberry Pi Desktop(intelCPU PC)で
書き込み中エラーや、シリアルポートが認識されなくなる。
シリアルモニタを閉じると書き込んだスケッチが消える?
困っています。

結論
WindowsPCを使う


継続調査の情報です。
Raspberry Pi OSでのスケッチ消失は、
ポート/dev/ttyACMx Seeeduino XIAOをシリアルモニタで
使わなければ大丈夫のようです。

シリアルモニタをみたいときは
@Serial1を使う(SerialUSBをSerial1に書き換える)
AUSB-SERIAL変換をつなぐ
 6pin(TX)→RXD 7pin(RX)→TXD GND→GND
B別のシリアルターミナルを使う
(GtkTermというのがあったので使いました。)

Raspberry Pi Desktop(intelCPU PC)では
USBケーブルの抜き挿しで回復できました。?
たまたまかも知れません。

RaspbrryPiでの不思議な現象
シリアルポートが認識されなくなった時
media/PiにArduinoという空フォルダがでていて解除できない。
SeeeduinoXIAOのUSBを抜いてもそのまま残る。

回復できた方法
@もう一度書き込んでみる。
AUSBケーブルを抜き挿ししてみる。
BUSBポートを変えてみる。
CSeeeduinoXIAOのリセットしてみる
(リセットパッドを2回ショート)
DRaspberryPiを再起動する。
再起動で一旦書き込めるようになるが、次の書き込みで
また発生することがあるので作業性悪い。

環境
Raspberry 4B 4GB Raspberry OS
NEC PCVJ27 OS:Raspberry Pi Desktop
Arduino IDE 1.8.15(1.8.13でも発生)
ボードマネージャ1.8.1
(1.7.9等他のバージョンでも発生していたようだ。)


スクリーンショット
「書き込み中にエラーが発生しました」
クリックすると元のサイズで表示します

「マイコンボードへ書き込んでいます」で
ArduinoIDEがしばらくフリーズし回復後
XIAOのシリアルポートが認識されなくなる。
オレンジLED速い点滅 リセットしても変わらない
クリックすると元のサイズで表示します

RaspbrryPi再起動したらオレンジLEDゆっくり点滅へ変わった。
ArduinoIDEを起動してシリアルポート確認すると、
XIAOのシリアルポートが認識されている。
書き込みができた。

正常に書き込めた時のスクリーンショット
クリックすると元のサイズで表示します
0
投稿者:管理人
1 | 《前のページ | 次のページ》
/1 
 
AutoPage最新お知らせ