水位センサー（レベルスイッチ）3種類をArduino UNOで使ってみた

海水水槽の飼育水の蒸発によって塩分濃度が濃くなるという問題があったので、
水位が減ったことを検知するために、3種類のレベルスイッチの動作確認を行いました。
配線方法や性能をまとめます。

# 材料
- Arduino UNO
- 半固定抵抗10kΩ
- ブレッドボード
- ジャンパーワイヤ（オス-オス）
- 液体の入った容器（私は陶器のマグカップと海水水槽で試しました）

# 環境
- MacOS Catalina 10.15.7
- ArduinoIDE 1.8.12

# 使用した水位センサー
## 非接触型
- [DFRobot Non-contact Liquid Level Sensor(SEN0204)](https://www.robotshop.com/jp/ja/gravity-non-contact-liquid-level-sensor.html)
- [非接触チューブタンク液体水位検出センサースイッチコンテナ](https://www.amazon.co.jp/gp/product/B07H983DZY/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1)

## フロート型
- [フロートスイッチ(水・薬液用)](https://www.monotaro.com/p/3320/8147/)

# DFRobot Non-contact Liquid Level Sensor(SEN0204)
![SEN0204.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/7a57de6e-d210-e7aa-131a-7db070568064.jpeg)
液体が入った容器の外から白いセンサーを当てて使います。

## 配線
DFRobotのWikiページに配線方法やプログラムが全て載っています。
ですが、画像が少し潰れていてピン配置が見づらいので補足で載せておきます。
![Liquid_Level_Sensor-XKC-Y25-T12V_connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/9fe2de6c-59fa-b58e-15e8-a7e16a10983f.png)

| Arduino UNO | Liquid Level Sensor |
|:-:|:-:|
| D5 | OUT（緑） |
| 5V | VCC（赤） |
| GND | GND（黒） |

## コード
D5ピンの値を読み取る簡単なコードです。
液体を検知すると白いセンサーに付いているLEDが赤く光り、**1**を出力します。
それ以外の時は0を出力します。
<details><summary>コード</summary>
<div>

```c

#define D_IN  5
int Liquid_level = 0;

void setup() {
 Serial.begin(9600);
 pinMode(D_IN, INPUT);
}

void loop() {
  Liquid_level = digitalRead(D_IN);
  Serial.print("Liquid_level= ");
  Serial.println(Liquid_level, DEC);
  delay(500);
}
```

</div>
</details>

## 結果
![DFRobot結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/3be5140c-d9af-7c4a-7883-8bb8c9434a60.png)
陶器のマグカップでは正常に検知できましたが、海水水槽で実験した際、
水槽の内側にこびり付いた塩の結晶を「水」と誤認するという現象が起きました。
![水位誤認.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/fbe60e85-a57f-7901-00e7-c65e0fcdfdf6.jpeg)
よって、「淡水ならよいが、海水の水槽には適さないのでは」という結論に至りました。

# 非接触チューブタンク液体水位検出センサースイッチコンテナ
![非接触センサー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/a5cf9a30-0a43-1d61-01b3-f747ecc9d48a.jpeg)
Amazonで売っていた非接触センサーです。
類似商品が多く売っており、いまいちどこのメーカーのものなのか分かりません。
Amazonでの商品タイトルは『12V-24V』という表記がありますが、センサー本体には『5V-24V』と記載されており、実際5Vで動きます。
使用方法はDFRobotのものと同じで、液体の入った容器に当てて使います。

## 配線
先端が3ピンのコネクタになっているので、ジャンパーワイヤを差し込んで使います。

| Arduino UNO | 非接触センサー |
|:-:|:-:|
| 5V | VCC（赤） |
| D5 | OUT（黄） |
| GND | GND（黒） |

## コード
コードはDFRobotのものと同じですが、出力結果が異なります。
こちらのセンサーでは、水位を検知した時にLEDが青く光り、**0**を出力します。
それ以外の時は1を出力します。
<details><summary>コード</summary>
<div>

```c
/* DFRobotのコードと全く同じものです */
#define D_IN  5
int Liquid_level = 0;

void setup() {
 Serial.begin(9600);
 pinMode(D_IN, INPUT);
}

void loop() {
  Liquid_level = digitalRead(D_IN);
  Serial.print("Liquid_level= ");
  Serial.println(Liquid_level, DEC);
  delay(500);
}
```

</div>
</details>

## 結果
![非接触センサー結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/3b3b848a-a8fe-cba2-37d3-ce8dac6bd4a3.png)
内容がDFRobotと被りますが、やはりマグカップは正常で、水槽では塩の結晶を水だと誤認しました。
このタイプの非接触水位センサーは淡水の水槽であれば有用に使えそうです。

# フロートスイッチ(水・薬液用)
![フロートスイッチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/17760ad3-64a5-10c1-ebaf-35711a785602.jpeg)
水面に浸して使用する接触型センサーです。
水位の増減によって中心にあるドーナツ型のフロートの位置が変動します。
![フロートスイッチ説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/33bad21d-a77c-6e11-73c0-013ba6cc2d09.png)

## 配線
フロートスイッチのケーブルは2本伸びていますが、VCCやGNDといった表記や色分けが特に無いので、
どちらを使っても大丈夫だと思います。
10kΩの半固定抵抗の抵抗値を最大にして使用します。
![フロートスイッチ配線図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/865f6708-089b-3867-3735-785da2003b23.png)

| Arduino UNO | 半固定抵抗 | フロートスイッチ |
|:-:|:-:|:-:|
| 3.3V | 1ピン | - |
| GND | - | どちらか一方 |
| A0 | 2ピン | - |
| - | 3ピン | どちらか一方 |

## コード
フロートスイッチはアナログ入力になります。
水位が足りている時は0、水位が足りない時は**0以外の整数**を出力します。
私が実験した時は655付近の値でしたが、705付近の値が出る方もいらっしゃるようで、個体差がありそうです。
<details><summary>コード</summary>
<div>

```c
#define A_IN  A0
int Liquid_level = 0;

void setup() {
 Serial.begin(9600);
 pinMode(A_IN, INPUT);
}

void loop() {
  Liquid_level = analogRead(A_IN);
  Serial.print("Liquid_level= ");
  Serial.println(Liquid_level, DEC);
  delay(500);
}
```

</div>
</details>

## 結果
![フロートスイッチ結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256451/3c56ca77-45d1-b281-f1aa-df7fb342f9b1.png)
前述の非接触センサーでは塩の結晶を誤認する現象がありましたが、
フロートスイッチは水面に直接触れて検知しているので、海水水槽にはフロートスイッチが一番適しているという結論に至りました。

# まとめ
Amazonで購入したものは参考になるページが無かったので、「アナログ入力かデジタル入力か」というところからのスタートでしたが、
なんとか動かすことができたので良かったです。
今回は「海水の水槽」という点を重視して実験しましたが、淡水の水槽や浴槽などに使う分にはどれも使えると思います。

# 参考文献
[Non-contact Liquid Level Sensor XKC-Y25-T12V SKU SEN0204](https://wiki.dfrobot.com/Non-contact_Liquid_Level_Sensor_XKC-Y25-T12V_SKU__SEN0204)
[Arduinoでフロートスイッチ(定水位スイッチ)を使ってみた](https://knkomko.hatenablog.com/entry/2019/09/21/230310)