Vol.747 8.Jun.2018

ジャンプスターター PHP(4)〜SQLと正規表現 ラズパイ(11)〜WebでLED点灯制御

J ジャンプスターター

by fjk

車のバッテリーが上がってエンジンを起動できないことがありませんか?
 他の車を近づけ、ブースターケーブルをつないで、起動させる方法が一般的ですが、近くにお願いできる車がいない場合は大変です(JAFにお願いしても直ぐには来ません)。
 そこで、便利なのが「ジャンプスターター」と呼ばれる、大電流出力が可能な充電式バッテリーです。普通車の2.5Lで300A、3Lで500A程度あればエンジン始動できるといわれているので、Beatit(容量:10800mA、最大出量:500A、\4,399)を購入した。Beatitは小型で、3Lガソリン車、2,5Lディーゼル車、オートバイ、ボートなど、さらに急速充電規格のQC3.0にも対応している。充電はUSBで行い、出力にUSB-A,-C端子(2A)もあり、LEDライト付モバイルバッテリーとしても使うことが出来る。いざという時のため、ジャンプスターターは車に常備しておくべき一品です。
ジャンプスターター
(要充電50%以上)
裏は黒色のツートーンカラー
(ケーブルは車印の所に差込)
車のバッテリーに接続


P PHPプログラミング(4) 〜SQLと正規表現〜

by fjk

PHP(XAMPP)はデータベースを以下の様にMySQLを使って簡単に扱うことができる。

@データーベースを作成
・XAMPPのコントロールパネルを開き、MySQLのAdminボタンを押す。
・phpMyAdmin画面で「データーベース」をクリック
・「データベースを作成する」にデーターベース名を入力し「作成」ボタンを押す。
・新規データーベースが登録された旨のメッセージが出る。
・コマンドで操作するため、「SQL」タブをクリック
Aテーブルの作成
・phpMyAdminでは画面上で対話型でも操作できるが、ここではコマンドでテーブルを作成する。
 CREATE TABLE:新規にテーブルを作成
CREATE TABLE food{ # foodは「テーブル名」
no INT, # 識別番号
kind VARCHAR(20), # 種別
name VARCHAR(80) # 品名
};
 DROP TABLE:テーブルの削除(簡単に削除できるので注意!)
DROP TABLE テーブル名;
Bデータの作成・操作(抜粋)
 INSERT:データの登録
INSERT INTO テーブル名(カラム名1,・・) VALUES(値1,・・);
 SELECT:データを表示
SELECT 表示カラム FROM テーブル名; # さらに WHERE name='対象データ'
 UPDATE:データを更新
UPDATE テーブル名 SET カラム名=値; # さらに WHERE name='変更データ'
 DELETE:データを削除
DELETE FROM テーブル名; # さらに WHERE name='削除データ'
Cデーターベースからの検索(抜粋)
 検索条件をWHEREで指定する(WHEREを指定しないとデータ全てが対象となる)。
SELECT * FROM food WHERE no=4;
 曖昧検索
SELECT * FROM food WHERE name LIKE '%リ%'; ・・・Like式を別途参照のこと
 並べ替え
SELECT * FROM food ORDER BY name;
 範囲を指定する
SELECT * FROM food WHERE no BETWEEN 2 AND 5;

phpMyAdmin画面 デーブル作製画面 登録データ例
SQLコマンド入力画面 phpMyAdminでデータ入力 入力したデータ例

※正規表現の表現法(抜粋)
.(ピリオド) 不明な1文字 ^(ハット) 先頭の文字列
*(アスタリスク) 不明な文字列(無くても)$(ドル) 行末の文字列
[0-9a-z] 範囲の1文字 +(プラス) 文字の繰り返し
[^a-c] 範囲外の1文字 |(パイプ) いずれかの文字列
?(クエスチョン) 文字が無いか1文字ある {n} n個以上の文字

 などの組み合わせ、例えば、(^abc*|*123$) は先頭が'abc'で始まるか、行末が'123'で終わる文字列
 正規表現に用いる特殊文字を指定するときはバックスラッシュ(\)でエスケープする。

※コマンドラインのほか、phpMyAdminでブラウザからもMySqlを操作することができる。



R ラズベリーパイ(11) 〜WebでLED点灯制御〜

by fjk

ラズパイでGPIOを制御できることが判ったが、web画面上からGPIOの制御を行いたい。Pythonでwebフレームワークを使うにはdjangoやFlaskなど様々なツールがあるが、本悪的な用途には適さないがコンパクトなbottleを使う。(https://code-examples.net/ja/docs/bottle~0.12/indexなど参照)

【bottleの主な機能】 (bottleは書籍「いちばんやさしいPythonの教本」を参考にした)
・ルーティング:「ユーザーから要求されたURL」と「処理するプログラム」の紐付け
・テンプレート:WEBページに動的にHTMLに値を変更して書き換える
・ユーティリティ:リクエストやレスポンスから情報を取得
・開発サーバ:開発用のWEBサーバー
@bottleを使うための準備(bottleのインストール)
   $ sudo apt-get install python-bottle
  ・・・ モジュール確認は $ python -c "help('modules')"
Abottleの動作確認
 /var/www/htmlフォルダーにhello.pyを作成、実行。
   $ python /var/www/html/hello.py
 Webブラウザでlocalhostにアクセス
   localhost:8080/hello
「Hello world」と表示されればOK。localhostの代わりにホストIPアドレスを使えば外部からアクセスが可能。
B3つのLEDを順次点灯(ハードの追加)
Cweb画面から制御
web_controle.pyプログラムを作成後、実行
   $ python /var/www/html/web_controle.py
Webブラウザでサーバーに”http://192.168.1.40:8080 ”(hostで指定したアドレス:8080)でアクセス
・hostとして'0.0.0.0'を指定すると"localhost:8080"でアクセス出来る。
・enumerateはfor文でインデックス付き要素を得るのに便利。

モジュールリストの中にbottle <hello.py> web画面例
WEB制御画面 3LED点灯実行例 応答webページの
HTMLファイルのソース例

    web_controle.py
    
    from bottle import route, run
    import RPi.GPIO as GPIO
    
    host = '192.168.1.40'     # localは0.0.0.0
    
    GPIO.setmode(GPIO.BCM)
    led_pins = [17, 27, 22]
    led_states = [0, 0, 0]
    switch_pin = 23
    
    GPIO.setup(led_pins[0], GPIO.OUT)
    GPIO.setup(led_pins[1], GPIO.OUT)
    GPIO.setup(led_pins[2], GPIO.OUT)
    GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def switch_status():
        state = GPIO.input(switch_pin)
        if state:
            return 'Up'
        else:
            return 'Down'
    
    def html_for_led(led):                        # ボタンが押されれたら・・
        l = str(led)
        result = " <input type='button' onClick='changed(" + l + ")' value='LED " + l + "'/>"
        return result
    
    def update_leds():                           # LEDへ出力する関数
        for i, value in enumerate(led_states):
            GPIO.output(led_pins[i], value)
    
    @route('/')
    @route('/<led>')                            # webから送られてくるLED番号により処理
    def index(led="n"):
        print(led)
        if led != "n":
            led_num = int(led)
            led_states[led_num] = not led_states[led_num]
            update_leds()
        response = "<script>"
        response += "function changed(led)"
        response += "{"
        response += "  window.location.href='/' + led"   # 押されたLED番号を付けてルートを指定
        response += "}"
        response += "</script>"
        
        response += '<h1>GPIO Control</h1>'
        response += '<h2>Button=' + switch_status() + '</h2>'
        response += '<h2>LEDs</h2>'
        response += html_for_led(0) 
        response += html_for_led(1) 
        response += html_for_led(2) 
        return response
    
    try:
        run(host=host, port=8080)
    finally:
        GPIO.cleanup()
    

ジャンプスターター PHP(4)〜SQLと正規表現 ラズパイ(11)〜WebでLED点灯制御