2021/12/26
サポートボードとしてM5Core2を追加した。
2021/12/25
初版
NTPによる時刻設定(M5StickC_Plus, M5CoreInk, M5Core2)
NTPによる時刻設定(M5StickC_Plus, M5CoreInk, M5Core2)
概要
M5StickC_Plus, M5CoreInk, M5Core2は、RTC内蔵されており電源オフでも時刻を保存している。ここでは、NTPに時刻設定するスケッチを紹介する。
「M5StickCのRTCをNTPサーバーからセットする」のスケッチを参考にして、M5StickC_Plus, M5CoreInk,M5Core2用に修正する。ソースは共通になっており、platformio.iniの内容で切り替えてビルドする。
ソース
以下のようにソースを修正する:
src/main.ino
//#define M5CI
//#define M5C2
//#define M5STICK_CP
#ifdef M5STICK_CP
//#include <M5StickC.h>
#include <M5StickCPlus.h>
#endif
#ifdef M5C2
#include <M5Core2.h>
#endif
#ifdef M5CI
#include "M5CoreInk.h"
#endif
#include <WiFi.h>
#include "time.h"
#ifdef M5CI
Ink_Sprite InkPageSprite(&M5.M5Ink);
char titleStrbuff[64];
char ntpStrbuff[64];
char dateStrbuff[64];
char weekStrbuff[64];
char timeStrbuff[64];
#endif
const char* ssid = "your_ssid";
const char* password = "your_password";
const char* ntpServer = "ntp.jst.mfeed.ad.jp";
RTC_TimeTypeDef RTC_TimeStruct;
RTC_DateTypeDef RTC_DateStruct;
void setup() {
#ifdef M5CI
M5.begin();
if( !M5.M5Ink.isInit())
{
Serial.printf("Ink Init faild");
}
M5.M5Ink.clear();
delay(1000);
//creat ink refresh Sprite
if( InkPageSprite.creatSprite(0,0,200,200,true) != 0 )
{
Serial.printf("Ink Sprite creat faild");
}
#endif
#ifndef M5CI
// put your setup code here, to run once:
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextSize(1);
M5.Lcd.setCursor(40, 0, 2);
M5.Lcd.println("RTC NTP TEST");
#endif
// 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");
// Set ntp time to local
configTime(9 * 3600, 0, ntpServer);
// Get local time
struct tm timeInfo;
if (getLocalTime(&timeInfo)) {
#ifndef M5CI
M5.Lcd.print(" NTP : ");
M5.Lcd.println(ntpServer);
#endif
// Set RTC time
RTC_TimeTypeDef TimeStruct;
TimeStruct.Hours = timeInfo.tm_hour;
TimeStruct.Minutes = timeInfo.tm_min;
TimeStruct.Seconds = timeInfo.tm_sec;
#ifndef M5CI
M5.Rtc.SetTime(&TimeStruct);
#endif
#ifdef M5CI
M5.rtc.SetTime(&TimeStruct);
#endif
RTC_DateTypeDef DateStruct;
DateStruct.WeekDay = timeInfo.tm_wday;
DateStruct.Month = timeInfo.tm_mon + 1;
DateStruct.Date = timeInfo.tm_mday;
DateStruct.Year = timeInfo.tm_year + 1900;
#ifdef M5STICK_CP
M5.Rtc.SetData(&DateStruct);
#endif
#ifdef M5C2
M5.Rtc.SetDate(&DateStruct);
#endif
#ifdef M5CI
M5.rtc.SetData(&DateStruct);
#endif
}
//disconnect WiFi
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop() {
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
#ifndef M5CI
// put your main code here, to run repeatedly:
M5.Rtc.GetTime(&RTC_TimeStruct);
#ifdef M5STICK_CP
M5.Rtc.GetData(&RTC_DateStruct);
#endif
#ifdef M5C2
M5.Rtc.GetDate(&RTC_DateStruct);
#endif
M5.Lcd.setCursor(0, 30);
M5.Lcd.printf(" Date: %04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
M5.Lcd.printf(" Week: %s\n", wd[RTC_DateStruct.WeekDay]);
M5.Lcd.printf(" Time: %02d : %02d : %02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
#endif
#ifdef M5CI
// put your main code here, to run repeatedly:
M5.rtc.GetTime(&RTC_TimeStruct);
M5.rtc.GetData(&RTC_DateStruct);
sprintf(titleStrbuff,"RTC NTP TEST");
sprintf(ntpStrbuff,"NTP:%s", ntpServer);
sprintf(dateStrbuff,"Date: %04d-%02d-%02d",
RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date);
sprintf(weekStrbuff,"Week: %s", wd[RTC_DateStruct.WeekDay]);
sprintf(timeStrbuff,"Time: %02d : %02d : %02d",
RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
InkPageSprite.clear();
InkPageSprite.drawString(5,5,titleStrbuff);
InkPageSprite.drawString(5,20,ntpStrbuff);
InkPageSprite.drawString(5,35,dateStrbuff);
InkPageSprite.drawString(5,50,weekStrbuff);
InkPageSprite.drawString(5,65,timeStrbuff);
InkPageSprite.pushSprite();
#endif
delay(500);
}
以下は、自分の環境に合わせて修正すること:
const char* ssid = "your_ssid";
const char* password = "your_password";
const char* ntpServer = "ntp.jst.mfeed.ad.jp";
M5StickC_Plus, M5CoreInk. M5Core2用は以下のようになり、ビルドのターゲットに合わせて内容を変更してビルドする。
M5StickC_Plus用:
platformio.ini
[env:M5StickCPlus]
platform = espressif32
board = m5stick-c
framework = arduino
build_flags = -DM5STICK_CP
monitor_speed = 115200
lib_ldf_mode = deep+
lib_deps =
m5stack/M5StickCPlus @ ^0.0.5
tinyu-zhao/FFT @ ^0.0.1
m5stack/UNIT_ENV @ ^0.0.2
adafruit/Adafruit BMP280 Library @ ^2.5.0
adafruit/Adafruit Unified Sensor @ ^1.1.4
M5CoreInk用:
platformio.ini
[env:M5CoreInk]
platform = espressif32
board = m5stick-c
framework = arduino
build_flags = -DM5CI
upload_poert = /dev/ttyUSB0
monitor_speed = 115200
lib_deps =
m5stack/M5-CoreInk @ ^0.0.2
knolleary/PubSubClient @ ^2.8
m5stack/UNIT_ENV @ ^0.0.2
lib_ldf_mode = deep+
M5Core2用:
platformio.ini
[env:m5core2]
platform = espressif32
board = m5stack-core2
framework = arduino
upload_speed = 2000000
monitor_speed = 115200
board_build.partitions = default_16MB.csv
build_flags =
-DM5C2
-DCORE_DEBUG_LEVEL=4
-DBOARD_HAS_PSRAM
-mfix-esp32-psram-cache-issue
lib_deps =
https://github.com/m5stack/M5Core2.git
https://github.com/FastLED/FastLED
;https://github.com/m5stack/M5Core2/blob/master/examples/core2_for_aws/ArduinoECCX08.zip
lovyan03/LovyanGFX
adafruit/Adafruit BMP280 Library @ ^2.5.0
adafruit/Adafruit Unified Sensor @ ^1.1.4
m5stack/UNIT_ENV @ ^0.0.2
lib_ldf_mode = deep+
なお、ファイルとして、default_16MB.csvが必要になる。
以下の手順でダウンロードすること:
wget https://github.com/espressif/arduino-esp32/blob/master/tools/partitions/default_16MB.csv
動作
ビルドして起動するとNTP同期した時刻が表示される。
一回動かせば時刻が設定されるので、他のスケッチを書き込んでも、設定された時刻が保存される。
参考情報
platformio関連:
arduinoフレームワーク用platformio.ini集
Building Core2 FactoryDemo in PlatformIO
VSCodeとPlatformIOでM5Stack Core2開発
M5Stack Core2とVSCode + PlatformIOとでM5Stackプログラミングを始めてみた。
Arduino-IDE関連:
Arduino IDE environment - M5Paper
Arduino IDEのインストールと設定 (Windows, Mac, Linux対応)
M5Stackファミリ関連:
M5Core2 Arduino Install
M5Paper Arduino Install
M5CoreInk Arduino Install
M5Stamp-PICO Arduino Install
M5Stamp-C3 Arduino Install
Wio-Terminal/ESP8622/ESP32ボードを共通のスケッチで動かす(NTP-CLIENT編)
Wio-Terminal/M5Atom/ESP8622/ESP32ボードを共通のスケッチで動かす(v2)(STARWARS編)
Wio-Terminal/M5Atom/ESP8622/ESP32ボードを共通のスケッチで動かす(v2)(MQTT編)
Wio-Terminal/M5Atom/ESP8622/ESP32ボードを共通のスケッチで動かす(v2)(REST-API編)
Wio-Terminal/M5Atom/ESP8622/ESP32ボードを共通のスケッチで動かす(v2)(OSC編)
その他:
スルーホール用テストワイヤ TT-200 (10本入)
以上