Grove - CO2 & Temperature & Humidity Sensor (SCD30)

Grove - CO2 & Temperature & Humidity Sensor (SCD30) は、Sensirion SCD30 をベースとした高精度二酸化炭素センサーです。このセンサーの測定範囲は 0 ppm-40'000 ppm で、400ppm から 10'000ppm の間で測定精度は ±(30 ppm + 3%) に達することができます。
CO2 検出のための非分散赤外線(NDIR)測定技術に加えて、SCD30 は同じセンサーモジュール上に Sensirion の湿度および温度センサーを統合しています。
産業用センサーへのアップグレード可能
SenseCAP S2110 コントローラー と S2100 データロガー を使用することで、Grove を LoRaWAN® センサーに簡単に変換できます。Seeed はプロトタイピングをサポートするだけでなく、堅牢な 産業用センサー の SenseCAP シリーズでプロジェクトを拡張する可能性も提供します。
SenseCAP S210x シリーズの産業用センサーは、環境センシングのためのすぐに使える体験を提供します。大気質監視のためのより高い性能と堅牢性を持つ S2103 ワイヤレス CO2、温度、湿度センサーを参照してください。このシリーズには、土壌水分、気温と湿度、光強度、CO2、EC、および 8-in-1 気象ステーションのセンサーが含まれています。次の成功する産業プロジェクトのために最新の SenseCAP S210x をお試しください。
| SenseCAP 産業用センサー |
| S2103 気温・湿度・CO2 |
バージョン
| 製品バージョン | 変更点 | リリース日 |
|---|---|---|
| Grove - CO2 & Temperature & Humidity Sensor (SCD30) V1.0 | 初期版 | 2018年12月 |
アプリケーションアイデア
- 空気清浄機
- 環境監視
- 植物環境監視
特徴
- NDIR CO2 センサー技術
- 統合された温度・湿度センサー
- 最高のコストパフォーマンス
- 優れた安定性のためのデュアルチャンネル検出
- デジタルインターフェース I2C
- 低消費電力
- 超長寿命センサー(15年)
仕様
| パラメータ | 値 |
|---|---|
| 供給電圧 | 3.3V / 5V |
| 動作温度 | 0 – 50℃ |
| 保存温度 | - 40°C – 70°C |
| 湿度動作条件 | 0 – 95 %RH |
| センサー寿命 | 15年 |
| インターフェース | I2C |
| I2Cアドレス | 0x61 |
| サイズ | L: 61mm W: 42mm H: 19mm |
| 重量 | 19.7g |
| パッケージサイズ | L: 110mm W: 70mm H: 40mm |
| 総重量 | 27g |
| パラメータ | 条件 | 値 |
|---|---|---|
| CO2測定範囲 | 0 – 40'000 ppm | |
| 精度 | 400ppm – 10'000ppm | ± (30 ppm + 3%) |
| 再現性 | 400ppm – 10'000ppm | 10ppm |
| 応答時間 | τ63% | 20 s |
| パラメータ | 条件 | 値 |
|---|---|---|
| 湿度測定範囲 | 0 %RH – 100 %RH | |
| 精度 | 0 – 50°C, 0 – 100%RH | ±2 %RH |
| 再現性 | 0.1 %RH | |
| 応答時間 | τ63% | 8 s |
| パラメータ | 条件 | 値 |
|---|---|---|
| 温度測定範囲 | -40°C – 120°C | |
| 精度 | 0 – 50°C | ±0.5°C |
| 再現性 | 0.1°C | |
| 応答時間 | τ63% | > 2 s |
| パラメータ | 条件 | 値 |
|---|---|---|
| 平均電流 | 更新間隔 2 s | 19 mA |
| 最大電流 | 測定中 | 75 mA |
| エネルギー消費 | 1回の測定 | 120 mJ |
ハードウェア概要
サポートされているプラットフォーム
| Arduino | Raspberry Pi | |||
|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() |
入門ガイド
Arduino で遊ぶ
ハードウェア
必要な材料
| Seeeduino V4.2 | Base Shield | Grove-CO2 & T&H SCD30 |
|---|---|---|
![]() | ![]() | |
| 今すぐ入手 | 今すぐ入手 | 今すぐ入手 |
さらに、Seeeduino V4.2 と Baseshield の組み合わせに相当する新しい Seeeduino Lotus M0+ もご検討ください。
ハードウェア接続
-
ステップ 1. Grove - CO2 & Temperature & Humidity Sensor (SCD30) を Base Shield の I2C ポートに接続します。
-
ステップ 2. Grove - Base Shield を Seeeduino に差し込みます。
-
ステップ 3. USB ケーブルで Seeeduino を PC に接続します。

ソフトウェア
Arduino を初めて使用する場合は、開始前に Arduino 入門ガイド を参照することを強くお勧めします。
-
ステップ 1. Github から Seeed SCD30 ライブラリ をダウンロードします。
-
ステップ 2. ライブラリのインストール方法 を参照して Arduino 用ライブラリをインストールします。
-
ステップ 3. Arduino IDE を再起動します。サンプルを開きます。以下の3つの方法で開くことができます: a. Arduino IDE で直接開く場合は、パス:File --> Examples -->Grove_scd30_co2_sensor-->SCD30_Example から開いてください。

b. コンピュータで開く場合は、XXXX\Arduino\libraries\Seeed_SCD30-master\examples\SCD30_Example フォルダにある SCD30_Example.ino をクリックしてください。XXXX は Arduino IDE をインストールした場所です。

c. または、コードブロックの右上角にあるアイコン
をクリックして、以下のコードを Arduino IDE の新しいスケッチにコピーすることもできます。
#include "SCD30.h"
#if defined(ARDUINO_ARCH_AVR)
#pragma message("Defined architecture for ARDUINO_ARCH_AVR.")
#define SERIAL Serial
#elif defined(ARDUINO_ARCH_SAM)
#pragma message("Defined architecture for ARDUINO_ARCH_SAM.")
#define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_SAMD)
#pragma message("Defined architecture for ARDUINO_ARCH_SAMD.")
#define SERIAL SerialUSB
#elif defined(ARDUINO_ARCH_STM32F4)
#pragma message("Defined architecture for ARDUINO_ARCH_STM32F4.")
#define SERIAL SerialUSB
#else
#pragma message("Not found any architecture.")
#define SERIAL Serial
#endif
void setup()
{
Wire.begin();
SERIAL.begin(115200);
SERIAL.println("SCD30 Raw Data");
scd30.initialize();
}
void loop()
{
float result[3] = {0};
if(scd30.isAvailable())
{
scd30.getCarbonDioxideConcentration(result);
SERIAL.print("Carbon Dioxide Concentration is: ");
SERIAL.print(result[0]);
SERIAL.println(" ppm");
SERIAL.println(" ");
SERIAL.print("Temperature = ");
SERIAL.print(result[1]);
SERIAL.println(" ℃");
SERIAL.println(" ");
SERIAL.print("Humidity = ");
SERIAL.print(result[2]);
SERIAL.println(" %");
SERIAL.println(" ");
SERIAL.println(" ");
SERIAL.println(" ");
}
delay(2000);
}
ライブラリファイルが更新される可能性があります。このコードは更新されたライブラリファイルに適用できない場合があるため、最初の2つの方法を使用することをお勧めします。
- ステップ 4. デモをアップロードします。コードのアップロード方法がわからない場合は、コードのアップロード方法を確認してください。
すべてがうまくいけば、Grove - CO2 & Temperature & Humidity Sensor (SCD30) の生データをシリアルモニターから読み取ることができるはずです。

キャリブレーションと設置
実際のシナリオでより正確な結果を得るために、以下の2つの点に注意する必要があります:
-
- 正しい設置
-
- キャリブレーション
設置
正しい設置については、SCD30 Design-In Guidelinesを参照してください。
キャリブレーション
初回起動時には、アルゴリズムがASCの初期パラメータセットを見つけるために最低7日間の期間が必要です。センサーは毎日少なくとも1時間は新鮮な空気にさらされる必要があります。また、その期間中、センサーは電源から切断してはいけません。そうしないと、キャリブレーションパラメータを見つける手順が中止され、最初からやり直す必要があります。正常に計算されたパラメータはSCD30の不揮発性メモリに保存され、再起動後も以前に見つけたASCのパラメータが保持されます。キャリブレーションの詳細については、Interface Description Sensirion SCD30 Sensor Moduleを参照してください。
SCD30ライブラリフォルダには2つのinoサンプルがあり、SCD30_auto_calibration.inoを実行してキャリブレーションを開始できます。
Raspberry Pi で使用する
ハードウェア
- ステップ 1. このプロジェクトで使用するもの:
| Raspberry pi | Grove Base Hat for RasPi | Grove-CO2 & T&H SCD30 |
|---|---|---|
|
|
|
| 今すぐ入手 | 今すぐ入手 | 今すぐ入手 |
- ステップ 2. Grove Base Hat を Raspberry に接続します。
- ステップ 3. Grove-CO2 を Base Hat の I2C ポートに接続します。
- ステップ 4. Raspberry Pi を USB ケーブルで PC に接続します。

ソフトウェア
Raspberrypi OS >= Bullseye を搭載した Raspberry Pi を使用している場合は、このコマンドラインを Python3 でのみ 使用する必要があります。
- ステップ 1. Setting Software に従って開発環境を設定します。
- ステップ 2. 関連する仮想環境に入ります。
source ~/grove_env/env/bin/activate
cd ~/grove_env/grove.py/grove
-
ステップ 3. 以下のコマンドを実行してコードを実行します。
-
以下は grove_co2_scd30.py コードを確認するためのものです。
less grove_co2_scd30.py
from typing import NoReturn
from grove.i2c import Bus
import struct
import time
class GroveCo2Scd30(object):
__COMMAND_TRIGGER_CONTINUOUS_MEASUREMENT = 0x0010
__COMMAND_STOP_CONTINUOUS_MEASUREMENT = 0x0104
__COMMAND_SET_MEASUREMENT_INTERVAL = 0x4600
__COMMAND_GET_DATA_READY_STATUS = 0x0202
__COMMAND_READ_MEASUREMENT = 0x0300
__COMMAND_ACTIVATE_ASC = 0x5306
__COMMAND_SET_FRC = 0x5204
__COMMAND_SET_TEMPRATURE_OFFSET = 0x5403
__COMMAND_ALTITUDE_COMPENSATION = 0x5102
__COMMAND_READ_FIRMWARE_VERSION = 0xd100
__COMMAND_SOFT_RESET = 0xd304
def __init__(self, address=0x61, bus=1):
self.address = address
self.bus = Bus(bus)
self.set_measurement_interval(2)
self.trigger_continuous_measurement()
@staticmethod
def _calc_crc(data: list) -> int:
crc = 0xff
for d in data:
crc ^= d
for _ in range(8):
if crc & 0x80:
crc = ((crc << 1) ^ 0x31) & 0xff
else:
crc = (crc << 1) & 0xff
return crc
def _write(self, cmd: int, data: list):
write_data = list(struct.pack(">H", cmd))
if data is not None:
for d in data:
write_data.extend(struct.pack(">H", d))
write_data.append(GroveCo2Scd30._calc_crc(struct.pack(">H", d)))
write_msg = self.bus.msg.write(self.address, write_data)
self.bus.i2c_rdwr(write_msg)
def _read(self, address: int, data_number: int) -> list:
write_data = list(struct.pack(">H", address))
write_msg = self.bus.msg.write(self.address, write_data)
self.bus.i2c_rdwr(write_msg)
read_msg = self.bus.msg.read(self.address, 3 * data_number)
self.bus.i2c_rdwr(read_msg)
result = []
for i in range(data_number):
d = read_msg.buf[i*3:i*3+2]
if GroveCo2Scd30._calc_crc(d) != read_msg.buf[i*3+2][0]:
raise ValueError("CRC mismatch")
result.append(struct.unpack(">H", d)[0])
return result
def trigger_continuous_measurement(self, pressure: int = 0):
self._write(self.__COMMAND_TRIGGER_CONTINUOUS_MEASUREMENT, [pressure])
def stop_continuous_measurement(self):
self._write(self.__COMMAND_STOP_CONTINUOUS_MEASUREMENT, None)
def set_measurement_interval(self, interval: int):
self._write(self.__COMMAND_SET_MEASUREMENT_INTERVAL, [interval])
def get_measurement_interval(self) -> int:
data = self._read(self.__COMMAND_SET_MEASUREMENT_INTERVAL, 1)
return data[0]
def get_data_ready_status(self) -> bool:
data = self._read(self.__COMMAND_GET_DATA_READY_STATUS, 1)
return True if data[0] == 1 else False
def read_measurement(self) -> tuple:
data = self._read(self.__COMMAND_READ_MEASUREMENT, 6)
data_bytes = struct.pack(">HHHHHH", data[0], data[1], data[2], data[3], data[4], data[5])
data_floats = struct.unpack(">fff", data_bytes)
co2 = data_floats[0]
temp = data_floats[1]
humi = data_floats[2]
return co2, temp, humi
def set_forced_recalibration(self, co2: float):
self._write(self.__COMMAND_SET_FRC, [int(co2)])
def set_automatic_self_calibration(self, activate: bool):
self._write(self.__COMMAND_ACTIVATE_ASC, [1 if activate else 0])
def get_automatic_self_calibration(self) -> bool:
data = self._read(self.__COMMAND_ACTIVATE_ASC, 1)
return True if data[0] == 1 else False
def set_temperature_offset(self, offset: float):
self._write(self.__COMMAND_SET_TEMPRATURE_OFFSET, [int(offset * 100)])
def get_temperature_offset(self) -> float:
data = self._read(self.__COMMAND_SET_TEMPRATURE_OFFSET, 1)
return float(data[0]) / 100
def set_altitude_compensation(self, altitude: int):
self._write(self.__COMMAND_ALTITUDE_COMPENSATION, [altitude])
def get_altitude_compensation(self) -> int:
data = self._read(self.__COMMAND_ALTITUDE_COMPENSATION, 1)
return data[0]
def read(self) -> tuple:
if not self.get_data_ready_status():
return None
return self.read_measurement()
def main() -> NoReturn:
sensor = GroveCo2Scd30()
while True:
if sensor.get_data_ready_status():
co2, temperature, humidity = sensor.read()
print(f"CO2 concentration is {co2:.1f} ppm")
print(f"Temperature in Celsius is {temperature:.2f} C")
print(f"Relative Humidity is {humidity:.2f} %")
time.sleep(1)
if __name__ == "__main__":
main()
- このコードを実行します
python grove_co2_scd30.py
すべてが順調に進めば、以下の現象が見られます。😄

Wio Terminal で遊ぶ(ArduPy)
ハードウェア
- ステップ 1. 以下のものを準備します:
| Wio Terminal | Grove-CO2 & T&H SCD30 |
|---|---|
| 今すぐ入手 | 今すぐ入手 |
-
ステップ 2. Grove-CO2 & T&H SCD30 を Wio Terminal の I2C Grove ポートに接続します。
-
ステップ 3. USB Type-C ケーブルで Wio Terminal を PC に接続します。

ソフトウェア
-
ステップ 1. ArduPy 入門ガイド に従って、Wio Terminal で ArduPy 開発環境を設定します。
-
ステップ 2. ArduPy ファームウェアが Wio Terminal にフラッシュされていることを確認します。詳細については、こちら を参照してください。
aip install Seeed-Studio/seeed-ardupy-scd30
aip build
aip flash
- ステップ 3. 以下のコードをコピーして
ArduPy-scd30.pyとして保存します:
from arduino import grove_scd30
from machine import LCD
from machine import Sprite
import time
scd30 = grove_scd30()
lcd = LCD()
spr = Sprite(lcd) # Create a buff
def main():
spr.createSprite(320, 240)
while True:
spr.setTextSize(2)
spr.fillSprite(spr.color.BLACK)
spr.setTextColor(lcd.color.ORANGE)
spr.drawString("SCD30 Reading", 90, 10)
spr.drawFastHLine(40, 35, 240, lcd.color.DARKGREY)
spr.setTextColor(lcd.color.WHITE)
spr.drawString("- CO2 Level: ", 20, 50)
spr.drawString("- Temperature: ", 20, 80)
spr.drawString("- Humidity: ", 20, 110)
if(scd30.isAvailable()):
data = scd30.getCarbonDioxideConcentration()
spr.drawFloat(data[0], 2,220,50) # CO2
spr.drawFloat(data[1], 2, 220,80)
spr.drawFloat(data[2], 2, 220,110)
spr.pushSprite(0,0)
time.sleep_ms(500)
print("\nCarbon Dioxide Concentration:", data[0])
print("Temperature:", data[1])
print("Humidity:", data[2])
if __name__ == "__main__":
main()
- ステップ 4.
ArduPy-scd30.pyを分かる場所に保存します。以下のコマンドを実行し、<YourPythonFilePath>をArduPy-scd30.pyの場所に置き換えてください。
aip shell -n -c "runfile <YourPythonFilePath>"
# Example:
# aip shell -n -c "runfile /Users/ansonhe/Desktop/ArduPy-scd30.py"
- ステップ 5. 以下のように、ターミナルに 3 つのデータ値が表示され、Wio Terminal の LCD 画面にも表示されます。
ansonhe@Ansons-Macbook-Pro ~:aip shell -n -c "runfile /Users/ansonhe/Desktop/ArduPy-scd30.py"
Positional argument (/dev/cu.usbmodem1414301) takes precedence over --open.
Connected to ardupy
Carbon Dioxide Concentration: 2360.639
Temperature: 29.18707
Humidity: 66.88538
Carbon Dioxide Concentration: 2360.639
Temperature: 29.18707
Humidity: 66.88538
Carbon Dioxide Concentration: 2500.573
Temperature: 29.17372
Humidity: 66.61072

回路図オンラインビューア
リソース
- [ZIP] Grove - CO2 & Temperature & Humidity Sensor (SCD30) 回路図ファイル
- [PDF] SCD30 設計ガイドライン
- [PDF] SCD30 データシート
- [PDF] SCD30 インターフェース説明書
技術サポート & 製品ディスカッション
弊社製品をお選びいただき、ありがとうございます!弊社製品での体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを用意しています。









