.. note::

    こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ！Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。

    **参加する理由は？**

    - **エキスパートサポート**：コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
    - **学び＆共有**：ヒントやチュートリアルを交換してスキルを向上させましょう。
    - **独占的なプレビュー**：新製品の発表や先行プレビューに早期アクセスしましょう。
    - **特別割引**：最新製品の独占割引をお楽しみください。
    - **祭りのプロモーションとギフト**：ギフトや祝日のプロモーションに参加しましょう。

    👉 私たちと一緒に探索し、創造する準備はできていますか？[|link_sf_facebook|]をクリックして今すぐ参加しましょう！

.. _4.1.15_py:

4.1.15 アラームベル
============================

はじめに
-----------------

このプロジェクトでは、手動のアラームデバイスを作成します。サーモリスターや光敏感センサーをトグルスイッチと置き換えて、温度アラームや光アラームを作成することができます。

必要な部品
------------------------------

このプロジェクトで必要なコンポーネントは以下の通りです。

.. image:: ../img/list_Alarm_Bell.png
    :align: center

全てのキットを購入することは確かに便利です。リンクはこちらです：

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - 名前
        - このキットのアイテム
        - リンク
    *   - Raphael Kit
        - 337
        - |link_Raphael_kit|

以下のリンクから個別に購入することもできます。

.. list-table::
    :widths: 30 20
    :header-rows: 1

    *   - コンポーネント紹介
        - 購入リンク

    *   - :ref:`cpn_gpio_board`
        - |link_gpio_board_buy|
    *   - :ref:`cpn_breadboard`
        - |link_breadboard_buy|
    *   - :ref:`cpn_wires`
        - |link_wires_buy|
    *   - :ref:`cpn_resistor`
        - |link_resistor_buy|
    *   - :ref:`cpn_led`
        - |link_led_buy|
    *   - :ref:`cpn_buzzer`
        - |link_passive_buzzer_buy|
    *   - :ref:`cpn_slide_switch`
        - |link_slide_switch_buy|
    *   - :ref:`cpn_transistor`
        - |link_transistor_buy|
    *   - :ref:`cpn_capacitor`
        - |link_capacitor_buy|

回路図
-------------------------

============ ======== ======== ===
T-Board Name physical wiringPi BCM
GPIO17       Pin 11   0        17
GPIO18       Pin 12   1        18
GPIO27       Pin 13   2        27
GPIO22       Pin 15   3        22
============ ======== ======== ===

.. image:: ../img/Schematic_three_one10.png
   :align: center

実験の手順
-----------------------------

**ステップ1**: 回路を組み立てる。

.. image:: ../img/image266.png

**ステップ2**: ディレクトリを変更する。

.. raw:: html

   <run></run>

.. code-block::

    cd ~/raphael-kit/python/

**ステップ3**: 実行する。

.. raw:: html

   <run></run>

.. code-block::

    sudo python3 4.1.15_AlarmBell.py

プログラムが開始された後、トグルスイッチは右に切り替えられ、ブザーはアラーム音を出します。同時に、赤と緑のLEDは特定の周波数で点滅します。

**コード**

.. note::
    以下のコードを **変更/リセット/コピー/実行/停止** することができます。しかし、その前に、 ``raphael-kit/python`` のようなソースコードのパスに移動する必要があります。


.. raw:: html

    <run></run>

.. code-block:: python

    #!/usr/bin/env python3

    import RPi.GPIO as GPIO
    import time
    import threading

    BeepPin=22
    ALedPin=17
    BLedPin=27
    switchPin=18

    Buzz=0
    flag =0
    note=150
    pitch=20

    def setup():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(BeepPin, GPIO.OUT)
        GPIO.setup(ALedPin,GPIO.OUT,initial=GPIO.LOW)
        GPIO.setup(BLedPin,GPIO.OUT,initial=GPIO.LOW)
        GPIO.setup(switchPin,GPIO.IN)
        global Buzz
        Buzz=GPIO.PWM(BeepPin,note)

    def ledWork():
        while flag:
            GPIO.output(ALedPin,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(ALedPin,GPIO.LOW)
            GPIO.output(BLedPin,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(BLedPin,GPIO.LOW)

    def buzzerWork():
        global pitch
        global note
        while flag:
            if note >= 800 or note <=130:
                pitch = -pitch
            note = note + pitch 
            Buzz.ChangeFrequency(note)
            time.sleep(0.01)

    def on():
        global flag
        flag = 1
        Buzz.start(50)
        tBuzz = threading.Thread(target=buzzerWork) 
        tBuzz.start()
        tLed = threading.Thread(target=ledWork) 
        tLed.start()    

    def off():
        global flag
        flag = 0
        Buzz.stop()
        GPIO.output(ALedPin,GPIO.LOW)
        GPIO.output(BLedPin,GPIO.LOW)      

    def main():
        lastState=0
        while True:
            currentState =GPIO.input(switchPin)
            if currentState == 1 and lastState == 0:
                on()
            elif currentState == 0 and lastState == 1:
                off()
            lastState=currentState

    def destroy():
        off()
        GPIO.cleanup()

    if __name__ == '__main__':
        setup()
        try:
            main()
        except KeyboardInterrupt:
            destroy()

**コード説明**

.. code-block:: python

    import threading

ここで、 ``Threading`` モジュールをインポートします。通常のプログラムは上から下へとコードを順次実行しますが、このモジュールを利用することで、同時に複数の作業を行うことができます。 ``Threading`` モジュールのおかげで、LEDとブザーは別々に動作することができます。

.. code-block:: python

    def ledWork():
        while flag:
            GPIO.output(ALedPin,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(ALedPin,GPIO.LOW)
            GPIO.output(BLedPin,GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(BLedPin,GPIO.LOW)

``ledWork()`` 関数は、これら2つのLEDの動作状態を設定するためのものです。
緑のLEDを0.5秒間点灯させてから消灯し、同様に赤のLEDを0.5秒間点灯させてから消灯します。

.. code-block:: python

    def buzzerWork():
        global pitch
        global note
        while flag:
            if note >= 800 or note <=130:
                pitch = -pitch
            note = note + pitch 
            Buzz.ChangeFrequency(note)
            time.sleep(0.01)

``buzzWork()`` 関数はブザーの動作状態を設定するためのものです。
ここでは、周波数を130と800の間に設定し、20の間隔で増減させます。

.. code-block:: python

    def on():
        global flag
        flag = 1
        Buzz.start(50)
        tBuzz = threading.Thread(target=buzzerWork) 
        tBuzz.start()
        tLed = threading.Thread(target=ledWork) 
        tLed.start()  

``on()`` 関数で：

1) “flag=1”としてマークを定義し、制御スレッドの終了を示します。

2) Buzzを開始し、デューティサイクルを50%に設定します。

3) LED とブザーが同時に動作できるように、 **2** 別々のスレッドを作成します。


``threading.Thread()`` 関数はスレッドを作成するために使用され、そのプロトタイプは以下の通りです:

   ``class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)``

構築メソッドの中で、主要なパラメータは ``target`` です。
我々は、呼び出し可能なオブジェクト（ここでは関数 ``ledWork`` と ``BuzzWork`` ）を ``target`` に割り当てる必要があります。

次に、 ``start()`` が呼び出されてスレッドオブジェクトを開始します。例えば、 ``tBuzz.start()`` は新しくインストールされた ``tBuzz`` スレッドを開始するために使用されます。

.. code-block:: python

    def off():
        global flag
        flag = 0
        Buzz.stop()
        GPIO.output(ALedPin,GPIO.LOW)
        GPIO.output(BLedPin,GPIO.LOW)

``Off()`` 関数は “flag=0” を定義して、スレッド **ledWork** と **BuzzWork** を終了し、ブザーとLEDをオフにします。

.. code-block:: python

    def main():
        lastState=0
        while True:
            currentState =GPIO.input(switchPin)
            if currentState == 1 and lastState == 0:
                on()
            elif currentState == 0 and lastState == 1:
                off()
            lastState=currentState

``Main()`` はプログラムの全体的なプロセスを含んでいます: まずスライドスイッチの値を読み取ります。トグルスイッチが右に切り替えられた場合（読み取りが1の場合）、 ``on()`` 関数が呼び出され、ブザーが鳴り、赤と緑のLEDが点滅します。それ以外の場合、ブザーとLEDは動作しません。

現象の画像
------------------------

.. image:: ../img/image267.jpeg
   :align: center