【M5Stack】M5StickCのスケッチ例TFT_Print_Test:M5.Lcd.print、M5.Lcd.println、M5.Lcd.printf、M5.Lcd.drawString、M5.Lcd.drawCentreString、M5.Lcd.drawRightString

  • URLをコピーしました!
目次

M5StickC

前回、M5StickCのスケッチ例TFT_Print_Testに出てきたM5.Lcd.setTextFont、M5.Lcd.setTextSize、M5.Lcd.setCursor、M5.Lcd.setTextColorを勉強してみました。

今回は残りでテキスト表示のコマンドであるM5.Lcd.print、M5.Lcd.println、M5.Lcd.printfの違いを見ていきましょう。

今回の基本のプログラムとしてはこちらです。

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextFont(1);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 25);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.print("A: Hello World!");
  M5.Lcd.print("B: Hello World!");
  delay(1000);
}

M5.Lcd.print、M5.Lcd.println、M5.Lcd.printfの違い

基本のプログラムでは「M5.Lcd.print(文字列)」で文字の出力をしています。

M5StickCに出力した結果はこんな感じです。

2つの文字列が続けて表示されています。

つまり「M5.Lcd.print(文字列)」は改行されずに表示されているわけです。

次に「M5.Lcd.println(文字列)」を試してみましょう。

こちらの場合は2つの文字列の間は改行して出力されました。

それでは「M5.Lcd.printf(文字列)」はどうでしょうか。

こちらは改行されていません。

となると「M5.Lcd.print(文字列)」と「M5.Lcd.printf(文字列)」の違いはなんでしょうか。

「printf」という書き方はどこかで出てきた覚えがないでしょうか。

そう、C言語を勉強したときに出てきました。

そして出力の際、変換指定子を使用して、文字、文字列、数値を指定して出力していました。

ということで答えは「M5.Lcd.printf(文字列)」は変換指定子を使った出力ができるでした。

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextFont(1);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 25);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.printf("%d %s %f", 1, "Hello", 0.5);
  delay(1000);
}

まとめてみるとこんな感じです。

M5.Lcd.printM5.Lcd.printlnM5.Lcd.printf
改行しないするしない
変換指定子使えない使えない使える

改行の方法

先ほどの例だと「M5.Lcd.printf」を使用した場合は改行されません。

では改行はどのようにするのでしょうか。

これはPythonと同じく「\n」(バックスラッシュn)で改行することができます(エスケープシーケンス)。

ただ何故かいつもバックスラッシュを打つのに使っている「Option + ¥」が使えず、「<<」と表示されてしまいます。

(MacOSの話です。Windowsの方は「¥」でバックスラッシュとなるはずです)

そこでなんとかしたのが、”日本語入力”で「Option + ¥」を押すことで全角のバックスラッシュを出し、そこから英字のバックスラッシュに変換するという方法でした。

何故、Arduinoのソフトウェア上だけバックスラッシュが正しく打てないのか分かりませんが、とりあえず使える状態にはなったので、当面はこれでよしとします。

そしてこんな感じで改行のエスケープシーケンスを試してみました。

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextFont(1);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 25);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.printf("A: Hello World!\n");
  M5.Lcd.printf("B: Hello World!\n");
  delay(1000);
}

M5.Lcd.drawString、M5.Lcd.drawCentreString、M5.Lcd.drawRightString

ここまで「print」関連のコマンドを見てきましたが、実は文字を表示するのにまた違うコマンドが存在します。

それは「M5.Lcd.drawString」、「M5.Lcd.drawCentreString」、「M5.Lcd.drawRightString」の3つです。

これらのコマンドでは座標とフォントサイズも一緒に指定します。

つまり「M5.Lcd.drawString(文字列, X座標, Y座標, フォントサイズ)」という形でそれぞれ指定します。

そして「M5.Lcd.drawString」、「M5.Lcd.drawCentreString」、「M5.Lcd.drawRightString」の違いは座標に対して、左寄せ、中央寄せ、右寄せの違いです。

またそれぞれ座標を指定するので、「M5.Lcd.setCursor(X座標, Y座標);」は必要ありません。

ということでこんな感じで試してみました。

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextFont(1);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.drawString("A: Hello World!", 70, 20, 1);
  M5.Lcd.drawCentreString("B: Hello World!", 70, 30, 1);
  M5.Lcd.drawRightString("C: Hello World!", 70, 40, 1);
  delay(1000);

ちなみにフォントサイズは「M5.Lcd.setCursor(x, y, fontsize)」の時と同様、3以上に設定すると消えてしまったので、とりあえず「1」にしておいて、「M5.Lcd.setTextSize(int);」で調整した方が良さそうです。

M5.Lcd.printとM5.Lcd.drawStringの違い

それでは「M5.Lcd.print(println、printf含む)」と「M5.Lcd.drawString(drawCentreString、drawRightString含む)」の違いはなんでしょうか?

それは画面の端を超えた際の挙動に違いがあります。

「M5.Lcd.print(println、printf含む)」では右端まで行ったら、続きは1行下がって左端から出力されます。

しかし「M5.Lcd.drawString(drawCentreString、drawRightString含む)」は右端まで行っても、折り返しせずに出力されるため、画面外に出てしまった文字に関しては表示されなくなってしまいます。

#include <M5StickC.h>

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
}

void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextFont(1);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(35, 25);
  M5.Lcd.setTextColor(TFT_WHITE);
  M5.Lcd.print("A: Hello World! B: Hello World! C: Hello World!");
  M5.Lcd.drawString("A: Hello World! B: Hello World! C: Hello World!", 35, 55, 1);
  delay(1000);
}

これで文字の表示に関してだいぶ分かってきました。

次回は図形の出力の方法を知りたいのでスケッチ例の「Display」を見てみることにしましょう。

ではでは今回はこんな感じで。

¥2,816 (2021/07/05 10:12時点 | Amazon調べ)
よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次