「デバイス+センサー」が MQTTクライアントになった構成の開発をしている中で、MQTT の値を受信する MQTTブローカーの部分や別クライアント側に手を加える開発をするのに、以下のような物理部分をセットしなくても開発できるようにしたくて、今回の内容を進めました。
GR-ROSE と「Grove - CO2 & Temperature & Humidity Sensor (SCD30) 」の接続はスルーホール用テストワイヤを使い、差し込み式で接続してる。 https://t.co/hA2wu3KYw3 pic.twitter.com/WbV3yNgNB6
— you (@youtoy) October 30, 2021
概要
ひとまず温湿度の 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
の値を変更すると、生成される乱数の変化の度合いを変えることができたりもします。