Das Wemos D1 mini Buzzer Shield verfügt über einen einfachen Piezo / Buzzer über welchen man Töne in verschiedenen Tonlagen wiedergeben kann. Es ist sogar möglich eine kleine Melodie abzuspielen.
Das Shield wird mit einfachen Stiftleisten geliefert, da jedoch der Buzzer eine sehr geringe Bauhöhe hat, bietet es sich an die kleinen, kurzen Stiftleisten gegen lange Stiftleisten mit Buchsen auszutauschen.
Dieser Wechsel hat den Vorteil das man nun noch weitere Shields auf das Buzzer Shield stapeln kann.
Anschluss
Da auch dieses Shield einfach auf den Wemos D1 mini gesteckt werden kann, ist der Anschluss relativ einfach zu bewerkstelligen, jedoch muss man zuerst den PIN wählen, über welchen der Buzzer „angesprochen“ werden soll.
Dieses geschieht, indem man die beiden Lötstellen miteinander verbindet.
Programmieren eines Sketches
Nachdem nun der Pin gewählt wurde kann mit dem Programmieren des Sketches begonnen werden.
Die Funktion um einen Ton auf einem Buzzer zu generiert lautet „tone“ und hat 2 verschiedene Aufrufmöglichkeiten:
- tone(pin, frequenz)
- tone(pin, frequenz, dauer)
Die Wiedergabe des Tones kann man jederzeit mit dem Befehl noTone(pin); abbrechen.
Lied „Alle meine Entchen“
Als erstes wollen wir das Kinderlied „Alle meine Entchen“ auf dem Buzzer Shield abspielen, dazu besorgt man sich die Noten als Texte und dazu die passenden Frequenzen.
Die Frequenzen kann man aus dem Beispiel „ToneMelody“ der Arduino Referenz entnehmen.
Für dieses Lied haben wir die Töne
c, d, e, f, g, g, a, a, a, a, g a, a, a, a, g f, f, f, f, e, e d, d, d, d, c
Welche wir in ein Array speichern und durch die Frequenzen der einzelnen Töne ersetzen.
#define a 1136 //Note a #define c 1915 //Note c #define d 1700 //Note d #define e 1519 //Note e #define f 1432 //Note f #define g 1275 //Note g //Die Noten int notes[] = {c, d, e, f, g, g,-1, a, a, a, a, g,-1, a, a, a, a, g,-1, f, f, f, f, e, e,-1, d, d, d, d, c};
Nun noch die Takte damit das ganze eine „runde“ Melodie ergibt.
//Die länge der Note int takt[] = {2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2};
Zu jeder Note sollte es nun einen Takt geben. (Ich prüfe dieses später in der loop.)
Nun können in einer Schleife die Noten und die dazugehörigen Takte ausgewertet und wiedergegeben werden.
//Die länge des Arrays ermitteln. int numberOfNotes = sizeof(notes)/sizeof(int); //Für jede Note im Array for(int i=0; i<numberOfNotes; i++){ int value = notes[i]; //Holen der Note aus dem Array an der Position i // den Takt * das Tempo int t = takt[i]* tempo; //Wenn die Note den Wert -1 hat dann //eine Pause einlegen if (notes[i] == -1) { delay(t); } else { //Wenn die Note nicht den Wert -1 hat //dann die Note wiedergeben playNote(value, t); } //Eine kleine Pause zwischen den Noten. delay(tempo / 2); }
Der gesamte Sketch
int buzzer=D5; #define a 1136 //Note a #define c 1915 //Note c #define d 1700 //Note d #define e 1519 //Note e #define f 1432 //Note f #define g 1275 //Note g //Die Noten int notes[] = {c, d, e, f, g, g,-1, a, a, a, a, g,-1, a, a, a, a, g,-1, f, f, f, f, e, e,-1, d, d, d, d, c}; //Die länge der Note int beat[] = {2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2}; int tempo = 200; //Das Tempo des Liedes //Anzahl der Noten //hier kann man auch die Länge des Arrays mit der Funktion sizeOf() ermitteln //aber für dieses Beispiel mit einer festen Länge ist das einfacher. const int numberOfNotes = 31; void setup() { Serial.begin(9600); //Begin der seriellen Kommunikation mit 9600 Baud pinMode(buzzer, OUTPUT); //Setzen des Buzzers als Ausgangssignal } void loop() { //Für jede Note im Array for(int i=0; i<numberOfNotes; i++){ int value = notes[i]; //Holen der Note aus dem Array an der Position i // den Takt * das Tempo int b = beat[i]* tempo; //Wenn die Note den Wert -1 hat dann //eine Pause einlegen if (notes[i] == -1) { delay(b); } else { //Wenn die Note nicht den Wert -1 hat //dann die Note wiedergeben playTone(value, b); } //Eine kleine Pause zwischen den Noten. delay(tempo / 2); } //Nachdem das Lied abgespielt wurde eine Pause von 5 sek. einlegen. delay(5000); } //Funktion zum abspielen einer Frequenz. //Erwartet eine Freuqenz (tone) und eine Dauer (duration) void playTone(int tone, int duration) { for (long i = 0; i < duration * 1000L; i += tone * 2) { digitalWrite(buzzer, HIGH); delayMicroseconds(tone); digitalWrite(buzzer, LOW); delayMicroseconds(tone); } }
Hallo Stefan, danke für das Tutorial. Ich beschäftige mich jetzt schon länger mit dem D1mini und behaupte, das ich schon relativ fit im Umgang bin. Zumindest habe ich schon einige kleiner Projekte hinbekommen, ohne Programmierer zu sein. Relais und LEDs schalten funzt, wie gewünscht 😉
Jetzt wollte ich eine akustisches Signal in einen Sketch einbauen. Deshalb habe ich mir auch „dein“ Buzzer-Shield besorgt und auf D5 konfiguriert. Alle Versuche, mit anderen und auch mit deinem Programm funktionieren leider nicht. Der Sketch bricht schon beim Prüfen ab:
alle_meine_entchen:1:12: error: ‚D5‘ was not declared in this scope
int buzzer=D5;
exit status 1
‚D5‘ was not declared in this scope
Liegt das eventuell an der Arduino-Version? Muss man da was updaten? Ich bin echt ratlos!
Hi,
der Compiler kennt D5 nicht, ändere doch mal den Wert auf 5 quasi ohne das D dann sollte es klappen.
Gruß,
Stefan