Page 1 of 1

TEA5767 FM Radio with rotary encoder - Arduino for beginners

Posted: 02 Oct 2021 20:19
by Levy
Dupa cum am scris la descrierea rotary encoder, urmatorul mic proiect va fi un radio FM care sa fie controlat de acest encoder.

La schema encoderului am adaugat TEA5767, care este un disoozitiv I2C, si se conecteaza la arduino pentru control cu 2 fire, SDA si SCL, care corespund in acest caz cu pini analogici de pe arduino A4 si A5. A se vedea documentatia pentru alte modele de arduino, la Uno este identic cu nano. Bineinteles la cele doua fire de date cu care coordonam functionarea modulului FM se mai adauga inca doua conductoare, unul pentru +5V CC si cel de masa GND.

Image

Pe iesirea de antena se conecteaza antena cu care vine acest modul, iar pe iesirea casti se pot conecta casti sau un amplificator audio dedicat. In acest caz s-au folosit niste difuzoare de la un PC care nu au mai fost folosite.

Codul la care am ajuns in aceasta configuratie este urmatorul:

Code: Select all

#include <Wire.h>
#include <TEA5767Radio.h>

#define CLK 2
#define DT 3
#define SW 4
TEA5767Radio radio = TEA5767Radio();

float counter = 107.7;
int currentStateCLK;
int lastStateCLK;

String currentDir ="";
unsigned long lastButtonPress = 0;


void setup()
     {
           pinMode(CLK,INPUT);
          pinMode(DT,INPUT);
          pinMode(SW, INPUT_PULLUP);
         lastStateCLK = digitalRead(CLK);
         Serial.begin(9600);
          Serial.print(" Frecvency: ");
          Serial.println(counter);
         Wire.begin();
         radio.setFrequency(107.7);
     }

void loop()
     {
          currentStateCLK = digitalRead(CLK);
         if (currentStateCLK != lastStateCLK  && currentStateCLK == 1)
           {
              if (digitalRead(DT) != currentStateCLK)
                 {
                       counter = counter + 0.1;
                    if (counter > 108.1)
                       {
                         counter = 87.5;
                       }
                       currentDir ="UP";
                    radio.setFrequency(counter);
                   } else
                      {
                             counter = counter - 0.1;
                          if (counter < 87.5)
                             {
                                counter = 108;
                             }
                       currentDir ="DOWN";
                    radio.setFrequency(counter);
                        }
                Serial.print("Direction: ");
                Serial.print(currentDir);
                Serial.print(" - Frecvency: ");
                Serial.println(counter);
           }
   
  lastStateCLK = currentStateCLK;
  int btnState = digitalRead(SW);
   if (btnState == LOW)
        {
             if (millis() - lastButtonPress > 50)
              {
                    Serial.println("Button pressed!");
                }
             lastButtonPress = millis();
         }
     delay(1);
     }

Proiectul este relativ simplu de realizat de incepatori si se poate continua sau extinde, cu un afisaj LCD si cu alte functii, autoscan etc...
Nu am incercat inca, dar cred ca acest modul poate furniza si date RDS cu ajutorul caruia sa afisam pe un ecran LCD numele canalului receptionat.

Un scurt video despre realizarea acestui montaj puteti vedea aici:

phpBB [video]


Spor la bricolat ! :drink: