United Statesからアクセスされていますが、言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

センサー値を人が読めるように変換する方法

センサーからの出力は多くの場合、0〜1023の間の数値です。このプロジェクトでは、この数値をNode-RED関数を使用して、人間が読み取れる抵抗、電圧、温度に変換します。あなたのプロジェクトに合ったセンサー等を使用してください。

部品リスト

Qty Product 品番
1 OKdo Raspberry Pi 4 Basic Kit (UK) 4 GB 200-7274

Node-RED関数ノード(Javascript)を記述して、値をセンサー値から電圧値に変更します。さらに、別の関数ノードを記述して、その時点でのセンサーの抵抗値を計算できます。最後に、3番目の関数ノードを使用して、その抵抗値(サーミスタの場合)を、摂氏の温度に変更できます。

Javascriptコードに協力してくれたジェームス・マクファーレンとアンディ・スタンフォード・クラークに感謝します。

上の3つのステップは、3つの異なる機能を持つノード(「電圧(Volts)」、「抵抗(Resistance)」、「温度(Temp)」)に分けられているため、自分のプロジェクトに合ったパーツを再利用可能です。ただし、すべてのノードを、1つの関数ノードにまとめることもできます。

これらの関数ノードを使用するために、計算方法やJavascriptを理解する必要はありません。コピーしてフローに貼り付けるだけで使用可能です。

最初の2つのノードは、さまざまなタイプのセンサーで使用できます。「電圧(Volts)」にはステップ数とVrefの正しい値を、「抵抗(Resistance)」には分圧器として使用される抵抗器の抵抗値を入力してください。

最後のノード「温度」は、使用されるサーミスタ固有のものであり、データシートにすべての情報が記載されています。

次に、コードをコピーして、下の方法でインポートします。

Node-REDフローページで、メニューをクリックします(右上の3本線)

[インポート]をクリック

[クリップボード]をクリック

フローを灰色のボックスに貼り付け

[インポート]をクリック

Node-REDにインポートするコード:

[{"id":"88d8d093.5acaf","type":"function","z":"c32b5e9c.320c5","name":"Volts","func":"var n=msg.payload;\nconst steps = 1023;\nconst Vref = 3.3;\nvar Vadc = Vref * n / steps;\nmsg.payload = Vadc;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":160,"y":180,"wires":[["426782ef.4c21e4"]]},{"id":"426782ef.4c21e4","type":"function","z":"c32b5e9c.320c5","name":"Resistance","func":"var Vadc=msg.payload;\n// Vin is the voltage from the ADC.\n// R1 and R2 must be in same units (e.g. K or ohms)\nconst R2 = 10e3;\nvar R1 = R2 * (3.3/Vadc - 1);\nmsg.payload = R1;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":200,"y":240,"wires":[["c0574638.f14f5"]]},{"id":"c0574638.f14f5","type":"function","z":"c32b5e9c.320c5","name":"Temp","func":"var R1=msg.payload;\nconst A1 = 3.354016e-03;\nconst B1 = 2.569850e-04;\nconst C1 = 2.620131e-06;\nconst D1 = 6.383091e-08;\nconst Rref = 10e3;\nvar k = R1/Rref; // We make a substitution here to simplify things.\nvar T;\nif (k > 0) {\n T = 1.0 / ( A1 + B1*Math.log(k) + C1*Math.pow(Math.log(k),2) + D1*Math.pow(Math.log(k),3) );\n} else { \n T = 0.0;\n}\nvar Tc = T - 273.15 // Turn from Kelvin into degrees C\nmsg.payload = Tc;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":260,"y":300,"wires":[[]]}]

次のように3つのノードを貼り付けます。

Screenshot_2020-11-19_at_13.34_.39__64593b29ef0ae0f6244c41ae9d508c9c996f62ee.png

または、コードを各関数ノードに自分で追加することもできます。電圧ノードの出力を抵抗ノードの入力にリンクし、抵抗ノードの出力を温度ノードの入力にリンクします。

電圧ノードの内容:

var n=msg.payload;
const steps = 1023;
const Vref = 3.3;
var Vadc = Vref * n / steps;
msg.payload = Vadc;
return msg;

抵抗ノードの内容:

var Vadc=msg.payload;
// Vin is the voltage from the ADC.
// R1 and R2 must be in same units (e.g. K or ohms)
const R2 = 10e3;
var R1 = R2 * (3.3/Vadc - 1);
msg.payload = R1;
return msg;

温度ノードの内容:

var R1=msg.payload;
const A1 = 3.354016e-03;
const B1 = 2.569850e-04;
const C1 = 2.620131e-06;
const D1 = 6.383091e-08;
const Rref = 10e3;
var k = R1/Rref; // We make a substitution here to simplify things.
var T;
if (k > 0) {
 T = 1.0 / ( A1 + B1*Math.log(k) + C1*Math.pow(Math.log(k),2) + D1*Math.pow(Math.log(k),3) );
} else { 
 T = 0.0;
}
var Tc = T - 273.15 // Turn from Kelvin into degrees C
msg.payload = Tc;
return msg;

電圧ノードの前に「入力(input)」を、最後のノードの後ろにデバッグノード(または制御したいもの)を追加する必要があります。ここではスイッチノードをよく使用しますが、これは、特定の値を下回っている場合aを実行し、そうでない場合はbを実行します。

これで、センサー値が、人間が読めるものになりました!

I am an inventor, engineer, writer and presenter. Other stuff: Royal Academy of Engineering Visiting Professor of Engineering: Creativity and Communication at Brunel University London; Fellow of the Institution of Mechanical Engineers and have a PhD in bubbles; Judge on BBC Robot Wars.

コメント