3-5 変数について

Arduino言語のプログラミングでは、「変数」に数値や文字列を記憶させたり、呼び出したり、計算や処理をして便利に使うことができます。
多くの人にはなじみのない言葉ですが、Arduinoでプログラミングをする上で変数は非常に大事な概念で、超便利かつ不可欠で将来にわたってめちゃくちゃ使います。
  

変数は例えるなら箱のようなものです。
中に好きな数値や文字列、電子部品から読み取った値などを入れることができます。

  

変数を宣言しよう

変数を使うためには、

  • データ型(=この変数には何を入れられるか)
  • 変数名(=その変数の名前) 

を定義しておく必要があります。これを変数の宣言と呼びます。

例えば、“データ型がint型のvalueという名前の変数”を宣言するときの書き方は以下の通りです。

int value;

これにより、下概念図のような変数が用意されます。

    \\変数valueです。ヨロシク!//

変数の名前ってどうつければいいの?

変数の名前は英数字が使用でき、かつ変数名の最初の文字がアルファベットで始まる必要があります。
この章では説明の為に敢えて簡素な変数名(例えばvalue)にしていますが、一般的には英語を使った説明的な名前が望ましいです。
例えば光センサの値を入れる変数であればlightSensorとか、まばたきをするためのボタンならblinkButtonといった感じでしょうか。
何が分かりやすい名前かは、搭載する電子部品の種類や数、プログラムの内容によって変わってくるので、適宜考えましょう。

またArduinoのプログラムで命令などに使われるお決まりの単語は変数名には使えません(これを予約語といいます)

変数に入れられるものは型次第

さて、先程“データ型がint型のvalueという名前の変数”を宣言しました。

int型は、-32768~32767までの2バイトの整数を入れることができるデータ型です(これはUno R3基準です。詳細は後述…)
なので、このvalueという変数には、420という数値を入れることができます。
またこの420を、1や、32や、7786や、-459などの数値と入れかえることもできます。

ですが998750は…このvalueには大きすぎて入りません(32767までの数字しか入らないからね~)
また小数に対応していないので、0.29も入りません。
大きな数を入れたい時のデータ型はlong型、小数を入れたい時はfloat型を使う必要があります。(各型の詳しい違いも後述するよ!)

変数を定義しつつ初期値も入れちゃう

変数を宣言すると同時に、その中身に好きな値を初期値としてセットしておくこともできます。書き方は以下の通りです。

int value = 90;

これによりできたint型の変数valueの中には、90という数値が初期値としてセットされています。

変数の中身は変えられる

上記で宣言した、変数value(中には90が入っている)の中身を違う数値に変えたい時は、以下のように書きます。

 value = 777;

これでvalueの中身は90から777に変わりました。先に入っていた90は上書きされ消えたのでもう戻ってきません。

変数の中身は計算もできる

変数の中身は単純に入れ替えるだけでなく、計算によって加減乗除などをすることもできます。

int value = 90;
value = value + 1600;

まず一行目の記述により、初期値として90入りのint型の変数valueが宣言されました。
その次の行では「いま入っているvalueの中身に1600を足す」計算をしています。
1600 + 90 の結果、最終的にvalueの中には1690の数値が残りました。
(Arduinoで計算式を書くときのルールはこのページの一番下のTipsにまとめてるよ!)


以上が変数の基本です!
ちょっとわかりにくいかもしれませんが、実際にプログラム上で扱いながら覚えていけばいいと思います。
  
  

変数のデータ型(=変数の中身にどういうデータを入れられるか)には、さまざまな種類があります。
よく使うものを一覧表にして比較しました。
  

データ型の名前 説明 実際に利用できる数値 備考(と講師の感想)
bool
(boolean)
false(偽、数値なら0)か
true(真、数値なら1)の
どちらかを代入できる型
false(0)かtrue(1) 0か1の二値を扱えるので、LEDやスイッチのON/OFF等に使える。
今はboolという名前だが、かつてはbooleanという名前が使われていた。
char 文字を数値として記憶する型
1バイトで一文字
-128~127 Arduinoで文字データを扱いたい場合はこのchar型か、後述するStringクラスを使う。
charは文字を数値として扱う(例えば'A'は65、'B'は66)ので、
'A'の入ったcharの変数に+1をすると中身が'B'に変化するといった使い方もできます。
int R4系では4バイト、
R3系等の大半のArduinoでは
2バイトの整数を代入できる型
R4系では
-2,147,483,648
~2,147,483,647
R3系では
-32,768~32,767
そんなにケタが大きくない整数を扱う場合に一般的に使われる型。
R4系ではボードの性能がつよつよになった結果、
longと同じ範囲の整数を扱えるようになっているが、
実際にきぐるみの実装に使うマイコンはR3系の可能性が高いです。
なので互換性の観点から、当面はR4でもR3と同じ基準でintを使った方が無難と思います。
long 4バイトの整数を代入できる型 -2,147,483,648
~2,147,483,647
-32,768より小さいか、32,767より大きい整数を扱いたい時に使う型。
float 4バイトの小数を代入できる型 3.4028235E+38

-3.4028235E+38
小数を扱いたい場合に使う型。割り算の答えやセンサから読み取った値など、
小数点以下の数値が出る場合はfloatを使うと覚えておけばOK。
使える範囲が広い分intやlongといった整数型より計算に時間がかかるので、
小数を使わない(整数のみ)のであれば整数型を使った方がいいです。

R4とR3で利用できる数値が異なる問題については、こちらで補足しています:マイコンのbit数の違い
  
  

各例はコピーしてloop部の内部に貼り付けることで動作確認ができます。
ぜひコピペしてシリアルモニタで結果を観測してみてください。

bool型

bool LED1 = false;
LED1 = true;

1行目:bool型の変数LED1を宣言して、初期値をfalse(=0)に設定しています。
2行目:LED1の中身をtrue(=1)に変えました。

bool型の中身は下記のように0 / 1の数値表記でも指定できます。

bool LED2 = 0;
LED2 = 1;

Serial.printやSerial.printlnでboolの中身を表示すると、0 / 1で表示されます。
変数の中身をシリアルモニタで表示するには、( )の中に変数名を入れればOKです。例えば…

Serial.println(LED1);

これで変数LED1の中身がシリアルモニタに表示されます。
(setup部に Serial.begin(9600); を書くことを忘れずに!)

char型

基本
char str1 = 'A';
char str2 = 65;

1行目:
 char型の変数str1を宣言して、初期値に大文字のアルファベットAを入れました。
 Aは ' ' (シングルクオーテーション)で囲う必要があります。
2行目:
 同じくchar型の変数str2に、ASCIIコードの65番の文字(=大文字のアルファベットA)を入れました。

1行目も2行目も、charの中に入っているのは65という数値です。
どの文字が何番に対応しているかは下記のサイト等をご参照ください。

ASCIIコード表:http://www3.nit.ac.jp/~tamura/ex2/ascii.html

charで宣言された変数の中身が数値であることを利用して、下記のような芸当で中身の文字を変えることもできます。

str1 = str1 + 5;

この1文によって、str1の中身の数値は70になりました。
70の数字に対応する文字は大文字のアルファベットFです。なので、今str1の中にはFが入っているということになります。

複数文字を扱う場合
char str3[] = "しめじパワー";

複数の文字をchar型の変数に入れたい場合は、ちょっとめんどくさいです。
変数名str3の後ろに[ ]を書くことで、この変数を配列にする必要があります。
配列はかなり難しい概念なので本資料での説明は割愛します(気になる人はぜひ調べてほしいですが、中級者以上になってからを推奨します…)

複数の文字列を扱いたい場合は、より複雑で便利な処理ができて、どちらかというとcharよりも簡単(個人の感想です)なStringクラス(3-6を見てね!)の使用をおすすめします。
またシリアルモニタの項の復習になりますが、複数文字のデータなので、文字列は ' ' ではなく “ ” で囲います。

int型

(変数の説明で既に履修済みなので割愛します)

long型

long value1 = 500000000;
long value2 = -150000000;
value2 = value1 + value2;

1行目:
 long型の変数value1を宣言して、中身に500,000,000の数値を入れます。
2行目:
 同じくlong型の変数value2に、-150,000,000の数値を入れます。
3行目:
 intの例と同じように、2つの変数同士で足し算の計算をさせています。
 この行のよりも後ろで Serial.println(value2); を実行することで、
 シリアルモニタからvalue2の計算結果を表示できます。

float型

float sensor = 7.16;
sensor = sensor / 9.9999;

1行目:
 float型の変数sensorを宣言して、中身に7.16の数値を入れます。
2行目:
 sensorを9.9999で割り、その計算結果でsensorの中身を上書きしています。
 sensorの中身をシリアルモニタで表示すると、小数第3位が丸められ0.72と出ます。
 Serial.println(sensor,8); と書くことで、小数第8位までを表示できます。


Tips:Arduinoでの計算記号

人間の世界での計算式とArduinoの世界での計算式では、書き方に若干の違いがあります。
まずArduinoの世界では、加減乗除をする際には下記の記号を使う必要があります。

  • 足し算:半角記号の「+」(プラス)
  • 引き算:半角記号の「-」(マイナス)
  • 掛け算:半角記号の「*」(アスタリスク)
  • 割り算:半角記号の「/」(スラッシュ)

また変数の解説でも出てきましたが、Arduinoでの計算式の書き方は、
 計算結果を入れる変数 = 項1 計算記号 項2  となります。常に一番左側に計算結果が来ると覚えればOKです。
以下にArduinoでの計算例をいくつか挙げてみます(value1~3の変数はすべてint型とします)

value1 = 500 + 300;

value1の結果は800となります

value2 = 1000 + 1000 - 500 - 100;

複数の項を持つ計算ももちろん可能です
value2の結果は1400となります

value3 = (10+10) * 5;

人間世界と同じように、Arduinoの計算式では()を使うことができます
value3の結果は100となります


最後に、加減乗除以外にも、計算に使える便利な記号があります。

  • 半角記号の「%」→割った数の余りを求められます
int value4 = 0;
value4 = 9 % 4;

value4は9÷4の余りである1となります

  • 半角記号の「++」(プラス2個)→整数値の変数の値に1を足す
int value5 = 5;
value5 = value5++;

value5は+1されて6となります(value5 = value5 + 1 と同じ効果を持ちます)

  • 半角記号の「–」(マイナス2個)→整数値の変数の値から1を引く
int value5 = 5;
value5 = value5--;

value6は-1されて4となります(value6 = value6 - 1 と同じ効果を持ちます)


今すぐに全部覚えなくても大丈夫です。後の章で出てくるものもありますので、実践しながら覚えていきましょう。