【ホール素子】水流センサー(流量計)arduinoスケッチ
ホール素子を使った流量計を入手しましたがなかなかarduinoのスケッチが見当たりません。
そこでいろいろ調べて何とか使えそうになったのでメモに残しておきます。
ホール素子とは
ホール素子とはホール効果を利用して磁石や電流による磁界を電気信号に変換して出力する非接触型の磁気センサーです。
ホール効果とは、電流の流れているものに対し、電流に垂直に磁場をかけると、電流と磁場の両方に直交する方向に起電力が現れる現象。
ホール素子はドアや窓のセキュリティ対策として、或はスピードメータなど動きを感知する機器などに使われていますが羽根の回転を検知して流量に変換したものが流量計(水量計)です。
水量計(流量計)
そのホール素子を使った流量計(水量計)です。
既に使い始めて1年経過しましたが非接触型なので安定して稼働しています。
カズが使っているのはこの水流センサーです。
【2022/05 追記】
当時は金属製の流量センサーの方がが高かったのですが今はむしろ割安のようです。今度水耕栽培に使う場合コレにしようと思います。 ^^;
arduino との配線
ホール素子を使った流量計はリード線が3線あり、arduinoへはこのように配線します。
赤 ⇒ 5V
黄 ⇒ 信号
attachInterrupt 関数
attachInterruptは外部割り込みが発生したときに実行する関数を指定します。
attachInterrupt(割り込み, function, mode)
【パラメータ】
function: 割り込み発生時に呼び出す関数
mode: 割り込みを発生させるトリガ
割り込み番号はarduino Unoでは pin2(int.0) pin3(int.1) となっています。
ここではPin 3を使っていますので割り込みに1を指定、或いはdigitalPinToInterrupt()を使って3と指定します。
arduino のattachInterrupt関数の詳しい使い方はこちらを参考にしました。
volatileとは?
volatileは変数を修飾するキーワードで、型宣言の前に付けて、コンパイラが変数を取り扱う方法を変更します。具体的には、変数をレジスタではなくRAMからロードするよう、コンパイラに指示します。ある条件では、レジスタに記憶された変数の値は不確かだからです。変数をvolatileとして宣言する必要があるのは、その変数がコントロールの及ばない別の場所(たとえば並行して動作するコード)で変更される可能性があるときです。Arduinoの場合、そうした状況が当てはまるのは、割り込みサービスルーチンと呼ばれる、割り込みに関連したコードだけです。
割り込みで変数の場合にvolatileを使うということのようですね。
流量計(Water Flow Sensor) スケッチ
[php]
volatile int pulseCount;
float ryuuryou;
unsigned long oldTime;
float sam_ryuuryou=0;
float keisuu=5.5; //流量調整係数
void setup(){
pinMode(3, INPUT_PULLUP);
oldTime = millis();
}
void loop(){
attachInterrupt(digitalPinToInterrupt(3), flow, RISING);
if(millis() >= (oldTime + 1000)){
oldTime=millis();
ryuuryou=((pulseCount / keisuu )/60);
sam_ryuuryou=sam_ryuuryou+ryuuryou;
pulseCount = 0;
}
}
void flow (){
pulseCount++;
}
[/php]
より正確な流量を計測するために1秒毎の流量を積算しています。
係数(keisuu)を5.5としていますが使用する塩ビ管の内径や圧力の差(自然落下や加圧)などで実際の流量が多少異なってきますので値を調整してください。
カズは1分間の流量を実測して係数を5.5としています。
流量計(水量計) まとめ
この流量計を何に使っているかというと実は…太陽熱温水器に使っています。
太陽熱温水器のコントローラでは温度計測と給水が出来ますが浴槽にどのくらいのお湯を入れるかという設定が出来ません。
太陽熱温水器ですので熱源は無料なので有難いのですが何せ、お天気任せで温度も60度以上からほぼ水温と同じというようにいろいろです。
一般的にはお湯を入れて水で温度を調整するという方法だと思いますがちょっと芸がない!ということで、カズはarduinoをコントローラに組み込み、温度と湯量を設定したらお湯の量と水の量を自動で計算して浴槽を設定温度でお湯はりするようにしています。
使用している電磁弁は2個で流量が計算された水量に達したら水の電磁弁を閉じ、水とお湯の合計流量(設定流量)に達したらお湯の電磁弁を閉じるというスケッチです。
そして浴槽のお湯が設定流量に達したらメロディでお知らせということでやや遊びココロの領域ですね。
メロディーも「いい湯だな ♪」
この流量計はフロースイッチと組み合わせて水耕栽培にも使えそうですね。
今考えていることは水耕栽培の改良型で、噴霧式水耕栽培を作ったのですが根が成長しすぎて小さな容器では収まらなくなりました。(^^;
かといって広い敷地ではないのでスペースが限られます。
そこで、ボックスに1~2株を定植?して、今度は噴霧式と従来の水耕栽培の方法(栽培溶液に浸す)の融合を試みてみようと思います。
栽培溶液に浸す時間と栽培溶液が全くない時間をarduinoでコントロールし、根に適度なストレスを与えることで更に成長を促そうということですが…
逆効果かな?
しかし、空気に触れる時間もあるのでやっぱりいい方法かな?
来年春に我流新プロジェクトスタートです。(^^;