obniz に Grove Water Level Sensor をつなげるメモです。
Arduino C のプログラムが分かったので移植したい
こちらの記事で Water Level Sensor のArduino C のプログラム は分かったので移植しようと思います。
GROVE 5方向スイッチ のArduino I2Cコードをobniz JavaScript I2Cコードに置き換えるメモ
以前も移植できたので、このときのノウハウは活用していきます。
ソースコード
出来上がったソースはこちらです。
千石電商さんで購入した 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>
実際にはこのように動きます。
#obniz に水位センサー Grove Water Level Sensor と連携ました。水をそそぐと水位の変化が取れます。
タッチセンサーが並んでる的な仕組みだったので、#Arduino 元コードを参考にしつつ I2C の流れを移植できました!#Seeed #LEGO #ゆるメカトロ #Noodlもくもく会 #ビジュアルプログラミング交流会 pic.twitter.com/Pd2iN45gOg— Tanaka Seigo (@1ft_seabass) August 30, 2020