Study:M5Stack Core2 / RTC & touch


はじめに

M5Stack core2スイッチサイエンスさんから買いました。
(M5Stackシリーズの初めての購入になります。)
発売当時瞬殺で在庫無しになっていましたが、現時点(2021/2/11)では在庫多数になった様です。
これまで、ESP32の開発キットでRTCやI2C経由でセンサやMicroSD書き込み、USBバッテリでの駆動など試してきたのですが、追加のセンサ以外は入っている・・・(^^;
・・・・こっちの方が安いし手軽じゃん!

検討したこと

購入して、まず何かソフトウエアを動かそうと思ってRTCの時刻表示をさせる事にしました。
Core2ではRTCがあり、計測を行う時など時間情報はありがたいです。
更にありがたい事に、M5Stackのコードなど色々と出ているので、変更し使わせて頂きました。
ついでにタッチパネルのサンプルもあったので、追加しました。
・・・ただ、0.5秒毎の更新としたので反応が鈍い。割込とかしたいところです。(出来るのか?)

[ ↑ 動作画像]
 ・画面の一番上:0.5秒毎にSSIDの接続をチェックし「.」を増やします。10秒まで
 ・WiFi接続したら、IPアドレスを表示し、RTCを更新
 ・RTCの情報を0.5秒間隔で表示します。
   表示のタイミングでタッチパネルが押されていたら位置を確認し時刻の色を変えます。

参考

Qiita/ M5StackにRTCを接続しI2C通信で時刻の設定、取得を行う
Qiita/ M5StickCのRTC-1〜RTC呼び出しとシステム時間利用
サンプルプログラム touch
M5Stack.com/M5Stackの全般的なチュートリアル(core2向け)

環境

Arduino 1.8.13 (Windows 10)

コード

RTC_NTP.ino
#include <M5Core2.h>
#include <time.h>
#include <WiFi.h>

// for WiFi
char ssid[] = "xxxxxxxx"; // your SSID
char pass[] = "xxxxxxxx"; // your Pass word

// for Time
const char* ntpServer = "ntp.jst.mfeed.ad.jp"; // NTP server
const long  gmtOffset_sec = 9 * 3600;          // Time offset 9hr
const int   daylightOffset_sec = 0;            // No summer time
RTC_DateTypeDef RTC_DateStruct; // Data
RTC_TimeTypeDef RTC_TimeStruct; // Time
static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
struct tm timeinfo;
String dateStr;
String timeStr;
void getTimeFromNTP(){
  // To get Time from NTP server
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  while (!getLocalTime(&timeinfo)) {
    delay(1000);
  }
}

void setNTP2RTC(){
    // timeSet
    getTimeFromNTP();
    getLocalTime(&timeinfo);
    // read RTC
    M5.Rtc.GetTime(&RTC_TimeStruct);
    M5.Rtc.GetDate(&RTC_DateStruct);
    // --- to over write date&time
    RTC_DateStruct.Year = timeinfo.tm_year + 1900;
    RTC_DateStruct.Month = timeinfo.tm_mon + 1;
    RTC_DateStruct.Date = timeinfo.tm_mday;
    RTC_DateStruct.WeekDay = timeinfo.tm_wday;
    M5.Rtc.SetDate(&RTC_DateStruct);
    RTC_TimeStruct.Hours = timeinfo.tm_hour;
    RTC_TimeStruct.Minutes = timeinfo.tm_min;
    RTC_TimeStruct.Seconds = timeinfo.tm_sec;
    M5.Rtc.SetTime(&RTC_TimeStruct);
}

void setup() {
  M5.begin();
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(WHITE,BLACK);
  //
  int con_count = 0;
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
    con_count++;
    if(con_count >= 20){
      break;
    }
  }
  if(con_count < 20){
    M5.Lcd.print("\nWiFi connected.");
    setNTP2RTC();
  }else{
    M5.Lcd.print("\nWiFi did not connect.");
  }
  M5.Lcd.print("\nIP=");
  M5.Lcd.print(WiFi.localIP());  
}

void loop() {
  M5.Lcd.setCursor(0, 80, 1);
  M5.Rtc.GetDate(&RTC_DateStruct);
  M5.Rtc.GetTime(&RTC_TimeStruct);
  M5.Lcd.printf("%04d.%02d.%02d %s\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date, wd[RTC_DateStruct.WeekDay]);
  M5.Lcd.printf("%02d:%02d:%02d", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds);
  // for Touch
  TouchPoint_t pos= M5.Touch.getPressPoint();
  if(pos.y > 240){
    if(pos.x < 109)
      M5.Lcd.setTextColor(RED,BLACK);
    else if(pos.x > 218)
      M5.Lcd.setTextColor(BLUE,BLACK);
    else if(pos.x >= 109 && pos.x <= 218)
      M5.Lcd.setTextColor(GREEN,BLACK);
  }
  delay(500);
}

おわりに

初めてQiitaに書き込みました。
実用性という意味ではまだまだですが、検討を始めるきっかけになれば幸いです。

来歴

2021/09/03 @ekzemplaro さんからのご指摘の通り、誤記があり、修正しました。