10_API_ChatGPT_SW
スイッチでChatGPT APIを呼び出す
スイッチを押したときにChatGPT APIへ質問を送信します。
準備する
CherryIoTとモジュールを接続する
CherryIoTの指定コネクタに以下のモジュールを接続し、CherryIoTをPCのUSB-A挿入口に接続します。
スイッチモジュール
接続先:A
Wi-Fiの情報を確認する
CherryIoTを接続する2.4GHz Wi-FiのSSID(ネットワーク名)とパスワードを確認します。Wi-Fiルーター本体のラベルや設定画面に記載されています。分からない場合は、ネットワークの管理者に確認してください。
OpenAI APIを使用する
はじめに「09_API_ChatGPT」で、OpenAI APIを使ってChatGPTへ質問を送る基本の流れを確認してください。このサンプルでは、その流れにスイッチ操作を組み合わせます。
サンプルコード
GitHubで公開しているサンプルコードです。コードをコピーして Arduino IDEで使用します。
GitHubからコードを読み込んでいます...プログラムを書き込む
上のサンプルコードをコピーし、Arduino IDEに貼りつけます。
設定情報を書き換える
コード内の以下の箇所を、「1 準備する」で確認・取得した情報に 書き換えます。
| コード内の項目 | 入力する情報 |
|---|---|
ssid | 接続するWi-FiのSSID |
password | Wi-Fiのパスワード |
openaiKey | OpenAI APIのシークレットAPIキー |
const char* ssid = "ここにSSIDを入力";const char* password = "ここにパスワードを入力";String openaiKey = "ここにAPIキーを入力";コードの左側にある項目名や記号は残し、例を参考に値の部分だけを 書き換えます。値を囲む"、行末の;、 証明書の開始・終了行などは削除しません。書き換えたあと、xxxxxなどの仮の文字が残っていないことを確認してください。
Wi-Fiのパスワード、APIキー、トークン、証明書などを入力したコードは、 Webサイト、SNS、GitHubなどへ公開しないでください。
ボードとポートの設定を確認し、左上の 「→(書き込みボタン)」を押してCherryIoTに書き込みます。
初めて書き込む方は「はじめてのCherryIoT」で詳しい手順を確認してください。
動作確認
シリアルモニターで確認する
スイッチの状態による回答を確認する
Arduino IDEの画面右上にあるシリアルモニターのアイコンをクリックします。スイッチの状態によって、ChatGPTから表示される回答が切り替わります。① スイッチを押しているときは、ギャル風の明るいキャラクターとしての回答が表示されます。② スイッチを押していないときは、「こんにちは、今日はいい天気ですね。」という質問に対する通常の回答が表示されます。回答の内容は実行するたびに異なる場合があります。

スイッチを押しているときと離しているときで、設定された内容に応じたChatGPTの回答がシリアルモニターに表示されるなら成功です。
コードの解説
スイッチ入力をきっかけにAPIリクエストを実行し、返ってきた回答を表示します。
GitHubからコードを読み込んでいます...Serial.begin(115200);シリアルモニターへ文字や測定値を表示するため、通信速度を115200bpsに設定します。
pinMode(swPin, INPUT);スイッチ端子を「入力」に設定します。
if (digitalRead(swPin) == HIGH) {スイッチが押されているかを確認します。
Serial.println(openAI_chat("あなたはギャル風の明るい弾けたキャラクターの女の子です。タメ口で話します。そのキャラクター設定で話してください。こんにちは、今日はいい天気ですね。"));押されているときはキャラクター設定を含む質問をOpenAI APIへ送り、回答を表示します。
delay(1000);1秒待ちます。
} else {ifの条件(スイッチが押されている)を満たさないとき、次の処理を実行します。
Serial.println(openAI_chat("こんにちは、今日はいい天気ですね。"));通常の質問をOpenAI APIへ送り、回答を表示します。
openAI_chat_reset();1回の質問が終わるたびに会話履歴を最初の状態へ戻します。
WiFi.begin(ssid, password);設定したSSIDとパスワードでWi-Fiへ接続します。
String openAI_chat(String message) {質問をOpenAI APIへ送り、返された回答文を呼び出し元へ返す処理を、openAI_chat関数にまとめます。
String request = "{\"model\":\""+model+"\",\"messages\":[" + historical_messages + "]}";モデル名と会話履歴をAPIへ送るJSON形式にまとめます。
if (client_tcp.connect("api.openai.com", 443)) {OpenAI APIへHTTPSで接続します。
client_tcp.println("Authorization: Bearer " + openaiKey);APIキーを認証ヘッダーへ追加します。
else if (c != '\r')受信文字が改行でも復帰文字でもないとき、応答確認用の文字列へ追加します。
} else if (getResponse.indexOf("\"")!=-1&&c == '\n'&&state==true) {回答の終端を示す引用符と改行を検出したとき、回答の読み取りを終了します。
return getResponse;APIから取り出した回答文を呼び出し元へ返します。
else
return "Connection failed";最初のifの条件(OpenAI APIへ接続できた)を満たさないとき、「Connection failed」を返します。
historical_messages = system_content;会話履歴を役割設定だけの初期状態へ戻します。