.. 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:: media/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:: media/Schematic_three_one10.png
:align: center
Experimentelle Verfahren
-----------------------------
Schritt 1: Bauen Sie die Schaltung auf.
.. image:: media/image266.png
:width: 800
Für Benutzer in C-Sprache
^^^^^^^^^^^^^^^^^^^^^^^^^^
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.
Für Python-Sprachbenutzer
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Schritt 2: Verzeichnis wechseln.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
Schritt 3: Ausführen.
.. raw:: html
.. code-block::
sudo python3 3.1.10_AlarmBell.py
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**
.. note::
Sie können den folgenden Code **Ändern/Zurücksetzen/Kopieren/Ausführen/Stoppen** . Zuvor müssen Sie jedoch zu einem Quellcodepfad wie ``davinci-kit-for-raspberry-pi/python`` gehen.
.. raw:: html
.. code-block:: python
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 Erklärung**
.. code-block:: python
import threading
Hier importieren wir das Threading-Modul und es ermöglicht Ihnen,
mehrere Dinge gleichzeitig zu tun, während normale Programme Kode nur von oben nach unten ausführen können.
Bei Threading-Modulen können die LED und der Summer separat arbeiten.
.. 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)
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:: 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)
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:: python
def on():
global flag
flag = 1
Buzz.start(50)
tBuzz = threading.Thread(target=buzzerWork)
tBuzz.start()
tLed = threading.Thread(target=ledWork)
tLed.start()
In der Funktion ``on()``:
1. Definieren Sie die Markierung „flag = 1“, die das Ende des Kontrollthreads angibt.
#. Starten Sie den Buzz und stellen Sie den Arbeitszyklus auf 50% ein.
#. Erstellen Sie 2 separate Threads, damit die LED und der Summer gleichzeitig arbeiten können.
``tBuzz = threading.Thread(target=buzzerWork)`` : Create the thread and its prototype is as follows:
.. code-block:: python
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
Unter den Konstruktionsmethoden ist der Hauptparameter target. Wir müssen dem Ziel ein aufrufbares Objekt zuweisen (hier sind die Funktionen ledWork und BuzzWork).
Next ``start()`` wird aufgerufen, um das Thread-Objekt zu starten.
Beispiel: ``tBuzz.start()`` wird verwendet, um den neu installierten tBuzz-Thread zu starten.
.. code-block:: python
def off():
global flag
flag = 0
Buzz.stop()
GPIO.output(ALedPin,GPIO.LOW)
GPIO.output(BLedPin,GPIO.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:: 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()`` 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.
Phänomen Bild
------------------------
.. image:: media/image267.jpeg
:align: center