Published on

raspberry pi でラーメンタイマーを作成(multiprocessingも)

Authors
  • avatar
    Name
    Kikusan
    Twitter
#coding: utf-8
import wiringpi as pi

import time
from multiprocessing import Value, Array, Process
from datetime import timedelta

BUZZER_PIN = 17
LED_PIN = 23
SW_PIN = 24
WAITING_TIME = 180

pi.wiringPiSetupGpio()
pi.pinMode(BUZZER_PIN, pi.OUTPUT) # ブザー:OUTPUT
pi.pinMode(LED_PIN, pi.OUTPUT) # LED:OUTPUT
pi.pinMode(SW_PIN, pi.INPUT) # タクトスイッチ:INPUT
pi.pullUpDnControl(SW_PIN, pi.PUD_UP) # スイッチプルアップ


def output(flg):
    """
    出力制御関数
    -------------
    flg:bool 出力ONかOFFか
    """
    if flg:
        pi.digitalWrite(BUZZER_PIN, pi.HIGH) # ブザーを鳴らす
        pi.digitalWrite(LED_PIN, pi.HIGH) # LED ON
    else:
        pi.digitalWrite(BUZZER_PIN, pi.LOW) # ブザー停止
        pi.digitalWrite(LED_PIN, pi.LOW) # LED OFF
        

def stop(stopflg):
    """
    タイマー停止関数 タイマー中にボタンが押された場合、停止フラグをTrueにする
    -------------
    stopflg:Synchronized wrapper bool 停止フラグ
    """    
    while True:
        if pi.digitalRead(SW_PIN) == pi.LOW: # タクトスイッチが押されている
            stopflg.value = 1
            return
        time.sleep(0.1)
        

def inform_3min(stopflg):
    """
    タイマー関数 停止フラグがTrueの場合、タイマーを停止する
    -------------
    stopflg:Synchronized wrapper bool 停止フラグ
    """
    # 時間計測
    for i in range(WAITING_TIME):
        print(timedelta(seconds=(WAITING_TIME - i)))
        time.sleep(1)
        if stopflg.value:
            return
    # 出力
    while True:
        output(True)
        time.sleep(0.5)
        output(False)
        time.sleep(0.5)
        if stopflg.value:
            output(False)
            break


def run():
    """
    実行関数 タクトスイッチが押されるとタイマーを起動する
    """
    while True:
        print('waiting')
        stopflg = Value('i', 0)
        if pi.digitalRead(SW_PIN) == pi.LOW: # タクトスイッチが押されている
            while True:
                # 長押しは起動しない
                if pi.digitalRead(SW_PIN) == pi.LOW:
                    time.sleep(0.1)
                    continue

                # タイマー起動   
                p1 = Process(target=stop, args=[stopflg])
                p2 = Process(target=inform_3min, args=[stopflg])
                p1.start()
                p2.start()
                p1.join()
                p2.join()
                break
            break
        else:
            pass
        time.sleep(0.1)


if __name__ == '__main__':
    while True:
        # スイッチが押されていなければ実行関数を起動
        if pi.digitalRead(SW_PIN) != pi.LOW:
            run()
        time.sleep(0.1)