ボタンを追加(03)

今回はボタンを追加しました。こんな感じになります。

2つのボタン。”Port” ボタンは、LEDのオンオフ用。”Clear” ボタンは GPIO PortのClear用です。今回もPython,HTML,CSSファイルの構成になっています。

先ずはCSS ファイル。ファイル名は、”http_server_03.css”です。

http_server_03.css

@charset "UTF-8";

.t_font {
        font-size: 40px;
        font-weight:bold;
        font-style: italic;
        color: #0ff;
}

.b_frame {
        width: 400px;
        background: #363636;
        padding: 15px;
        border-radius: 10px;
        margin-top: -30px;
        margin-right: 10px;
}

button {
        display: block;
        margin: 10px;
        line-height: 50px;
        cursor: pointer;
        color: #fff;
        background: #228b22;
        border-radius: 10px;
        font-size: 24px;
	    width:120px;
}

前回から、”button”の追加と、フォントの大きさ色を変更しています。

続いて、HTMLファイル。ファイル名は、”index_03.html”です。

index_03.html

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <link rel="stylesheet" type="text/css" href="./http_server_03.css" >
        <title>http-server 1.0</title>
    </head>
    <body>
        <center>
        <div class="b_frame">
   	    <div class="t_font"><u>HTTP-Server 1.0</u></div><br>
		    <form method='get'>
    	        <button type='submit' name='1' value='0' >Port</button>
    	        <button type='submit' name='2' value='0' >Clear</button>
            </form>
        </div>
        </center>
    </body>
</html>

追加されたボタンは、14,15行目です。

最後にPythonファイル。ファイル名は、”hello_03.py”。これはちょっと長いです。

hello_03.py

from http.server import HTTPServer, SimpleHTTPRequestHandler
from urllib.parse import urlparse,parse_qs
import RPi.GPIO as GPIO

led_stat = 0

GPIO.setmode(GPIO.BCM)      
GPIO.setup(17, GPIO.OUT)   
GPIO.output(17,0)        

class MyHandler(SimpleHTTPRequestHandler):

    def do_GET(self):
        global led_stat

        fl = 1
        if self.chk_file() == 0:
            parsed = urlparse(self.path)
            params = parse_qs(parsed.query)
            a=next(iter(params))

        #-----  LED ON/OFF  --------------
            if a == "1":
                if led_stat == 0:
                    GPIO.output(17,1)
                    print("LED_On\n")
                    led_stat = 1
                else:
                    GPIO.output(17,0)
                    print("LED_Off\n")
                    led_stat = 0

        #-----  Port Clear  --------------
            elif a == "2":
                GPIO.cleanup()  
                print("IO_Clear\n")

        else :
            fl = 0

        if fl == 1:
            f = open("index_03.html",'rb')
            self.send_response(200)
            self.send_header('Content-type', "text/html")
            self.end_headers()
            self.wfile.write(f.read())
            f.close()

    #-------------------------------------------------
    def chk_file(self):
        a = 0
        if self.path == "/":
            self.path = "/index_03.html"
            dataType = "text/html"
            a = 1
        if self.path.endswith(".css"):
            dataType = "text/css"
            a = 1

        if a == 1:
            self.path = "." + self.path
            f = open(self.path,'rb')
            self.send_response(200)
            self.send_header('Content-type', dataType)
            self.end_headers()
            self.wfile.write(f.read())
            f.close()
        return a

#---------------------------------------------------------

host = ''
port = 8080
httpd = HTTPServer((host, port), MyHandler)
print('serving at port', port)
httpd.serve_forever()

と言ってもこれくらいの長さですが。プログラムの流れを説明します。

  • 2行目: from urllib.parse import urlparse,parse_qs
    • urlparse,parse_qs この2つはクエリの処理に使います。
  • 3行目: GPIO用 インポート。
  • 5行目: LEDの状態を表す変数。外部変数で宣言しています。
  • 7,8,9行: LEDの初期設定。GPIO17のポートを使用しています。GPIOの説明ページと同じ回路を用いてLEDを
         オン/オフしています。
  • 17行目: クライアントからの要求がファイルなのかdef chk_file(self):でチェックします。
  • 18,19,20行: この3行で、クライアントから送られて来たクエリを処理しています。
    • 今回のクエリは /?1=0 となります。
    • 18行: parsed.query= “1=0”
    • 19行: paramsはdictionaryで {‘1’: [‘0’]} となり
    • 20行: ここで ’1’ が取り出されます。
    • この辺の詳細は、”urlparse – URL を部分文字列に分割する” を参照下さい。
  • 23行目: LEDオンオフ用のボタンが押された事を判断。
  • 34行目: GPIOポートクリア用のボタンが押された事を判断。
  • 39行目: クライアントからのリクエストがファイルの場合 fl=0
  • 42から47行: indexファイルを送る処理。
  • 50から68行: クライアントからのファイル要求に対応。

いつも通りに全て同じフォルダーに入れてターミナルから、python3 hello_03.py を実行して下さい。

ブラウザに、”raspberrypi.local:8080″と入力。HPの画面でPortボタンを押せばLEDがオンオフします。

次回は、java scriptについて説明します。