文字を扱う(Arduino詳解)

Arduino詳解その21です。前回の記事はこちらです。

hirocom777.hatenadiary.org
f:id:HiroCom777:20201003164310j:plain

文字を扱う方法

 Arduinoのスケッチを構成しているのはC言語で、C言語に他の高級言語のような文字列型変数(任意の長さの文字列を格納できる変数型)がありません。C言語で文字データを扱うには配列を使用するのが一般的です。今までのスケッチでもダブルクォーテーションでくくった文字列が出てきたと思いますが、これは文字の配列です。charという1バイトのデータ型に1文字を格納してその配列を文字列として扱います。以下にスケッチ例を示します。

void setup() {
  Serial.begin(9600);

  //"Arduino"と送信
  Serial.print("Arduino");
  Serial.println("");

  //配列でまとめて"Arduino"と送信
  char c[] = "Arduino";
  Serial.print(c);
  Serial.println("");

  //配列で順番に"Arduino"と送信
  for (int i = 0; i <= 7; i++) {
    Serial.print(c[i]);
  }
  Serial.println("");
}

void loop() {
}

上記のスケッチは異なる方式で"Arduino"という文字列をシリアルモニタに3回送信しています。『Arduino』という文字列をダブルクォーテーションで囲ったものと配列cは同じものということです。配列の内容を順番に送信しても同じです。配列cの個々の要素には1文字を表すASCIIコードが入力されます。そして、配列の最後には終わりを示す数値0(ASCIIコード0)が入ります。Arduino』という7文字を格納するのに0~7の8つの配列要素が用意されるのは、このためです。

配列ではなく一つのchar型変数に文字を代入する場合には、文字をシングルクォーテーションで囲みます。以下のようになります。

char c = 'A';

直接記述できない特殊な文字は頭に『\"を付けて表します。エスケープシーケンスって言います。以下のような例があります。

"\n" 改行
"\t" タブ
"\0" ASCIIコード0(終わりを示す)

で、文字データを扱っていると色々なことをやりたくなります。内容を比較したり、検索したり、一部を書き換えたり、文字長さを確認したり、結合したり、etc・・・で、そういうことをするライブラリもあるにはあるんですけれど、何分元が配列なので使いずらいんです。

Stringオブジェクト

で、Arduinoではこの問題を解消するために、Stringクラスを標準で装備しています。このクラスから作成されたStringオブジェクトは様々な機能を使うことが出来ます。
実を言うと、過去の記事でStringオブジェクトを少しだけご紹介したことが有ります。
hirocom777.hatenadiary.org
秒数を入力すると時間表示の文字列を返す関数TimeText()を作りました(例:90⇒01:30)。以下にスケッチを再掲します。

//秒数を入力すると時間表示の文字列を返します。(例:90⇒01:30)
String TimeText(int second) {
  //分の表示
  String textData = String(int(second / 600));
  second = second % 600;
  textData += String(int(second / 60)) + ":";
  //秒の表示
  second = second % 60;
  if (second < 10) {//0~9秒の時は"0"表示を追加する。
    textData += "0";
  }
  textData += String(int(second));
  return (textData);
}

スケッチを解説しますね。
まず、ストリングオブジェクトを生成するには以下の様に記述します。

String オブジェクト名;

これだけで、ストリングオブジェクトが生成できます。また、以下の様に記述すると数字を文字列で表記したストリングオブジェクトを作れます。

String(数値);

つまり、

String textData = String(int(second / 600));

は、ストリングオブジェクトtextDataを生成して数値が表す文字データ(この場合は分表示の10の位の文字)をセットしています。次にsecondの数値を600で割ったあまりに変換してから

textData += String(int(second / 60)) + ":";

でtextDataに分表示の1の位を追加しています。この様に、ストリングオブジェクトを使用すると文字データの結合も簡単になります。また、後ろに":"を足していますが、こちらは先に説明した通りchar型の配列です。char型の配列もあわせて追加出来ちゃいます。便利ですね!!最後に秒を表す文字データを追加。この時も0~9秒の時は間に"0"のchar型配列を追加しています。

ちなみに、

String(文字列);

で文字列のストリングオブジェクトが作れます。文字列は文字配列でもストリングオブジェクトでもchar型変数でもOKです。

便利だ!!

 いかがでしたか?ストリングオブジェクトを使用すると、スケッチでの文字の取り扱いがグンと楽になります。ストリングオブジェクトには他にも色々な機能があります。次回はそれらの機能とストリングオブジェクトを使用するときの注意点などをご紹介します。お楽しみに!!
hirocom777.hatenadiary.org


Arduino UNO入門の連載記事はコチラからどうぞ!!