Grove - I2C 高精度温度センサー(MCP9808)
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
Grove - I2C 高精度温度センサー(MCP9808)は、MCP9808をベースにした高精度デジタルモジュールです。他のセンサーとは異なり、このセンサーでは測定解像度を選択することができます。高精度な温度測定に加え、プログラム可能な温度アラートも提供しています。アラーム信号を出力するための専用ピンを使用しており、この信号を割り込みとして使用して他のボードを制御するのに非常に便利です。
総じて、このセンサーは温度制御の新しいスターになると信じています。
産業用センサーへのアップグレードが可能
SenseCAP S2110コントローラーおよびS2100データロガーを使用することで、Groveを簡単にLoRaWAN®センサーに変えることができます。Seeedはプロトタイピングを支援するだけでなく、SenseCAPシリーズの堅牢な産業用センサーを使用してプロジェクトを拡張する可能性も提供します。
SenseCAP S210xシリーズの産業用センサーは、環境センシングのための即時使用可能な体験を提供します。空気質モニタリングのための高性能で堅牢なS2101ワイヤレス温度・湿度センサーをご参照ください。このシリーズには、土壌水分、空気温度と湿度、光強度、CO2、EC、そして8-in-1気象ステーション用のセンサーが含まれています。次の成功する産業プロジェクトのために最新のSenseCAP S210xをお試しください。
SenseCAP 産業用センサー |
S2101 空気温度&湿度 |
特徴
高精度
- ±0.25 (標準値) -40°C ~ +125°C
- ±0.5°C (最大値) -20°C ~ +100°C
- ±1°C (最大値) -40°C ~ +125°C
ユーザー選択可能な測定解像度
- +0.5°C, +0.25°C, +0.125°C, +0.0625°C
ユーザー設定可能な温度アラート出力
I2Cインターフェース
仕様
項目 | 値 |
---|---|
動作電圧 | 3.3V/5V |
動作範囲 | -40°C ~ +125°C |
デジタルインターフェース | I2C標準 400 kHz |
I2Cアドレス | 0x18(デフォルト)/ 0x18~0x1F(オプション) |
応用例
- 産業用途
- 産業用冷凍庫および冷蔵庫
- 食品加工
- パーソナルコンピュータおよびサーバー
- PC周辺機器
- 家電製品
- 携帯/ポータブルデバイス
ハードウェア概要
ピンマップ


I2Cアドレス
PCBの裏面には3セットのパッドが用意されています。デフォルトではAD0~AD2はすべてLowレベルのパッドに接続されていますが、これらのパッドを切断し、反対側(Highレベル)にハンダ付けすることができます。I2Cアドレスは7ビットのアドレス0011A0A1A2です。0011はアドレスコードであり、これは工場設定で変更できません。
A0A1A2はスレーブアドレスであり、変更可能です。デフォルト設定ではA0=0/A1=0/A2=0となっているため、デフォルトのI2Cアドレスは0011000です。通常、アドレスは8ビットである必要があるため、MSB(最上位ビット)に1ビットの0を追加します。これにより0001,1000となります。このアドレスはバイナリ形式ですが、コード内では通常16進数形式を使用するため、バイナリアドレスを16進数アドレスに変換します。ここでは0x18となります。同様に、すべてのパッドをHighレベルにハンダ付けすると0001,1111となり、これは0x1Fです。このように、I2Cアドレスは0x18から0x1Fまでの範囲であり、その中から任意のアドレスを選択できます。ただし、**Grove_Temperature_sensor_MCP9808-master**ライブラリ内の**Seeed_MCP9808.h**ファイルでI2Cアドレスを変更する必要があります。#define DEFAULT_IIC_ADDR 0X18
アドレスマップ
A2=0 | A0=0 | A0=1 |
---|---|---|
A1=0 | A2A1A0-000,0x18 | A2A1A0-001,0x19 |
A1=1 | A2A1A0-010,0x1A | A2A1A0-011,0x1B |
A2=1 | A0=0 | A0=1 |
---|---|---|
A1=0=0 | A2A1A0-100,0x1C | A2A1A0-101,0x1D |
A1=0=1 | A2A1A0-110,0x1E | A2A1A0-111,0x1F |
ALEパッド
PCBの裏面にはALEパッドが見えます。このパッドから出力されるアラート信号は、他のコントローラーの外部割り込み信号として使用できます。デフォルトの出力はHighで、このボードでは3.3Vであるべきです。条件が満たされると、出力電圧はLow(0V)になります。この条件は、このWikiを完了した後に設定できます 😄
回路図
I2Cアドレス

前述のように、これらの3セットのパッドを使用してI2Cアドレスを選択します。デフォルトのアドレスを変更したい場合は、配線を切断して再ハンダ付けしてください。
MCP9808

ご覧の通り、ALEパッドはプルアップ抵抗を介して3.3Vに接続されています。
双方向レベルシフター回路

これは、I2Cバスの異なる電圧セクションを接続するための典型的な双方向レベルシフター回路です。このセンサーのI2Cバスは3.3Vを使用しますが、ArduinoのI2Cバスが5Vを使用する場合、この回路が必要になります。上記の回路図では、Q6およびQ5はNチャネルMOSFET 2N7002Aであり、双方向スイッチとして機能します。この部分をよりよく理解するために、AN10441を参照してください。
このセクションでは回路図の一部のみを表示しています。完全なドキュメントについては、Resourcesを参照してください。
対応プラットフォーム
Arduino | Raspberry Pi | |||
---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
上記で対応していると記載されているプラットフォームは、モジュールのソフトウェアまたは理論的な互換性を示しています。ほとんどの場合、Arduinoプラットフォーム向けのソフトウェアライブラリやコード例のみを提供しています。すべての可能なMCUプラットフォーム向けにソフトウェアライブラリやデモコードを提供することは不可能です。そのため、ユーザー自身でソフトウェアライブラリを作成する必要があります。
はじめに
Arduinoで遊ぶ
ハードウェア
必要な材料
Seeeduino V4.2 | Base Shield | Grove - I2C 高精度温度センサー |
---|---|---|
![]() | ![]() | ![]() |
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
ステップ1. Grove - I2C 高精度温度センサーをGrove-Base ShieldのI2Cポートに接続します。
ステップ2. Grove - Base ShieldをSeeeduinoに差し込みます。
ステップ3. USBケーブルを使用してSeeeduinoをPCに接続します。

Grove Base Shieldがない場合は、以下のようにこのモジュールをSeeeduinoに直接接続することもできます。
Seeeduino | Grove-MCP9808 |
---|---|
5V | 赤 |
GND | 黒 |
SDA | 白 |
SCL | 黄色 |
ソフトウェア
Arduinoを初めて使用する場合は、開始前に[Arduinoの使い方](https://wiki.seeedstudio.com/ja/Getting_Started_with_Arduino/)を参照することを強くお勧めします。
ステップ1. Grove MCP9808ライブラリをGithubからダウンロードします。
ステップ2. ライブラリのインストール方法を参照してArduino用のライブラリをインストールします。
ステップ3. Arduino IDEを再起動します。以下のパスで例を開きます: File --> Examples --> Grove Temperature Sensor MCP9808 --> MCP9808_demo_with_limit。

上記の画像に示されているように、2つのデモを提供しています。**MCP9808_basic_demo**と**MCP9808_demo_with_limit**です。**MCP9808_basic_demo**は温度のみを提供し、アラート機能は無効です。
**MCP9808_demo_with_limit**デモでは、アラート機能が有効です。温度のみが必要な場合は、basic_demoで十分です。アラート機能を使用したい場合は、limit_demoを選択してください。
ステップ4. デモをアップロードします。コードのアップロード方法がわからない場合は、コードのアップロード方法を確認してください。
ステップ5. Arduino IDEのシリアルモニターを開きます。Tool-> Serial Monitorをクリックするか、++ctrl+shift+m++キーを同時に押します。すべてが正常に動作していれば、結果が表示されます。
結果は以下のようになります。
sensor init!!
temperature value is: 29.31
temperature value is: 29.31
temperature value is: 29.31
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.25
temperature value is: 29.19
temperature value is: 29.25
では、ALE Pad の使用方法を見てみましょう。
デモコード MCP9808_demo_with_limit:
#include "Seeed_MCP9808.h"
MCP9808 sensor;
void setup()
{
Serial.begin(115200);
if(sensor.init())
{
Serial.println("センサーの初期化に失敗しました!!");
}
// 上限温度を30°Cに設定
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
delay(10);
// 臨界温度を32°Cに設定
sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,0x0200);
delay(10);
// アラートビットを有効化。温度が設定値を超えるとアラートビットは低出力(Low)になり、それ以外では高出力(High)を維持します。
sensor.set_config(SET_CONFIG_ADDR,0x0008);
Serial.println("センサーが初期化されました!!");
}
void loop()
{
float temp=0;
// 温度を取得し、浮動小数点形式で値を取得
sensor.get_temp(&temp);
Serial.print("温度値は: ");
Serial.println(temp);
delay(1000);
}
このコードは温度測定に加えて、以下の機能も実装しています。温度が30℃未満の場合、ALE Pad はデフォルトで高出力(3.3V)を維持します。 温度が30℃を超える場合、ALE Pad は低出力(0V)になります。
では、しきい値の温度を変更したい場合はどうすればよいでしょうか?OK、14行目に注目してください:
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
この関数を使用して温度を制御します。最初のパラメータはUPPER_LIMITレジスタのアドレスで、2番目のパラメータ0x01e0は設定する16進数の温度値です。上記の例では30℃に設定されています。0x01e0は4ビットの16進数で、右端のビットは小数部分を表します。これを0に設定すると、有効な数値は0x1eになります。eは10進数で14を意味し、上位ビットの1は10進数で16を意味します。したがって、0x1eは16+14=30に相当します。
ファイル Seeed_MCP9808.cpp には以下の3つの関数が用意されています。
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,u16);
sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,u16);
sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,u16);
前述の通り、ALE Pad のデフォルト出力は高出力であり、温度が特定の条件を満たすと出力レベルが低くなります。これらの3つの関数を使用して独自の条件を設定できます。
sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,u16) は下限温度を設定するために使用されます。u16 は設定する4ビットの16進数の温度値です。温度が設定値より低い場合、ALE Pad の出力が低くなります。
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,u16) は上限温度を設定するために使用されます。同様に、u16 は設定する4ビットの16進数の温度値です。温度が設定値より高い場合、ALE Pad の出力が低くなります。
sensor.set_critical_limit(SET_CRITICAL_LIMIT_ADDR,u16) は割り込みモード用に使用されます。このWikiではコンパレータとしての動作方法のみを示しています。詳細については、データシート を確認してください。
下限温度と上限温度を設定することで条件ゾーンを作成できます。温度が条件ゾーンに達すると出力が低くなります。

例えば、ALE Pad の出力を28℃から30℃の間で高出力にし、温度が30℃を超えるか28℃未満の場合に低出力にしたい場合、コードは以下のようになります:
sensor.set_lower_limit(SET_LOWER_LIMIT_ADDR,0x01c0);
delay(10);
sensor.set_upper_limit(SET_UPPER_LIMIT_ADDR,0x01e0);
delay(10);
**upper_limit** が **lower_limit** より高いことを確認してください。そうでない場合、正しく出力されません。また、**critical_limit** が **upper_limit** より高いことを確認してください。レジスタが正しく書き込まれるようにするために、一定の delay() が必要です。
Raspberry Piで遊ぶ
ハードウェア
- ステップ1. このプロジェクトで使用するもの:
Raspberry Pi | Grove Base Hat for RasPi | Grove - I2C 高精度温度センサー |
---|---|---|
![]() | ![]() | ![]() |
今すぐ購入 | 今すぐ購入 | 今すぐ購入 |
- ステップ2. Grove Base Hat を Raspberry Pi に接続します。
- ステップ3. Grove - I2C 高精度温度センサーを Base Hat の I2C ポートに接続します。
- ステップ4. Raspberry Pi を USBケーブルを介してPCに接続します。

ソフトウェア
Raspberry Pi OS >= Bullseye を使用している場合、Python3 のみでこのコマンドラインを使用する必要があります。
ステップ1. ソフトウェア設定 に従って開発環境を構成し、grove.py を Raspberry Pi にインストールします。
ステップ2. 以下のコマンドを実行してコードを動かします。
# Python3 用 virtualenv
virtualenv -p python3 env
source env/bin/activate
# コマンドを入力
grove_high_accuracy_temperature
以下は mcp9808.py のコードです。
import math
import threading
from grove.i2c import Bus
from grove.temperature import Temper
RES_LOW = 0x00
RES_MEDIUM = 0x01
RES_HIGH = 0x02
RES_PRECISION = 0x03
MCP9808_REG_AMBIENT_TEMP = 0x05
class TemperMCP9808(Temper):
def __init__(self, address=0x18):
self._addr = address
self._bus = Bus()
self._resolution = Temper.RES_1_2_CELSIUS
def _derive_res(self, res):
ares = -1
if res >= Temper.RES_1_2_CELSIUS:
ares = RES_LOW
elif res >= Temper.RES_1_4_CELSIUS:
ares = RES_MEDIUM
elif res >= Temper.RES_1_8_CELSIUS:
ares = RES_HIGH
elif res >= Temper.RES_1_16_CELSIUS:
ares = RES_PRECISION
if ares < 0:
return False
self._bus.write_byte(self._addr, ares)
# print("ares = {}".format(ares))
return True
@property
def temperature(self):
result = self._bus.read_word_data(self._addr, MCP9808_REG_AMBIENT_TEMP)
# バイトを入れ替える
data = (result & 0xff) 8 | (result & 0xff00) 8
# print("data = {}".format(data))
# print("data = {}".format(hex(data)))
# 温度が負の場合をチェック
if data & 0x1000:
data = -((data ^ 0x0FFF) + 1)
else:
data = data & 0x0fff
return data / 16.0
すべてが正常に動作すれば、以下の結果が表示されます。
(env)pi@raspberrypi:~ grove_high_accuracy_temperature
Grove - I2C-High-Accuracy-Temperature を挿入してください
Grove-Base-Hat の任意の I2C スロットに接続してください
温度を検出中...
24.5 Celsius
24.5 Celsius
24.375 Celsius
^CTraceback (most recent call last):
File "grove_high_accuracy_temperature.py", line 54, in <module>
main()
File "grove_high_accuracy_temperature.py", line 50, in main
time.sleep(1)
KeyboardInterrupt
このプログラムは ctrl+c を押すことで終了できます。
オンライン回路図ビューア
リソース
- [Zip] Grove - I2C 高精度温度センサー(MCP9808) Eagle ファイル
- [Zip] Seeed MCP9808 ライブラリ
- [PDF] MCP9808 のデータシート
- [PDF] 2N7002A のデータシート
- [PDF] AN10441
プロジェクト
この製品の紹介ビデオです。簡単なデモを含んでおり、試してみることができます。
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルを用意しています。