← UIAPduino WebHID Lab

HID Graph

HID ProMicro CH32V003 / Tools → USB: Keyboard+Mouse+WebHID / Sketch: HidGraph.ino / hid.Print() の数値をリアルタイムでグラフ化 & CSV 保存
⚠️ このページは Chrome または Edge でのみ動作します。
WebHID API は Firefox・Safari では利用できません。Chrome / Edge で開き直してください。

接続

未接続

※ Chrome / Edge のみ対応。接続した時から記録が始まり、届いた数値がグラフに出ます。

グラフ

幅
接続すると、基板から届いた数値がここにグラフで出ます。
値ごとに段が分かれます。
Excel
Excel でグラフにすると、印の行(bounce など)で線が切れます。 印の行は値の列が空欄になるためです。次の設定で、空欄を飛ばして線がつながります。
グラフを右クリック→ データの選択→ 非表示および空白のセル(左下)→ データ要素を線で結ぶ→ OK

止めたあと、グラフをドラッグすると過去へ動き、ホイールで幅が変わります(全部の段がいっしょに動きます)。 段の左の ⋮⋮ をつかんで上下に動かすと、段を入れ替えられます。 保存は CSV(UTF-8・BOM 付き)です。

警報の知らせ方 段の見出しの「警報」で上限・下限を決めると、範囲の外へ出た時に知らせます

トピック名

いつもすること:グラフに赤い印を付け(CSV の「印」の列にも残ります)、範囲の外にいる間は段を赤くします。 音とスマホへの知らせは、同じ段では 1 分に 1 回までです。
ntfy の使い方:①スマホに「ntfy」のアプリを入れる(無料・アカウント不要) ②アプリの「+」→「Subscribe to topic」で、自分で決めたトピック名を入れて「Subscribe」 ③同じ名前をここに入れて、「スマホに知らせる」にチェック ④「試しに送る」で、スマホに通知が届くか確かめる。 トピック名は半角の英数字と - _ で 64 文字までです。知っている人は誰でも知らせを読めるので、推測されにくい名前にしてください。 トピック名と入・切は、このブラウザの中にだけ覚えます。
iPhone で、ntfy のアプリには届くのに iPhone の通知に出ない時は、アプリでそのトピックの購読を消して、同じ名前で購読し直してください (ntfy の説明書の「既知の問題」にある直し方です)。
知らせを送るのはこのページです。ページを閉じたり、PC がスリープしたりすると送れません。

HID コンソール 届いた文字をそのまま表示(緑=数値として読んだ行 / 橙=印になった行)

行が思ったとおりにグラフにならない時は、ここで実際に届いた文字を確かめてください。新しいほうから 500 行まで表示します。

スケッチソース — HidGraph

GitHub ↗

書き込み手順: Arduino IDE → sketches/HidGraph/HidGraph.ino / ボード: HID ProMicro CH32V003, Tools → USB: Keyboard+Mouse+WebHID
センサーなしで試せるデモです。ボールを落としてはずませる計算をして、高さを h[mm]:値 の形で送ります。

使い方と仕様

1. スケッチでの数値の書き方

hid.Print() / hid.Println() で出した 1 行(改行まで)を、ページが次の 3 つの書き方のどれかとして自動で見分けます。 スケッチ側の設定は要りません。

書き方届く行の例グラフ
1 行に数値 1 つ123段が 1 つ。名前は「値1」
1 行に数値を複数12,34,56 12 34 56数値の数だけ段ができる。名前は左から「値1」「値2」「値3」
名前つきtemp:23 hum:45 temp:23,hum:45名前がそのまま段の見出しになる
名前と単位temp[℃]:23見出しが「temp [℃]」になる

2. 印(数値として読めない行)

上の書き方にきっちり合わない行(start sensor error count = 5 など)は、 グラフの上の「印」になります。その行が届いた時刻に、全部の段を貫く縦線が出て、いちばん上の段の上の端に文字が出ます。 縦線にマウスを乗せると、全文が出ます。数値としてグラフにしたい時は、count:5 のように書いてください。 空の行は、何もしません。

3. 時刻

グラフの横軸と CSV の時刻は、ページがその行の改行を受け取った時刻(記録を始めてからの時間)です。基板の millis() ではありません。

4. グラフの見方と操作

したいこと操作
見る幅を変える「幅」の 5 秒・10 秒・30 秒・60 秒を選ぶ。直近のその幅が流れ続けます
過去を見る「一時停止」を押す(グラフをドラッグしても止まります)。ドラッグで過去へ動き、ホイールで幅が変わります。止めている間もデータは受け取り続けます。「再開」で最新に戻ります
値を読むグラフにマウスを乗せる。縦線が全部の段に出て、その時刻にいちばん近い点の値が段ごとに出ます。時刻は下の軸に出ます
縦軸を固定する段の見出しの「自動」を押して「固定」にし、下と上の値を入れる。「自動」の間は、見えている範囲の最小〜最大に合わせ続けます
段を入れ替える段の左の ⋮⋮ をつかんで上下に動かす。測定中でもできます。CSV の列も同じ並びになります
2 つの値の関係を見る「XY」に切り替えて、X と Y の値を選ぶ。同じ行で届いた値どうしを点にします。描くのは「時間」と同じ幅の点で、古い点ほど薄くなります

段が多くて 1 段が 80 px より低くなる時だけ、グラフの中を縦にスクロールします。

5. 式の段(速度・加速度など)

段の見出しの「+変化」を押すと、その値の変化の速さ(時間で微分したもの)の段が、すぐ下にできます。 距離の段で押せば速度、できた速度の段でもう一度押せば加速度です。単位は cm → cm/s → cm/s² と自動で付きます。 「+ 式の段」を押すと、自分で式を書く段ができます。

使えるもの書き方例
四則演算・括弧・べき乗+ - * / ( ) ^temp - 25 (a + b) / 2
数学の関数abs sqrt sin cos atan2 log min maxsqrt(ax^2 + ay^2 + az^2)
微分d(名前, N)d(h, 5) d(h, 5) * 3.6
移動平均avg(名前, N)avg(h, 9)

6. 警報(上限・下限)

段の見出しの「警報」を押すと、上限と下限を決める小さな窓が開きます。どちらか片方だけでも決められます(空欄は使いません)。 決めた値は、グラフに赤い点線で出ます。縦軸の「固定」の上・下とは別のものです。

いつすること
範囲の中から外へ出た時(上限を超えた・下限を下回った)グラフに赤い印を付ける(CSV では、その値の行の「印」の列に入る)。「警報の知らせ方」で選んでいれば、音を鳴らす・スマホに知らせる
外にいる間段の見出しと、グラフの枠・今の値を赤くする。値が届くたびに知らせることはしない
範囲の中へ戻った時印だけ付ける

7. 記録を消す

記録を消して 0 からやり直すきっかけは、次の 2 つだけです。基板をつなぎ直しただけでは消えません。

消す直前の記録は、1 回分だけ取ってあります。「消す前の記録を保存」で CSV にできます。 段の名前・単位・式・並び・縦軸の設定・上限と下限は、消しても残ります。

8. CSV

項目内容
保存する範囲「全部を保存」=記録した全部。「表示中の範囲を保存」=いまグラフに見えている時刻の範囲
行届いた 1 行が、CSV の 1 行
列時刻 [ms]、値(段の並び順。見出しは temp [℃] の形)、印
受け取った値届いた文字のまま(23.50 は 23.50)
式の段の値有効数字 6 桁。d() と avg() の値は、N 個の点の真ん中の点の行に入る
その行に無い値空欄
印印の行の 印 の列に文字が入る(数値の列は空欄)
文字コードUTF-8(BOM 付き)。Excel でそのまま開けます。Python で読む時は encoding='utf-8-sig' を指定してください
ファイル名graph-年月日-時分秒.csv(記録を始めた日時)。保存のダイアログで変えられます
閉じる前の確認「全部を保存」で書き出していない行が 1 行でもあると、ページを閉じる・再読み込みする・別のページへ移る前に、ブラウザが「このサイトを離れますか?」と聞きます。測定中は、保存したあとに届いた行も数えます。「表示中の範囲を保存」は一部だけなので数えません。「消す前の記録」が書き出されないまま残っている時も聞きます。聞く文はブラウザが決めるので、ブラウザによって違います。ブラウザそのものが落ちた時や、PC の電源が切れた時は、聞くことができません
Excel でグラフにする時印の行や、別の行で届いた値の行は空欄になるので、そこで線が切れます。グラフを右クリック →「データの選択」→ 左下の「非表示および空白のセル」→「データ要素を線で結ぶ」で、空欄を飛ばして線がつながります

9. 通信

HID Console と同じ Print プロトコルです。Input Report 8 バイトの先頭が 0x50、2 バイト目がフラグ(0x04=クリア)、 残り 6 バイトが文字で、改行は 0x0A です。接続した時に、ブラウザから接続通知(0x01 の Feature Report)を送り、 スケッチの hid.WaitAvailable() を先へ進めます。

接続した直後は、最初の改行までに届いた文字を読まずに捨てます。基板がすでに動いていると、行の途中から届くためです (h[mm]:523 の 23 だけが届くと、数値と読み違えて「値1」の段ができてしまいます)。 捨てた文字は、HID コンソールに灰色で出ます。スケッチが hid.Clear() を送った時は、次の文字が行の始まりなので、そこから読みます。 ちょうど行の始まりで接続した時は、正しい 1 行を捨てることになります。