データログ V2

このモジュールは micro:bit V2MICROBIT USB ドライブに保存された MY_DATA ファイルにデータを記録できるようにします。

_images/log-my_data.png

データは表形式で構成され、ブラウザで表示したりプロットしたりできます。

_images/log-html-view.jpeg

この機能に関する詳しいガイダンスは microbit.org ウェブサイトのデータロギングページ で確認できます。

関数

log.set_labels(*labels, timestamp=log.SECONDS)

ログファイルのヘッダーを設定します。

この関数には任意の数の位置引数を指定でき、それぞれが列のヘッダーになります。たとえば log.set_labels("X", "Y", "Z") のように使います。

理想的には、データが記録される前に一度だけこの関数を呼び出し、データテーブルのヘッダーを一度だけ設定する必要があります。

プログラム開始時にログファイルが既に存在する場合、あるいはこの関数が複数回呼ばれた場合、ログファイルに既に定義されているラベルをチェックします。この関数呼び出しがまだ存在しない新しいラベルを含む場合、追加カラムを持つ新しいヘッダ1行を生成します。

デフォルトで、最初の列は各行のタイムスタンプを含んでいます。時間の単位はタイムスタンプ引数で選択できます。

パラメータ:
  • *labels -- 任意の数の位置引数。それぞれがログヘッダの見出しになります。
  • timestamp -- すべての行の最初の列として自動的に追加されるタイムスタンプの単位を選択します。タイムスタンプの値は log.MILLISECONDS, log.SECONDS, log.MINUTES, log.HOURS, log.DAYS またはタイムスタンプを無効にする None のうちのいずれかである必要があります。デフォルト値は log.SECONDS です。
log.set_mirroring(serial)

ログのデータ記録をシリアル出力にミラーリングするかを設定します。

シリアル出力へのミラーリングはデフォルトで無効になっています。有効にすると、ログファイルに記録された各行がシリアルにも出力されます。

パラメータ:serial -- True を指定するとシリアル出力にデータをミラーリングします。
log.delete(full=False)

ヘッダを含むログの内容を削除します。

ログヘッダーを再び追加するには、この関数の後に set_labels 関数を呼び出す必要があります。

消去には2種類のモードがあります。物理ストレージからデータを完全に削除する「完全」消去と、データを削除せずに無効にする「高速」消去です。

パラメータ:full -- True を指定すると完全消去になり、 False を指定すると高速消去になります。
log.add(data_dictionary, /, *, **kwargs)

ログにデータ行を追加します。

この関数でデータを記録するには、2つの方法があります。

  1. キーワード引数を使う方法: 各引数名は見出しを表します。
    • 例: log.add(X=compass.get_x(), Y=compass.get_y())
  2. 辞書を使う方法: 辞書の各キーが見出しを表します。
    • 例: log.add({ "X": compass.get_x(), "Y": compass.get_y() })

キーワード引数による方法は使いやすく、辞書による方法は、キーワード引数では使えないスペース(およびその他の特殊文字)を使えます。

set_labels 関数あるいはこの関数の以前の呼出で事前に指定されなかった新しいラベルがある場合、その新規ラベルのあるログを追加できるように、新しいヘッダーエントリーができます。

以前に指定され、この関数への呼び出しに存在しないラベルは、ログ行に空の値でスキップされます。

例外:OSError -- ログが一杯になると、この関数はエラーコード 28 ENOSPCOSError 例外を発生させます。

サンプルコード

最小限の例:

from microbit import *
import log

# 5秒毎にデータを記録すえうタイマーを設定
@run_every(s=5)
def log_temp():
    log.add(temp=temperature())

while True:
    # プログラムが終わらないように必要となるループ
    sleep(100)

log モジュール API の全機能を実行する例:

from microbit import *
import log

# ラベルの設定とタイムスタンプの時間単位を選択
log.set_labels('temp', 'brightness', timestamp=log.SECONDS)

# 各データ行をシリアル出力に送るようにする
log.set_mirroring(True)

continue_logging = True

# このデコレータは、この関数が10秒50ms毎に実行されるようにスケジュール
@run_every(s=10, ms=50)
def log_data():
    """温度と光量を記録し、アイコンを表示する。"""
    global continue_logging
    if continue_logging:
        display.show(Image.SURPRISED)
        try:
            log.add(temp=temperature(), brightness=display.read_light_level())
        except OSError:
            continue_logging = False
            display.scroll("Log full")
        sleep(500)

while True:
    if button_a.is_pressed() and button_b.is_pressed():
        display.show(Image.CONFUSED)
        # "full" オプションでログファイルを削除すると、時間はかかりますが
        # 確実にデバイスからデータを消去できます。
        log.delete(full=True)
        continue_logging = True
    elif button_a.is_pressed():
        display.show(Image.HAPPY)
        # 光量のみを記録し、温度の項目は空になります。ログが一杯になると
        # 例外が発生し、プログラムが停止します。
        log.add({
            "brightness": display.read_light_level()
        })
    else:
        display.show(Image.ASLEEP)
    sleep(500)