概要
Arduinoでシリアル通信で受け取った数字の文字列を数値型に変換する必要があったので、その方法を調べてみました。
この記事は下記の環境で動作確認をしています。
項目 | 内容 |
---|---|
Arduino IDE | 1.8.13 |
Arduinoボード | 秋月電子通商 AE-ATmega (Arduino Duemilanove互換ボード) |
toInt()
シリアル通信で受け取った文字列をString型オブジェクトに格納している場合は、toInt()
を使用します。
toInt()
は、文字列を整数に変換するメソッドです。変換結果はlong型で返されます。
文字列は数字で始まっている必要があります。文字列が数字以外の文字列で始まっている場合は変換されず、整数0が返されます。
詳しくは、公式のArduinoリファレンスをご覧ください。英語ですが、翻訳サイトなどを使って一度目を通しておくと良いでしょう。
なお、toInt()
は、公式にもサンプルスケッチが用意されています。
スケッチ例
LEDの明るさの設定値(0~255)をシリアル通信でArduinoに送信して、LEDの明るさを制御するスケッチ例です。
toInt()
を使う際の注意としては、文字列が変換できなかった場合も0が返されるという点です。
今回はLEDの明るさを制御するだけなので、文字列が変換できなかった場合は0を指定したときと同じ動作にすることにしました。
0が返されたときにエラー処理をしたい場合は、正常に変換できた場合に返される整数の範囲に0が含まれないようにする必要があります。
/**
* @file conv.ino
* @brief LED Controller
* @author Keitetsu
* @date 2021/02/13
* @copyright Copyright (c) 2021 Keitetsu
* @par License
* This software is released under the MIT License.
*/
#define LED_PIN 3 /**< LEDを接続するanalogWrite対応ピン */
#define LED_DUTY_MIN 0 /**< LEDの最小デューティ比.消灯 */
#define LED_DUTY_MAX 255 /**< LEDの最大デューティ比.最大輝度で点灯 */
/**
* @brief セットアップ関数
*/
void setup()
{
Serial.begin(9600);
// LEDのPWM制御のデューティ比を0に設定する
analogWrite(LED_PIN, LED_DUTY_MIN);
}
/**
* @brief ループ関数
*/
void loop()
{
String line; // 受信文字列
int line_len; // 受信文字列の長さ
long led_duty; // LEDのPWM制御のデューティ比
// シリアル通信で1行(セミコロンまで)読み込む
line = Serial.readStringUntil(';');
// 1行の文字数を取得する
line_len = line.length();
// 文字列が1文字から3文字の間であれば,文字列を整数に変換する
if ((line_len >= 1) && (line_len <= 3)) {
// 文字列を整数に変換する
led_duty = line.toInt();
// デバッグ用文字列をシリアル通信で送信する
Serial.print("LED Duty: ");
Serial.println(led_duty);
// 整数がLED_DUTY_MIN以上LED_DUTY_MAX以下であれば,LEDのデューティ比として設定する
if ((led_duty >= LED_DUTY_MIN) && (led_duty <= LED_DUTY_MAX)) {
analogWrite(LED_PIN, led_duty);
}
}
}
実行方法
スケッチを書込みできたら、シリアルモニタを開きます。
はじめに、シリアルモニタで改行コードを送らない設定「No line ending」に設定してください。
そして、Arduinoのシリアルモニタから1桁から3桁かつ0から255の数字とその末尾に半角セミコロンを付加した文字列、例えば「0;」、「64;」や「255;」送ってみてください。
送った数字に応じてLEDの明るさが変わり、シリアルモニタには「LED Duty: 128」などと送った数字が戻ってきます。