第25回 言い訳キーボード完成版

いよいよ言い訳キーボードのスケッチ完成です!

目次

Stringクラスのインスタンス配列

前回の記事では、Stringクラスのインスタンスを配列として用意する書き方を習得しました。

String moji[3] = {"文字列0", "文字列1", "文字列2"};

このように配列を宣言すると、moji[0]"文字列0"moji[1]"文字列1"moji[2]"文字列2"で初期化されます。


例えば次のようにシリアルモニタに表示するスケッチを考えてみます。

Serial.println( moji[1] );

シリアルモニタには次のように結果が表示されます。

文字列1

言い訳キーボードでは、スイッチが押されたら適当な文字列を選択するようにしています。

そこで、インスタンスの配列で適当な文字列を選択したい場合はどうしたらよいでしょうか?

そうするには、配列の添字を乱数にしてしまえばOKです。

moji[0]moji[1]moji[2]の中から適当な文字列を選択する場合、0〜2の乱数を発生させて、それを配列の添字にすればOKです。

つまり、次のようなスケッチにすれば、文字列0、文字列1、文字列2のいずれか適当な文字列をシリアルモニタに表示できるようになります。

Serial.println( moji[ 0〜2の乱数 ] );

「0〜2の乱数」の部分は、random(3)と書くことができますので、次のスケッチで適当な文字列を選んでシリアルモニタに表示することができます。

Serial.println( moji[random(3)] );

言い訳キーボードへの実装

お疲れさまでした!

これで言い訳キーボードのスケッチに必要な知識を一通り習得できました!!


それでは、第21回の記事で作成した動作確認版の言い訳キーボードのスケッチを、Stringクラスのインスタンス配列を使って書き直してみます。

まず、各スイッチに対応した言い訳の文字列は、例えば左スイッチであれば以下のように宣言することにします。

String iiwake_hidari[3] = {
  "okitara \n",
  "toirega \n",
  "kaiinuga \n" };

文字列ごとに改行していますが、これは見やすくしただけです。(C++言語では改行は無視されるので見やすさを優先してみました)

このように宣言したインスタンス配列を、左側スイッチが押された場合、Keyboard.printメソッドでPCに適当に選んで送ればOKです。

if( hidariSwitch.pushed() ){
  Keyboard.print(iiwake_hidari[ random(3) ]);
}

このようにStringクラスのインスタンスを配列として最初に宣言すれば、プログラムの先頭の方にまとめることができます。

文字列を変更したい場合、まとまっていますのでメンテナンスしやすくなりますよね。

言い訳キーボードスケッチ完成版!

それでは、今までの集大成、ということで言い訳キーボードのスケッチをまとめましょう。

/*
 * 言い訳キーボード完成版
 * 
 *  PC側の入力モードが「日本語入力」で「ローマ字入力」の場合のスケッチです
 */

// キーボードライブラリとスイッチライブラリをインクルード
#include <Keyboard.h>
#include <avdweb_Switch.h>

// 左スイッチの言い訳文字列の定義
String iiwake_hidari[3] = {
  "okitara \n",
  "toirega \n",
  "kaiinuga \n" };

// 中央スイッチの言い訳文字列の定義
String iiwake_chuo[3] = {
  "zutuugahidoinode \n",
  "mizumoredeshuurisurutame \n",
  "doubutubyouinnniikutame \n" };

// 右スイッチの言い訳文字列の定義
String iiwake_migi[3] = {
  "kyuukawoshutokuitashimasu \n",
  "kyuukyooyasumishimasu \n",
  "owarishidaishusshashimasu \n" };

// スイッチのピン番号の定義
#define SWITCH_HIDARI A5
#define SWITCH_CHUO   A4
#define SWITCH_MIGI   A3

// スイッチクラスのインスタンスを生成
Switch hidariSwitch(SWITCH_HIDARI); // 左側スイッチ
Switch chuoSwitch(SWITCH_CHUO);     // 中央スイッチ
Switch migiSwitch(SWITCH_MIGI);     // 右側スイッチ


void setup() {
  // キーボード接続処理
  Keyboard.begin();

  // スイッチ接続ピンの入力設定
  pinMode(SWITCH_HIDARI, INPUT_PULLUP);
  pinMode(SWITCH_CHUO,   INPUT_PULLUP);
  pinMode(SWITCH_MIGI,   INPUT_PULLUP);

  // 乱数の初期化
  randomSeed( analogRead(A1) );
}


void loop() {

  // スイッチライブラリに左側スイッチ状態の調査を指示
  hidariSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( hidariSwitch.pushed() ){
    Keyboard.print(iiwake_hidari[ random(3) ]);
  }


  // スイッチライブラリに中央スイッチ状態の調査を指示
  chuoSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( chuoSwitch.pushed() ){
    Keyboard.print(iiwake_chuo[ random(3) ]);
  }

  // スイッチライブラリに右側スイッチ状態の調査を指示
  migiSwitch.poll();
  
  // 左側スイッチが押されたら、主部を適当に選んでPCに送信
  if( migiSwitch.pushed() ){
    Keyboard.print(iiwake_migi[ random(3) ]);
  }

}

更新履歴

日付内容
2021.12.30新規投稿
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次