【やってみた】IoTはアクアリウムをお手軽趣味にできるのか?水槽の水位を管理してみた

2020 2/14
【やってみた】IoTはアクアリウムをお手軽趣味にできるのか?水槽の水位を管理してみた

こんにちは。さすがにちゆりです。
前回のIoT考えてみたで以下の記事を書きました。

あわせて読みたい
IoTはアクアリウムをお手軽趣味にできるのか?水槽の水位を管理してみる
IoTはアクアリウムをお手軽趣味にできるのか?水槽の水位を管理してみるこんにちは。結局ちゆりです。たたみには愛しのお魚ちゃんがいるのだが,水槽の水位の管理をつい忘れちゃうらしい。そこで,僕(ちゆり)がIoTを駆使して,水槽の水位管...

今回は、IoTを活用してお魚ちゃんたちの水槽の水位を管理してみたので成果をご覧ください。

目次

構成から準備編

ざっくりな構成はこんな感じ

今回もラズパイを使いまわして実装です。使うモジュールも水位センサーブザーのみと、簡単に入手できるものだったので、非常に安価に実装ができました。

以下構成図なり。

画像
ざっくり構成図

ちなみに使ったモジュールはこの2つ。こんな安っぽいゴミのようなモジュールが今回は大活躍します。
たたみが眠れなくなるまでとことん追い詰めます。まるで恐怖の大魔王。おー怖

画像
water sensor (水位センサー)
画像
ブザー

やりたいこと

まず、水位センサーでお魚ちゃんを飼っている水槽の水位を測定します。
水位がある一定よりも下がったら(つまり、水槽の水が少なくなってきたら)ブザーが鳴ります。(これ、かなりうるさい…)これを止める方法は水を追加するしかありません。またはラズパイを破壊するしかないでしょう。そうなれば僕(ちゆり)からたたみに賠償請求を出します。金銭面でもたたみを追い詰めていきます。
そう。すべて悪いのは水槽の管理を怠ったたたみのせいなんですから。ははははは。

それでは、実装していきます。

実装までに必要な準備

以下作成のために準備したものです。

画像
今回使用するモジュールたち
  • Raspberry Pi (僕はRaspberry Pi3 B+を使用しました。毎度毎度ラズパイに頼りすぎ。だって便利ですもん。なんでもできるもん。)
  • 水位センサー(水位を測定するために使います。そんなこと分かるか。)
  • ブザー(アラートとして鳴らします。けっこううるさいです。)
  • ジャンパーピン(モジュールとラズパイを繋ぐただの線です。)
  • AC/DCコンバーター(電圧変換するやつです。変電所みたいなもん。)
  • ブレッドボード(はんだ付けをしなくても回路が組める必殺仕事人)

今回はGPIO制御とかラズパイをそれらしく扱っていきますよ。僕はプログラマーなのであまりハード系には詳しくないですが、そんな僕でもなんとか扱えます。ラズパイ使えばなんでも簡単にできます。

いざ、実装編

ラズパイとモジュールの回路実装

簡単に言うとラズパイとモジュールの回路を組んでいきます。これはモジュールの説明書を見て繋ぎました。
よく意味も分からずに繋いでいきます。ハード系皆無。マジ理解無理。
きゅうじつ研究室は回路組んだり、ハード系が得意(好きな)方を年中募集しています。

・回路実装するうえで参考にしたページ
http://kookye.com/ja/2017/06/01/design-a-water-level-detector-through-a-raspberry-pi-board-and-water-level-sensor/

で、なんとなく回路を組み出来上がったラズパイの姿がこちら。

画像
モジュール実装後

ん。なんかキモくね??実装の段階では気づかなかったけどなんかキモいわ。形が。
「その回路の組み方センスないよ。」「もっとこうした方がいいよ。」っていうアドバイス待っています。
きゅうじつ研究室メンバー確定です。

画像だけじゃ回路がどうかとか分からないか..。
回路図までの構成を図にして載せるのはなかなか難しかったので今回は割愛です。

プログラムの制御

さてさてちゆりの本業。プログラミングの出番です。これまでずっと背負っていたランドセルを今下ろし、シャンプーをして(リンスも込み)準備完了。さぁゴリゴリコーディングすっぞ。おら。

今回も僕の大好きな言語pythonを使っていきます。C言語でもいいのですが、pythonの方が万人受けがいい。
というか簡単だからサクッとできる。そういえばpythonの由来ってなにか分かる? 実はですね。pyth..

時間切れのようなのでコーディングしたソースコードを貼っていきます。
興味ない(わからない)方はすっ飛ばしてください。縦から読むと「たかし愛してる」と記述している部分もあるので探してみてね。(いや。そんなわけあるかーーい。(たたみ))

import RPi.GPIO as GPIO
import time

SPICLK = 11
SPIMISO = 9
SPIMOSI = 10
SPICS = 8

BuzzerPin = 17    # pin11

photo_ch = 0

def init():
         GPIO.setwarnings(False)
         GPIO.cleanup()			#clean up at the end of your script
         GPIO.setmode(GPIO.BCM)		#to specify whilch pin numbering system
         # set up the SPI interface pins
         GPIO.setup(SPIMOSI, GPIO.OUT)
         GPIO.setup(SPIMISO, GPIO.IN)
         GPIO.setup(SPICLK, GPIO.OUT)
         GPIO.setup(SPICS, GPIO.OUT)

         GPIO.setup(BuzzerPin, GPIO.OUT)
         GPIO.output(BuzzerPin, GPIO.LOW)

def readadc(adcnum, clockpin, mosipin, misopin, cspin):
        if ((adcnum > 7) or (adcnum < 0)):
                return -1
        GPIO.output(cspin, True)

        GPIO.output(clockpin, False)  # start clock low
        GPIO.output(cspin, False)     # bring CS low

        commandout = adcnum
        commandout |= 0x18  # start bit + single-ended bit
        commandout <<= 3    # we only need to send 5 bits
        for i in range(5):
                if (commandout & 0x80):
                        GPIO.output(mosipin, True)
                else:
                        GPIO.output(mosipin, False)
                commandout <<= 1
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)

        adcout = 0
        for i in range(12):
                GPIO.output(clockpin, True)
                GPIO.output(clockpin, False)
                adcout <<= 1
                if (GPIO.input(misopin)):
                        adcout |= 0x1

        GPIO.output(cspin, True)

        adcout >>= 1
        return adcout

def buzzer(buzzertime):
        GPIO.output(BuzzerPin, GPIO.HIGH)
        time.sleep(buzzertime)
        GPIO.output(BuzzerPin, GPIO.LOW)
        time.sleep(0.5)

def main():
         init()
         time.sleep(2)
         print"will start detec water level\n"
         while True:
                  adc_value=readadc(photo_ch, SPICLK, SPIMOSI, SPIMISO, SPICS)
                  print(adc_value)
                  if adc_value == 0:
                           print"no water\n"
                           buzzer(3)
                  elif adc_value>=400 and adc_value<1000 :
                           print"water is good!\n"
                           if adc_value*0.2 > 100:
                                print"water level: 100%\n"
                           else:
                                print"water level:"+str("%.1f"%(adc_value*0.2))+"%\n"
                  elif adc_value>=300 and adc_value<400 :
                           print"water is so good!\n"
                           print"water level:"+str("%.1f"%(adc_value*0.2))+"%\n"
                  elif adc_value>=100 and adc_value<300 :
                           print"water is dangerous!\n"
                           print"water level:"+str("%.1f"%(adc_value*0.2))+"%\n"
                  elif adc_value>=1 and adc_value<100 :
                           print"it is fuck you"
                           print"water level:"+str("%.1f"%(adc_value*0.2))+"%\n"
                           buzzer(0.5)
                  elif adc_value>= 1000:
                      adc_value = adc_value/200
                      print"water is osyaka\n"
                      print"water level:"+str(adc_value)+"%\n"
                      buzzer(0.5)

                  time.sleep(1)

def destroy():
        GPIO.output(BuzzerPin, GPIO.LOW)
        GPIO.cleanup()

if __name__ == '__main__':
         try:
                  main()

         except KeyboardInterrupt:
                  destroy()
                  pass
GPIO.cleanup()

実はこれpython2系でしか動かないのでご注意を、といってもprint文を変えるだけでpython3系にも対応するとは思いますが..。僕だってpython3系を使いたいのだがモジュール制御のライブラリがpython2系でしか対応していない場合もあるため無難だという考えのも今回はpython2という選択。

ちょっと頑張った感を出すためにデバッグのあとも残しつつ..。まぁ拾い物のソースコードをうまくつなぎ合わせてオリジナルにしているだけですが。

実装ポイント

プログラムを組む方で興味がある人向けにソースコード解説です。(どれほど需要があるのか分かりませんが)

  1. def readadc関数…(モジュールの信号変換関数)
    • モジュールから受信した信号をプログラムで処理できる形に変換する。
  2. def buzzer関数…(ブザーを鳴らす関数)
    • GPIOを制御してブザーを鳴らすだけです。
  3. main関数内で水位センサーの信号からブザーを鳴らす鳴らさないの判定を行います。

動かしてみた

さぁ。実装の成果を見てもらいましょう。

こんな感じで水槽に取り付けていきます。
思ったけど。これ電気機器だから水槽に落ちたら死亡説..。魚も機器も..気をつけなければ。

画像
水槽に取り付け1
画像
水槽に取り付け2

そして取り付け完了。全体像はこちら!(意外と様になってない?いい感じじゃん)
水槽がかっこいいから、それっぽくおしゃれな写真が取れました。

画像
水槽に取り付け全体像

果たして無事に動くのか。

さて、動かしていきますよ。
実際に動かした動画は、以前Twitterに投稿した動画になります。

しっかり、水位が低下したらしっかりブザー鳴るようになっていますね。
これを止める方法は水槽に水を補充するしかありません。がんばれたたみ。一生働け

今回の苦労ポイント

僕のハード/電気回路の知識不足ですかねぇ。ハードの知識がもっとあればサクサクやりたいことはできたのに..。
結構実装に時間をかけてしまいました。

本当はもっと時間があれば、水位が低下したらLINEで通知する仕組みとかも可能なんですが、今回は実装できていません。納期ギリギリだったので..。
IoTを駆使したらいろいろできて楽しいですね。

最後に

なんとかたたみの要望通りに実装できましたね。たたみの【考えてみた】は以下

あわせて読みたい
【考えてみた】IoTはアクアリウムをお手軽趣味にできるのか?~水位の管理編~
【考えてみた】IoTはアクアリウムをお手軽趣味にできるのか?~水位の管理編~ たたみです。「IoT考えてみた」というカテゴリには入っていますが、私はプログラムがゴリゴリかけるわけではないので、私がこのカテゴリの記事を書くときは主にちゆり...

アイデアを形にする僕(ちゆり)カッコ良くない?

なにかやってほしいアイデア,疑問点等ありましたら気軽にコメントなりツイッターなりで連絡していただければ優しくお答えしますのでお待ちしていますね。

では,またおもしろいアイデアを考えてきます。ばいちゃ。

関連記事

コメント

コメントする

目次