.. note::

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

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

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

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

.. _3.1.9_c:

3.1.9 アラームベル
=======================

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

このプロジェクトでは、手動アラーム装置を作成します。トグルスイッチをサーミスタまたは光センサーに置き換えて、温度アラームまたは光アラームを作成できます。

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

このプロジェクトには、以下の部品が必要です。

.. 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/c/3.1.9/

**ステップ3**: コンパイルします。

.. raw:: html

   <run></run>

.. code-block::

    gcc 3.1.9_AlarmBell.c -lwiringPi -lpthread

**ステップ4**: 実行します。

.. raw:: html

   <run></run>

.. code-block::

    sudo ./a.out

プログラムを起動したら、スライドスイッチを右に移動し、ブザーからアラーム音が鳴ります。同時に、赤と緑のLEDが一定の頻度で点滅します。

.. note::

    実行後に動作しない場合、またはエラーメッセージ「wiringPi.h: No such file or directory」が表示される場合は、 :ref:`install_wiringpi` を参照してください。


**コード説明**

.. code-block:: c

    #include <pthread.h>

このコードでは、新しいライブラリである ``pthread.h`` を使用します。これは一般的なスレッドライブラリのセットで、マルチスレッディングを実現できます。LEDとブザーの独立した動作を実現するために、コンパイル時に ``-lpthread`` パラメータを追加します。

.. code-block:: c

    void *ledWork(void *arg){       
        while(1)    
        {   
            if(flag==0){
                pthread_exit(NULL);
            }
            digitalWrite(ALedPin,HIGH);
            delay(500);
            digitalWrite(ALedPin,LOW);
            digitalWrite(BLedPin,HIGH);
            delay(500);
            digitalWrite(BLedPin,LOW);
        }
    }

関数 ``ledWork()`` は、これら 2 つの LED の動作状態を設定するのに役立ちます。
緑色の LED が 0.5 秒間点灯した後、消灯します。
同様に、赤色 LED が 0.5 秒間点灯し続けた後、消灯します。

.. code-block:: c

    void *buzzWork(void *arg){
        while(1)
        {
            if(flag==0){
                pthread_exit(NULL);
            }
            if((note>=800)||(note<=130)){
                pitch = -pitch;
            }
            note=note+pitch;
            softToneWrite(BeepPin,note);
            delay(10);
        }
    }

関数 ``buzzWork()`` は、ブザーの動作状態を設定するために使用されます。
ここでは、累積または減衰する周波数を 130 ～ 800 に設定します。
20間隔で。

.. code-block:: c

    void on(){
        flag = 1;
        if(softToneCreate(BeepPin) == -1){
            printf("setup softTone failed !");
            return; 
        }    
        pthread_t tLed;     
        pthread_create(&tLed,NULL,ledWork,NULL);    
        pthread_t tBuzz;  
        pthread_create(&tBuzz,NULL,buzzWork,NULL);      
    }

「on()」関数では以下のことを実行します：

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

2) ソフトウェア制御されたトーンピン ``BeepPin`` を作成します。

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

* ``pthread_t tLed``：スレッド ``tLed`` を宣言します。
* ``pthread_create(&tLed,NULL,ledWork,NULL)``：スレッドを作成し、そのプロトタイプは次のようになります：

.. code-block:: 

    int pthread_create(pthread_t *restrict tidp,const pthread_attr_t*restrict_attr,void*（*start_rtn)(void*),void *restrict arg);

成功した場合、0を返し、それ以外の場合はエラー番号-1を返します。

* 最初のパラメータはスレッド識別子へのポインタです。
* 2番目のパラメータはスレッド属性を設定するために使用されます。
* 3番目のパラメータはスレッド実行関数の開始アドレスです。
* 最後のパラメータはその関数を実行するものです。

.. code-block:: c

    void off(){
        flag = 0;
        softToneStop(BeepPin);
        digitalWrite(ALedPin,LOW);
        digitalWrite(BLedPin,LOW);
    }

``Off()`` 関数では、「flag=0」と定義してスレッド **ledWork** と **BuzzWork** を終了し、その後ブザーとLEDを消灯させます。

.. code-block:: c

    int main(){       
        setup(); 
        int lastState = 0;
        while(1){
            int currentState = digitalRead(switchPin);
            if ((currentState == 1)&&(lastState==0)){
                on();
            }
            else if((currentState == 0)&&(lastState==1)){
                off();
            }
            lastState=currentState;
        }
        return 0;
    }

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

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

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