obniz に Grove Water Level Sensor をつなげるメモ
obniz に Grove Water Level Sensor をつなげるメモです。
Arduino C のプログラムが分かったので移植したい
https://www.1ft-seabass.jp/memo/2020/09/02/m5stick-c-plus-connect-grove-water-level-sensor/
こちらの記事で Water Level Sensor のArduino C のプログラム は分かったので移植しようと思います。
https://www.1ft-seabass.jp/memo/2019/07/04/obniz-i2c-first-step/
以前も移植できたので、このときのノウハウは活用していきます。
ソースコード
出来上がったソースはこちらです。

千石電商さんで購入した 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>
実際にはこのように動きます。