M5StickCで時刻と高度を表示する ~ その1

2020年7月28日

前回、「スマートフォンのGPSデータをRaspberry Piへ送る」というテストを行いましたが、本命はRaspberry PiではなくてM5StickCです。それは、M5StickCにはリストバンドが付いているので、スマートウォッチとして活用できるからです。

しかし、実用的な状態まで持って行くには、やらなければならないことがたくさんあります。まず今回は、ベースとなるプログラムを作ります。

また、M5StickCに表示する項目は、時刻高度の2つにします。この2つをスマートフォンで取得して、M5StickCにUDPソケット通信で転送することが今回のテストになります。

M5StickCのプログラミング

スマートフォン側のプログラムは、Raspberry Piの場合と同じなので割愛します。(ただし、Raspberry Piの時は、緯度・経度を転送したので、今回は時刻と高度を転送するように修正します)

M5StickCのプログラムは、以下のサイト様を参考にしました。

はやぶさの技術ノート


参考にしたソースはM5Stack用なので、M5StickC用に適度変更しています。

#include <M5StickC.h>
#include <WiFi.h>
#include <WiFiUdp.h>
 
#define BUFSIZE 1024
 
const char* ssid     = "入力してください";
const char* password = "入力してください";
const int port = 60000;
 
WiFiUDP udp;
 
void print_wifi_state(){
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setCursor(3, 3);
  M5.Lcd.println("WiFi connect");
  M5.Lcd.print("IP address: ");
  M5.Lcd.println(WiFi.localIP());
  M5.Lcd.print("Port: ");
  M5.Lcd.println(port);
}
 
void setup_wifi(){
  M5.Lcd.setTextColor(RED);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setCursor(3, 3);
  M5.Lcd.print("Connecting to ");
  M5.Lcd.println(ssid);
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    M5.Lcd.print(".");
  }
 
  print_wifi_state();
  
  udp.begin(port);
}

void setup() {
  M5.begin();

  M5.Lcd.setRotation(3);
 
  setup_wifi();
}

void split(String data, String *lines){
  int count = 0;
  int datalength = data.length();
  for (int i = 0; i < datalength; i++) {
    char onec = data.charAt(i);
    if ( onec == ',' ) {
      count++;   
      if ( count == 2) {
        break ;
      }  
    }
    else {
      lines[count] += onec;
    }
  }
}

void loop() {
  char packetBuffer[BUFSIZE];
  String lines[2] ;
  
  int packetSize = udp.parsePacket();
 
  if (packetSize){
    int len = udp.read(packetBuffer, packetSize);
    if (len > 0){
      packetBuffer[len] = '\0';
    }
    split(packetBuffer, lines) ;

    // print param
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setCursor(3, 3);
    M5.Lcd.setTextColor(GREEN);
    M5.Lcd.println(lines[0]);

    M5.Lcd.setCursor(3, 27);
    M5.Lcd.println(lines[1]+" m");
  }
}

Wi-Fiの設定を、それぞれ入力してください。UDPソケット通信で送られてくる文字列は、

時刻,高度


で、カンマで区切られています。それをsplit関数で分解して、文字列配列に入れています。Arduinoにはsplit関数がないらしく、自作しました。

ソースができたら、コンパイルしてM5StickCへインストールしてください。

実行する

実行してWi-Fiに接続すると、上の画像の状態で待機します。画面には、M5StickCのIPアドレスと、ポート番号が表示されています。

スマートフォンからデータを送信する時に、M5StickCのIPアドレスが必要です。

待機状態になっていることを確認して、スマートフォン側からM5StickCへデータを送信します。

時刻と高度を表示する

スマートフォンからデータが送られて、時刻と高度が表示されました。屋外でも使ってみましたが、結構良く見えました。これなら実用になるでしょう。

バッテリーを持たせる改良が必要

屋外でスマートフォンと通信しながら使ってみましたが、バッテリーが1時間ほどで切れました。予想はしていたけれど、やっぱり短いです。

そのため、今後はバッテリーを持たせるための各種実験を行おうと思います。推測では、対策をしても厳しくて、外部電源を考えないと難しいのではと思っていますが、いろいろな方法を試してみようと思います。