温度 はセンサー入門の定番。本記事では 3 種類のセンサーを使い分ける考え方と、micro:bit / M5Stack 両方のコードを示します。
1. 温度センサーの仕組み
- サーミスタ式 (NTC):温度で抵抗値が変わる。安価、応答速い、精度はそこそこ
- IC デジタル式: チップ内部で温度→デジタル値に変換、配線が楽 (例: DS18B20)
- 容量式 + IC: 高精度、温湿度・気圧と組合せ可 (例: BME280)
2. 代表 3 種の比較
| センサー | 通信 | 精度 | 価格 | 特徴 |
|---|---|---|---|---|
| DS18B20 | 1-Wire | ±0.5℃ | 300〜500 円 | 防水ケーブル版あり、土中・水中 OK |
| DHT22 | 専用プロトコル | ±0.5℃ | 500〜900 円 | 湿度も測れる、応答やや遅い |
| BME280 | I2C | ±1℃ | 500〜800 円 | 湿度・気圧も測れる、小型 |
| M5Stack ENV III Unit | I2C (Grove) | ±0.5℃ | 1,500 円 | BME280 をユニット化、配線一発 |
3. 配線:micro:bit + DHT22
- DHT22 の VCC (赤) → micro:bit の 3V
- DHT22 の DATA (黄) → micro:bit の P0
- DHT22 の GND (黒) → micro:bit の GND
- ワニ口クリップ で各ピンに接続 (はんだ付け不要)
⚠️ 配線時の注意事項
(1) 配線中は必ず USB を抜く (通電しながら触ると誤接触で破損)。(2) VCC と GND を絶対に直接繋がない (ショート→ 発煙の恐れ)。(3) センサー電源電圧の確認 (DHT22 は 3.3V〜5V 動作、micro:bit は 3V 出力なので OK)。(4) ワニ口クリップが他のピンに触れていないか確認 (P0 を狙ったつもりが P1 に当たっているケース多発)。(5) 静電気対策 (乾燥した日は金属に触れて放電してから作業)。
4. micro:bit MakeCode (ブロックの流れ)
- 1拡張機能を追加: MakeCode で「拡張機能 → DHT22」を検索して追加
- 2ずっとブロックの中で 「DHT22 から温度を読む (P0)」
- 3変数 temp に代入
- 4シリアル出力: `serial write line(temp)` で USB ケーブル経由で PC に送る
- 55 秒待つ (測定間隔)
5. M5Stack MicroPython (BME280)
M5Stack Core2 + ENV III Unit (BME280)
Python
from m5stack import lcdfrom m5stack_ui import M5Screenimport unitimport time
screen = M5Screen()screen.set_screen_bg_color(0xFFFFFF)env3 = unit.get(unit.ENV3, unit.PORTA)
while True: temp = env3.temperature hum = env3.humidity pres = env3.pressure / 100 # hPa lcd.clear() lcd.print(f"Temp: {temp:.1f} C", 10, 30, 0xFF0000) lcd.print(f"Hum: {hum:.1f} %", 10, 70, 0x0000FF) lcd.print(f"Pres: {pres:.1f} hPa", 10, 110, 0x008800) print(f"{time.time()},{temp:.2f},{hum:.2f},{pres:.2f}") time.sleep(5)6. 1 日のデータをグラフ化 (Colab で解析)
シリアル出力か SD 保存で集めた CSV を Google Colab に上げて、matplotlib でグラフ化します。
Colab で 24 時間温度の折れ線グラフを描く
Python
import pandas as pdimport matplotlib.pyplot as plt
df = pd.read_csv('temp_log.csv', names=['ts', 'temp', 'hum', 'pres'])df['time'] = pd.to_datetime(df['ts'], unit='s')
fig, ax = plt.subplots(figsize=(10, 4))ax.plot(df['time'], df['temp'], color='red', label='温度 [°C]')ax.set_xlabel('時刻')ax.set_ylabel('温度 [°C]')ax.set_title('我が家のリビング 24 時間温度変化')ax.grid(True, alpha=0.3)ax.legend()fig.autofmt_xdate()plt.tight_layout()plt.savefig('room_temperature_24h.png', dpi=200)7. 落とし穴
- 自己発熱: 1 秒間隔の連続測定だと値が高めに出る → 5〜10 秒間隔
- 直射日光: 黒い樹脂が熱くなる → 日陰に設置
- 配線の長さ: 1m 超えると 1-Wire の DS18B20 で誤動作することあり
- 起動直後: 電源投入から 5〜10 秒は値が安定しない
- 結露: 寒い場所に持ち出すと水滴が付き電子部品が壊れる → ジップロックに乾燥剤
8. 次の話
EP.04 では 湿度 を扱います。「窓を閉めると湿度はどれくらい上がるか」を 1 日のデータで検証します。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。