名刺サイズの超小型PC「ラズパイ」で遊ぶ(第41回)
庭の水やりで身近なIoTを体験、自動水やりシステムの構築 ~LEDやLCDで水分量を表示~
前回は地中の水分を測定してコンソールに表示させてみました。しかしコンソール画面だけでは何となく物足りない気がします。そこで今回はそれまでのプログラムを元に、状態に応じてLEDを点灯させたり、LCD(液晶ディスプレイ)に情報を表示させる仕組みを作ります。
状態に応じてLEDを点滅
まずはブレッドボード上にLEDを取り付けて、Dryの場合は点灯、Wetなら点滅、VeryWetなら消灯としてみましょう。LEDをつなげるためには抵抗が必要ですが、抵抗値は以下の式で求められます。
抵抗値(Ω)=(電源電圧-順電圧値)÷電流値(A)
今回使ったのは手元にあった秋月電子通商で発売されている5mmピンク色LEDですが、このLEDは順電圧値が3.1V、電流値が20mAなので、今流しているラズパイの電圧は3.3Vですから、
(3.3-3.1)÷0.02=10(Ω)
となり、10Ω以上であれば大丈夫です。ただし10Ωだとさすがに明るすぎたので、100Ωの抵抗を取り付けました。
そして動かすプログラムは以下のようになります。gpiozeroでは、LEDのライブラリは「LED」になりますので、それをimportしておきます。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import subprocess
from gpiozero import MCP3002
from gpiozero import LED
Vref = 3.3 # 基準となるラズパイの電圧
led = LED(25) # LEDをGPIO 25(22番ピン)に接続
# 値の最大値と最小値
dry = 270
water = 119
interval = (dry - water) / 3
wet = water + interval
lbdry = dry - interval
try:
while True:
pot = MCP3002(channel=0)
hum = round(pot.value * Vref * 100,1)
if (hum < dry and hum > lbdry):
print("Dry")
led.on()
elif (hum > wet and hum < lbdry):
print("Wet")
led.on()
time.sleep(0.1)
led.off()
time.sleep(0.1)
elif (hum > water and hum < wet):
print("very Wet")
led.off()
time.sleep(0.2)
except: KeyboardInterrupt
subprocess.call('clear')
spiled.py
特にコンソールでの表示はいらないという場合であれば、上記のprint文を全て#でコメントアウトしてください。
ここまで来ると何となく測定器っぽいなと思えてきます。次回はこれを踏まえて、実際に水やりをする機構を作り上げていきます。
LCDに表示させる
ラズパイで使えるLCDはさまざまな種類がありますが、一番簡単なのはセンサーでも使っているSPI接続で使えるものと、I2Cで使えるものの2種類です。I2Cは2つの線でつなげて使えるので簡単です。そこでLCDはI2Cで使えるものの中から選択します。
そしてこれまたI2Cで使えるLCDはさまざまな種類があるのですが、ラズパイとの相性などを考えて「AQM0802A-RN-GBW」を使うことにしました。8W×2Lの表示ができる“AE-AQM0802”という名前で販売されているLCDは何種類かありますが、こちらはバックライト付きで、L2Cの通信を安定させるバスリピーター「PCA9515」が基板に搭載されているモデルです。ほかに16W×2Lという「1602」のLCDもありますが、今回は情報量が少ないので、8×2で十分です。
AQM0802を使うためのプログラムのポイントは、まず初期化のコマンドを送ってLCDを初期状態にして、それから表示させる必要があることです。AQM0802の初期化コマンドはデータシートから「0x38」「0x39」「0x14」「0x73」「0x56」「0x6c」「0x38」ですので、これを送る関数を設定しておきます。
これを踏まえたプログラムは以下のようになります。ここでは「wetmon.py」として保存します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import subprocess
import smbus
from gpiozero import MCP3002
from gpiozero import LED
Vref = 3.3 # 基準となるラズパイの電圧
led = LED(25) # LEDをGPIO 25(22番ピン)に接続
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)
time.sleep(0.1)
def writeLCD( message ):
mojilist=[]
for moji in message:
mojilist.append(ord(moji))
i2c.write_i2c_block_data(addr, def_data, mojilist)
#time.sleep(0.5)
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()
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(1)
except: KeyboardInterrupt
command(def_clear)
subprocess.call('clear')
wetmon.py
nanoなどで記述して保存したら、実行してみましょう。
$ python wetmon.py
AQM0802とコンソール画面に「Dry」などと表示されればOKです。次回は実際の水やりシステムを構築していきます。
Copyright © ITmedia, Inc. All Rights Reserved.
名刺サイズの超小型PC「ラズパイ」で遊ぶ
今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。
この記事の著者
関連記事
こんなメディアも見られています
ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。
SpecialPR
本日の新着記事
アクセスランキング
-
1
メルカリ、梨の転売疑惑に「盗品の出品は確認されず」 誹謗中傷には利用制限も
-
2
Anthropic、「Claude Opus 5」公開 Fable 5に迫る性能を半額で――サイバー安全策は緩和、拒否時は自動フォールバックも
-
3
「iPhone高騰」はこれからも続く? 中国CXMTに近づくApple、メモリ競合へのけん制が不発に終わりそうなワケ【後編】
-
4
「ニューロマンサー」実写ドラマ、Apple TV+で2027年1月配信開始へ
-
5
「こんなのに追われたら……」急斜面もやすやす爆走、中国製の車輪付き四足ロボのデモ動画が話題 最高時速20km超
-
6
海外の新作バカゲー「電車アタック」にマンガ家が感心した理由 ブッ飛んだ内容と完成度の高さ、そして“日本”
-
7
検索結果に「詐欺ではありません」と表示させる詐欺手口、警視庁が注意喚起 AI要約も餌食に
-
8
「めっちゃカメレオン」公式Discord乗っ取り 担当者PCがマルウェア感染、管理者が全員BANに 現在は復旧
-
9
暑さ対策が熱い! 「猛暑対策展」で感じた、転んでもただでは起き上がらない日本人のエネルギー
-
10
スーパーに並んだ「ごちゃごちゃ生成AIポップ」が物議 “看板王”こと、きぬた歯科院長「これはアリ」
ITmedia NEWS SNS
インフォメーション
注目情報をチェック
ITmediaNEWSをフォロー
あなたにおすすめの記事PR