ITmedia NEWS > STUDIO >

庭の水やりで身近なIoTを体験、自動水やりシステムの構築 〜給水ポンプの取付〜名刺サイズの超小型PC「ラズパイ」で遊ぶ(第42回)(2/2 ページ)

» 2021年06月26日 07時00分 公開
[岩泉茂ITmedia]
前のページへ 1|2       

 ではまず、ラズパイからポンプをコントロールできるか、テストプログラムで試します。以下のようにnanoなどで記述してください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gpiozero import Motor
from time import sleep
motor = Motor(forward=4, backward=14)
while True:
    print("forward")
    motor.forward()
    sleep(2)
    print("stop")
    motor.stop()
    sleep(2)
pumptest.py

 これを「pumptest.py」などの名前で保存したら実行してみましょう。

$ python pumptest.py

 ポンプが回る音が聞こえたでしょうか。2秒間隔で回ったり止まったりします。テストが成功したら、最後のプログラムを組み上げることにしましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import subprocess
import smbus
from gpiozero import MCP3002
from gpiozero import LED
from gpiozero import Motor
Vref = 3.3 # 基準となるラズパイの電圧
led = LED(25) # LEDをGPIO 25(22番ピン)に接続
motor = Motor(forward=18, backward=23) # モーターをつないだGPIO
i2c = smbus.SMBus(1)
addr = 0x3e # AQM0802のアドレス
# AQM0802の初期化
def_command = 0x00
def_data = 0x40
def_clear = 0x01
display_On = 0x0f
LCD_2ndline = 0x40 + 0x80
# 値の最大値と最小値
dry = 270
water = 119
interval = (dry - water) / 3
wet = water + interval
lbdry = dry - interval
# AQM0802の関数
def command( code ):
        i2c.write_byte_data(addr, def_command, code)
def writeLCD( message ):
        mojilist=[]
        for moji in message:
            mojilist.append(ord(moji)) 
        i2c.write_i2c_block_data(addr, def_data, mojilist)
 
def init_lcd ():
        command(0x38)
        command(0x39)
        command(0x14)
        command(0x73)
        command(0x56)
        command(0x6c)
        command(0x38)
        command(def_clear)
        command(display_On)
init_lcd()
writeLCD("Joutai:")
try:
    while True:
        pot = MCP3002(channel=0)
        hum = round(pot.value * Vref * 100,1)
        if (hum < dry and hum > lbdry):
            command(LCD_2ndline)
            print("Dry")
            writeLCD("Dry     ")
            led.on()
            motor.forward()
            time.sleep(5)
            motor.stop()
            time.sleep(5)
        elif (hum > wet and hum < lbdry):
            command(LCD_2ndline)
            print("Wet")
            writeLCD("Wet     ")
            led.on()
            time.sleep(0.5)
            led.off()
            time.sleep(0.5)
        elif (hum > water and hum < wet):
            command(LCD_2ndline)
            print("very Wet")
            writeLCD("very Wet")
            led.off()
        time.sleep(10)
except: KeyboardInterrupt
command(def_clear)
subprocess.call('clear')
clematispump.py

 プログラムは「clematispump.py」のような名前を付けて保存します。これで乾いていると水を差し、十分に湿ったら給水を止めるシステムが出来上がりました。水については30行目の「time.sleep(5)」で調整します。今は5秒間水を流すような設定です。これはそれぞれの環境で変えてください。ちなみにこの1サイクルは10秒間隔で動かしています。これもそれぞれの環境に応じて変えてください。

 なお余談ですが、ポンプのテスト時には動作音がしたものの、実際に給水しようとホースを取り付けてもくみ取ってくれません。粗悪品を手に入れたのかと思いましたが調べてみると、水通しが必要な模様。ポンプごとバケツに入れて動作させたらしっかりと吸水しました。新しいポンプをポチる前に、こういったことがないか気をつけましょう。

Raspberrry Pi 完成したシステム
Raspberrry Pi 実際に作ってみた様子。エアコンのホース穴にコードを通して、家の中でラズパイを置き、観測する仕組みだ

 最初はなんとか給水を自動化できないかと考えてスタートしたシステムですが、意外と時間がかかりました。このほかにもラズパイを使って作ることができるIoTシステムはあるかと思います。何かまた見つけたら、ここで紹介しようと思います。

前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.