Arduino - 文字列を数値に変換(整数値のみ)

概要

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が含まれないようにする必要があります。

conv.ino
/**
 * @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」などと送った数字が戻ってきます。

SerialMonitor.png

i-enter
「効果」をつねに提供します。スマホアプリ開発No.1の実績。最新のIoTに対応した開発も行います。
https://www.i-enter.co.jp/
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
この記事は以下の記事からリンクされています
コメント

こんにちは。

記事タイトルにあるような処理を行うとき、toInt()を使う方法もあります。
ご紹介されているメソッドの実装にもいくつか問題があるように感じましたので、編集リクエストを送信させていただきました。
ご確認のほど、よろしくお願いいたします。
公式のArduinoリファレンスへのリンクと、サンプルスケッチのリンクは下記のとおりです。

あなたもコメントしてみませんか :)
すでにアカウントを持っている方は
ユーザーは見つかりませんでした