シリアルモニタから数値を送り、Arduinoに数値に応じた処理をさせたいときがあります。しかし、以下のコードを書き込んでもちっとも反応してくれません。
sample1.ino
void setup() {
Serial.begin(9600);
}
void loop() {
byte var = Serial.read();
switch (var) {
case 1:
//hoge(var);<-数値を送って何かをさせる処理
Serial.println('1');
break;
case 2:
//hoge(var);
Serial.println('2');
break;
case 3:
//hoge(var);
Serial.println('3');
break;
}
}
理由はSerial通信が1Byteの文字コード(ASCIIコード)で行われているからで、ASCIIコード表を確認してみると、数字の『1』は10進数で『49』、16進数で『0x31』に対応していることがわかります。
数字自体は0x30から始まっているため、先ほどのコードに1行追加すると目的の動作をさせることができます。
sample2.ino
void setup() {
Serial.begin(9600);
}
void loop() {
byte var = Serial.read();
var = var - 0x30; // 追加の行
switch (var) {
case 1:
//hoge(var);<-数値を送って何かをさせる処理
Serial.println('1');
break;
case 2:
//hoge(var);
Serial.println('2');
break;
case 3:
//hoge(var);
Serial.println('3');
break;
}
}
単純にシリアルモニタからの数字入力で条件判断させたいのであれば、switch文のcaseを
case '1':
または
case 0x31:
とすることで文字としての『1』を認識させることができます。