.. 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
.. code-block::
cd ~/raphael-kit/python/
**ステップ3**: 実行する。
.. raw:: html
.. code-block::
sudo python3 4.1.15_AlarmBell.py
プログラムが開始された後、トグルスイッチは右に切り替えられ、ブザーはアラーム音を出します。同時に、赤と緑のLEDは特定の周波数で点滅します。
**コード**
.. note::
以下のコードを **変更/リセット/コピー/実行/停止** することができます。しかし、その前に、 ``raphael-kit/python`` のようなソースコードのパスに移動する必要があります。
.. raw:: html
.. 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