1
0

More than 1 year has passed since last update.

ランダムなダミーの温湿度の値で急激な変動がない値を生成する(Node.js で simplex-noise を利用)

Last updated at Posted at 2021-10-30

「デバイス+センサー」が MQTTクライアントになった構成の開発をしている中で、MQTT の値を受信する MQTTブローカーの部分や別クライアント側に手を加える開発をするのに、以下のような物理部分をセットしなくても開発できるようにしたくて、今回の内容を進めました。

概要

ひとまず温湿度の 2つの値を対象に、それらをランダムに生成するプログラムを作っていきます。
その値について、JavaScript だと Math.random() を使う方法もありますが、あまり急激な変化はしてほしくなかったため、乱数生成の部分には「Simplex Noise」を使いました(パッケージは以下を利用)。

●simplex-noise - npm
 https://www.npmjs.com/package/simplex-noise

ちなみに、Simplex Noise をざっくり説明すると、以下のパーリンノイズと同じようなものになります。

●パーリンノイズ - Wikipedia
 https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%83%AA%E3%83%B3%E3%83%8E%E3%82%A4%E3%82%BA

必要になる環境など

開発には Node.js を使っていきます。

MQTTブローカーを何らか用意し、今回のプログラムを動作させる PC の中で動かしてください。
また、以下のコマンドで 2つのパッケージを利用できるようにしておいてください。

$ npm i mqtt simplex-noise

プログラム

プログラムの内容は、以下のとおりです。

const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://localhost");
const { SimplexNoise } = require("simplex-noise");

const simplex = new SimplexNoise();
let count = 0;

client.on("connect", function () {
  const timerId = setInterval(() => {
    const randomT = convertedValueRandom(simplex.noise2D(count, 10), 20, 25);
    client.publish("outTopic/T", randomT + "");
    const randomH = convertedValueRandom(simplex.noise2D(count, 20), 60, 80);
    client.publish("outTopic/H", randomH + "");
    console.log(`
    温度: ${randomT}, 
    湿度: ${randomH}`);
    count += 0.007;
  }, 2000);
});

function convertedValueRandom(inputSimplexNoise, min, max) {
  const randomZeroToOne = (inputSimplexNoise + 1) / 2;
  return randomZeroToOne * (max - min) + min;
}

simplex-noise は -1 から 1 の間の値を生成するため、Math.random() のような 0 から 1 の値を生成させたい場合は、少し手を加える必要があります。
上記の中では、 convertedValueRandom() でその変換を行っています。

また、 count += 0.007 の値を変更すると、生成される乱数の変化の度合いを変えることができたりもします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0