.. note::
Bonjour, bienvenue dans la communauté SunFounder dédiée aux passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez au cœur de ces technologies avec d'autres amateurs partageant la même passion.
**Pourquoi nous rejoindre ?**
- **Support d'Experts** : Résolvez vos problèmes après-vente et relevez vos défis techniques avec l'aide de notre communauté et de notre équipe.
- **Apprendre & Partager** : Échangez astuces et tutoriels pour perfectionner vos compétences.
- **Avant-premières exclusives** : Accédez en avant-première aux annonces de nouveaux produits et à des aperçus exclusifs.
- **Réductions spéciales** : Profitez de remises exclusives sur nos produits les plus récents.
- **Promotions festives et concours** : Participez à nos promotions spéciales et tirages au sort pendant les périodes festives.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _py_pi5_bell:
3.1.10 Alarme Manuelle
=========================
Introduction
------------------
Dans ce projet, nous allons créer un dispositif d'alarme manuel. Vous pouvez remplacer
l'interrupteur à bascule par une thermistance ou un capteur photosensible pour réaliser
une alarme de température ou de lumière.
Composants nécessaires
------------------------------
Dans ce projet, nous avons besoin des composants suivants.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_list.png
:width: 800
:align: center
.. Il est certainement plus pratique d'acheter un kit complet, voici le lien :
.. .. list-table::
.. :widths: 20 20 20
.. :header-rows: 1
.. * - Nom
.. - COMPOSANTS DANS CE KIT
.. - LIEN
.. * - Kit Raphael
.. - 337
.. - |link_Raphael_kit|
.. Vous pouvez également les acheter séparément via les liens ci-dessous.
.. .. list-table::
.. :widths: 30 20
.. :header-rows: 1
.. * - INTRODUCTION DES COMPOSANTS
.. - LIEN D'ACHAT
.. * - :ref:`gpio_extension_board`
.. - |link_gpio_board_buy|
.. * - :ref:`breadboard`
.. - |link_breadboard_buy|
.. * - :ref:`wires`
.. - |link_wires_buy|
.. * - :ref:`resistor`
.. - |link_resistor_buy|
.. * - :ref:`led`
.. - |link_led_buy|
.. * - :ref:`Buzzer`
.. - |link_passive_buzzer_buy|
.. * - :ref:`slide_switch`
.. - |link_slide_switch_buy|
.. * - :ref:`transistor`
.. - |link_transistor_buy|
.. * - :ref:`capacitor`
.. - |link_capacitor_buy|
Schéma du Circuit
-------------------------
============ ======== ======== ===
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:: ../python_pi5/img/4.1.15_alarm_bell_schematic.png
:width: 600
:align: center
Procédure expérimentale
-----------------------------
**Étape 1** : Construisez le circuit.
.. image:: ../python_pi5/img/4.1.15_alarm_bell_circuit.png
**Étape 2** : Changez de répertoire.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 3** : Exécutez le script.
.. raw:: html
.. code-block::
sudo python3 3.1.10_AlarmBell.py
Une fois le programme démarré, l'interrupteur basculera à droite et le
buzzer émettra des sons d'alarme. En même temps, les LED rouge et verte
clignoteront à une certaine fréquence.
.. warning::
Si le message d'erreur ``RuntimeError: Cannot determine SOC peripheral base address`` s'affiche, veuillez vous référer à :ref:`faq_soc`
**Code**
.. note::
Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, vous devez accéder au chemin source du code, tel que ``davinci-kit-for-raspberry-pi/python-pi5``.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
# Initialisation du TonalBuzzer sur la broche GPIO 22
BeepPin = TonalBuzzer(22)
# Initialisation des LEDs sur les broches GPIO 17 et 27
ALedPin = LED(17)
BLedPin = LED(27)
# Initialisation du bouton sur la broche GPIO 18
switchPin = Button(18)
# Variable globale pour contrôler l'état du buzzer et des LEDs
flag = 0
def ledWork():
"""
Control LED blinking pattern based on the flag state.
When flag is set, alternately blink ALedPin and BLedPin.
"""
while True:
if flag:
# Clignotement alternatif des LEDs
ALedPin.on()
time.sleep(0.5)
ALedPin.off()
BLedPin.on()
time.sleep(0.5)
BLedPin.off()
else:
# Éteindre les deux LEDs si flag est désactivé
ALedPin.off()
BLedPin.off()
# Définir la mélodie musicale comme une liste de notes et de leurs durées
tune = [
('C4', 0.1), ('E4', 0.1), ('G4', 0.1),
(None, 0.1),
('E4', 0.1), ('G4', 0.1), ('C5', 0.1),
(None, 0.1),
('C5', 0.1), ('G4', 0.1), ('E4', 0.1),
(None, 0.1),
('G4', 0.1), ('E4', 0.1), ('C4', 0.1),
(None, 0.1)
]
def buzzerWork():
"""
Play a tune using the buzzer based on the flag state.
The tune is played only when the flag is set.
"""
while True:
for note, duration in tune:
if flag == 0:
break
print(note) # Afficher la note actuelle dans la console
BeepPin.play(note) # Jouer la note actuelle
time.sleep(duration) # Pause pendant la durée de la note
BeepPin.stop() # Arrêter le buzzer après la mélodie
def main():
"""
Monitor button press to update the flag state.
Sets the flag when the button is pressed.
"""
global flag
while True:
flag = 1 if switchPin.is_pressed else 0
try:
# Initialisation et démarrage des threads pour le contrôle du buzzer et des LEDs
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
main()
except KeyboardInterrupt:
# Arrêter le buzzer et éteindre les LEDs en cas d'interruption du programme
BeepPin.stop()
ALedPin.off()
BLedPin.off()
**Explication du Code**
#. Ce segment comprend l'importation des bibliothèques essentielles pour implémenter des délais et la gestion des threads. Il importe également les classes `LED`, `Button` et `TonalBuzzer` de la bibliothèque `gpiozero`, nécessaires pour contrôler les périphériques GPIO sur un Raspberry Pi.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import LED, Button, TonalBuzzer
import time
import threading
#. Configure un buzzer sur la broche GPIO 22, deux LEDs sur les broches GPIO 17 et 27, et initialise un bouton sur la broche GPIO 18. Un drapeau global est également défini pour gérer l'état du buzzer et des LEDs.
.. code-block:: python
# Initialisation du TonalBuzzer sur la broche GPIO 22
BeepPin = TonalBuzzer(22)
# Initialisation des LEDs sur les broches GPIO 17 et 27
ALedPin = LED(17)
BLedPin = LED(27)
# Initialisation du bouton sur la broche GPIO 18
switchPin = Button(18)
# Drapeau global pour contrôler l'état du buzzer et des LEDs
flag = 0
#. Cette fonction contrôle le clignotement des LEDs en fonction de l'état du drapeau (`flag`). Si le drapeau est activé (1), les LEDs s'allument et s'éteignent alternativement. Si le drapeau est désactivé (0), les deux LEDs restent éteintes.
.. code-block:: python
def ledWork():
"""
Control LED blinking pattern based on the flag state.
When flag is set, alternately blink ALedPin and BLedPin.
"""
while True:
if flag:
# Clignotement alternatif des LEDs
ALedPin.on()
time.sleep(0.5)
ALedPin.off()
BLedPin.on()
time.sleep(0.5)
BLedPin.off()
else:
# Éteindre les deux LEDs si le drapeau est désactivé
ALedPin.off()
BLedPin.off()
#. La mélodie est définie comme une séquence de notes (fréquence) et de durées (secondes).
.. code-block:: python
# Définir la mélodie musicale comme une liste de notes et de leurs durées
tune = [
('C4', 0.1), ('E4', 0.1), ('G4', 0.1),
(None, 0.1),
('E4', 0.1), ('G4', 0.1), ('C5', 0.1),
(None, 0.1),
('C5', 0.1), ('G4', 0.1), ('E4', 0.1),
(None, 0.1),
('G4', 0.1), ('E4', 0.1), ('C4', 0.1),
(None, 0.1)
]
#. Joue une mélodie prédéfinie lorsque le drapeau est activé. La mélodie s'arrête si le drapeau est désactivé en cours de lecture.
.. code-block:: python
def buzzerWork():
"""
Play a tune using the buzzer based on the flag state.
The tune is played only when the flag is set.
"""
while True:
for note, duration in tune:
if flag == 0:
break
print(note) # Affiche la note actuelle dans la console
BeepPin.play(note) # Joue la note actuelle
time.sleep(duration) # Pause pendant la durée de la note
BeepPin.stop() # Arrête le buzzer après la mélodie
#. Vérifie en continu l'état du bouton pour activer ou désactiver le drapeau.
.. code-block:: python
def main():
"""
Monitor button press to update the flag state.
Sets the flag when the button is pressed.
"""
global flag
while True:
flag = 1 if switchPin.is_pressed else 0
#. Les threads pour les fonctions `buzzerWork` et `ledWork` sont démarrés, leur permettant de s'exécuter simultanément avec la fonction principale.
.. code-block:: python
try:
# Initialiser et démarrer les threads pour le contrôle du buzzer et des LEDs
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
main()
#. Arrête le buzzer et éteint les LEDs en cas d'interruption du programme, garantissant une sortie propre.
.. code-block:: python
except KeyboardInterrupt:
# Arrêter le buzzer et éteindre les LEDs en cas d'interruption du programme
BeepPin.stop()
ALedPin.off()
BLedPin.off()