おはようございます。


上差し今朝の群馬県の様子です。
いつもの様にYoutube経由で、群馬県庁のライブカメラにリンクを張ってあります。

群馬県庁32階(北側)からの眺望 ライブ配信

今回は、マニアックな記事を書きます。

螻蛄の自慢話:
自称4言語を操るキャラ。
その内の2つは、プログラミング言語(C言語とPython)
残りの2つは、怪しい英語と日本語
です。(笑)

で紹介した【After】のスクリプトでは、イベントドリブンの
#wait_for_edge() function
#The wait_for_edge() function is designed to block execution of
#your program until an edge is detected.
の関数を使いました。Raspberry PiのGPIOに入力機能を持たせて、そのエッヂを検出すると、停止していた処理を開始するという関数です。

今回は、
#event_detected() function
#The event_detected() function is designed to be used in a loop with other things,
#but unlike polling it is not going to miss the change in state of an input
#while the CPU is busy working on other things.
を使用したスクリプトを紹介します。

#/usr/bin/python3
#https://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/

#event_detected() function
#The event_detected() function is designed to be used in a loop with other things,
#but unlike polling it is not going to miss the change in state of an input
#while the CPU is busy working on other things.

import RPi.GPIO as GPIO 
from time import sleep

gpio_led = 17
gpio_sw = 5

class Fio:
    def __init__(self):
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(gpio_led, GPIO.OUT)
        GPIO.setup(gpio_sw, GPIO.IN, pull_up_down=GPIO.PUD_UP)
        
        GPIO.output(gpio_led, 0)
        
    def fade_in_out(self, pi):
    #Threaded callbacks
    #RPi.GPIO runs a second thread for callback functions. This means that callback functions
    #can be run at the same time as your main program, in immediate response to an edge.

        pi = GPIO.PWM (gpio_led, 50 )  #( pin, Hz )
        pi.start (0)   
        #fade in
        print(end='\nfade-in')
        for i in range(0, 100):
            duty = i
            pi.ChangeDutyCycle( duty )
            sleep(0.1)
            #print(end = '.')
    #fade out
        print(end='\nfade-out')
        for i in range(0, 100):
            duty = 100 - i
            pi.ChangeDutyCycle( duty )
            sleep(0.1)
            #print(end = ".")
        #switch off      
        pi.stop()
    
    def loop(self):    
        try:
            while True:
                sleep(1)
        
        except KeyboardInterrupt: 
            pass

    def finish(self):
        print("Stop the program and turning off the LED")
        GPIO.cleanup(gpio_led)
        GPIO.cleanup(gpio_sw)
    
def main():
    pwm = Fio()

    GPIO.add_event_detect(gpio_sw, GPIO.FALLING, callback=pwm.fade_in_out, bouncetime=200)
    pwm.loop()
    pwm.finish()

# If this script was called as shell command, __name__ is '__main__'.
if __name__ == '__main__':
    main()
になります。
ちょっとオブジェクト指向っぽくして、クラス、メソッド、インスタンスを使ってみました。
###
Classってクラス = 学級 というよりも、軍隊の最小単位 が相応しいと思っています。右差し Class Fio
Methodは、その隊員ですね。右差し Class Fioの中の各関数
以上は、あくまでも状態を意味します。

このClassにミッションを与えます。それが、Instanceです。右差し pwm = Fio()
このインスタンスを設定することで、その隊が起動できる状態になります。
###
また、
GPIO.add_event_detect(gpio_sw, GPIO.FALLING, callback=pwm.fade_in_out, bouncetime=200)
で割り込み処理(イベントドリブン)の設定をしています。GPIO.add_event_detect()は、引数としてコールバック関数へのポインタを渡します。
callback=pwm.fade_in_out の部分です。このコールバック関数が、実質的な割り込み処理を行っています。
これは、
pwmというミッションを帯びたClass Fioに属するfade_in_out()隊員が遂行する仕事
ってことになります。
この様に人間社会の摂理を体系的に整理して、コンピューターに指示を出す(アルゴリズム)ことがプログラミング言語とも言えます。
という意味で、私は自称4言語を扱うキャラなのです。笑笑
グッ

上差しは、
# If this script was called as shell command, __name__ is '__main__'.
if __name__ == '__main__':
    main()
の部分の様子です。
勿論、Thonnyを起動してから、その中で実行しても構いません。

ps 本日は、wifeが予約してくれた帯状疱疹のワクチン接種をしてきます。
  ではでは。