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);
}
おわりに
#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 さんからのご指摘の通り、誤記があり、修正しました。
Author And Source
この問題について(Study:M5Stack Core2 / RTC & touch), 我々は、より多くの情報をここで見つけました https://qiita.com/kaoruka/items/b36c99fb124fea0d5d24著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .