変数と演算子を使ってみる(Arduino)

変数とは、プログラムの中で、値を格納するための入れ物をいいます。
1+2=?
としたとき。この結果を入れるためのものです。
1+2=a
と書き直すと、aの中身(加算結果)は3ということになります。
ここで書いたaは入れ物の名前であり、変数名とよぶ。

また、プログラムでは、=を代入演算子といい、
算数などとは、左右反対に記述する。
a=1+2
という記述になり、
1+2の算術結果を変数名aとい入れものに格納するという表現になります。

変数名は英文字で始まることが決められています。
また、Arduinoのコンパイラが特定の指示(意味)と受け取ってしまう
ような名前は使用出来ません(予約語とよばれる)

変数には、
・論理型(真・偽、yes・no)
・整数型(小数点を必要としない数値)
・実数型(小数点を必要とする数値)
・文字関連型(文字として扱う)
などの型とよばれるものがあり、
格納する値に合わせ、適切な型の変数を用意する必要があります。
例えば、
 c = 2.1 + 3.6
この場合、変数cには、5.7という小数点を必要とする数値が
格納出来なければなりませんから、実数型の変数cを準備します。

型名説明
Boolean論理型論理型の変数で「true、false」または「0以外(true)と0(false)」の二つの値を持つ
int整数型2バイトで表現される符号付の整数で-32768~32767の値をもつデータの型
long倍精度整数型4バイトで表現される符号付き
float単精度実数型4バイトで-32768~32767の実数の値をもつ型
double倍精度実数型8バイトの-1.7976931348623157E+308~1.7976931348623157E+308までの実数の値をもつ型
string文字列型char型の配列で最後がヌルで終端されている
Stringオブジェクトオブジェクトの文字列として扱われる。stringと異なる
代表的な型一覧

などが代表的な型となります。
変数を準備するする事を、変数宣言といい、
変数宣言は、その変数を使用するまで宣言することになっています。

宣言方法は、
 変数の型 変数名
で、
 float c;
 c = 2.1 + 3.6;
となります。

演算子は、最低現、四則演算子は必要です。
 加算演算子(+)
 減算演算子(-)
 乗算演算子(*)
 除算演算子(/)
 剰余演算子(%)除算の余りを求めるもの

変数宣言と値の設定ですが、
int a; // 整数型変数をAという変数名で準備
a = 10; // 変数に整数値10を代入する
と、
int a = 10; // 整数型変数aを準備し変数aに10を代入する
は、同義になります。

int a = 10;
int b = 3;
int addition = a + b;
int subtraction = a - b;
int multiplication = a * b;
int division = a /b
int surplus = a % b;
これで、変数a、変数bを使った四則演算が完了です。
演算結果を格納する変数名が英単語などで記述すると分かりやすいですね?
additionの中身は、13
subtractionの中身は、7
multiplicationの中身は、30
divisionの中身は、3
surplusの中身は、1
となっているでしょう。

しかし、どこに出力(表示)すれば良いのでしょう。
・・・Arduino本体に表示する画面などないはありません。
ArduinoIDEにはシリアルモニタという通信機能があります。
これは、
Arduinoからの情報を出力を表示したり、
パソコンのキーボードからArduinoに情報を送ったり出来ます。
ただし、簡単なスケッチ(プログラミング)は必要となります。

シリアルポートを利用するには、
setup()ブロックに、
Serial.begin(9600); // シリアルポートを初期化(9600 bpsで通信)
と記載すればOKです。
この時注意が必要なのは、通信速度の設定です。
setup()ブロックに記述した速度と、
シリアルモニタ右下に設定されている通信速度が一致
していることが必要です。
一般的には、9600~115200くらいでしょうか?
初期設定は、9600のようです。
これで利用準備は完了です。
シリアルモニタ画面を表示するには、
右上の、目にような?なアイコンをクリックします。
カーソルを合わせると、シリアルモニタと表示されます。
※このコンソールモニタは、Arduinoとパソコン(PC)が、
 USBケーブルで接続されていないと表示されません。

シリアルモニタ
シリアルモニタ画面

コンソールモニターに何か表示してみます。
言語でよくある”Hello World”にします。
使用する関数は、
Serial.println関数を使用します。
 関数書式は、
  Serial.println( 表示内容 )
 です。
で、記述してみると、
  Serial.println( Hello World );
となりますが、
その文字自身をを表示するときは、その文字を
””(ダブルクォーテーション)で囲みます。
  Serial.println( "Hello World" );
となります。
では、試してみます。

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
 }
 void loop() {
   // put your main code here, to run repeatedly:
   Serial.println( "Hello World" ); // シリアルポートに出力
   delay(2000);  // 2秒停止
 }
シリアルモニタに表示
シリアルモニタに表示

※loop( )関数に書かれていますから、2秒毎に何度も表示されます。

では、続いて演算結果を表示させてみます。
先ほどの四則演算の結果です。
ここでは、いろいろな記述をしてみます。

// 変数宣言
int a = 10;
int b = 3;
// ①加算
Serial.println( 10 + 3 );
// ②減算
Serial.println( a - 3 );
// ③乗算
int mult = a * b;
Serial.println( mult );
// ④除算
int divi = 10 /3
Serial.println( divi );
// ⑤剰余
Serial.println( a % b );

①は、
変数に対して、定まった数を定数とよびます。
定数10と定数3の加算結果が表示されます。
lこのように、Serial.println関数の引数内で
計算させて表示するこもできます。
②は、
変数と定数を使ったものです。
変数aには、変数宣言時に10が代入されていますから、
10 - 3を実行したことになります。
③は、表示させる行の前で、
事前に、変数multに乗算結果を求めます。
その結果を、次の行、Serial.println( mult )で表示させています。
このとき、引数のmultに””を付けてはいけません。
付けると、multという文字が表示されてしまいます。
Serial.println( mult )は、変数multの中身を表示する
という指示になります。
④は、③と同じですが、定数を使った計算例です。
⑤は、①②と同様ですが、Serial.println関数の引数内で
変数を使って計算させて表示させています。

どれが良い悪いではなく、
数値を変更したりする場合には、変数を、
決まった値なら定数を利用するなど、
その都度、使い分ければ良いですし、
何より自分に分かりやすい記述が一番です。

では、ArduinoIDEで記述して実行してみます。

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
 }
 void loop() {
   // put your main code here, to run repeatedly:
   // 変数宣言
   int a = 10;
   int b = 3;
   // 四則演算
   Serial.print("加算:");    // シリアルポートに出力(改行指示なし)
   Serial.println( 10 + 3 );  // シリアルポートに出力(改行指示あり)
   Serial.print("減算:");
   Serial.println( a - 3 );
   int mult = a * b;
   Serial.print("乗算:");
   Serial.println( mult );
   int divi = 10 / 3;
   Serial.print("除算:");
   Serial.println( divi );
   Serial.print("剰余:");
   Serial.println( a % 3 );
   delay(10000);      // 10秒停止
 }
演算処理の結果表示
演算処理の結果表示

※loop( )関数に書かれていますから、10秒毎に何度も表示されます。

Serial.print("加算:"); の場合、
printlnとは違い、表示後に改行されません。
そのため次の表示内容、
Serial.println( 10 + 3 );
が後ろに続いて表示され、
加算:13
という表示になります。

もう一つ、
型の違いによる計算結果の違いです。

int、float型について試してみます。
10÷3を試します。
記述は、
 int divi1 = 10 / 3;
 float divi2 = 10.0 / 3.0;
となります。
注意が必要な点があります。
代入演算子(=)の右辺は、代入よりも先に処理されます。
そのため、右辺が、整数型ばかりで構成されている場合、
処理は整数型で行われてしまします。
3 ← 10 ÷ 3
3.33・・・ ← 10.0 ÷ 3
3.33・・・ 10.0 ÷ 3.0
のように、右辺に実数値が入っていれば、計算は実数で行われます。
ですが、今度は左辺の問題です。
int divi = 10 ÷ 3
の場合、右辺が整数型なので結果は3で、
diviには、3が代入されます。
float divi = 10.0 ÷ 3.0
の場合、右辺では実数計算が行われ、3.33・・・で、
diviには、3.33が代入されます。
また、
float divi = 10 ÷ 3
の場合、右辺では整数計算が行われ、整数3が求められ、
実数型diviには、3.0が代入されます。
では、
int divi = 10.0 ÷ 3.0
の場合、右辺では実数計算が行われ、3.33・・・で、
整数型変数diviに代入したいのですが、型が一致しません。
この場合、暗黙(勝手(親切))に型変換)が行われ、
整数値3が代入されます。
では、ArduinoIDEで記述して実行してみます。

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);   // シリアルポートを初期化(9600 bpsで通信)
 }
 void loop() {
   // put your main code here, to run repeatedly:
   // 変数宣言
   int divi1 = 10 / 3;
   // 型の違いによる計算結果
   Serial.print("divi1:");   // シリアルポートに出力
   Serial.println( divi1 );  
   int divi2 = 10 / 3.0;
   Serial.print("divi2:");
   Serial.println( divi2 );  
   float divi3 = 10 / 3;
   Serial.print("divi3:");
   Serial.println( divi3 );  
   float divi4 = 10 / 3.0;
   Serial.print("divi4:");
   Serial.println( divi4 );  
   delay(10000);      // 10秒停止
 }

※loop( )関数に書かれていますから、10秒毎に何度も表示されます。

演算子で、複合代入演算子があります。
i = i + 1
のように、左辺の変数に演算を行い、
再び左辺の変数に演算結果を代入するような
場合に使用できできます。
i = i + 1;
場合、
i += 1;
と記述でます。
複合代入演算子には、

複合代入演算子記述一般演算子記述説明
a+=2a = a + 2加算
a-=2a = a - 2減算
a*=2a = a * 2乗算
a/=2a = a / 2除算
a%=2a = a % 2剰余
複合代入演算子例

などがあります。

また、インクリメント、デクリメント演算子よばれる、
整数値に対して1を加減するという記述があります。
インクリメント、デクリメント演算子には、

インクリメント、デクリメント演算子複合代入演算子一般演算子説明
a++a+=1a = a + 1加算
a--a-=1a = a - 1減算
インクリメント、デクリメント演算子

シリアルモニタに
"Hello"とダブルクォーテーション(")を含めて表示したい場合、
 Serial.println( ""Hello"" );
と書けそうな気がします。
ですが、Serial.println( )関数では、""で囲まれた内容は、
そのまま表示すると解釈しています。
そうすると、(""Hello"")は、""が4つもあり、
組み合わせが理解できません。
そのため、表示したい(")は、\"と\を付けて記述します。
そうすることで、これは囲い込みの(")ではなく、
そのままシリアルモニタに送る文字だと解釈します。
実際の記述は、
 Serial.println( "\"Hello\"" );
となります。
これらは、他にもいろいろあり、これらの文字を、
制御文字(エスケープシーケンス)とよびます。

¥n復帰改行
¥tタブ(水平)
¥¥¥自身の表示
¥"ダブルクォーテーション(")自身の表示
スケープシーケンス(特殊文字)

など、他にもあります。