Jukebox mit Klingeltönen

 

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:

 

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

Beispiele für Lautsprecher

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ück­te Tas­te des analogen Keyboards wird mit ana­logRead am Ein­gang A0 abgefragt:

int Ana­log­wert = analogRead(A0);

Die Ana­lo­gen Ein­gän­ge lie­fern Wer­te zwi­schen 0 und 1023. Je nach gedrück­ter Tas­te erge­ben sich die­se Werte:

 

Eine switch case Abfra­ge weist je nach Wert die ent­spre­chen­de Akti­on zu.

Bei­spiel Abfra­ge der lin­ken Taste:

 

				
					// analogen Wert an A0 abfragen
int Ana­log­wert = 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 Wer­te­be­reich zwi­schen 0 und 20 ab. Die übri­gen Wer­te­be­rei­che wer­den ent­spre­chend 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.
SALE