Merhabalar, Robo90 firmasından satın almış olduğum aşağıdaki elektronik parçalar ve Arduino kodlama ile yapmış olduğum FM Radyo devresi çalışmasını aşağıda görecekseniz.
Elektronik Parçalar;
1-Nokia 5110 LCD Ekran – 84×48 – Arduino Uyumlu https://www.robo90.com/nokia-5110-lcd-ekran-84×48-arduino-uyumlu
2-TEA5767 FM Stereo Radyo Modülü https://www.robo90.com/tea5767-fm-stereo-radyo-modulu
3-Arduino Nano Klon https://www.robo90.com/arduino-nano-klon
4-PAM8403 2x3W Mini Ses Yükseltici Kartı – Stereo – Amfi-Potlu https://www.robo90.com/pam8403-2x3w-mini-ses-yukseltici-karti-stereo-amfi-potlu
5-Rotary Encoder Modülü – KY-040 – Arduino Uyumlu https://www.robo90.com/rotary-encoder-modulu-ky-040-arduino-uyumlu
6-Hoparlör: 4 ohm 3 watt
7-Seetronic MTP3C Stereo 3.5mm Jak (TEA5767 hoparlör çıkışı için)
Uygulama Videosu
Arduino kod yazılımını da aşağıya ekliyorum.
Dikkat etmeniz gerekenler için;
1-Kod içinde kullanılan kütüphanelerin linkleri aynı satırda verilmiştir. Bu linkleri kullanarak kütüphaneleri indirebilirsiniz.
2-FreeSerif18pt7b, FreeSerifItalic9pt7b ve FreeMono12pt7b kütüphanelerini indirdikten sonra, aşağıdaki kodlarla oluşturacağınız .ino uzantılı arduino programının yer aldığı klasör içine taşıyın ve sırasında program kodlarınızı Arduino Nano içine yükleyin.
Kablo Şeması
Arduino Kodu
Kullanılan program kodu aşağıdadır.
#include <TEA5767N.h> //https://github.com/mroger/TEA5767
#include <SPI.h>
#include <Adafruit_GFX.h> //https://github.com/adafruit/Adafruit-GFX-Library
#include <Adafruit_PCD8544.h> //https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
#include "FreeSerif18pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeSerif18pt7b.h
#include "FreeSerifItalic9pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeSerifItalic9pt7b.h
#include "FreeMono12pt7b.h" //https://github.com/adafruit/Adafruit-GFX-Library/blob/master/Fonts/FreeMono12pt7b.h
#include "splash.h"
#include <ClickEncoder.h> //https://github.com/0xPIT/encoder
#include <TimerOne.h> //https://github.com/PaulStoffregen/TimerOne
#include <EEPROM.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
int SaniyeOtoKayit = 300;
float onceki_frekans = 0;
float frekans = 95.0f;
ClickEncoder *encoder;
int16_t son_deger, value;
boolean yukari = false;
boolean asagi = false;
boolean orta = false;
long saniye_degeri = 0;
long oncekiler = 0;
bool arkaisikACIK = false;
long aralik = 1000;
TEA5767N radyo = TEA5767N();
void setup()
{
pinMode(7, OUTPUT);
digitalWrite(7,HIGH);
initDisplay();
acilissayfasigoster();
radyo.setMonoReception();
radyo.setStereoNoiseCancellingOn();
RotaryEncoderVeri();
Serial.begin(9600);
frekans = readFrequencyFromEEPROM();
if(isnan(frekans))
{
Serial.println("setup(): EEPROM icinde frekans degeri yoktur.");
frekans = 88.0;
writeFrequencyToEEPROM(&frekans);
}
printText(String(frekans,1),String(frekans,1));
}
void loop() {
unsigned long mevcutlar = millis();
RotaryEncoderKontrol();
if(mevcutlar - oncekiler > aralik)
{
if(frekans!=onceki_frekans)
{
onceki_frekans = frekans;
radyo.selectFrequency(frekans);
saniye_degeri = 0;
}else
{
saniye_degeri++;
if(saniye_degeri == SaniyeOtoKayit)
{
float frekans_oku = readFrequencyFromEEPROM();
if(frekans_oku!=frekans)
{
Serial.println("Dongu(): Yeni frekans EEPROM icine kaydediliyor.");
writeFrequencyToEEPROM(&frekans);
}
}
}
oncekiler = mevcutlar;
Serial.println("loop(): "+String(saniye_degeri));
}
readRotaryEncoder();
if(yukari)
{
yukari = false;
onceki_frekans = frekans;
frekans = frekans+0.1f;
printText(String(frekans,1),String(onceki_frekans,1));
}
if(asagi)
{
asagi = false;
onceki_frekans = frekans;
frekans = frekans-0.1f;
printText(String(frekans,1),String(onceki_frekans,1));
}
}
void printText(String yazi, String onceki_yazi)
{
display.clearDisplay(); // clears the screen and, WHITE buffer
if(onceki_yazi.length() == 4)
{
display.setFont(&FreeSerifItalic9pt7b);
}else
{
display.setFont(&FreeSerifItalic9pt7b);
}
display.setTextColor(WHITE);
display.setCursor(5,11);
display.println("Gulru FM");
display.setFont(&FreeSerif18pt7b);
display.setCursor(4,44);
display.println(onceki_yazi);
display.display();
if(yazi.length() == 4)
{
display.setFont(&FreeSerifItalic9pt7b);
}else
{
display.setFont(&FreeSerifItalic9pt7b);
}
display.setTextColor(BLACK);
display.setCursor(5,11);
display.println("Gulru FM");
display.setFont(&FreeSerif18pt7b);
display.setCursor(4,44);
display.println(yazi);
display.display();
}
void RotaryEncoderVeri()
{
encoder = new ClickEncoder(A1, A0, A2);
encoder->setAccelerationEnabled(false);
Timer1.initialize(1000);
Timer1.attachInterrupt(timerIsr);
son_deger = encoder->getValue();
}
void initDisplay()
{
display.begin();
display.setContrast(60);
display.clearDisplay(); // clears the screen and, WHITE buffer
display.display();
}
void timerIsr()
{
encoder->service();
}
void acilissayfasigoster()
{
display.clearDisplay();
//display.drawBitmap(0, 0, SPLASH, 84, 48, 1);
display.setTextSize(2);
display.setCursor(3, 0);
display.print(" GULRU");
display.setCursor(3, 20);
display.print(" RADYO");
display.display();
delay(5000);
display.clearDisplay(); // clears the screen and, WHITE buffer
display.setTextSize(1);
}
void writeFrequencyToEEPROM(float *freq)
{
byte ByteArray[4];
memcpy(ByteArray, freq, 4);
for(int x = 0; x < 4; x++)
{
EEPROM.write(x, ByteArray[x]);
}
Serial.println("writeFrequencyFromEEPROM(): "+String(frekans));
}
float readFrequencyFromEEPROM()
{
float frekans = 86.0;
byte ByteArray[4];
for(int x = 0; x < 4; x++)
{
ByteArray[x] = EEPROM.read(x);
}
memcpy(&frekans, ByteArray, 4);
Serial.println("readFrequencyFromEEPROM(): "+String(frekans));
return frekans;
}
void RotaryEncoderKontrol()
{
ClickEncoder::Button b = encoder->getButton();
if (b != ClickEncoder::Open) {
if(b==ClickEncoder::Clicked)
{
Serial.println("Toggle BackLight");
if(arkaisikACIK == false)
{
arkaisikACIK = true;
turnOnBacklight();
}else
{
arkaisikACIK = false;
turnOffBacklight();
}
}
}
}
void turnOnBacklight()
{
digitalWrite(7,LOW);
}
void turnOffBacklight()
{
digitalWrite(7,HIGH);
}
void readRotaryEncoder()
{
value += encoder->getValue();
if (value/2 > son_deger) {
son_deger = value/2;
yukari = true;
delay(50);
}else if (value/2 < son_deger) {
son_deger = value/2;
asagi = true;
delay(50);
}
}