JavaScriptのコードをobnizノードで使えるように書き換える


Node-REDのobnizノードの使い方は少しクセがあるのでクセを把握しておきましょう。

## obnizノードの使い方概要

- 設定ノードという裏側のノードがいて、ここでピンアサイン（各ピンに何を設定するのか）などの初期化処理を記述すること
- 表側に見えて使えるノードは`obniz repeatノード`と`obniz functionノード`の2種類
- 2種類のノードは使い分けが必要で、それぞれのノードの中にJavaScriptノードを記載する
	- センサーなどの数値を常に取得したいインプット系の処理はobniz repeatノードを使う
	- LEDやスピーカーなどアクチュエーターやインジケーターを操作したいアウトプット系の場合は`obniz functionノード`を利用

といった流れです。

[こちら](https://qiita.com/n0bisuke/items/072a8a1bf77525fef835)も参照ください

> [obnizノードの使い方概要](https://qiita.com/n0bisuke/items/072a8a1bf77525fef835)

## 書き換え例

### 例1. スピーカーの利用

例えば以下のようなスピーカーを扱うコードがあった場合

#### 元のスピーカー利用のコード

[公式ドキュメント](https://docs.obniz.com/ja/sdk/parts/Speaker/README.md)に記載のあったコードを使ってみます。

```js
// Javascript Example
var speaker = obniz.wired("Speaker", {signal:0, gnd:1});
speaker.play(1000); //1000hz
await obniz.wait(1000);
speaker.stop();
```

↑のコードを分解して、設定ノードとobniz functionノードに書き換えましょう。

#### Node-REDで使えるようにobnizノードに書き換え

- obnizの設定ノード

設定ノードではobnizPartsというグローバル変数に設定情報を入れています。

```
obnizParts.Speaker = obniz.wired("Speaker",{ signal:0, gnd:1 });
```

こちらを設定ノードの初期化という項目に

> obniz IDを入れてある設定項目の下にあります。
> ![スクリーンショット 2024-05-11 18.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/ff1de5b9-9f66-a750-52c0-90a1112de844.png "スクリーンショット 2024-05-11 18.39.24.png")


- obniz functionノード

センサーではなくスピーカーなのでobniz functionノードを選定します。
obnizParts.speaker.play()といった形でグローバル定義しているところから関数を参照して利用できます。

```
obnizParts.speaker.play(1000); //1000hz
await obniz.wait(1000);
obnizParts.speaker.stop();
```

といった書き換えになります。

書き出したJSONはこちらです。

```json
[{"id":"4e3fcc47958b6fed","type":"obniz-function","z":"6fb5714eef9f6d67","obniz":"8816e09b9d1479f7","name":"","code":"obnizParts.Speaker.play(1000); //1000hz\nawait obniz.wait(1000);\nobnizParts.Speaker.stop(); // 音をとめる","x":400,"y":400,"wires":[[]]},{"id":"4326f4a9b12a3397","type":"inject","z":"6fb5714eef9f6d67","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":340,"wires":[["4e3fcc47958b6fed"]]},{"id":"8816e09b9d1479f7","type":"obniz","obnizId":"4927-6126","deviceType":"obnizboard1y","name":"","accessToken":"","code":"obnizParts.Speaker = obniz.wired(\"Speaker\",{ signal:0, gnd:2 });"}]
```


### 例2. CdS照度センサー

例えば以下のようなスピーカーを扱うコードがあった場合

```
const Obniz = require('obniz');
const obniz = new Obniz('obnizのデバイスID');

obniz.onconnect = async () => {
    obniz.io0.output(true); //io0を5vに
    obniz.io2.output(false); //io2をGNDに

    //io1をアナログピンに
    obniz.ad1.start((voltage) => {
        console.log(`changed to ${voltage} v`);
    });
    
    //一回だけ取得
    var voltage = await obniz.ad0.getWait();
    console.log(voltage);
}
```

- obnizの設定ノード

```
obniz.io0.output(true); //io0を5vに
obniz.io2.output(false); //io2をGNDに
```

- obniz repeatノード

```
const voltage = await obniz.ad1.getWait();

obniz.display.print(voltage)
msg.payload = voltage;

return msg;
```

といった書き換えになります。
Node-REDのノードはmsg.payloadに値を詰めて、return msgで次のノードに情報を渡します。

## やりたいこと

HC-SR04という超音波センサーを使いたいです。
距離の値を取得してデバッグノードに渡す処理を書きたいのでやり方を教えて下さい。

参考までに公式ドキュメントにあったJavaScriptコードはこちらです。

```
// Javascript Example
const hcsr04 = obniz.wired("HC-SR04", {gnd:0, echo:1, trigger:2, vcc:3});
while(true) {
  let avg = 0;
  let count = 0;
  for (let i=0; i<3; i++) { // measure three time. and calculate average
    const val = await hcsr04.measureWait();
    if (val) {
      count++;
      avg += val;
    }
  }
  if (count > 1) {
    avg /= count;
  }
  console.log(avg);
  await obniz.wait(100);
}
```