名刺サイズの超小型PC「ラズパイ」で遊ぶ(第42回)

庭の水やりで身近なIoTを体験、自動水やりシステムの構築 ~給水ポンプの取付~(2/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システムはあるかと思います。何かまた見つけたら、ここで紹介しようと思います。

印刷する
SNSでシェア
SpecialPR

名刺サイズの超小型PC「ラズパイ」で遊ぶ

今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。

この連載の記事をもっと見る

この記事の著者

関連記事

こんなメディアも見られています

ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。

メールマガジンを配信中
メールマガジンを配信中

国内外の業界動向、AIやクラウドなどの最新技術、キャリア情報など今知りたい情報をまとめてお届けします。

いますぐご登録

本日の新着記事

アクセスランキング

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

ITmedia NEWS SNS

X @itmedia_newsをフォロー

インフォメーション

ITmediaNEWSをフォロー

あなたにおすすめの記事PR