HOWTO · Arduino
Arduino シリアルプリント複数の変数
Serial.print()および Serial.println()関数を使用して、シリアルモニターに変数値を表示できます。
このページの内容
Arduino のシリアルモニターに複数の変数値を表示するには、Serial.begin() でシリアル通信を初期化し、各値を Serial.print() または Serial.println() で送信します。Serial.print() を続けて呼び出すと同じ行に出力され、Serial.println() は値の後に改行を加えます。値の間に文字を挿入すると、結果を読み取りやすくできます。シリアルモニターのボーレートは、Serial.begin() に指定した値と同じにしてください。
以下の完全な例では、値を区切って同じ行に表示する方法、浮動小数点数の表示桁数、値を別々の行に表示する方法、そして変化する2つの値を示します。簡単なホスト用シムを含むため、同じソースを標準 C++ として実行できます。Arduino ではボードのコアが Serial と delay() を提供し、コンピューターではシムが標準出力に書き込み、例として2回の反復を実行します。ボードで使う場合は、シリアルモニターを Serial.begin() と同じボーレートに設定してください。
Serial.print() で複数の値を同じ行に出力する
Serial.print() は値を文字列に変換して出力し、改行は加えません。各項目について続けて呼び出し、項目の間に区切り文字を出力します。この例では温度と湿度の値の間にタブ("\t")を入れているため、出力に含まれるのはタブ文字であり、バックスラッシュと t の2文字ではありません。
浮動小数点数では、任意の第2引数で小数点以下に表示する桁数を指定できます。ここでの Serial.print(temperature, 2) は、小数点以下2桁での表示を指定します。変わるのは表示形式であり、変数に格納された値ではありません。最後に Serial.println() を呼び出すと、その行の末尾に改行が入ります。精度を指定する引数は浮動小数点数の表示に使います。整数は整数として出力されます。
Serial.println() で値を別々の行に出力する
値ごとに別の行へ出力するには、Serial.println(value) を使います。値を出力した後に改行するため、続けて呼び出すと縦に並んだ一覧になります。このスケッチでは、各ラベルに Serial.print() を使い、対応する値に Serial.println() を使うので、ラベルと値は同じ行に表示されます。
Serial.begin(9600) に合わせて、シリアルモニターを9600ボーに設定します。モニター側の速度が異なると、スケッチが意図した値を送信していても、受信した文字が文字化けして見えることがあります。各 Serial.println() は値の後に改行を加えるため、次の呼び出しは新しい行から始まります。
両方の関数を組み合わせて変化する値を整形する
値を繰り返し表示する場合は、最初の値と区切り文字に Serial.print() を使い、その行の最後の値に Serial.println() を使います。次のループは、値の間にタブを入れ、各組の後に改行して、変化する2つの値を出力します。次の反復に進む前に湿度の値を増やすため、2つ目の値は常に1つ目より5大きくなります。ボード上ではループが繰り返され、行ごとに短い間隔が入ります。ホスト用シムでは、変化が分かるように2回実行します。上の同じ行への出力と別々の行への出力の節は、変数宣言とシリアル設定を一か所にまとめた、この完全な例を説明しています。
別のプログラムで行を解析する場合は、項目の順序と区切り文字を一貫させてください。どちらかを変えると、そのプログラムに影響することがあります。ホスト用シムが示すのは出力形式だけであり、ボードやシリアルモニターの動作を再現するものではありません。
この例は、ホスト用シムでは標準出力に表示されます。ボードでは Arduino コアが同じ Serial 呼び出しと、繰り返し実行される loop() を提供します。コード内のラベル(「Temperature」「Humidity」など)と表示されるテキストは英語のままです。出力例は、タブ区切りや改行、反復ごとに変わる数値を示しています。
#ifndef ARDUINO
#include <iostream>
class HostSerial {
public:
void begin(unsigned long) {}
void print(const char* value) { std::cout << value; }
void print(int value) { std::cout << value; }
void print(double value, int digits = 2) {
std::cout.setf(std::ios::fixed);
std::cout.precision(digits);
std::cout << value;
std::cout.unsetf(std::ios::fixed);
}
void println(const char* value) { print(value); std::cout << '\n'; }
void println(int value) { print(value); std::cout << '\n'; }
void println(double value, int digits = 2) { print(value, digits); std::cout << '\n'; }
};
HostSerial Serial;
void delay(unsigned long) {}
#endif
int humidity = 40;
void setup() {
Serial.begin(9600);
}
void loop() {
float temperature = 23.456;
Serial.print("Temperature: ");
Serial.print(temperature, 2);
Serial.print("\t");
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Temperature on its own line: ");
Serial.println(temperature, 2);
Serial.print("Humidity on its own line: ");
Serial.println(humidity);
int first = humidity;
int second = humidity + 5;
Serial.print(first);
Serial.print("\t");
Serial.println(second);
humidity++;
delay(1000);
}
#ifndef ARDUINO
int main() {
setup();
loop();
loop();
}
#endif
Temperature: 23.46 Humidity: 40
Temperature on its own line: 23.46
Humidity on its own line: 40
40 45
Temperature: 23.46 Humidity: 41
Temperature on its own line: 23.46
Humidity on its own line: 41
41 46