M5StickCで時刻と高度を表示する ~ その1
前回、「スマートフォンの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時間ほどで切れました。予想はしていたけれど、やっぱり短いです。
そのため、今後はバッテリーを持たせるための各種実験を行おうと思います。推測では、対策をしても厳しくて、外部電源を考えないと難しいのではと思っていますが、いろいろな方法を試してみようと思います。