プログラム
使用言語
使用言語としてはMycro pythonを使用しております。こちらはマクロコンピュータ上での動作に最適化された、Python3と互換性が高い言語処理系になります。(wiki引用)]
動作プログラム
本回路で導入したプログラムになります。if文が多様されていて綺麗ではないですが、動作自体は致しました。本プログラムは下記に示す4つの項目で構成されております。
- import文
- pinの定義
- 初期値の設定
- メインループ
# 1.import文
import machine
import utime
# 2.pinの定義
onsw = machine.Pin(6, machine.Pin.IN, machine.Pin.PULL_UP)
senser = machine.Pin(9, machine.Pin.IN, machine.Pin.PULL_UP)
led = machine.Pin(25, machine.Pin.OUT)
Relay = machine.Pin(22, machine.Pin.OUT)
# 3.初期値の設定
#swの初期値を0にする。
swflg = 0
#swのカウンター
swcnt = 0
#ラッチ1
swflg_lat = 0
#センサーの初期値を0にする。
sensflg = 0
#センサーのカウンター
senscnt0 = 0
senscnt1 = 0
#タイムカウンター
timecnt = 0
#ラッチ2
sensflg_lat = 0
# 4.メインループ
while True:
sensflg = senser.value()
swflg = onsw.value()
if swflg == 0 :
swcnt = swcnt + 1
if swcnt == 10 or swflg_lat == 1:
led.value(1)
swflg_lat = 1
#水が足らない時
if sensflg == 1 :
senscnt1 = senscnt1 + 1
#水が満杯になった時
elif sensflg == 0 :
senscnt0 = senscnt0 + 1
timecnt = 0
if senscnt0 == 10 :
Relay.value(0)
sensflg_lat = 0
senscnt0 = 0
#水が足らない時リレーをONにしてポンプを駆動する。
if senscnt1 == 10 or sensflg_lat == 1:
Relay.value(1)
sensflg_lat = 1
senscnt1 = 0
timecnt = timecnt + 1
if timecnt == 1200 :
Relay.value(0)
led.value(0)
sensflg_lat = 0
swflg_lat = 0 #強制OFF
timecnt = 0
#ボタンがOnの時の動作
if swflg == 0 :
swcnt = swcnt + 1
if swcnt == 20 :
led.value(0)
swflg_lat = 0
Relay.value(0)
senscnt1 = 0
senscnt0 = 0
if swflg == 1 :
swcnt = 0
utime.sleep(0.1)
1. import文
Python等のプログラム言語では、標準ライブラリといったものがあり、その項目を宣言する事でライブラリから取り出した関数を使う事が出来ます。
このプログラムでは下記の示す通り、ラズベリーパイピコのpinの定義を行うmachineライブラリと時間関数の定義を行うutimeライブラリを使用しています。
マイコンを使用した電子工作を行う時は時間の関数や、pinの定義はよく行うのでおまじないみたいなものとして考えて頂けたらと思います。
# 1.import文
import machine
import utime
2. pinの定義
ラズベリーパイピコはマイコンのようなものなので、pinの入出力の定義をする必要があります。
ここでは詳細を省くが、マイコンを動作させるには使用するpinを入力にするのか出力にするのか定義する必要があるので下記プログラムを用いてpinの入出力の定義を行いました。
# 2.pinの定義
onsw = machine.Pin(6, machine.Pin.IN, machine.Pin.PULL_UP)
senser = machine.Pin(9, machine.Pin.IN, machine.Pin.PULL_UP)
led = machine.Pin(25, machine.Pin.OUT)
Relay = machine.Pin(22, machine.Pin.OUT)
センサー回路とSW読み込み回路で用いた6pinと9pinは入力設定に、リレーを駆動する為の22pinは出力設定にしました。後ラズベリーパイピコに標準で載っているLEDの部分も出力設定にして、回路が動いている時はこの緑色のLEDが光るように致しました。
3. 初期値の設定
メインループで使用する変数の初期値を定義しております。
# 3.初期値の設定
#swの初期値を0にする。
swflg = 0
#swのカウンター
swcnt = 0
#ラッチ1
swflg_lat = 0
#センサーの初期値を0にする。
sensflg = 0
#センサーのカウンター
senscnt0 = 0
senscnt1 = 0
#タイムカウンター
timecnt = 0
#ラッチ2
sensflg_lat = 0
基本的にはセンサーやSWがONになった時のフラグや、その時に使用していたカウンター、状態保持のラッチの初期値を設定しております。
4. メインループ
最後にメインループになります。
senser.value()とonsw.value()でセンサーとSWの値を読み込んでそれを元に動作を行っております。動作は下記の通りになります。
- センサーとSWの値を読み込む
- SWを長押ししたらアイドル状態(センサーの値を読み込める状態)になる。この時ラズベリーパイピコ上の緑色のLED(25pin)がONになる。
- 水が無くなってセンサーがOFFになったら、リレーをONにしてポンプを駆動する。
- 水が溜まってセンサーがONになったらリレーの駆動をOFFしてポンプを駆動する。
- 1~4をラズベリーパイピコのLED(25pin)が光っている間行い続ける。
# 4.メインループ
while True:
sensflg = senser.value()
swflg = onsw.value()
if swflg == 0 :
swcnt = swcnt + 1
if swcnt == 10 or swflg_lat == 1:
led.value(1)
swflg_lat = 1
#水が足らない時
if sensflg == 1 :
senscnt1 = senscnt1 + 1
#水が満杯になった時
elif sensflg == 0 :
senscnt0 = senscnt0 + 1
timecnt = 0
if senscnt0 == 10 :
Relay.value(0)
sensflg_lat = 0
senscnt0 = 0
#水が足らない時リレーをONにしてポンプを駆動する。
if senscnt1 == 10 or sensflg_lat == 1:
Relay.value(1)
sensflg_lat = 1
senscnt1 = 0
timecnt = timecnt + 1
if timecnt == 1200 :
Relay.value(0)
led.value(0)
sensflg_lat = 0
swflg_lat = 0 #強制OFF
timecnt = 0
#ボタンがOnの時の動作
if swflg == 0 :
swcnt = swcnt + 1
if swcnt == 20 :
led.value(0)
swflg_lat = 0
Relay.value(0)
senscnt1 = 0
senscnt0 = 0
if swflg == 1 :
swcnt = 0
utime.sleep(0.1)
このプログラムを動作させる事で、水槽の水が減ったら、ポンプを駆動する回路が出来ました。
結果
最終的には下記の写真の通りで作る事が出来ました。(あまり出来栄えはよろしくないのですが、問題なく動作しております。)
もし何かしら改善点が見つかりましたら、修正していきながらより使いやすいように調整していきたいです。
コメント