M5Stackに時間を表示したい! 〜ネットワーク接続は難しい?【超初心者がIoT開発に挑んでみる#6】

IoT

はじめに

 前回はセンサユニットを使って温湿度計を作ってみました。気になる点は残っていますが・・・

 今回はM5Stackをネットワークに接続してネットから時刻情報を取得して表示してみたいと思います。このほかにもネットワークに接続すると、いろんなことができます。下の記事のようにセンサーで読み取った値をPC上で見ることもできます。内容は難しくないので、こちらも合わせてご覧ください。

 さて、ネットワーク接続と聞くと難しく感じますね。もちろん全て理解するのは難しいですが、接続するだけなら難しくありませんでした。

そんなわけで今回はWi-FiでM5Stackとネットワークと接続して、NTPサーバから時間を取得してみます。

今回はネットワークに接続します。セキュリティ上で危険な行為はしていないつもりですが、読者の皆様が行う際は自己責任でお願いいたします。特にWi-Fiのパスワードの取り扱いには十分に注意してください。

Wi-Fiを利用したネットワークとの接続方法

 さてWi-Fiとの接続方法ですが、ざっくりとした方法はスマホやPCと同じで、
① 接続したいWi-FiのSSIDを選択する
② Wi-Fiのパスワードを入力する
となります。スケッチの方もWi-Fi接続に必要となる部分はそれほど多くありません。
以下にネットワーク接続に必要な部分+αを抜き出したスケッチを記載します。

#include <M5Stack.h>
#include <WiFi.h> //Wi-Fi接続に必要なライブラリ

const char* ssid = "ここにSSIDを入れる";  
const char* password = "ここにパスワードを入れる";

void setup(){
 M5.begin();
 WiFi.begin(ssid, password); //ここでSSIDを選択して、パスワードを入力するイメージ

 //Wi-Fiに接続できるまで待機する(Wi-Fiに接続されるとWiFi.status()がWL_CONNECTEDなる)
 //この部分は必須ではないと思いますが、あったほうが視覚的に接続されたことがわかります
 while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  M5.lcd.print("~"); //適当な文字を1秒ごとに表示するようにしている
 }
 M5.lcd.println("\nCONNECTED!");

 //Wi-Fi接続を切断する
 //この部分も必須ではないようですが、接続の必要がなければ切断した方がいいです
 WiFi.disconnect(true);
 WiFi.mode(WIFI_OFF);
}

「多い!長い!」と思うかもしれませんが、大切なことは “WiFi.hをincludeして、WiFi.begin()にSSIDとパスワードを渡す” ことです。そう思うと簡単に思えないでしょうか?

これだけで接続できるのは便利ですね。

NTPサーバとは?

 NTPは”Network Time Protocol”の略称であり、様々な情報機器に正確な時刻情報を配信しているサーバのことです。今回は、国立研究開発法人 情報通信研究機構(NICT)のNTPサーバから時刻情報を取得します。以下にNICTのHPリンクを記載しておきます。

リンク先にも記載がありますが、NTPサーバ名は ntp.nict.jp です。これは後ほどスケッチを書く際に必要となります。

M5Stackに時間を表示する

 それでは実際にM5Stackに時間を表示するためのスケッチを下に記載します。

#include <M5Stack.h>
#include <WiFi.h>
#include <time.h> //時刻情報を取得する際に使う構造体tmが定義されている

//使用する変数を定義
const char* ssid = "ここにSSIDを入れる";  
const char* password = "ここにパスワードを入れる";
const char* ntpServerName = "ntp.nict.jp";  //NTPサーバのアドレス

//※時間関係の変数は”秒”に直すことに注意
const long jst = 9 * 3600;  //日本時間はグリニッジ標準時から9時間=9×3600秒進んでいる
const int daylightOffset = 0; //サマータイム用の変数を設定する(今回は日本時間なので0に設定)

//printLocalTime()関数の役割は、取得した時刻情報を画面に表示すること
void printLocalTime() {
  struct tm timeInfo; //時刻情報を受け取る際に使うtime.hで定義されている構造体

/* 構造体tmの中身
(これは補足なのでコメントアウトしています。今回はsec, min, hour, mday, mon, yearのみ扱います。)
  struct tm {
    int tm_sec;    0~61秒(61秒は最大2秒の閏秒を考慮している模様)
    int tm_min;    0~59分
    int tm_hour;   0~23時
    int tm_mday;   1~31日
    int tm_mon;    0~11月(1月を0月としているので使う際は+1する必要がある)
    int tm_year;   年(1900年からの年数なので使う際は+1900とする必要がある) 
    int tm_wday;   日曜日を0とした日数(日=0、月=1、火=2、・・・土=6)
    int tm_yday;   1月1日からの日数(0~365)
    int tm_isdst;  サマータイム用(詳細は割愛)
}
*/
//時刻情報を取得できたら画面に時刻情報を表示する
  if (getLocalTime(&timeInfo)==true){ //timeInfoの前に"&"をつけるのはアドレスを渡すため
    M5.Lcd.setCursor(0, 10);
    M5.Lcd.printf("Date: %04d/%02d/%02d\n", timeInfo.tm_year + 1900, timeInfo.tm_mon+1, timeInfo.tm_mday);
    M5.Lcd.printf("Time: %02d:%02d:%02d\n", timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec);
  }
}

void setup() {
  M5.begin();
  M5.Lcd.setTextSize(2);
  //WiFiに接続するための処理→ssidとpasswordを渡す
  WiFi.begin(ssid, password);

  //WiFiに接続できるまで待機する(Wi-Fiに接続されるとWiFi.status()がWL_CONNECTEDなる)
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    M5.lcd.print("~");  //表示するものは何でもいいです。今回は1秒ごとに"~"が表示されるようにしました。
  }
  //WiFiに接続できたらCONNECTED!を表示する
  M5.lcd.println("\nCONNECTED!");
  delay(1000);
  M5.lcd.fillScreen(BLACK);

  //NTPサーバから時間を取得する
  configTime(jst, daylightOffset, ntpServerName);
  printLocalTime();

  //WiFiを切断する
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop() {
  //上記で宣言したprintLocalTime関数を呼び出して時刻情報を表示
  printLocalTime();
  delay(1000);
}

今回からコードの説明は、できる限りスケッチ内のコメントに残すことにしました。
コメントが多いスケッチは好ましくないのは理解していますが、ご了承ください。
「もっと説明が欲しい!」や「間違えてる・・・」などあればぜひコメントください!

上記スケッチをM5StackにUploadすれば、下の画像のように時刻情報が表示されると思います。

この記事を書いていた時刻がバレバレですが、ちゃんと表示されていますね。

 実は紹介している方法だとM5Stack Basic V2.6の電源を切ると時刻情報が消えてしまいます。もちろん再度NTPサーバに接続できれば時刻情報を取得できますが、接続できない環境にある時はどうすればいいのでしょうか。特にIoTデバイスの観点では、WiFiに一々接続しないといけないという点は不利益になる可能性があります。
 そこでRTC(Real Time Clock)という機能があります。このRTCはバッテリーがある限り時刻情報を保持することができます。
ただし、M5Stack Basic V2.6はRTC機能が内蔵されていません。必要な場合は外付けのRTCモジュールが必要となる点に注意です。

最後に

 いかがでしたか?今回は時刻表示のためにWi-Fiを利用してM5Stackをネットワークに接続してみました。必要な部分だけに注目すれば、意外に簡単だったのではないでしょうか。

セキュリティ上、危険な行為はしていないつもりですが、ネットワークに接続する場合はセキュリティに注意して進めていきたいですね。

最後までご覧いただきありがとうございます。今回はここまでで終わりたいと思います。

次回もぜひご覧ください!

おすすめの書籍

 もっと詳しくM5Stackについて知りたい!という方はこちらの書籍がおすすめです。とても詳しく載っていてわかりやすいです。

とりあえず何か作ってみたい!という方にはこちらの書籍がおすすめです。書いてある通りにやるだけでお手軽にIoTデバイスを作ることができます。

※Amazonのアソシエイトとして、当メディア(Nラボ備忘録)は適格販売により収入を得ています。

他記事のご紹介

当ブログではさまざまな記事を投稿しています。特に資格取得に関する記事はとても人気です。
一読の価値はあると思いますので、ぜひご覧ください!

コメント

タイトルとURLをコピーしました