にかいどーIoTびぼうろく H30.7.22

#人生初プログラミング
まずは目標を確認しよう。目標を見失い彷徨うことほど怖いことはない。
現在の課題はRaspberryPiでAC電圧のポンプの電源をタイマー制御することだ。
そしてその制御はPythonで行う。
つまりPythonで制御プログラムを作成しなければならない。
人生初のプログラミングである。
課題達成のために必要なことは3つ

1.ポンプを動かす時間を入力できるようにすること
2.変な時間入れたりしたりポンプ稼働が終わったあとに最初に戻ること
3.RaspberryPiでAC制御のためにGPIOを制御すること

この3つを念頭においてコードを作成せねばならない。

#初Python
人生初のプログラムはPythonによる以下のコードであった。

```Python:firstpython.py
print ("hatsupython!")
```

実際には""の中身は違うがそこは許してほしい。
公序良俗に触れる可能性がある。
いやそこまではいかないが念のためだ。
今後も""の中身や関数名は違う。
実際には男子小学生的な名前がたくさんついている。

これだけであっても実は大変苦労した。
理由は参考にした入門サイトが古く、Python2時代の記法だったからである。

```Python2:firstpython_error.py
print "hatsupython!"
```

このように()なしで記述してしまい、エラーで動かなかった。
なぜなんだとそのままtwitterに投稿したら記述方式が古いことを教えてもらい、
フォロワー無双であることを再認識させて頂いた。
もしも今後IoTをしようと思い、Pythonを学ぶ方がおられたら参考にしてもらいたい。
()なしはPython2時代のもの、()付きはPython3時代のもの、
今後のバージョンアップ次第でまた変わる可能性もある。

#Pythonへポンプ稼働時間を入力
最初のプログラムもできたし、課題達成に向けてコードを創っていこう。
まずはポンプ稼働時間の入力である。
タイマーとして機能させる場合、任意の時間をPythonへ入力する必要がある。
そのためにinput関数を使えばいいという。
次に作ったコードがこれである。

```Python:pumptimeinput.py
#coding: utf-8

print("4桁の正の整数を入れてください")
pump = input() #ここにポンプ稼働時間を入れてもらう
pump = int(pump) #文字の型から数字の型へ変換
minute = pump // 100 #前2桁を分にだす
second = pump % 100 #後2桁を秒にする

print(str(minute) + "分" + str(second) + "秒") #時間の確認
```

これで人間が望む時間をコードに教え込むことができるようになった。
しかしここで"型"というのが出てきて混乱した。
調べたり教えてもらったりしたところ、まだ私もしっかりとは理解していないが、
CPUはバカなので文字として区別と整数としての区別と小数としての区別ができなくてエラーが起きる。
だから人間が教える必要があるということのようだ。
str()は整数から文字に型変換するための関数である。
いったん数字に型変換してるのでstrを使わないと型の違いから文字と併用できないから入れている。
またこのままだと小数点をポンプ時間として入力されるとめんどくさいことになるので、
実際にはこのように変更した。

```Python:pumptimeinput_kai.py
#coding: utf-8

print("4桁の正の整数を入れてください")
pump = int(float(input())) #ここにポンプ稼働時間を入れてもらうが、float()でいったん小数に型変換し、さらにint()で整数に型変換する
minute = pump // 100 #前2桁を分にする
second = pump % 100 #後2桁を秒にする
print(str(minute) + "分" + str(second) + "秒") #時間の確認
pumptime = minute * 60 + second #時間をあとで使いやすく秒に変換しておく
```

そしてこれでint()を行う前にfloat()を行うことで小数点入れられても大丈夫になったが、まだ1～4桁の整数以外の数字、
つまり0以下の負の数字や、10000以上の数字を入れられると困るので次は条件次第で同じ動作を繰り返すようにせねばならない。

#繰り返し動作
次は変な数字入れらりたり、最後までポンプが動いたあとに最初に戻って何度も繰り返すようにコードを作成することだ。
条件によって場合分けする場合、ifかwhileを使うようだ。
そのうち何度も繰り返す場合はwhileを使う。
また複数条件を使う場合、andは両方条件が必要な場合に使い、orはどちらか片方でも条件を満たす場合に使う。
今回は0以下か10000以上のどちらかが成立すればいいのでorを使うことにする。
Pythonにおける条件文は”インデント”によりどこの部分を読み込んだりループさせるかが変わると多くの入門サイトに書いてあるが、
”インデント”は初心者には大変わかりにくいので素直に字下げとか段落とか書いて欲しくある。
業界の人にはわかるのであろうが、こういうので新規脱落に繋がっているのではないかと考えることが多々あるので、
というか私が脱落しそうになるので、できるかぎり”インデント”は今後”字下げ”と書くなど、できるだけカタカナ語を減らし日本語に変換していきたい。
そして以下がコードである。

```Python:whileinput.py
#coding: utf-8 

pump = 0 #最初にwhile内に入るためのポンプの時間の初期値

while pump <= 0 or pump >= 10000: #0以下か5桁以上だとループするようにする
    print("4桁の正の整数を入れてください")
    pump = int(float(input())) #ポンプ稼働時間入力

print("0～4桁の正の整数です")
```

これで相当変な入力をされない限り何度も読み込みされるようになった。
また全部終わったあとプログラムの最初に戻ってほしいので全体をループさせるようにするために全体をwhileで囲うことにする。
whileの中にwhileが入るが、どこを読み込むかは字下げで決まり、
最初のwhileはすべて繰り返し動作させ、2番目のwhileは入力のところだけを繰り返し動作させる。

```Python:whileinput_kai.py
#coding: utf-8 

programloop = 0 #無限ループさせるための初期値
while programloop == 0: #無限ループ
    pump = 0 #最初にwhile内に入るためのポンプの時間の初期値
    
    while pump <= 0 or pump >= 10000: #0以下か5桁以上だとループするようにする
        print("4桁の正の整数を入れてください")
        pump = int(float(input())) #ポンプ稼働時間入力
    
    minute = pump // 100 #前半2桁を”分”で出す
    second = pump % 100 #後半2桁を”秒”で出す
    print(str(minute) + "分" + str(second) + "秒") #時間の確認の表示
    pumptime = minute * 60 + second #時間をあとで使いやすく秒に変換しておく
```

だいぶ目標に近づいてきた。
次はポンプ稼働を仮定した場合のコードだ。

#プログラムを一時止める
入力された時間に応じてポンプを稼働させるには、

1.まず時間を入力させ
2.ポンプ稼働の命令をだし
3.入力された時間だけ一時的にプログラムを待機させ
4.入力時間経過後待機終了しポンプ終了の命令をだす

この流れでいけるはずだ。
なので次は3の一時的に待機させるコードを作成する必要がある。
一時待機させるのはsleep関数というものを使えば良いようだ。

```Python:sleep.py
#coding: utf-8
from time import sleep

print("ポンプ開始")
sleep(3) #3秒だけ待機させる
print("ポンプ終了")
```

sleepの()内は秒単位である。数字でなく変数を入れるときは気を付けねばならない。
またimportというのはどうやら他人が作成したコードを使わせてもらうときに記述するらしい。
どういうふうに作成したかはわからないが、とりあえず完成品なので使わせてもらおう。
こういうことができるのが最近のコンピューター言語のすごいところだという。
今回はfromを使っているので、timeという完成品の中から、sleepだけ使わせてもらうと宣言した。
これと今までのコードをつなぎ合わせると、

```Python:sleep.py
#coding: utf-8
from time import sleep

programloop = 0 #無限ループさせるための初期値
while programloop == 0: #無限ループ
    pump = 0 #最初にwhile内に入るためのポンプの時間の初期値
    
    while pump <= 0 or pump >= 10000: #0以下か5桁以上だとループするようにする
        print("4桁の正の整数を入れてください")
        pump = int(float(input())) #ポンプ稼働時間入力
    
    minute = pump // 100 #前半2桁を”分”で出す
    second = pump % 100 #後半2桁を”秒”で出す
    print(str(minute) + "分" + str(second) + "秒") #時間の確認の表示
    pumptime = minute * 60 + second #時間をあとで使いやすく秒に変換しておく

    print("ポンプ開始") #この下にGPIO制御でポンプ稼働のコードを入れる

    print("合計" + str(pumptime) + "秒待機")
    sleep(pumptime) #入力された時間待機
    
    print("ポンプ終了") #この下にGPIO制御でポンプ終了のコードを入れる
```

ずいぶんと目標に近づいてきた。

#満月が光を放つか否かを知るための装置を彼は作り出した

WindowsのVisual Studio Codeでできるところはここまでであろう。
GPIOの制御コードなど、あとはRaspberryPi側で行う。