UKW-Radio mit dem TEA5767-Modul

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Mit dem Radio­mo­dul TEA5767 soll ein ana­lo­ges Radio gebaut wer­den. Ein Tas­ten­pad erle­digt die Sen­der­wahl, der gewähl­te Sen­der wird auf einem LCD ange­zeigt.
Außer­dem kann der Sen­der auch über den Seri­el­len Moni­tor aus­ge­wählt werden.

UKW-Sen­der

Je nach Sen­de­ge­biet musst du die emp­fang­ba­ren Sen­der her­aus­fin­den. Auf der Sei­te band​scan​.de fin­dest du eine nach Bun­des­län­dern auf­ge­schlüs­sel­te Liste:

Bay­ernhttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​b​a​y​e​r​n​.​php
Baden-Würt­tem­berg:https://​www​.band​scan​.de/​l​i​s​t​e​n​/​b​a​d​e​n​_​w​u​e​r​t​t​e​m​b​e​r​g​.​php
Berlin&Brandenburghttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​b​e​r​l​i​n​.​php
Hes­senhttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​h​e​s​s​e​n​.​php
Niedersachsen&Bremen:https://​www​.band​scan​.de/​l​i​s​t​e​n​/​n​d​s​.​php
Nord­rhein-West­fa­lenhttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​n​r​w​.​php
Meck­len­burg-Vor­pom­mern:https://​www​.band​scan​.de/​l​i​s​t​e​n​/​m​e​c​k​p​.​php
Rheinland-Pfalz&Saarland:https://​www​.band​scan​.de/​l​i​s​t​e​n​/​r​p​s​a​a​r​.​php
Sach­senhttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​s​a​c​h​s​e​n​.​php
Sach­sen-Anhalthttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​s​a​c​h​s​e​n​-​a​n​h​a​l​t​.​php
Schleswig-Holstein&Hamburg:https://​www​.band​scan​.de/​l​i​s​t​e​n​/​h​a​m​b​u​r​g​_​s​h​.​php
Thü­rin­genhttps://​www​.band​scan​.de/​l​i​s​t​e​n​/​t​h​u​e​r​i​n​g​e​n​.​php

Benö­tig­te Bauteile

  • TEA5767-Radio­mo­dul
  • LCD 1602
  • Tas­ten­pad
  • Lei­tungs­dräh­te

Schalt­plä­ne

(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Ardui­no UNO

Wemos D1 Mini

ESP32-Wroom

Board instal­lie­ren:

Benö­tig­te Bibliotheken

Das Pro­gramm

Benö­tig­te Biblio­the­ken ein­bin­den und Varia­blen definieren

# include "TEA5767Radio.h"
# include "Wire.h"
# include "LCDIC2.h"

// 4-zeiliges Display
LCDIC2 lcd(0x27, 20, 4);

// String für die Eingabe im Seriellen Monitor
String Eingabe;

// Name des Radios
TEA5767Radio radio = TEA5767Radio();
/*
  Senderliste Raum Köln
  1Live 87,6
  bigFM 104.9
  Deutschlandfunk 89,1
  Radio Berg 99.7
  Radio Köln 107.1
  RPR1 103.5
  SWR1 92.4
  SWR3 94.8
  SWR4 97.4
  WDR2 98.6
  WDR3 95.9
  WDR4 90,7
  WDR5 88.0
*/

// Anzahl der Sender
# define Anzahl 5

// Variable für den gewählten Sender
int SenderNummer;

// Namen der Sender, je nach dem Empfangsgebiet anpassen
String Senderliste[Anzahl] = 
{ 
 "WDR2 ", "1Live", "WDR4 ", "Radio Berg", "SWR3"
};

// Frequenzen der Sender, Dezimalpunkt beachten
float Frequenzliste[Anzahl]
{
  98.6, 87.6, 90.7, 99.7, 94.8
};

Der set­up-Teil

void setup() 
{
  Wire.begin();
  Serial.begin(9600);

  // LCD starten
  lcd.begin();

  // Cursor "verstecken"
  lcd.setCursor(false);
}

Der loop-Teil

void loop() 
{
  // Tasten des Tastenpads abfragen
  SenderNummer = Tasterabfrage();

  // -1 -> keine Taste gedrückt
  if (SenderNummer !=-1)
  {
    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
  }

  // auf serielle Eingabe warten
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    String Eingabe = Serial.readStringUntil('\n');

    // letztes Zeichen entfernen
    Eingabe.substring(0, Eingabe.length() - 1);

    // Eingabe in Großbuchstaben umwandeln 
    // Groß- und Kleinschreibung der Eingabe möglich
    Eingabe.toUpperCase();

    // Eingabe abfragen -> Zählung beginnt mit 0
    // Namen der Sender anpassen
    if (Eingabe == "WDR2") 
    {
      SenderNummer = 0;
    }

    if (Eingabe == "1LIVE") 
    {
      SenderNummer = 1;
    }
    if (Eingabe == "WDR4") 
    {
      SenderNummer = 2;
    }

    if (Eingabe == "RADIOBERG") 
    {
      SenderNummer = 3;
    }

    if (Eingabe == "SWR3") 
    {
      SenderNummer = 4;
    }

    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
    Serial.println("Sender: " + Senderliste[SenderNummer]);
    Serial.println("Frequenz: " + Frequenz);
  }

  // String Eingabe leeren
  Eingabe = "";
}

Die Funk­ti­on Tasterabfrage

Das Tas­ten­pad am Anschluss A0 gibt einen Wert zwi­schen 0 und 1023 (D1 0 bis 1024) zurück. Die­ser Wert wird in der Varia­ble Ana­log­wert gespei­chert. Je nach dem ermit­tel­ten Wert wird der Sen­der (Sen­der­num­mer) fest­ge­legt. Lei­der ver­lau­fen die die abge­frag­ten Wer­te für den Ardui­no UNO und den D1 Mini sehr unterschiedlich.

Beim ESP32 gibt es eine Beson­der­heit: der ADC-Wand­ler arbei­tet mit einer Auf­lö­sung von 12 Bit. Die digi­ta­len Wer­te befin­den sich zwi­schen 0 und 4095.

Ardui­no UNO 

int Tasterabfrage()
{
  int Analogwert = analogRead(A0);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */

  // für die Anzeige des Werts Kommentarzeichen entfernen
  // Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 20:
      SenderNummer = 0;
      break;

    // oben
    case 30 ... 60:
      SenderNummer = 1;
      break;

    // unten
    case  70 ... 120:
      SenderNummer = 2;
      break;
      
    // rechts
    case 150 ... 200:
      SenderNummer = 3;
      break; 
    
     // rechts außen
     case 300 ... 400:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }

  // gedrückte Taste zurückgeben
  return SenderNummer;
}

D1 Mini

int Tasterabfrage()
{
  int Analogwert = analogRead(A0);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 20:
      SenderNummer = 0;
      break;

    // oben
    case 30 ... 100:
      SenderNummer = 1;
      break;

    // unten
    case 120 ... 180:
      SenderNummer = 2;
      break;
      
    // rechts
    case 200 ... 300:
      SenderNummer = 3;
      break; 
    
    // rechts außen
     case 500 ... 600:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }
  
  // gedrückte Taste zurückgeben
  return SenderNummer;
}

ESP32-Wroom

int Tasterabfrage()
{
  int Analogwert = analogRead(35);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  // Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 50:
      SenderNummer = 0;
      break;

    // oben
    case 0 ... 200:
      SenderNummer = 1;
      break;

    // unten
    case 300 ... 700:
      SenderNummer = 2;
      break;
      
    // rechts
    case 900 ... 1200:
      SenderNummer = 3;
      break; 
    
    // rechts außen
     case 1800 ... 2500:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }
  
  // gedrückte Taste zurückgeben
  return SenderNummer;
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:

Letzte Aktualisierung: 16. Feb 2024 @ 9:48