![見出し画像](https://assets.st-note.com/production/uploads/images/167856417/rectangle_large_type_2_1cbf033d6376a7261aa92827a2acd5f3.png?width=1200)
プログラムと電子工作・超音波センサで水位を測る準備実験
超音波方式の距離センサを用いて、水面とセンサ取付部との距離を計測することにより、どの距離まで水面が上昇しているかを測定します。
水位を計測したい溝や水路、田んぼに設置し、超音波センサを取付けた位置と水面までの垂直距離を計測することで、水位を求めます。超音波センサはお馴染みの HC-SR04を使います。当然、防水仕様ではないので、水がかからないように、センサ前面に長い(1メートル)のパイプを取付けます。1メートル水位が上昇するとセンサが水没し、間違いなく故障しますが、仕方ないですね。
目標
超音波センサから水面までの距離を計測します。
通常来るはずのないパイプ先端を原点(0メートル)として、増水した水位を計測するための、機器構造や計算方法を決定します。
部品・機材
使用する部品は次のとおりです。
電子部品
M5StickC Plus 1台
超音波距離センサ 1個、HC-SR04(Rainbow E-Technology)[例:秋月電子通商 111009]
ジャンプワイヤ 複数本[例:秋月電子通商 105159]
ブレッドボード 1台[例:秋月電子通商 105294]
開発用機材
PC(Windows10 または 11)、開発環境 Arduino-IDE導入ずみ
USB-A・USB-C ケーブル
画用紙(不要なポスターやカレンダーの紙でも可)
開発手順
回路図(図1)にしたがって、ブレッドボード上に回路を作る。
PCと M5StickC Plusを USBケーブルで接続する。
Arduino-IDEでスケッチ hc_sr04.ino を開く。
検証・コンパイルする。
M5StickC Plusに書き込む。
![](https://assets.st-note.com/img/1735531043-ulD3rQehI1JONCPMqZFUpwR4.png?width=1200)
![](https://assets.st-note.com/img/1736079157-bYX3BFVnCpmkK4aHJOoUwIz9.png?width=1200)
![](https://assets.st-note.com/img/1735546474-wSufekpLc9AP0VCsGtyDT7qK.png?width=1200)
スケッチ
hc_sr04.ino
#include <M5Unified.h>
#define TRIG_PIN GPIO_NUM_0
#define ECHO_PIN GPIO_NUM_26
#define LHEIGHT 25 /*1行の高さ(px)TextSize(3):25、TextSize(2):15*/
const uint32_t TIMEOUT_FOR_PULSEIN = 14706 * 2; /*5mを往復するのにかかる時間(us)*/
const double SOUND_SPEED = 331.5 + 0.6 * 15; /*15℃の音速(m/s)*/
/*
HC-SR04 データシート
https://akizukidenshi.com/goodsaffix/hc-sr04_v20.pdf
*/
void setup() {
M5.begin(); /*M5を初期化する*/
M5.Lcd.setTextSize(3); /*文字サイズはちょっと小さめ*/
M5.Lcd.setRotation(3); /*上スイッチが左になる向き*/
M5.Lcd.println("hc_sr04");
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW);
}
void loop() {
// Trigパルスを出力する。
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Echoパルス幅を測る。
/*
Arduino Language Reference - pulseIn()
https://docs.arduino.cc/language-reference/en/functions/advanced-io/pulseIn/
*/
uint32_t dT = pulseIn(ECHO_PIN, HIGH, TIMEOUT_FOR_PULSEIN);
double distance = SOUND_SPEED * dT / (2 * 1000000 / 100);
M5.Lcd.setCursor(0, LHEIGHT*1); /*2行目*/
M5.Lcd.printf("%6.2fcm", distance);
Serial.printf("*** Distance: %6.1fcm\n", distance);
delay(2000); /*測定間隔約 2秒*/
}
Trigパルスは、10マイクロ秒 HIGHパルスを出力します。
便利な Arduino関数 pulseIn() で Echoパルス幅を計測します。pulseIn() にはタイムアウト時間を与えています。
結果
2秒ごとに計測結果を LCDモニタに表示します。
![](https://assets.st-note.com/img/1735545619-nzNMpbga4W2x6JUFKhuyT9Sc.jpg?width=1200)
実験
厳密な実験ではありませんが、身の回りにあるものを用いて、簡易的な実験を行いました。
![](https://assets.st-note.com/img/1736431842-1o0TVsMIW5kLw3BteuKbj8G4.png?width=1200)
![](https://assets.st-note.com/img/1737717616-OBUv6IV4CdXp9lR1Q8KmToZ0.png?width=1200)
考察
実験結果から分かること
超音波センサ HC-SR04に円筒を取付けると、円筒の長さを測定します
円筒を接続して延長しても、内部に段差があると HC-SR04に近い方の円筒の長さを測定します。内・外の順番を入れ替えても同じ結果です。
円筒内部に物体があると、物体までの距離を測定します
以上から、
超音波センサ HC-SR04に円筒を取付けて、水面までの距離を測定する構造では、円筒が水に浸かった時点から、HC-SR04が水没するまでの水位を計測することができそうです。
気温による測定誤差
音速は気温に影響します。音速(m/s) =331.5+0.6*気温(℃)
気温 15℃を基準として、気温が 0℃から 30℃まで変化したときの測定誤差は ±3%です。
![](https://assets.st-note.com/img/1735533128-OyelV8oJiRBuqpwMKzCPj25H.png?width=1200)
参考
HC-SR04 データシート
https://akizukidenshi.com/goodsaffix/hc-sr04_v20.pdfArduino Language Reference - pulseIn()
https://docs.arduino.cc/language-reference/en/functions/advanced-io/pulseIn/
ライセンス
このページのソースコードは、複製・改変・配布が自由です。営利目的にも使用してかまいませんが、何ら責任を負いません。