.. note::
Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez dans l'univers du Raspberry Pi, d'Arduino et d'ESP32 avec d'autres passionnés.
**Pourquoi nous rejoindre ?**
- **Support d'experts** : Résolvez les problèmes après-vente et surmontez les défis techniques avec l'aide de notre communauté et de notre équipe.
- **Apprenez et partagez** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos derniers produits.
- **Promotions festives et concours** : Participez à des concours et à des promotions spéciales.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
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 en faire une alarme de température ou de luminosité.
Composants
------------
.. image:: img/list_Alarm_Bell.png
:align: center
Schéma de Câblage
-------------------
============ ======== ======== ===
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
Procédures Expérimentales
----------------------------
**Étape 1 :** Montez le circuit.
.. image:: img/image266.png
:width: 800
**Étape 2 :** Changez de répertoire.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/
**Étape 3 :** Compilez le code.
.. raw:: html
.. code-block::
gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread
**Étape 4 :** Exécutez le fichier compilé.
.. raw:: html
.. code-block::
sudo ./a.out
Lorsque le programme démarre, basculez l'interrupteur vers la droite et le
buzzer émettra un son d'alarme. En même temps, les LED rouge et verte clignoteront
à une certaine fréquence.
.. note::
Si cela ne fonctionne pas après l'exécution, ou s'il y a un message d'erreur indiquant « wiringPi.h : Aucun fichier ou répertoire de ce type », veuillez consulter :ref:`faq_c_nowork`.
**Explication du Code**
.. code-block:: c
#include
Dans ce code, nous utilisons la nouvelle bibliothèque `pthread.h`, qui est un
ensemble de bibliothèques de threads permettant de réaliser le multithreading.
Nous ajoutons le paramètre **-lpthread** lors de la compilation pour permettre
le fonctionnement indépendant de la LED et du buzzer.
.. 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);
}
}
La fonction `ledWork()` configure l'état de fonctionnement des deux LEDs :
elle allume la LED verte pendant 0,5 seconde, puis l'éteint, et fait de même
pour la LED rouge.
.. 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);
}
}
La fonction `buzzWork()` configure l'état de fonctionnement du buzzer. Ici,
nous définissons une fréquence entre 130 et 800, qui augmente ou diminue avec
un intervalle de 10 millisecondes.
.. 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);
}
Dans la fonction `on()` :
1) Définition de la variable `flag=1` pour indiquer que le thread de contrôle est actif.
2) Création d'une broche de tonalité contrôlée par logiciel **BeepPin**.
3) Création de deux threads distincts pour que la LED et le buzzer puissent fonctionner en même temps.
**pthread_t tLed :** Déclaration d'un thread nommé **tLed**.
**pthread_create(&tLed, NULL, ledWork, NULL) :** Création du thread avec le prototype suivant :
int pthread_create(pthread_t \*restrict tidp, const pthread_attr_t \*restrict_attr, void*(*start_rtn)(void*), void \*restrict arg);
**Valeur de retour**
Si la création est réussie, retourne \"**0**\" ; sinon, retourne le code d'erreur \"**-1**\".
**Paramètres**
- Le premier paramètre est un pointeur vers l'identifiant du thread.
- Le second paramètre est utilisé pour définir les attributs du thread.
- Le troisième paramètre est l'adresse de démarrage de la fonction du thread.
- Le dernier paramètre est celui qui exécute la fonction.
.. code-block:: c
void off(){
flag = 0;
softToneStop(BeepPin);
digitalWrite(ALedPin,LOW);
digitalWrite(BLedPin,LOW);
}
La fonction `off()` définit `flag=0` afin de sortir des threads `ledWork` et `buzzWork`, puis arrête le buzzer et les LEDs.
.. 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;
}
La fonction `main()` contient l'ensemble du processus du programme : elle lit
d'abord la valeur de l'interrupteur coulissant ; si celui-ci est basculé vers
la droite (la lecture est 1), la fonction `on()` est appelée, le buzzer est
activé et les LEDs rouge et verte clignotent. Sinon, le buzzer et les LEDs s'éteignent.