ボタンを見張りながらLEDを点滅させ、同時にセンサーも読む。Arduinoでそう書こうとするとdelay()が使えず、millis()との比較と状態機械を部品ごとに手で書き分けることになる。扱う部品が増えるほどloop()の中は散らかっていく。
reduardo7氏の「Arduino Multi-Tasking Kit」は、そこをオブジェクトの生成に置き換える。すべてのクラスが静的な連結リストへ自分を登録するため、部品ごとにupdate()を呼んで回る必要がない。各部品は自分の状態を内部で持ち、単純なゲッターでイベントを知らせる。delay()はどこにも使わず、タイミングはすべてmillis()の比較で処理する。
利用者が書く定型は2行に収まる。setup()にRunnable::setupAll()を、loop()にRunnable::loopAll()を置くだけだ。あとはオブジェクトをグローバルに宣言しておけば、フレームワークがonSetup()とonReady()、onLoop()を順に呼ぶ。
時間を扱う部品は3種類ある。Timerは単発で、指定した時間が過ぎるとコールバックを呼ぶ。Intervalは一定間隔で繰り返し、回数を決めておける。Whileは一定間隔で回る非ブロッキングのwhile文にあたる。
ハードウェア側の部品も一通りそろう。Buttonはチャタリングを除いたうえで短い押下と長い押下、押しっぱなしを見分ける。PinInDigitalとPinOutDigitalはデジタル入出力を担い、回数を決めた点滅にも対応する。LedDisplay8はアノードコモンの7セグメント表示器を小数点込みで駆動し、ShiftRegisterは自動送りと手動での1段送り、向きの制御を備える。ProximityCheckはLEDと光で抵抗値が変わる素子を組み合わせた近接センサーで、校正の手順を含む。
多くのセッターが自分自身を返すため、設定をつなげて書ける。タイマーを3秒に設定して開始する処理は、timer.set(3000)->start();のように1行で済む。
導入の手間も小さい。ヘッダーのみで構成し、.cppファイルもビルドの指定も要らない。すべてをまとめた単一のヘッダーを既存のプロジェクトへ置くだけでも使える。
例となるスケッチは11本を同梱する。ボタンのクリック判定や点滅の完了検出、7セグメント表示器の増減、近接センサーの校正、シフトレジスタの自動と手動などが並び、いずれもArduino IDEとPlatformIOの両方で開ける。全クラスの仕様をまとめた技術マニュアルと導入手順の解説も添え、実際に組み上げた例としてarduino-carという別のリポジトリを公開している。