注釈
こんにちは、SunFounder Raspberry Pi & Arduino & ESP32 愛好者コミュニティ (Facebook) へようこそ! Raspberry Pi、Arduino、ESP32 を仲間と一緒にさらに深く学びましょう。
参加する理由
専門的なサポート: 販売後の問題や技術的な課題をコミュニティとチームで解決。
学びと共有: 技術やチュートリアルを交換し、スキルを向上。
限定プレビュー: 新製品発表や先行情報に早期アクセス。
特別割引: 新製品を特別価格で購入可能。
イベント・プレゼント企画: プレゼントや季節キャンペーンに参加。
👉 一緒に探求し、創造しましょう。今すぐ [ここ] をクリックして参加!
2.2.2 サーミスタ (MCP3008)
はじめに
光センサーが光を検出するのと同様に、サーミスタは温度に敏感な電子部品であり、 熱警報などの温度制御機能を実現するために使用できます。
必要な部品
このプロジェクトには以下の部品が必要です。
部品をまとめて購入するのが便利です。リンクはこちら:
名前 |
キット内数量 |
リンク |
|---|---|---|
Raphael Kit |
337 |
以下から個別に購入することもできます。
部品紹介 |
購入リンク |
|---|---|
- |
回路図
T-Board 名 |
physical |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
実験手順
ステップ 1: 回路を組み立てます。
ステップ 2: コードのあるフォルダに移動します。
cd ~/raphael-kit/c/2.2.2-2/
ステップ 3: コードをコンパイルします。
gcc 2.2.2_Thermistor.c -o Thermistor -lwiringPi -lm
注釈
-lm は math ライブラリを読み込むために必要です。省略するとエラーになります。
ステップ 4: 実行ファイルを実行します。
./Thermistor
コードを実行すると、サーミスタが周囲温度を検出し、計算結果が画面に表示されます。
注釈
実行しても動作しない、または「wiringPi.h: No such file or directory」というエラーが出た場合は WiringPiのインストールと確認 を参照してください。
コード
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>
#define SPI_CHANNEL 0 // CE0
#define SPI_SPEED 1000000 // 1MHz
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // 開始ビット
buffer[1] = (8 + channel) << 4; // シングルエンドモード + チャンネル
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int value = ((buffer[1] & 3) << 8) | buffer[2];
return value;
}
int main(void) {
int analogVal;
double Vr, Rt, temp, cel, Fah;
if (wiringPiSetup() == -1) {
printf("setup wiringPi failed!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("SPI setup failed!\n");
return 1;
}
while (1) {
analogVal = read_ADC(0); // CH0 から読み取り
// MCP3008 は 10ビット ADC (0–1023)
Vr = 3.3 * analogVal / 1023.0; // 基準電圧 Vref = 3.3V と仮定
Rt = 10000.0 * Vr / (3.3 - Vr); // 分圧回路, 10k 抵抗を使用
temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
cel = temp - 273.15;
Fah = cel * 1.8 + 32;
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
delay(1000);
}
return 0;
}
コード解説
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#include <math.h>
GPIO 制御 (wiringPi.h)、SPI 通信 (wiringPiSPI.h)、標準 I/O 操作 (stdio.h)、数学関数 (math.h) のライブラリをインクルード。
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000
SPI チャンネルと通信速度を定義。ここでは SPI チャンネル 0 (CE0) とクロック速度 1MHz を使用。
int read_ADC(int channel)
指定された MCP3008 チャンネルからアナログデータを読み取る関数。
buffer[0] = 1;
buffer[1] = (8 + channel) << 4;
buffer[2] = 0;
MCP3008 プロトコルに従って SPI コマンドを設定: 開始ビット、シングルエンドモード設定、チャンネル番号。
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
SPI コマンドを転送し、MCP3008 から 10ビット ADC データを取得。
int value = ((buffer[1] & 3) << 8) | buffer[2];
返された SPI バッファから 10 ビットの ADC 結果を抽出。
if (wiringPiSetup() == -1) { ... }
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { ... }
WiringPi を初期化し、SPI を設定。初期化に失敗した場合は終了。
analogVal = read_ADC(0);
サーミスタの分圧回路が接続された MCP3008 チャンネル 0 のアナログ信号を読み取る。
Vr = 3.3 * analogVal / 1023.0;
デジタル値をアナログ電圧に変換。ADC の範囲は 0–1023、基準電圧は 3.3V。
Rt = 10000.0 * Vr / (3.3 - Vr);
分圧公式を使用してサーミスタの抵抗を計算。10kΩ 抵抗を仮定。
temp = 1 / ((log(Rt / 10000.0) / 3950.0) + (1 / (273.15 + 25.0)));
B 定数式を使用してサーミスタ抵抗から温度 (ケルビン) を算出。 T(K) = 1 / [ln(Rt/R₀)/B + 1/T₀] - R₀ = 10kΩ - B = 3950 - T₀ = 25°C = 298.15K
cel = temp - 273.15;
ケルビン温度を摂氏温度に変換。
Fah = cel * 1.8 + 32;
摂氏温度を華氏に変換。
printf("Celsius: %.2f C Fahrenheit: %.2f F\n", cel, Fah);
温度を摂氏と華氏で小数点 2 桁の精度で表示。