40Pin T型GPIO拡張ボードを購入しました。
フラットケーブルでラスベリーパイと接続します。今まではラズベリーパイのピンとボードをジャンパーワイヤーで接続していましいた。
ちょっと動かすとジャンパーワイヤーが外れてしまいます。結線の多い回路ではどこが外れた?で結構無駄な時間を使います。
これならその心配はなさそうです。
最初はお約束のLチカ(LEDをチカチカと点滅させるHello worldのようなプログラム)です。
tkinterを使ったGUIプログラムです。
ボタン操作で消灯、点灯、点滅ができます。それではソースです。
# -*- coding: utf-8 -*-
import sys
import tkinter as tk
import wiringpi as wp
stateOnOff = 0
modeOnOff = 0
root = None
retBlink = None
#ボタンをクリックしたときのイベントハンドラー
def turnOff():
global modeOnOff, retBlink
wp.digitalWrite(7,0)
modeOnOff = 0
root.after_cancel(retBlink)
def turnOn():
global modeOnOff, retBlink
wp.digitalWrite(7,1)
modeOnOff = 1
root.after_cancel(retBlink)
def blink():
global stateOnOff, root, modeOnOff, retBlink
modeOnOff = 3
if stateOnOff == 0:
stateOnOff = 1
else:
stateOnOff = 0
wp.digitalWrite(7,stateOnOff)
retBlink = root.after(500, blink)
def main():
global root
root = tk.Tk()
root.title("LED control")
root.geometry("250x40")
wp.wiringPiSetup()
wp.pinMode(7,1)
wp.digitalWrite(7,0)
btnOff = tk.Button(
root,
text='消灯',
command=turnOff)
btnOff.grid(row=0, column=0,padx=5, pady=5)
btnOn = tk.Button(
root,
text='点灯',
bg='red',
command=turnOn)
btnOn.grid(row=0, column=1, padx=5, pady=5)
btnBlink = tk.Button(
root,
text='点滅',
bg='pink',
command=blink)
btnBlink.grid(row=0, column=2, padx=5, pady=5)
root.mainloop()
if __name__ == "__main__":
main()
点灯・消灯の処理ならHello worldなみに簡単です。そこに点滅が加わるとずーーーと難しくなります。
tkinterにはAfterというタイマー機能があります。このタイマーはワンショットです。タイマー処理でまたタイマー
のセットします。タイマーのセットと中止はrootにあるのでmain以外で使えるようにグローバル変数
にしました。
消灯のボタンはbtnOff、イベントハンドラーはdef turnOff():
点灯のボタンはbtnOn、イベントハンドラーはdef turnOn():
点滅のボタンはbtnBlink、イベントハンドラーはdef blink():
blinkで
retBlink = root.after(500, blink)
retBlinkはafterの戻り値を控えています。 そしてkの値を使って btnOfftとbtnOnでr root.after_cancel(retBlink)
タイマーをキャンセルしています。 これをやらないと点灯・消灯はうまく動きますが、一旦点滅にすると次にし点灯・消灯に変えても点滅が止まりません。
|