obniz に Grove Water Level Sensor をつなげるメモ

obniz に Grove Water Level Sensor をつなげるメモです。

Arduino C のプログラムが分かったので移植したい

M5StickC Plus に Grove Water Level Sensor をつなげるメモ

こちらの記事で Water Level Sensor のArduino C のプログラム は分かったので移植しようと思います。

GROVE 5方向スイッチ のArduino I2Cコードをobniz JavaScript I2Cコードに置き換えるメモ

以前も移植できたので、このときのノウハウは活用していきます。

ソースコード

出来上がったソースはこちらです。

image

千石電商さんで購入した Seeed Studio 110990210 Grove 4ピンコネクタ – ジャンパーピン変換ケーブル(5本入り) を使ってつなぎます。

  • 0番ピン 黒
    • GND
  • 1番ピン 赤
    • VCC
  • 2番ピン 白
    • SDA
  • 3番ピン 黄
    • SCL

で、つなぎます。

obniz クラウドから動かしています。Arduinoのプログラムを、変数名はだいたい同じにして移植できました。

  • 接続が整うまでに待ち時間が必要で、それがないと不安定になってハマった
  • 0番ピンと1番ピンに+-の電流を流してやるのをわすれててちょっとハマった

あたりを乗り越えて以下のようなプログラムに落ち着きました。

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link
      rel="stylesheet"
      href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
    />
    <link rel="stylesheet" href="/css/starter-sample.css" />
    <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script
      src="https://unpkg.com/obniz@3.8.0/obniz.js"
      crossorigin="anonymous"
    ></script>
  </head>
  <body>
    <div id="obniz-debug"></div>

    <div class="wrap">
      <div class="print">
        <h3 class="text-center" id="waterlevel">[water level]</h3>
      </div>

    <script>
      
      var obniz = new Obniz("Obniz_ID");
      obniz.onconnect = async function() {
        
        obniz.display.clear();
        obniz.display.print("Hello World");
        
        // 黒:0番
        obniz.io0.output(false)
        // 赤:1番
        obniz.io1.output(true)

        obniz.i2c0.onerror = function(err) {
          console.error(err)
        }

        // 接続が整うまでに待ち時間が必要
        await obniz.wait(100);

        // I2C接続
        obniz.i2c0.start({mode:"master", sda:2, scl:3, clock:400000 });

        // https://wiki.seeedstudio.com/Grove-Water-Level-Sensor/#software を参考
        let low_data = [];
        let high_data = [];

        let THRESHOLD = 100;
        let ATTINY1_HIGH_ADDR = 0x78;
        let ATTINY2_LOW_ADDR = 0x77;

        while(true){

          let touch_val = 0;
          let trig_section = 0;
          low_count = 0;
          high_count = 0;

          high_data = await obniz.i2c0.readWait(ATTINY1_HIGH_ADDR, 12);
          low_data = await obniz.i2c0.readWait(ATTINY2_LOW_ADDR, 8);

          let i;

          for (i = 0 ; i < 8; i++) {
            if (low_data[i] > THRESHOLD) {
              touch_val |= 1 << i;
            }
          }
          for (i = 0 ; i < 12; i++) {
            if (high_data[i] > THRESHOLD) {
              touch_val |= 1 << (8 + i);
            }
          }
          
          while (touch_val & 0x01)
          {
            trig_section++;
            touch_val >>= 1;
          }

          let water_level_mm = trig_section * 5;
          // console.log("c = " + water_level_mm + "%");
          
          // HTML に反映
          $("#waterlevel").html("[water level] " + water_level_mm + " %");

          // ディスプレイに反映
          obniz.display.clear();
          obniz.display.font(null,16)
          obniz.display.print("[water level]");
          obniz.display.font(null,30)
          obniz.display.print(water_level_mm + " mm");

          await obniz.wait(1000);
        }

      };
    </script>
  </body>
</html>

実際にはこのように動きます。