CHIRIMENをNode.jsで使用してみる⑶  ー I2C編 part１ ー

## はじめに
本記事では、複数回に分けてCHIRIMENコミュニティが提供しているnpmパッケージnode-web-gpioとnode-web-i2cを使用してNode.jsからGPIOとI2Cを制御するために私が実施した方法とそのサンプルコードを記載した備忘録になっています。
今回はCHIRIMENのExamplesにあるI2C ExamplesのコードをNode.jsから実行可能にする方法について説明していきます。なお、I2C編は全４回になる予定で、今回は湿温度センサー”SHT-30”と温度センサー”ADT-7410”をCHIRIMENから使用する方法について説明します。

## コードの主な違い
Webブラウザ版とNode.js 版でのコードの主な違いについて説明します。

- navigator()関数がNode.jsでは使用不可、記述する必要がないため削除する。
- sleep()関数がNode.js には存在しないため、使用する場合は適宜実装する必要がある。
- その他、HTML下では動作するがNode.js下では動作しない記法を変更する必要がある。

## node-web-i2cを使う上での注意点
node-web-i2cを用いる場合、使用するI2Cパーツごとパッケージをインストールする必要があります。[CHIRIMENをNode.jsで使用してみる⑴ ー 導入編 ー](https://qiita.com/okojon/items/58726940ef51d1c4a74c)で作成したnode-web-i2c をインストールしたのと同じディレクトリで以下のようにパッケージのインストールを行ってください。また、パッケージ一覧は[こちら](https://github.com/chirimen-oh/chirimen-drivers)のURLを参照してください。


```
xxxxはパッケージ名
% npm i @chirimen/xxxx
```


## I2C-SHT30
CHIRIMENからI2C-SHT30を使用して温度と湿度の値を出力する方法について説明します。

### 使用パーツ
- SHT30ブレークアウトボード x 1
- ジャンパー線（メス・メス） x 4

### 配線
以下の図のように配線してください。
![schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1797679/a7c120f2-ad6d-be89-b4d6-7497d4bd8529.png)

### パッケージのインストール
以下のようにSHT-30のパッケージをインストールしてください。

```
% npm i @chirimen/sht30
```
### Webブラウザ版のJavaScript
Webブラウザ版では、ループ処理によってSHT30から得た温度と湿度を動的に出力しています。

```JavaScript
main();

async function main() {
  const temperatureDisplay = document.getElementById("temperatureDisplay");
  const humidityDisplay = document.getElementById("humidityDisplay");
  const i2cAccess = await navigator.requestI2CAccess();
  const port = i2cAccess.ports.get(1);
  const sht30 = new SHT30(port, 0x44);
  await sht30.init();

  while (true) {
    const { humidity, temperature } = await sht30.readData();
    temperatureDisplay.innerHTML = `${temperature.toFixed(2)} ℃`;
    humidityDisplay.innerHTML = `${humidity.toFixed(2)} %`;
    await sleep(500);
  }
}
```

### Node.js版のJavaScript
"i2c-sht30.js"というファイル名で下記のコードを保存してください。
このNode.jsでは、コードを実行した時点での温度と湿度を出力する形で実装しています。

```JavaScript
// node-web-i2cを呼び出すおまじない
const { requestI2CAccess } = require("node-web-i2c");

// SHT30のパッケージを呼び出す
const SHT30 = require("@chirimen/sht30");

async function main() {
  const i2cAccess = await requestI2CAccess();
  const i2c1 = i2cAccess.ports.get(1);

  // SHT30の接続されているポートの指定
  const sht30 = new SHT30(i2c1, 0x44);
  await sht30.init();
  const { humidity, temperature } = await sht30.readData();
  console.log(`Temperature: ${temperature} ℃`);
  console.log(`Humidity: ${humidity} ℃`);
}

main();
```

### 実行してみよう
下記のようにコマンドラインから実行し、温度と湿度が出力されれば成功です。

```
% node i2c-sht30.js
Temperature: 24.433890287632565 ℃
Humidity: 53.6568245975433 ℃
```

## I2C-ADT7410
CHIRIMENからADT7410を使用して、温度の値を出力する方法について説明します。
このセンサーは4本のピンヘッダ経由で接続します。あらかじめピンヘッダをハンダ付けしておいてください。

### 使用パーツ
- ADT7410使用高精度・高分解能I2C・16Bit温度センサモジュール ）x 1
- ジャンパー線（メス・メス） x 4

### 配線
以下の図のように配線してください。
また、センサーを接続する際に左右を間違えると高温になり火傷等をする恐れがあるため注意してください。
![schematic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1797679/5142df34-a6d0-b5d1-69cf-572306a132e0.png)

### パッケージのインストール
以下のようにADT-7410のパッケージをインストールしてください。

```
% npm i @chirimen/adt7410
```

### Webブラウザ版のJavaScript
Webブラウザ版では、ループ処理によってADT7410から得た温度を動的に出力しています。

```JavaScript
main();

async function main() {
  var head = document.getElementById("head");
  var i2cAccess = await navigator.requestI2CAccess(); // i2cAccessを非同期で取得
  var port = i2cAccess.ports.get(1); // I2C I/Fの1番ポートを取得
  var adt7410 = new ADT7410(port, 0x48); // 取得したポートの0x48アドレスをADT7410ドライバで受信する
  await adt7410.init();
  for (;;) {
    // 無限ループ
    var value = await adt7410.read();
    head.innerHTML = value ? `${value} degree` : "Measurement failure";
    await sleep(1000);
  }
}
```

### Node.js版のJavaScript
"i2c-adt7410.js"というファイル名で下記のコードを保存してください。
このNode.jsでは、コードを実行した時点での温度を出力する形で実装しています。

```JavaScript
// ADT7410で温度を表示でさせるチュートリアル
const { requestI2CAccess } = require("node-web-i2c");

// ADT7410のパッケージを呼び出す
const ADT7410 = require("@chirimen/adt7410");

async function main() {
  const i2cAccess = await requestI2CAccess();
  const i2c1 = i2cAccess.ports.get(1);

  // ADT7410の接続されているポートの指定
  const adt7410 = new ADT7410(i2c1, 0x48);
  await adt7410.init();
  const temperature = await adt7410.read();
  console.log(`Temperature: ${temperature} ℃`);
}

main();
```

### ​実行してみよう
下記のようにコマンドラインから実行し、温度が出力されれば成功です。

```
% node i2c-adt7410.js
Temperature: 29.6875 ℃
```

## さいごに
今回は以上になります。今回はnode-web-i2cでI2Cの使用方法の概要と湿温度センサー”SHT-30”と温度センサー”ADT-7410”のコードについて説明しました。次回も引き続きnode-web-i2cで使用可能なI2Cパーツの使用方法についての記事になる予定です。