投稿者: sassy

  • 0-10V タイプ風速計

    中国製 0-10V タイプ風速計について調べて見た

    この機種はアルミ製です、製造メーカーはポリカーボネート製のメーカーとは異なります。
    中国製にはめずらしく取扱説明書が添付されている。(製造元の記載はないが)
    電源に12V供給すると0~30m/sの風速で黄色-青色端子に0~10Vの電圧が出てくる仕組みで分かりや
    すい、しかしパルス製が70m/sまで計測出来るのにこちらのアルミ製は30m/sまでしか測れないのが
    欠点か?
    作りは内部に収納された基板も見た目しっかりしている、しかし基板の収納方法は無理やり押し込ん
    である雑な感じ。
    回転を検出していると思われるカップとアームを支えている裏の部分にあるセンサーを見つけた。
    恐らく「磁気ホールセンサ」?と思われる。

    0-10V 風速計を分解したところ
    磁気ホールセンサーらしきセンサー部分

    ちなみに公表はされていないが、内部の3ピンコネクタから磁気ホールセンサと思
    われる部分からパルス電圧を取り出して計測したら1回転8パルスを確認できた。
    5年前買った同じ格好のRS485タイプでは10パルスだった。
    購入時期や製品によって異なるものと思われる。
    この数が多いほど分解能力は高い。

    パルス測定回路と読出しスクリプト

    パルス読出し用スクリプト

    #include <ESP8266WiFi.h>
    
    // パルスを入力するGPIOピン 
    const int pulsePin = 4;
    volatile unsigned long pulseCount = 0;
    
    // 割り込みサービスルーチン
    void ICACHE_RAM_ATTR onPulse() {
      pulseCount++;
    }
    
    void setup() {
      Serial.begin(9600);
      pinMode(pulsePin, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(pulsePin), onPulse, RISING);
    }
    
    void loop() {
        Serial.println(pulseCount);
      }
    

    設計構想

    設計構想としては、出てくる信号電圧0-10VをADコンバーターで読み取れば良いわけだ。
    テストしてみると10V以上は頭打ちになっており、風を更に強く充ててもそれ以上は上がらない。
    これははっきり30m/s以上は測れないという決定的意味ですが、はっきりしているのでかえって
    処理しやすいメリットでもある。

    適当なADコンバーターを探してみたが、16bit辺りのものが安くて使いやすい。
    アマゾンで手軽に入手できるADS1115などでも良いが、0~10Vを直接簡単に測れるADコンバーターは
    M5Stack用の「M5Stack用ADCユニット v1.1」が安価で性能も悪くなさそうなので今回はこれを使用することにする。
    入力にラダー抵抗が付いているので10V入力にも追加回路無しのそのままでの対応が出来る。
    使用しているADコンバーターチップはTexas Instruments製 ADS1110。
    ただし、5V系の部品なのでI2Cラインには双方向レベル変換器が必要になる。

    M5Stack用の16 bit ADコンバーターユニット
    自己校正機能を備えた ADS1110を搭載
    I2Cで通信 ¥1,100
    購入先 スイッチサイエンス

    特徴

    ADコンバーターにADS1110を搭載(従来品M5Stack用ADCユニット [U013]はADS1100搭載)
    最大分解能:16 bit
    サンプリングレートを変更可能:15~240サンプル/秒
    1、2、4、8倍のプログラマブルゲインアンプ(PGA)を内蔵
    高精度基準電圧源を内蔵:2.048 V ±0.05 %
    測定電圧範囲は従来通り:0 ~ 12 V
    レゴ互換の取り付け穴を二つ搭載

    仕様

    入力端子:HT3.96端子(2ピン)
    ADコンバータ:ADS1110PGA増幅率:1、2、4、8倍
    AD変換分解能:最大16 bit
    基準電圧:2.048 V ± 0.05%
    ローノイズ:10 μVP-P
    温度ドリフト:5 ppm/℃
    積分非直線性誤差(INL):フルスケールレンジの0.01%(最大)
    インターフェース:GROVE互換インターフェース(I2C)I2Cアドレス:0x48
    外形寸法:32 x 24 x 10.2 mm

    内部回路図

    分圧と測定範囲
    分圧比:R2/(R1 + R2) = 100kΩ/(510kΩ + 100kΩ ) ≒ 0.1639 = 1/6.1
    結果: 12Vを入力すると、内部のADS1110(ADC)の入力ピンに約1.967V程度が印加される。
    (12V x 0.1639 ≒ 1.967V
    計算式(電圧への換算)
    ADS1110からの読み取り値(raw)を電圧に換算する際は、以下の計算式に従う。
    入力電圧(V) = (rawデーター/32768)x 2.048 x 6.1 = rawデーター x 0.0000625 x 6.1
    *ADS1110はシングルエンドモードで15ビット+符号、または16ビットの解像度を持つ
    LSB_VOLTAGE = 0.0000625(62.5uV)
    DIVIDER_RATIO = 6.1

    ADS1110 設定レジスタ (Config Register) の構成

    主要な設定例
    0x8C (1000 1100): 連続変換、15 SPS、ゲイン=1
    0x0C (0000 1100): 連続変換、15 SPS、ゲイン=1(開始信号なし)
    0x9C (1001 1100): シングルショット(単発)測定、15 SPS、ゲイン=1 




    0-10V 風速計回路図

    ESP-WROOM-02が3.3V系なので5V系のM5Stack用パーツを使う場合には親和性が悪く、電源が風速
    計の12V電源も入れると3種類必要になります。
    この風速計は電源電圧12Vで設計されているので5Vでは動きませんので12Vは必須です。

    ADCユニット v1.1側のI2Cラインにプルアップ抵抗が付いているのでプルアップ抵抗は無しです。



    第一段階テストスクリプト ESP-WROOM-02用

    #include <Wire.h>
    #define ADS1110_ADDR 0x48
    
    // ADS1110 Config
    // PGA=1, 15SPS, Continuous
    #define ADS1110_CONFIG 0b10001100
    
    // M5 ADC Unit v1.1 分圧比
    #define DIVIDER_RATIO 6.1
    #define LSB_VOLTAGE   0.0000625  // 62.5uV (PGA=1)
    
    void setup() {
      Serial.begin(115200);
      Wire.begin(4, 5);
      Wire.setClock(100000);
    
      // 設定書き込み
      Wire.beginTransmission(ADS1110_ADDR);
      Wire.write(ADS1110_CONFIG);
      Wire.endTransmission();
    }
    
    float readVoltage() {
      // 3バイト(高バイト、低バイト、コンフィグ)を読み出す
      Wire.requestFrom(ADS1110_ADDR, (uint8_t)3);
      if (Wire.available() < 3) return -1;
    
      int16_t raw = (Wire.read() << 8) | Wire.read();
      Wire.read(); // config (unused)
    
      float adc_voltage = raw * LSB_VOLTAGE;
      return adc_voltage * DIVIDER_RATIO;
    }
    
    void loop() {
      float voltage = readVoltage();
    
      Serial.print("Voltage = ");
      Serial.print(voltage, 3);
      Serial.println(" V");
      delay(1000);
    }
    

    風速計の添付説明書の記載によると
    30m/s->10Vに対応
    0~10Vの電圧変化に風速が線形変化するとのこと、つまり
    速度= Vmv x 0.003m/s となる

    キャリブレーションについて

    キャリブレーション調整なしで動作させると風速計停止時0.04m/sが計測されました。
    これはゼロ点電位が完全に0Vで無い為起こります。
    ADS1110の1LSBは
    62.5uV x 分圧6.1 ≒ 0.00038V
    風速に換算すると 0.00038V x (30 / 10V) ≒ 0.0011 m/sになります。
    数LSBずれると 0.02~0.05 m/s 程度ずれます。

    キャリブレーションの方法
    キャリブレーションは2点での校正が基本になります。
    ゼロ点 -> 無風時のゼロ点調整
    スパン(最大値と最小値の差) ->既知の風速での調整 (別の風速計が必要)

    ● ゼロ点補正のやり方
      無風状態で電圧を測る (電圧はデバッグ用シリアルモニターに表示されている)
      私の機器の場合 Voltage : 0.013V Wind: 0.04 m/s 、従ってこの場合AD変換直後の数値から
      この0.013Vを引く操作を行う

      実際のスクリプト上の記述
      #define ZERO_OFFSET 0.013 // 無風時の電圧
       float adc_voltage = raw * LSB_VOLTAGE;の直後
      adc_voltage = adc_voltage – ZERO_OFFSET;
       if (adc_voltage < 0) adc_voltage = 0;

      スパン補正 (30m/s 側) 仕組み
    *ADコンバーターにおけるSCALE(スケール)
    フルスケール->最小デジタルコード(0V付近)から最大デジタルコード(最高電圧)までの入力範囲。
    SCALE(スケール) ->本風速計の場合、30 m/s -> 10V なので SCALE = 30 / 10 = 3.0

    ● 実際のスパン補正やり方

    送風機で風送る → 電圧測る
    その時の実風速を別の風速計で測る

    SCALE計算
    SCALE = 実風速 / (測定電圧 – ZERO_OFFSET)


    無風   0.013V   風速 0m/s
    送風 2.5V 風速 7.2 m/s

    SCALE = 7.2 / 2.5 -0.013) = 2.90

    最終完成式
    #define ZERO_OFFSET 0.013
    #define SCALE 2.9
    float voltage = readVoltage();
    float wind_speed = (voltage – ZERO_OFFSET) * SCALE;
    if (wind_speed < 0.3) wind_speed = 0;
    if (wind_speed > 30) wind_speed = 30;

    0点ズレ ZERO_OFFSET
    最大ズレ SCALE
    ADC誤差 平均化
    微小風 0.3m/s以下切り捨て(カップ風速計は 0.2~0.3m/s以下は回らない)

    理屈的には以上のようになるが、現実の世界ではゼロ点補正は容易だが、スパン補正は、難しい
    理由は送風機で一定の風を特定のポイントに当てるという作業の困難さによる。
    風洞実験装置のようなものを作らないと扇風機や送風機などでは難しい。
    そうゆう分けで以下のスクリプトはゼロ点調整部のみ組み込みました。





    0-10V風速計完成スクリプト ESP-WROOM-02用

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include <Wire.h>
    
    #define ADS1110_ADDR 0x48
    #define ADS1110_CONFIG 0b10001100
    
    #define DIVIDER_RATIO 6.1
    #define LSB_VOLTAGE   0.0000625
    #define ZERO_OFFSET 0.013   // 無風時の電圧
    
    #define MAX_WIND_SPEED 30.0   // ←ここを仕様に合わせる
    #define MAX_VOLTAGE    10.0
    
    #define WIFI_SSID "your_ssid"
    #define WIFI_PWD  "your_passwd"
    const char* mqtt_server = "192.168.1.200";
    
    #define LED 16
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    uint8_t count = 0;
    unsigned long lastSample = 0;
    
    void reconnect() {
      while (!client.connected()) {
        String clientId = "ESP8266-";
        clientId += String(random(0xffff), HEX);
        client.connect(clientId.c_str());
      }
    }
    
    float readVoltage() {
    
      Wire.requestFrom(ADS1110_ADDR, (uint8_t)3);
      if (Wire.available() < 3) return -1;
    
      int16_t raw = (Wire.read() << 8) | Wire.read();
      Wire.read();
    
      if (raw < 0) raw = 0;
    
      float adc_voltage = raw * LSB_VOLTAGE;
      
      adc_voltage = adc_voltage - ZERO_OFFSET;// Set Offset
      if (adc_voltage < 0) adc_voltage = 0;
      
      return adc_voltage * DIVIDER_RATIO;
    }
    
    void setup() {
    
      Serial.begin(115200);
      Wire.begin(4, 5);
      Wire.setClock(100000);
    
      Wire.beginTransmission(ADS1110_ADDR);
      Wire.write(ADS1110_CONFIG);
      Wire.endTransmission();
    
      WiFi.config(IPAddress(192,168,1,100),
                  IPAddress(192,168,1,1),
                  IPAddress(255,255,255,0));
    
      WiFi.begin(WIFI_SSID, WIFI_PWD);
      while (WiFi.status() != WL_CONNECTED) delay(500);
    
      client.setServer(mqtt_server, 1883);
    
      pinMode(LED, OUTPUT);
    }
    
    void loop() {
    
      if (!client.connected()) reconnect();
      client.loop();
    
      if (millis() - lastSample >= 1000) {
    
        float voltage = readVoltage();
    
        float wind_speed = (voltage / MAX_VOLTAGE) * MAX_WIND_SPEED;
        if (wind_speed < 0.05) wind_speed = 0; //誤差調整
        
        count +=1;
        if(count > 3){  
            char msg[16];
            dtostrf(wind_speed, 6, 2, msg);
    
            client.publish("wind_speed", msg);
    
            Serial.print("Voltage: ");
            Serial.print(voltage);
            Serial.print(" V  Wind: ");
            Serial.println(msg);
            count = 0;
        }
        
        digitalWrite(LED, !digitalRead(LED));
    
        lastSample = millis();
      }
    }

    NODE-REDフロー


    こんな感じになります
    [{"id":"c31a01828a7d6717","type":"tab","label":"0-10V式風速計","disabled":false,"info":"","env":[]},{"id":"74c02f018504dd99","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"wind_speed","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":190,"y":200,"wires":[["0f0fe984d5cf198c","ad02db2e68f78bbb"]]},{"id":"32d1e716c05ef4f4","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":1,"width":0,"height":0,"name":"風速","label":"風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":530,"y":200,"wires":[]},{"id":"0f0fe984d5cf198c","type":"debug","z":"c31a01828a7d6717","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":340,"y":440,"wires":[]},{"id":"ad02db2e68f78bbb","type":"function","z":"c31a01828a7d6717","name":"単位を付与","func":"var temp = msg.payload;\nvar data = temp + \" m/s\";\nmsg.payload = data;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":370,"y":200,"wires":[["32d1e716c05ef4f4"]]},{"id":"61e45e3515b67f80","type":"mqtt-broker","name":"","broker":"192.168.1.200","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a2862a7d5d758378","type":"ui-group","name":"風速","page":"cef20d4917f1c9a7","width":6,"height":1,"order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"cef20d4917f1c9a7","type":"ui-page","name":"気象","ui":"debf650e7f1343d3","path":"/page1","icon":"home","layout":"grid","theme":"a45c7f2adf09be21","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"debf650e7f1343d3","type":"ui-base","name":"画面名","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"headerContent":"page","navigationStyle":"default","titleBarStyle":"default","showReconnectNotification":true,"notificationDisplayTime":1,"showDisconnectNotification":true,"allowInstall":true},{"id":"a45c7f2adf09be21","type":"ui-theme","name":"気象","colors":{"surface":"#505050","primary":"#505050","bgPage":"#505050","groupBg":"#5f5f5f","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"68ee9dee6ee5f000","type":"global-config","env":[],"modules":{"@flowfuse/node-red-dashboard":"1.30.2"}}]



    更に詳細情報を送信するタイプのスクリプト

    上記の標準的な風速情報の他に以下の情報を更に送信するスクリプトです。
    ・3秒移動平均
    ・10分平均
    ・10分最大瞬間

    #include <ESP8266WiFi.h>
    #include <PubSubClient.h>
    #include <Wire.h>
    
    #define ADS1110_ADDR 0x48
    #define ADS1110_CONFIG 0b10001100   // PGA=1 15SPS continuous
    
    #define DIVIDER_RATIO 6.1
    #define LSB_VOLTAGE   0.0000625
    #define ZERO_OFFSET 0.013   // 無風時の電圧
    
    // ===== 風速仕様 =====
    #define MAX_VOLTAGE 10.0
    #define MAX_WIND    30.0   // 0-30m/s
    
    // ===== サンプリング =====
    #define SAMPLE_INTERVAL 500          // 0.5秒
    #define AVG3_COUNT 6                 // 3秒(0.5秒×6)
    #define AVG10_COUNT 200              // 10分(3秒値×200)
    
    #define WIFI_SSID "your_ssid"
    #define WIFI_PWD  "your_passwd"
    const char* mqtt_server = "192.168.1.200";
    
    #define LED 16
    
    WiFiClient espClient;
    PubSubClient client(espClient);
    
    float buffer3[AVG3_COUNT];
    float buffer10[AVG10_COUNT];
    
    int idx3 = 0;
    int idx10 = 0;
    
    float max10min = 0.0;
    unsigned long lastSample = 0;
    uint8_t count = 0;
    
    // ===== MQTT reconnect =====
    void reconnect() {
      while (!client.connected()) {
        String clientId = "ESP8266-";
        clientId += String(random(0xffff), HEX);
        client.connect(clientId.c_str());
      }
    }
    
    float readWindSpeed() {
    
      Wire.requestFrom(ADS1110_ADDR, (uint8_t)3);
      if (Wire.available() < 3) return 0;
    
      int16_t raw = (Wire.read() << 8) | Wire.read();
      Wire.read();
    
      if (raw < 0) raw = 0;
    
      float adc_voltage = raw * LSB_VOLTAGE;
      adc_voltage = adc_voltage - ZERO_OFFSET;
      if (adc_voltage < 0) adc_voltage = 0; 
      float actual_voltage = adc_voltage * DIVIDER_RATIO;
    
      float wind = actual_voltage * 3.0;   // 0-10V → 0-30m/s
    
      if (wind < 0) wind = 0;
      if (wind > MAX_WIND) wind = MAX_WIND;
    
      return wind;
    }
    
    void setup() {
    
      Serial.begin(115200);
      Wire.begin(4, 5);
      Wire.setClock(100000);
    
      Wire.beginTransmission(ADS1110_ADDR);
      Wire.write(ADS1110_CONFIG);
      Wire.endTransmission();
    
      WiFi.config(IPAddress(192,168,1,100),
                  IPAddress(192,168,1,1),
                  IPAddress(255,255,255,0));
    
      WiFi.begin(WIFI_SSID, WIFI_PWD);
      while (WiFi.status() != WL_CONNECTED) delay(500);
    
      client.setServer(mqtt_server, 1883);
    
      pinMode(LED, OUTPUT);
    
      Serial.println("Wind System Start");
    }
    
    void loop() {
    
      if (!client.connected()) reconnect();
      client.loop();
    
      if (millis() - lastSample >= SAMPLE_INTERVAL) {
    
        float instant = readWindSpeed();
    
        // ===== 3秒移動平均 =====
        buffer3[idx3++] = instant;
        if (idx3 >= AVG3_COUNT) idx3 = 0;
    
        float avg3 = 0;
        for (int i = 0; i < AVG3_COUNT; i++)
          avg3 += buffer3[i];
        avg3 /= AVG3_COUNT;
    
        // ===== 10分平均 =====
        buffer10[idx10++] = avg3;
        if (idx10 >= AVG10_COUNT) {
          idx10 = 0;
          max10min = 0;   // 10分リセット
        }
    
        float avg10 = 0;
        for (int i = 0; i < AVG10_COUNT; i++)
          avg10 += buffer10[i];
        avg10 /= AVG10_COUNT;
    
        // ===== 最大瞬間 =====
        if (avg3 > max10min)
          max10min = avg3;
    
        if (avg3 < 0.05) avg3 = 0; //誤差調整
        if (avg10 < 0.05) avg10 = 0;//誤差調整
        if (max10min < 0.05) max10min = 0;//誤差調整
    
        // ===== MQTT送信 =====
        count +=1;
        if(count > 6){   
        char m3[16], m10[16], mMax[16];
    
        dtostrf(avg3, 5, 2, m3);
        dtostrf(avg10, 5, 2, m10);
        dtostrf(max10min, 5, 2, mMax);
    
        client.publish("wind/3sec_avg", m3);
        client.publish("wind/10min_avg", m10);
        client.publish("wind/10min_max", mMax);
    
        Serial.print("Instant: ");
        Serial.print(instant);
        Serial.print("  3s: ");
        Serial.print(m3);
        Serial.print("  10min: ");
        Serial.print(m10);
        Serial.print("  Max10min: ");
        Serial.println(mMax);
        count = 0;
        }
        digitalWrite(LED, !digitalRead(LED));
    
        lastSample = millis();
      }
    }

    NODE-REDフロー

    こんな感じになります
    [{"id":"c31a01828a7d6717","type":"tab","label":"0-10V式風速計","disabled":false,"info":"","env":[]},{"id":"74c02f018504dd99","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"wind/3sec_avg","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":200,"y":200,"wires":[["0f0fe984d5cf198c","ad02db2e68f78bbb"]]},{"id":"32d1e716c05ef4f4","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":1,"width":0,"height":0,"name":"3秒平均風速","label":"3秒平均風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":570,"y":200,"wires":[]},{"id":"0f0fe984d5cf198c","type":"debug","z":"c31a01828a7d6717","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":340,"y":440,"wires":[]},{"id":"ad02db2e68f78bbb","type":"function","z":"c31a01828a7d6717","name":"単位を付与","func":"var temp = msg.payload;\nvar data = temp + \" m/s\";\nmsg.payload = data;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":200,"wires":[["32d1e716c05ef4f4"]]},{"id":"108dd3c33b249d41","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"wind/10min_avg","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":200,"y":260,"wires":[["71dc36c36bc92e3e"]]},{"id":"53fdf7bcb4a4cc0a","type":"mqtt in","z":"c31a01828a7d6717","name":"","topic":"wind/10min_max","qos":"2","datatype":"auto-detect","broker":"61e45e3515b67f80","nl":false,"rap":true,"rh":0,"inputs":0,"x":200,"y":320,"wires":[["762850e8d6bb2418"]]},{"id":"71dc36c36bc92e3e","type":"function","z":"c31a01828a7d6717","name":"単位を付与","func":"var temp = msg.payload;\nvar data = temp + \" m/s\";\nmsg.payload = data;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":260,"wires":[["364e76a4d2331bce"]]},{"id":"762850e8d6bb2418","type":"function","z":"c31a01828a7d6717","name":"単位を付与","func":"var temp = msg.payload;\nvar data = temp + \" m/s\";\nmsg.payload = data;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":390,"y":320,"wires":[["75cc289fe5b1357b"]]},{"id":"364e76a4d2331bce","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":2,"width":0,"height":0,"name":"10分平均風速","label":"10分平均風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":580,"y":260,"wires":[]},{"id":"75cc289fe5b1357b","type":"ui-text","z":"c31a01828a7d6717","group":"a2862a7d5d758378","order":3,"width":0,"height":0,"name":"10分最大風速","label":"10分最大風速","format":"{{msg.payload}}","layout":"row-spread","style":true,"font":"Arial,Arial,Helvetica,sans-serif","fontSize":"24","color":"#fafafa","wrapText":false,"className":"","value":"payload","valueType":"msg","x":580,"y":320,"wires":[]},{"id":"61e45e3515b67f80","type":"mqtt-broker","name":"","broker":"192.168.1.200","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":4,"keepalive":60,"cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthRetain":"false","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closeRetain":"false","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willRetain":"false","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"a2862a7d5d758378","type":"ui-group","name":"風速","page":"cef20d4917f1c9a7","width":6,"height":1,"order":1,"showTitle":false,"className":"","visible":"true","disabled":"false","groupType":"default"},{"id":"cef20d4917f1c9a7","type":"ui-page","name":"気象","ui":"debf650e7f1343d3","path":"/page1","icon":"home","layout":"grid","theme":"a45c7f2adf09be21","breakpoints":[{"name":"Default","px":"0","cols":"3"},{"name":"Tablet","px":"576","cols":"6"},{"name":"Small Desktop","px":"768","cols":"9"},{"name":"Desktop","px":"1024","cols":"12"}],"order":1,"className":"","visible":"true","disabled":"false"},{"id":"debf650e7f1343d3","type":"ui-base","name":"画面名","path":"/dashboard","appIcon":"","includeClientData":true,"acceptsClientConfig":["ui-notification","ui-control"],"showPathInSidebar":false,"headerContent":"page","navigationStyle":"default","titleBarStyle":"default","showReconnectNotification":true,"notificationDisplayTime":1,"showDisconnectNotification":true,"allowInstall":true},{"id":"a45c7f2adf09be21","type":"ui-theme","name":"気象","colors":{"surface":"#505050","primary":"#505050","bgPage":"#505050","groupBg":"#5f5f5f","groupOutline":"#cccccc"},"sizes":{"density":"default","pagePadding":"12px","groupGap":"12px","groupBorderRadius":"4px","widgetGap":"12px"}},{"id":"4a15a6018cc91f54","type":"global-config","env":[],"modules":{"@flowfuse/node-red-dashboard":"1.30.2"}}]





    製作

    未来工業 PVKボックス
    PVK-BOK 購入先 アマゾン ¥703
    蓋を底にして取付用のM4ねじ穴を4か所開ける
    後ろ面にケーブル用の穴2箇所開ける 
    前面にLED用の穴あける
    完成品
    ステンレススリムヘッド小ねじ M4×10 (10本入り) 購入先 アマゾン ¥576 (10本)
    ステンレス鋼製 M4x0.7mm ギザギザ付きフランジ六角ロックナット 購入先 アマゾン ¥399 (12本)
    トラスコ中山 コルゲートチューブ 内径7.4mm x10m 購入先 アマゾン ¥1,209
    100 x 100 x1.6mm厚鉄板
    購入先 横山テクノ 購入価格 ¥370
    鉄板を裏面にM4 2cmx2本
    皿ねじで固定する
    固定台側にネオジム磁石
    x2個をM4ねじで固定する
    ネオジム磁石 耐荷重8kg
    直径20mm 購入先 アマゾン ¥ 1,699 (10個)




    未来工業のケースを使用します。
    防水とは言ってないですが、特に問題は無いでしょう。
    上部のねじ穴はパテで塞ぎます。
    逆さにしたので底部をシリコンなどで塞ぎます。
    風速計からのケーブルは、最短でカット接続します、引っ張りまわすとノイズが乗ります。
    天板の風速計固定ねじはM4x10mm x4本 後部ケーブル穴は風速計用5mmφ 電源ケーブル用は
    内径7.4mmのコルゲートチューブが入るサイズに。
    前面LED穴は3mmφ

    固定用に100x100x1.6mmの鉄板を風速計の裏面にM4皿ねじ2本で固定する。
    固定台側にはネオジム磁石2個をM4ねじで固定する。

    完成品と運用の様子