TEA5767 FM Radio with rotary encoder - Arduino for beginners

Discutii despre placile de dezvoltare compatibile Arduino
User avatar
Levy
Gold User
Posts: 1581
Joined: 02 Oct 2013 15:07
Location: ABSURDISTAN

TEA5767 FM Radio with rotary encoder - Arduino for beginners

Unread postby Levy » 02 Oct 2021 20:19

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:
Dacă ai tăiat și ultimul copac, ai otrăvit și ultimul râu și ai prins și ultimul pește, ai să fi uimit să constați că banii nu sunt comestibili !

Image

Return to “Arduino”

Who is online

Users browsing this forum: No registered users and 14 guests