
いまさらだけどChatGPTとM5StickC Plusで、HelloプロンプトIoTエンジニアリングしてみる。
なにするの?
さいきん「これからの時代は自分でコードなんか書かないで、ChatGPTにコードを書いてもらうためのプロンプトエンジニアリングしか勝たん」みたいな本とか読んでいるんですが、実践が完全におろそかになっていたので、いまさらHello Prompt Engineeringをやってみます。やってみるのが大事。
プロンプトエンジニアリングってなに?
AI(人工知能)から望ましい出力を得るために、指示や命令を設計、最適化するスキルのことです。ChatGPTなどの生成AIを使いこなすために注目されるようになりました。生成AIは、命令(プロンプト)の出し方によって、出力されるコンテンツの質が大きく異なるため、より適切なものを入力するスキルが求められています。
つまり、要件を言葉でエンジニアにうまく伝えるようなもんですね。いけてるのおねがいのしかた、みたいな。
つくるもの
先日電子工作用に買ったM5StickC Plusで、とりあえずWifi接続してBitcoinの価格でも表示してみます。そんな難しくないですが、初心者のころはそれなりに時間がかかった気がします。ん、IoTじゃないか?でもArduino使ってるからIoTでいいよね。
使ったもの
VS Code, Platform IO (Arduino開発環境)
エンジニアさん:ChatGPT 3.5

さっそくGPT先生にお願いしてみる

日本語でいうとこんな感じです。ちなみにいまのところ、先生へのお願いは英語でしたほうがよくわかってもらえるようです。
あなたは有能なシステムエンジニアです。
M5StickC Plus用にコードを書いてほしいんです。
やりたいことは
- https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPYから現在のビットコイン価格をとってきて
- 現在のビットコイン価格を画面に表示して
- テキストは90度回転して、ちょっと大きめで
- ボタンをタップしたら、最新の価格にリフレッシュして
なんという曖昧な指示でしょう。JSONのどの値を参照するかとか特に指定してませんし、ボタンがどれかも言っていませんし、ちょっと大きめとか90度回転とか、何を基準に言ってるのかもよくわかりません。
ところで、最初の「あなたは有能なシステムエンジニアです」みたいなのはお作法なんだそうです。おまじないってやつです。なんか役割を刷り込むといいんだそうです。おもしろ。
吐き出されてきたコード

もう秒なんですよ。しかも礼儀正しいし。Certainlyなんて言われたら、なんかほんと恐縮ですよね。雑なPdMですみません。
#include <M5StickCPlus.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
const char *ssid = "";
const char *password = "";
const char *apiEndpoint = "https://api.bitflyer.jp/v1/ticker?product_code=BTC_JPY";
void setup() {
M5.begin();
M5.Lcd.setRotation(1); // Rotate screen 90 degrees
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
updateBitcoinPrice(); // Initial update
M5.Lcd.setTextSize(2); // Set text size to be a bit larger
}
void loop() {
M5.update();
if (M5.BtnA.wasPressed()) {
updateBitcoinPrice();
}
}
void updateBitcoinPrice() {
HTTPClient http;
Serial.println("Updating Bitcoin Price...");
http.begin(apiEndpoint);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
DynamicJsonDocument doc(1024);
deserializeJson(doc, payload);
float bitcoinPrice = doc["ltp"];
Serial.print("Bitcoin Price: ");
Serial.println(bitcoinPrice);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextColor(WHITE);
M5.Lcd.setCursor(10, 60);
M5.Lcd.print("BTC Price: ");
M5.Lcd.setCursor(10, 100);
M5.Lcd.print(bitcoinPrice);
} else {
Serial.printf("HTTP request failed with error %d\n", httpCode);
}
http.end();
}
早速実行してみます。が、ビルドが通りません。しかし慌てず、エラーメッセージを雑にコピペして、そのままGPT先生にフィードバック。

デバッグも秒

そんなエラー1回出したぐらいで謝罪しないでください。滅多なことでは謝ったりしないのがグローバル流だって聞きましたよ。
めでたくビルドも通り、そして…

きみ完璧じゃないかwww
いやこれはまじですごい。一通りのIoTは完全にChatGPT先生とプロンプト・エンジニアリングでやれる予感がしますね。結局はI/Oをいろいろと組み合わせて、なにか表示したり動かしたりするだけですからね。
しばらくプロンプト・エンジニアリングを試してみる。
さらに性能が神がかっているというGPT4.0とか、なんかダイヤグラムを解読してくれるなんとかいうのも出てきたと聞いているので、IoTだけでなくiPhone Appとかも作れるのかチャレンジしてみたいと思います。