超音波センサーHC-SR04で水位を測ってみる

超音波センサーとは、超音波の反射を利用して距離を測る測距センサーです。
これで水位を測れるか試してみました。

超音波センサーHC-SR04では、超音波を出して、超音波が返ってくるまでの時間を得ることができます。

この時間を元に、
距離(センチ)=超音波が返る時間(マイクロ秒)÷58
とすれば、距離が求まります。

HC-SR04が出した超音波を本やスマートフォンといった物体に向けると、超音波が反射して距離を求めることができます。
では、水にはちゃんと超音波は反射してくれるでしょうか。


今回HC-SR04をESP-WROOM-02というArduino互換のマイコンに繋ぎました。

マイコンで動かしたプログラム(スケッチ)はこんな感じ。
3秒おきに距離を測って、シリアルに出力するだけです。

const int trig_pin = 2;
const int echo_pin = 5;

int times;
int distance;

void setup()
{
  Serial.begin(9600);

  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
}

void loop()
{
  // 超音波を発生させる
  digitalWrite(trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_pin, LOW);

  // 超音波を受け取る
  times = pulseIn(echo_pin, HIGH);
  distance = (int)(times * 0.017);

  Serial.print(distance);
  Serial.print("(");
  Serial.print(times);
  Serial.println(")");
  delay(3000);
}

さて、水位を測る場所は、、、風呂です。
風呂に湯を張りながら、その水位を測ってみます。

待つこと約15分。
お湯が張れました。

しかし、、、その間にノートパソコン(ESP-WROOM-02への電源供給と、シリアル出力を記録するのが役目)がスリープに落ちていました。。。がっくり。

とはいえ途中までの結果は残っていたので、良しとしましょう。

結果の値は物体までの距離(センチ)です。
カッコ内の値は超音波が返るまでの時間(マイクロ秒)です。

105(6188)
106(6262)
105(6189)
105(6188)
107(6315)
105(6188)
104(6163)
107(6310)
104(6164)
105(6213)
49(2894)
47(2789)
47(2809)
47(2779)
46(2744)
47(2785)
46(2755)
46(2723)
46(2713)
46(2727)
45(2698)
46(2715)
45(2703)
45(2698)
45(2689)
45(2663)
45(2653)
45(2648)
44(2643)
44(2608)
44(2608)
44(2606)
44(2633)
44(2628)
44(2628)
44(2608)
44(2629)
44(2602)
44(2623)
44(2617)
44(2592)
44(2593)
44(2608)
44(2602)
44(2597)
44(2612)
43(2583)
43(2552)
44(2592)
43(2562)
43(2552)
43(2548)
42(2517)
43(2531)
43(2548)
42(2517)
42(2511)
42(2481)
42(2502)
42(2491)
42(2487)
42(2476)
42(2476)
41(2447)
41(2461)
41(2456)
41(2451)
41(2442)
41(2436)
41(2451)
41(2421)
41(2436)
41(2431)
41(2427)
41(2420)
40(2391)
40(2381)
40(2375)
40(2391)
40(2386)
40(2381)
40(2401)
40(2370)
39(2341)
40(2360)
39(2330)
39(2350)
39(2344)
39(2341)
39(2330)
39(2304)
39(2321)
39(2341)
38(2290)
38(2281)
38(2280)
39(2295)
38(2290)
38(2260)
38(2254)
38(2269)
38(2245)
38(2239)
38(2239)
37(2229)
37(2223)
38(2240)
37(2214)
37(2228)
37(2203)
37(2199)
37(2189)
37(2209)
37(2183)
37(2199)
37(2195)
36(2163)
36(2159)
36(2153)
36(2148)
36(2143)
36(2139)
36(2159)
36(2129)
36(2123)
36(2118)
35(2113)
36(2128)
35(2099)
35(2094)
35(2088)
34(2058)
35(2079)
35(2093)
35(2088)
34(2053)
35(2078)
34(2042)
34(2038)
34(2053)
34(2024)
34(2022)
34(2033)
34(2003)
33(1998)
33(1992)
33(1987)
33(1983)
33(1977)
33(1966)
33(1981)
33(1957)
33(1947)
32(1941)
32(1937)
32(1907)
32(1923)
32(1912)
32(1911)
32(1906)
32(1921)
32(1892)
32(1907)
32(1901)
31(1872)
31(1866)
31(1861)
31(1851)
31(1845)
31(1840)
31(1837)
31(1831)
31(1846)
31(1842)
31(1831)
30(1800)
30(1796)
30(1791)
30(1786)
30(1780)
30(1770)
30(1765)
29(1760)
29(1756)
30(1770)
30(1765)
29(1760)
29(1730)
29(1724)
29(1740)
29(1710)
28(1705)
28(1700)
28(1690)
29(1710)
28(1681)
28(1673)
28(1670)
28(1664)
28(1653)
28(1649)
28(1664)
28(1659)
27(1629)
27(1624)
27(1618)
27(1635)
26(1583)
26(1580)

湯を張る前に105センチ前後を記録しているのは異常値ですね。
浴槽は何かしら反射が弱いのかも。

湯を張り始めると49センチを記録して、あとは徐々に数値が減っています。
数値が減る、ということは超音波センサーから水面までの距離が短くなる、ということです。

だんだん値が減って、26センチを指したところで、、、スリープしたようです。

最後まで計測は出来ませんでしたが、水面に対してもちゃんと測距してくれることが判りました。


これができれば、
・液肥タンクの残量を量る
・水田の水の量を監視する
などに応用できそうですね。