こんばんは!
今回はシリアルモニタからLEDの明るさを変更できるプログラムを作成したので共有したいと思います。
シリアル通信で受け取った値を数値として扱うためのプログラムの例として参考になると思います。
使用するもの
・Arduinoメインボード(https://amzn.to/2vkPIUH)
・USBケーブル(https://amzn.to/2UHhntl)
・ブレッドボード(https://amzn.to/38eNi8u)
・ジャンパワイヤ (https://amzn.to/39uBU8T)
・LED(https://amzn.to/2TvEPGc)
作成したプログラム
今回作成したプログラムになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | int LED_PIN = 11; int value; void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); } void loop() { while (Serial.available()) { String str = Serial.readStringUntil('\n'); value = serialStringToInt(str); if (value != -1) { Serial.println(value); analogWrite(LED_PIN, value);//入力された大きさ分LEDを光らせる部分、好きに変更してみてください。 delay(50); } } } int serialStringToInt(String str_val) { int index; int len = str_val.length(); int inval; int outval = 0; for (index = 0; index <= (len - 1); index++) { inval = str_val.charAt(index) - 0x30; if (inval >= 0 && inval < 10) { outval += inval * round(pow(10, (len-1)-index)); }else { return -1; } } if(str_val != String(outval)){ return -1; } return outval; } |
Arduinoのシリアル通信は文字列でやり取りを行っています。
Serial.readStringUntilは末端の文字を指定して、その位置までの文字を読み取ります。今回の'\n'はenterを表しています。
シリアルモニタで「120」のように入力したとしても、それは120という数字ではなく1と2と0が連結した文字列(ASCII文字)として処理されています。
serialStringToInt関数でシリアル通信で受け取った文字列を数値に変換するための処理を行っています。
0~9のASCII文字は0x30~0x39なので、入力された数字から0x30を引いた値が0~9となります。
アナログ出力は0~255の間ですが、map関数を使用すれば範囲を変えることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | int LED_PIN = 11; int value; void setup() { Serial.begin(9600); pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, LOW); } void loop() { while (Serial.available()) { String str = Serial.readStringUntil('\n'); value = serialStringToInt(str); value = map(value, 0, 10, 0, 255); if (value != -1) { Serial.println(value); analogWrite(LED_PIN, value); delay(50); } } } int serialStringToInt(String str_val) { int index; int len = str_val.length(); int inval; int outval = 0; for (index = 0; index <= (len - 1); index++) { inval = str_val.charAt(index) - 0x30; if (inval >= 0 && inval < 10) { outval += inval * round(pow(10, (len-1)-index)); }else { return -1; } } if(str_val != String(outval)){ return -1; } return outval; } |
map関数で0~10までの値を0~255までに拡大しています。