ステップ1: 作る
説明
micro:bitを自己完結型のデータロガーに変身させて、測定した最高・最低温度を記録し、電池が切れたり電源を切断してもデータが保持されるようにします。
Pythonのプログラムですが、Pythonについて何も知らなくても使えます。
学ぶこと
- Pythonを使って、電源が切断されてもmicro:bitに記録が残る不揮発性ストレージに対してデータを読み書きする方法
- Pythonプログラムでエラーを処理する方法
- 数値変数を文字列に変換したり、逆に戻したりする方法
必要なもの
- micro:bit
- オプションのバッテリーパック
使い方
- .hexプログラムファイルをダウンロードし、micro:bitに書き込みます。
- バッテリーパックを持っているならmicro:bitにつないで、どこか温度が変わる場所に置きます。 屋外や冷蔵庫の中に置いて数分間放置することでテストできます。
- 振ると現在の温度を表示します。
- ボタンAを押すと記録された最低温度を表示します。
- ボタンBを押すと記録された最高温度を表示します。
- GNDとピン2を指で同時に押すと、最高温度と最低温度を現在の温度にリセットします。
ステップ2: プログラムする
1from microbit import *
2
3# function to read data file:
4def get_nv_data(name):
5 try:
6 with open(name) as f:
7 v = int(f.read())
8 except OSError:
9 v = temperature()
10 try:
11 with open(name, 'w') as f:
12 f.write(str(v))
13 except OSError:
14 display.scroll('Cannot create file %s' % name)
15
16 except ValueError:
17 display.scroll('invalid data in file %s' % name)
18 v = temperature()
19
20 return v
21
22# function to write data file:
23def set_nv_data(name, value):
24 try:
25 with open(name, 'w') as f:
26 f.write(str(value))
27 except OSError:
28 display.scroll('Cannot write to file %s' % name)
29
30min = get_nv_data('min.txt')
31max = get_nv_data('max.txt')
32
33while True:
34 currentTemp = temperature()
35 if currentTemp < min:
36 min = currentTemp
37 set_nv_data('min.txt', min)
38 if currentTemp > max:
39 max = currentTemp
40 set_nv_data('max.txt', max)
41 if accelerometer.was_gesture('shake'):
42 display.scroll(currentTemp)
43 if button_a.was_pressed():
44 display.scroll(get_nv_data('min.txt'))
45 if button_b.was_pressed():
46 display.scroll(get_nv_data('max.txt'))
47 if pin2.is_touched():
48 display.scroll('clearing data')
49 set_nv_data('min.txt', currentTemp)
50 set_nv_data('max.txt', currentTemp)
51
動作の仕組み
このデータロガーは、micro:bitから電源が切断された場合でも読み取り値を保存します。 これを行うには、 不揮発性ストレージ に読み取り値を保存します。 micro:bitにプログラムを書き込んでからコンピュータと切り離してもプログラムは消えませんが、同じように、電源を切っても内容を保持できるコンピュータメモリなのです。
データをmicro:bit上の、Pythonが読み取り更新できる2個のテキストファイルmin.txt
とmax.txt
に格納します。
プログラムは、温度を追跡して比較するために変数を3つ使用します。
currentTemp
はmicro:bitに内蔵されている 温度センサー の現在の温度を表します。max
が最高温度です。 現在の温度がmax
の現在値より大きい(>)場合、新しい値が割り当てられます。min
は最低温度です。 現在の温度が、現在のmin
の値を下回ると(<)現在の温度が新しいminの値になります。
二つの関数get_nv_data
とset_nv_data
は、不揮発性テキストファイルに数値データを読み書きします。 これらの関数は数字をテキストに変換したりその逆を行います。
int()
はテキスト(文字列ともい)を数値(整数)型変数に変換し、現在の温度と比較できるようにします。str()
は温度の読み取り値などの数値変数をテキストファイルに格納できるテキスト文字列に変換します。
関数は try
と except
を使って、データファイルの読み書きエラーをキャッチします。 一番最初に実行するときなど、最高最低温度が保存されたテキストファイルがない場合は、変数max
とmin
に現在の温度を設定します。
プログラムのメイン部分は、 while True:
ループの中で実行されます。 これは MakeCode で ずっと ブロックのように振る舞います。
ステップ3: 改善する
- micro:bit の温度センサーはプロセッサー内蔵のものなので、(プロセッサーの発熱により)周囲の気温よりも高い温度が読み出されます。 通常の温度計を使用して差を測定し、
temperature()
の読み取り値から差を引き算してオフセットをプログラムに足し算します。 - プログラムを変更して、加速度センサーにより測定される力など、さまざまな種類のデータを記録しましょう。
- 別の場所にある別のmicro:bitにデータを送信する無線機能を追加しましょう。
This content is published under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) licence.