第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です。

つまり、

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

とすれば、文字列0、文字列1、文字列2のいずれか適当な文字列をシリアルモニタに表示できるわけです。

0〜2の乱数はrandom(3)と書けばOKでしたよね。

ということで、String moji[3]で宣言したStringクラスのインスタンス配列から適当な文字列を選択するには、

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

と書けば実現できます。

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

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

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

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

文字列ごとに改行していますが、これは見やすくしただけです。C/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 23
#define SWITCH_CHUO   22
#define SWITCH_MIGI   21

// スイッチクラスのインスタンスを生成
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 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次