.. note:: Hallo und willkommen in der SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasten-Gemeinschaft auf Facebook! Tauchen Sie tiefer ein in die Welt von Raspberry Pi, Arduino und ESP32 mit anderen Enthusiasten. **Warum beitreten?** - **Expertenunterstützung**: Lösen Sie Nachverkaufsprobleme und technische Herausforderungen mit Hilfe unserer Gemeinschaft und unseres Teams. - **Lernen & Teilen**: Tauschen Sie Tipps und Anleitungen aus, um Ihre Fähigkeiten zu verbessern. - **Exklusive Vorschauen**: Erhalten Sie frühzeitigen Zugang zu neuen Produktankündigungen und exklusiven Einblicken. - **Spezialrabatte**: Genießen Sie exklusive Rabatte auf unsere neuesten Produkte. - **Festliche Aktionen und Gewinnspiele**: Nehmen Sie an Gewinnspielen und Feiertagsaktionen teil. 👉 Sind Sie bereit, mit uns zu erkunden und zu erschaffen? Klicken Sie auf [|link_sf_facebook|] und treten Sie heute bei! 3.1.10 Alarmglocke ==================== Einführung ----------------- In diesem Kurs erstellen wir ein manuelles Alarmgerät. Sie können den Kippschalter durch einen Thermistor oder einen lichtempfindlichen Sensor ersetzen, um einen Temperaturalarm oder einen Lichtalarm auszulösen. Komponenten --------------- .. image:: ../img/list_Alarm_Bell.png :align: center Schematische Darstellung ------------------------- ============ ======== ======== === T-Karte Name physisch 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 Experimentelle Verfahren ----------------------------- Schritt 1: Bauen Sie die Schaltung auf. .. image:: ../img/image266.png :width: 800 Schritt 2: Verzeichnis wechseln. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/3.1.10/ Schritt 3: Kompilieren. .. raw:: html .. code-block:: gcc 3.1.10_AlarmBell.c -lwiringPi -lpthread Schritt 4: Ausführen. .. raw:: html .. code-block:: sudo ./a.out Nach dem Start des Programms wird der Kippschalter nach rechts umgeschaltet und der Summer gibt Alarmtöne aus. Gleichzeitig blinken die roten und grünen LEDs mit einer bestimmten Frequenz. **Code Erklärung** .. code-block:: c #include  In dieser Kode verwenden Sie eine neue Bibliothek, ``pthread.h`` , die aus einer Reihe allgemeiner Thread-Bibliotheken besteht und Multithreading realisieren kann. Wir fügen den Parameter ``-lpthread`` zur Kompilierungszeit hinzu, damit die LED und der Summer unabhängig voneinander arbeiten können. .. 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);     } } Die Funktion ``ledWork()`` hilft beim Einstellen des Arbeitszustands dieser beiden LEDs: Sie leuchtet die grüne LED 0,5 Sekunden lang auf und erlischt dann. In ähnlicher Weise leuchtet die rote LED 0,5 Sekunden lang auf und erlischt dann. .. 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);     } } Mit der Funktion ``buzzWork()`` wird der Arbeitszustand des Summers eingestellt. Hier stellen wir die Frequenz zwischen 130 und 800 ein, um sie in einem Intervall von 20 zu akkumulieren oder abzunehmen. .. 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);       } In der Funktion ``on()``: 1. Definieren Sie die Markierung „flag = 1“, die das Ende des Kontrollthreads angibt. #. Erstellen Sie einen softwaregesteuerten Ton-Pin ``BeepPin``. #. Erstellen Sie zwei separate Threads, damit die LED und der Summer gleichzeitig arbeiten können. ``pthread_t tLed`` : Deklariert einen Thread tLed. ``pthread_create(&tLed,NULL,ledWork,NULL)`` : Erstellen Sie den Thread und sein Prototyp lautet wie folgt: .. code-block:: c int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); **Geben Sie den Wert zurück** Wenn dies erfolgreich ist, geben Sie „0“ zurück. Andernfalls geben Sie die Fallzahl „-1“ zurück. Parameter | Der erste Parameter ist ein Zeiger auf die Thread-ID. | Der zweite wird verwendet, um das Thread-Attribut festzulegen. | Die dritte ist die Startadresse der Thread-Running-Funktion. | Der letzte ist derjenige, der die Funktion ausführt. .. code-block:: c void off(){     flag = 0;     softToneStop(BeepPin);     digitalWrite(ALedPin,LOW);     digitalWrite(BLedPin,LOW); } Die Funktion ``off()`` definiert „flag=0“, um die Threads ledWork und BuzzWork zu verlassen und dann den Summer und die LED auszuschalten. .. 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()`` enthält den gesamten Prozess des Programms: Lesen Sie zuerst den Wert des Schiebeschalters; Wenn der Kippschalter nach rechts umgeschaltet ist (der Messwert ist 1), wird die Funktion ``on()`` aufgerufen, der Summer wird zur Ausgabe von Tönen angesteuert und die rote und die grüne LED blinken. Andernfalls funktionieren der Summer und die LED nicht.