注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と共にさらに深く学びましょう。
参加する理由
専門サポート: 購入後の問題や技術的な課題をコミュニティとチームで解決
学びと共有: ヒントやチュートリアルを交換し、スキルを向上
限定プレビュー: 新製品発表や先行情報に早期アクセス
特別割引: 新製品を特別価格で購入可能
イベントとプレゼント企画: プレゼントや季節ごとのキャンペーンに参加
👉 一緒に探求し、創造しましょう。今すぐ [ここ] をクリックして参加!
2.2.2 サーミスタ (MCP3008)
概要
フォトレジスタが光を検出できるのと同様に、サーミスタは温度に応じて抵抗値が変化する電子部品です。 これを利用して温度制御や熱警報などの機能を実現できます。
必要な部品
このプロジェクトで必要な部品は以下の通りです。
キット一式を購入するのが便利です。リンクはこちら:
名前 |
キット内の部品数 |
リンク |
|---|---|---|
Raphael Kit |
337 |
個別購入する場合は以下のリンクを参照してください。
部品名 |
購入リンク |
|---|---|
- |
回路図
実験手順
ステップ 1: 回路を組み立てます。
ステップ 2: SPI インターフェースを設定し、 spidev ライブラリをインストールします(詳細は SPI 設定 を参照)。すでに完了している場合はこのステップを省略できます。
ステップ 3: コードのフォルダに移動します。
cd ~/raphael-kit/python
ステップ 4: 実行ファイルを実行します。
sudo python3 2.2.2-2_thermistor.py
コードを実行すると、サーミスタが周囲の温度を検出し、計算結果が画面に表示されます。
警告
RuntimeError: Cannot determine SOC peripheral base address というエラーが出た場合は、「gpiozero」が動作しない場合。 を参照してください。
コード
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import spidev
import time
import math
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
while True:
analogVal = read_adc(0)
Vr = 3.3 * analogVal / 1023.0
Rt = 10000.0 * Vr / (3.3 - Vr)
tempK = 1.0 / (((math.log(Rt / 10000.0)) / 3950.0) + (1.0 / (273.15 + 25.0)))
Cel = tempK - 273.15
Fah = Cel * 1.8 + 32
print('Celsius: %.2f °C Fahrenheit: %.2f °F' % (Cel, Fah))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
コード解説
必要なライブラリをインポート:
spidev: MCP3008 との SPI 通信time: 遅延処理math: Steinhart–Hart 式の対数計算RPi.GPIO: GPIO 初期化とクリーンアップ
GPIO を BCM モードに設定し、MCP3008 の SPI (バス0, CE0) を 1MHz で初期化。
read_adc(channel)関数で MCP3008 の指定チャネル (0–7) からアナログ値を取得し、10ビット値 (0–1023) を返す。メインループでは:
チャネル0から電圧値を読み取る
サーミスタの抵抗値を計算
Steinhart–Hart 式を用いて温度を計算 (ケルビン → 摂氏 → 華氏)
計算結果を 0.2秒ごとに出力
Ctrl+C で停止すると、SPI と GPIO が正しく解放されます。