In diesem Beitrag möchte ich dir zeigen, wie ein aktiver Piezo Buzzer mit Groove Connector programmiert wird.
Einen aktiven Piezo Buzzer habe ich bereits im Beitrag Raspberry PI Tutorial #3: Piezo Buzzer für den Raspberry PI vorgestellt. Dieses kleine Modul für den Arduino funktioniert ähnlich nur das dieses zusätzlich über einen Grove Connector verfügt und somit super einfach an den Seeduino Nano angeschlossen werden kann.
Der Seeduino Nano in Verbindung mit dem Grove Shield bietet eine sehr einfache und vor allem verpolungssicherere Möglichkeit Shields und Module anzuschließen.
Bezug
Dieses kleine Modul habe ich über aliexpress.com für knapp 4 € inkl. Versandkosten erstanden. Die Preise auf ebay.de liegen derzeit bei ca. 7€* (inkl. kostenlosen Versand).
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Lieferumgang
Zum Lieferumfang des Modules gehört neben dem Modul selber noch ein ca. 20cm langes Anschlusskabel.
Geliefert wurde mir dieses einfache Shield in einer normalen Tüte (also keine antistatische Verpackung).
Technische Daten des aktiven Piezo Buzzer Shields
- Anschluss – Grove Connector (einmal digitaler PWM Pin)
- Spannung – 3.3V
- Abmaße – 21 mm x 21 mm x 10 mm
Aufbau und Schaltung
Das aktive Piezo Buzzer Modul verfügt wie bereits erwähnt über einen Grove Connector und wird über das beigefügte Kabel an zum Beispiel einem Seeduino Nano über das Grove Shield an einen digitalen PWM Pin angeschlossen.
Durch die kompakte Bauweise des Grove Shields sind leider nur 3 digitale Pins verfügbar, jedoch sind alle diese Pins PWM Pins. Ich habe das Modul an den digitalen Pin D6 angeschlossen.
Beispiel Projekt – Temperaturwarner mit Licht und Sound
Wie man Töne auf einem Piezo Buzzer wiedergibt, habe ich in diversen Beiträgen bereits gezeigt, hier möchte ich gerne mit den zwei bereits vorgestellten
Shields eine Schaltung aufbauen. Diese Schaltung soll dazu dienen bei einem erreichen einer Temperatur eine optische sowie akustische Warnung ausgegeben wird.
Aufbau der Schaltung
Für den Aufbau der Schaltung verwende ich neben der 3 Shields noch zusätzlich den Seeduino Nano sowie eine passendes Grove Shield und die Anschlusskabel.
Das NTC Widerstand Shield wird über einen analogen Anschluss mit dem Board verbunden (in meinem Fall A0) das LED Shield habe ich am digitalen Pin D4 und den aktiven Piezo Buzzer am digitalen Pin D6 angeschlossen.
Quellcode
Den Aufbau des Quellcodes möchte ich in drei Schritten aufteilen, dieses hat den Vorteil, das man jeweils ein kleines Programm hat, welches bereits eine Funktion hat. Des Weiteren ist es somit einfacher, die einzelnen Funktionen zu erläutern.
Schritt 1 – Werte des NTC Widerstandes auslesen
Wie bereits erwähnt habe ich dem NTC-Widerstand Shield bereits ein eigenen Beitrag gewidmet und dort auch gezeigt wie man den Wert ausließt.
Damit der Quellcode nicht so lang wird und sich auf das wesentliche beschränkt, lagere ich die Funktionen zum Lesen der Temperatur in eine eigene Datei “ntc_resistor.ino” aus. Eine Einbindung mit dem Befehl “include” entfällt hierbei!
#include <math.h> const int B = 4275; // B value of the thermistor const int ntcWiderstand = 100000; // NTC-Widerstand mit 100 kOhm const float MAX_ANALOG_VALUE = 1023.0; //maximaler Wert welcher am analogen Eingang erreicht werden kann //An welchem analogen Pin der NTC-Widerstand angeschlossen ist #define PIN A0 /** * Liest den Wert des NTC Widerstandes und berechnet den Widerstandswert */ double readResistorValue(){ float analogValue = analogRead(PIN); float resistorValue = MAX_ANALOG_VALUE / analogValue - 1.0; return ntcWiderstand * resistorValue; } /** * Liefert die aktuelle Temperatur in Grad Kelvin */ double getTempKelvin(){ return convert2TempKelvin(readResistorValue()); } /** * Liefert die aktuelle Temperatur in Grad Celsius */ double getTempCelsius(){ return convertKelvin2TempCelsius(getTempKelvin()); } double convert2TempKelvin(float value){ double temp = 1.0/(log(value/ntcWiderstand)/B+1/298.15); return temp; } double convertKelvin2TempCelsius(double kelvin){ return kelvin - 273.15; }
Schritt 2 – LED steuern
Nachdem wir nun die Temperatur auslesen können werden wir die LED abhängig von der Temperatur schalten. Hierbei gibt es nun zwei Wege , zum einen über ein Fade Effekt d.h. die LED wird mit steigender Temperatur heller und zum anderen durch einen fest eingestellten Schwellwert welcher bei überschreiten die LED aktiviert oder deaktiviert.
NTC Widerstand & LED mit Fade Effekt
//LED am digitalen Pin D6 angeschlossen #define LED 6 void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); } void loop() { //auslesen der Temperatur double temp = getTempCelsius(); //mappen des Temperaturbereiches 0°C bis 45°C auf die //möglichen PWM Signalwerte von 0..255 int ledValue = map(temp, 0,45,0,255); //setzen des LED Fade Effekts analogWrite(LED, ledValue); }
Da das Grove Shield des Seeduino Nano nur über einen PWM Anschluss verfügt ist die Lösung leider nicht möglich (da wir diesen Pin für den Piezo Buzzer benötigen), aber ich wollte diese gerne gezeigt haben.
NTC Widerstand & LED mit AN / AUS bei erreichtem Wert
Schreiben wir nun das Programm so um das wir bei erreichen der Temperatur von größer als 23°C die LED aktivieren.
//LED am digitalen Pin D4 angeschlossen #define LED 4 void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); } void loop() { //auslesen der Temperatur double temp = getTempCelsius(); //initial die LED deaktivieren boolean ledStatus = LOW; //Wenn die Temperatur größer als 23°C ist dann... if(temp > 23) { //Variable ledStatus auf HIGH setzten //die LED wird dann aktiviert ledStatus = HIGH; } //setzen des aktuellen Wertes für die LED digitalWrite(LED, ledStatus); }
Schritt 3 – aktiver Piezo Buzzer steuern
Den Buzzer steuert man mit der Funktion “tone” diese Funktion gibt es zum einen mit den Parametern Pin und Frequenz, sowie mit Pin, Frequenz und Dauer. Im ersteren Fall muss man jedoch mit der Funktion “noTone(<<PIN>>)” den Buzzer wieder deaktivieren.
tone(BUZZER, 1400); delay(500); noTone(BUZZER); //oder tone(BUZZER, 1400, 500);
Ich verwende zusätzlich die Funktion map um den Temperaturwert von 0°C bis 45°C einen bestimmten Ton “zuzuweisen”.
tone(BUZZER, map(temp, 0,45,500,2500), 500);
fertiges Sketch / Programm
Datei: grove_activePiezoBuzzer.ino
//LED am digitalen Pin D4 angeschlossen #define LED 4 //aktiver Piezo Buzzer am digitalen Pin D6 angeschlossen #define BUZZER 6 void setup() { //beginn der seriellen Kommunikation mit 9600 baud Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(BUZZER, OUTPUT); } void loop() { //auslesen der Temperatur double temp = getTempCelsius(); //initial die LED deaktivieren boolean ledStatus = LOW; Serial.println(temp); //Wenn die Temperatur größer als 23°C ist dann... if(temp > 23) { //Variable ledStatus auf HIGH setzten //die LED wird dann aktiviert ledStatus = HIGH; tone(BUZZER, map(temp, 0,45,500,2500), 500); } //setzen des aktuellen Wertes für die LED digitalWrite(LED, ledStatus); delay(500); }
Datei: ntc_resistor.ino
#include <math.h> const int B = 4275; // B value of the thermistor const int ntcWiderstand = 100000; // NTC-Widerstand mit 100 kOhm const float MAX_ANALOG_VALUE = 1023.0; //maximaler Wert welcher am analogen Eingang erreicht werden kann //An welchem analogen Pin der NTC-Widerstand angeschlossen ist #define PIN A0 /** * Liest den Wert des NTC Widerstandes und berechnet den Widerstandswert */ double readResistorValue(){ float analogValue = analogRead(PIN); float resistorValue = MAX_ANALOG_VALUE / analogValue - 1.0; return ntcWiderstand * resistorValue; } /** * Liefert die aktuelle Temperatur in Grad Kelvin */ double getTempKelvin(){ return convert2TempKelvin(readResistorValue()); } /** * Liefert die aktuelle Temperatur in Grad Celsius */ double getTempCelsius(){ return convertKelvin2TempCelsius(getTempKelvin()); } double convert2TempKelvin(float value){ double temp = 1.0/(log(value/ntcWiderstand)/B+1/298.15); return temp; } double convertKelvin2TempCelsius(double kelvin){ return kelvin - 273.15; }
Download
Hier nun das Beispiel zum bequemen Download: