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 [Ici] 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

../_images/list_Alarm_Bell1.png

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

../_images/Schematic_three_one101.png

Procédures Expérimentales

Étape 1 : Montez le circuit.

../_images/image2661.png

Étape 2 : Changez de répertoire.

cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/

Étape 3 : Compilez le code.

gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread

Étape 4 : Exécutez le fichier compilé.

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 Le code C ne fonctionne pas ?.

Explication du Code

#include <pthread.h>

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.

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.

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.

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.

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.

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.