Diese Anleitung beschreibt, wie du mit Lautsprecher, LCD und Tastenpad Klingeltöne abspielen kannst.
Inhalt
RTTL Klingeltöne
Nokia entwickelte für seine Mobiltelefone Klingeltöne, die z. B. als Anrufsignal abgespielt werden konnten.
Der daraus entwickelte Standard RTTTL (Ring Tone Text Transfer Language) enthält drei Bestandteile:
- den Namen des Klingeltons
- die Dauer der Noten und die verwendete Oktave
- die durch Kommata getrennten Noten (internationale Notenbezeichnung c, d, e, f, g, a, b)
Ein Doppelpunkt trennt die einzelnen Teile.
Beispiel Te Deum:
TeDeum:d=4,o=5,b=63:8c,8f,16f,16g,8a
d=4: Standardnotenlänge Viertelnote
o=5: Angabe der Oktave
b=63: Abspielgeschwindigkeit 63 Schläge pro Minute
8c: Note C als Achtelnote gespielt
🔗 PICAXE bietet Klingeltöne zum Download an.
Jukebox mit Tastenpad und LCD
Die Tasten eines Tastenpads sollen einen Titel auswählen. Dieser Titel wird auf dem LCD angezeigt und mit dem Lautsprecher abgespielt.
Das Programm im Film
Benötigte Bauteile
Die Lautstärke des Lautsprechers kann mit einem Widerstand reduziert werden.
Der Schaltplan
Benötigte Bibliotheken installieren
Klicke auf das Symbol Bibliothek und suche im nächsten Dialog nach der Bibliothek LiquidCrystal I2C und anschließend nach der Bibliothek PlayRtttl:
Bibliotheken einbinden und Variable definieren
# include "PlayRtttl.hpp"
# include "LiquidCrystal_I2C.h"
// Name des LCDs (lcd) festlegen
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Pin des Kautsprechers
# define Lautsprecher 7
// Variable für die gedrückte Taste des Tastenpads
int GedrueckteTaste;
String TitelSong;
char TeDeum[] =
"Charpentier/Te_Deum:d=4,o=5,b=63:8c,8f,16f,16g,8a,8f,c6,8a,8a,8a#,16c6,16a#,16a,16a#,8c6,16g,16f,16g,16a,8g,8c,8f,16f,16g,8a,8f,c6,8a,8a,16a#,16c6,16a,16a#,g,16f,2f";
char FuerElise[] =
"Beethoven/Für_Elise:d=8,o=5,b=125:32p,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,e,g#,b,4c.6,32p,e,e6,d#6,e6,d#6,e6,b,d6,c6,4a.,32p,c,e,a,4b.,32p,d,c6,b,2a";
char OdeandieFreude[] =
"Beethoven/Ode_an_die_Freude:d=4,o=6,b=100:a5,a5,a_5,c,c,a_5,a5,g5,f5,f5,g5,a5,a.5,8g5,2g5,";
char Bolero[] =
"Ravel/Bolero:d=4,o=5,b=80:c6,8c6,16b,16c6,16d6,16c6,16b,16a,8c6,16c6,16a,c6,8c6,16b,16c6,16a,16g,16e,16f,2g,16g,16f,16e,16d,16e,16f,16g,16a,g,g,";
Der setup-Teil
void setup()
{
// LCD starten
lcd.init();
// Hintergrundbeleuchtung des LCDs einschalten
lcd.backlight();
}
Der loop-Teil
Das gedrückte Taste des analogen Keyboards wird mit analogRead am Eingang A0 abgefragt:
int Analogwert = analogRead(A0);
Die Analogen Eingänge liefern Werte zwischen 0 und 1023. Je nach gedrückter Taste ergeben sich diese Werte:
Eine switch case Abfrage weist je nach Wert die entsprechende Aktion zu.
Beispiel Abfrage der linken Taste:
// analogen Wert an A0 abfragen
int Analogwert = analogRead(A0);
switch (Analogwert)
{
case 0 ... 20:
// char-Array des Titels in String umwandeln
TitelSong = String(TeDeum);
// Funktion aufrufen, Interpret/Titel extrahieren
ZeigeTitel(TitelSong);
// Titel spielen
playRtttlBlocking(Lautsprecher, TeDeum);
break;
case 0 … 20 fragt den Wertebereich zwischen 0 und 20 ab. Die übrigen Wertebereiche werden entsprechend zugewiesen.
Beachte das Leerzeichen vor und hinter den drei Punkten!
Der vollständige loop-Teil:
void loop()
{
// Tastenpad am Eingang A0 abfragen
int Analogwert = analogRead(A0);
switch (Analogwert)
{
// linke Taste;
case 0 ... 20:
// char-Array des Titels in String umwandeln
TitelSong = String(TeDeum);
// Funktion aufrufen, Interpret/Titel extrahieren
ZeigeTitel();
// Titel spielen
playRtttlBlocking(Lautsprecher, TeDeum);
break;
// obere Taste
case 30 ... 60:
TitelSong = String(FuerElise);
ZeigeTitel();
playRtttlBlocking(Lautsprecher, FuerElise);
break;
// rechte Taste
case 70 ... 120:
TitelSong = String(OdeandieFreude);
ZeigeTitel();
playRtttlBlocking(Lautsprecher, OdeandieFreude);
break;
// untere Taste
case 150 ... 200:
TitelSong = String(Bolero);
ZeigeTitel();
playRtttlBlocking(Lautsprecher, Bolero);
break;
// rechte äußere Taste -> Menü anzeigen
case 300 ... 400:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("1: Te Deum");
lcd.setCursor(0, 1);
lcd.print("2: F\365r Elise");
lcd.setCursor(0, 2);
lcd.print("3: Ode an die Freude");
lcd.setCursor(0, 3);
lcd.print("4: Bolero");
break;
}
}
Die Funktion Zeigetitel
Der loop-Teil ruft die Funktion ZeigeTitel auf. Der String TitelSong muss jetzt nach Namen des Interpreten und Namen des Titels getrennt werden.
TitelSong = TitelSong.substring(0, TitelSong.indexOf(„:“));
indexOf sucht nach dem ersten Doppelpunkt, substring extrahiert den ersten Teil vom ersten Buchstaben (0) bis zum :
TitelSong.replace(„_“, “ „);
ersetzt alle _ durch Leerzeichen
String Interpret = TitelSong.substring(0, TitelSong.indexOf(„/“));
Die Buchstaben im String TitelSong von 0 bis zum / enthalten den Namen des Interpreten
String Titel = TitelSong.substring(TitelSong.indexOf(„/“) + 1, TitelSong.length());
Der zweite Teil des Strings TitelSong enthält den Titel. Er beginnt mit dem Zeichen hinter dem / (+1) und endet mit der Länge des Strings (length)
void ZeigeTitel()
{
// Teil des Strings bis zum ersten Doppelpunkt kürzen, enthält die Informationen zu Interpret und Titel
TitelSong = TitelSong.substring(0, TitelSong.indexOf(":"));
// _ durch leerzeichen ersetzen
TitelSong.replace("_", " ");
// erster Teil des Strings bis zum / -> Name des Interpreten
String Interpret = TitelSong.substring(0, TitelSong.indexOf("/"));
// zweiter Teil des Strings vom / + 1 bis zum Ende des Strings -> Name des Titels
String Titel = TitelSong.substring(TitelSong.indexOf("/") + 1, TitelSong.length());
// Titel auf dem LCD anzeigen
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Spiele:");
lcd.setCursor(0, 1);
lcd.print(Interpret);
lcd.setCursor(0, 2);
lcd.print(Titel);
}
Funduino - Dein Onlineshop für Mikroelektronik
-
Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
-
Mehr als 3.500 Artikel sofort verfügbar!
-
Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.