Güncelleme: 23.11.2024
CesarSound isimli kullanıcının Arduino Project Hub'da bir projesine rastladım: "AM/FM/SW Radio Receiver - Si4730 / Si4735 © GPL3+"
Radyo alıcılarına merakım olduğundan, incelemeye başladım. Radyo, Silicon Labs'ın ürettiği Si47XX tümdevreleri etrafına kurulmuş. Bu tümdevreye bir Arduino ile kumanda ediliyor ve teknik veriler de 1.8 inçlik renkli bir LCD ekranda gösteriliyor. 150 kHZ ilâ 30 MHZ arasında AM modunda, 76 ilâ 108 MHz arasında WFM modunda çalışabiliyor. Eğer Si4735 tümdevresini kullanırsanız SSB de dinleyebiliyorsunuz.
PL102 modül |
Yeni devre böyle olacak. Kutuya pil ve hoparlör böyle yerleşecek.
Si4730'un adaptör PCB'sine lehimlenmiş hâli. PCB'nin fazladan 2+2 bacağını kesmek yerine, boş bıraktım.
18 Aralık 2020
Dün gece nihayet bitirdim ana devreyi. Ama bir an önce ve heyecanla devrenin çalışmasını görmek istediğimden olacak, baskı devreyi ters basmışım! Oturup yeniden baskı devre basmak yerine, normal yüze monte edilecek elemanları da bakırlı yol tarafına lehimleyerek devreyi çalıştırdım. Saat gecenin 03'ü idi.
23 Aralık 2020 - Mutluluk ve hayal kırıklığı
Devreyi çalıştırdım. Ama bir noksanıyla: Devre maalesef LW ve SW bandlarında çalışmıyordu. Acaba tümdevreyi mi bozdum diyerek bir tümdevre daha monte ettim adaptör PCB'sine. Hayır, netice yine aynıydı. FM'de gümbür gümbür çalışan devre, MW'de oldukça gürültülü bir şekilde çalışıyor, LW ve SW'de çalışmıyordu.
Önce CesarSound takma isimli kullanıcı ile haberleştim. "Ben ve ardkaşlarımın kurduğu bütün devreler çalıştı" diyordu. Ama onlar hep PL102BA-S modül kullanmışlardı. Daha sonra bu konuda oldukça iyi çalışmaları olan PU2CLR çağrı işaretli Ricardo Lima Caratti'ye konuyu açtım. O da hayretler içindeydi. Zira o, benim gibi Si4730-D60 tümdevresini kullanmış ve alıcı bütün bandlarda çalışıyormuş. "Acaba bu Çinliler sahte tümdevre mi gönderdiler? Bu tümdevre Si4730-D60 değil mi?" diye düşünmeye başladım. Zira bu tümdevrenin D60 olmayan versiyonları sadece MW ve FM bandlarında çalışıyordu. PU2CLR'nin bir test programcığı var, onu kullanarak baktım tümdevre gerçekten de Si4730-D60. Peki ne oluyordu? Konuyla ilgili gruplara vs. bakıp yazışırken bir şey öğrendim: Bu tümdevrenin belli bir târihten önce üretilmişleri LW ve SW'de çalışmıyordu. (Şimdilik varabildiğimiz tek sonuç bu.)
Kaderime küstüm ve MW ve FM'de çalışan bir devre olarak kaldı uygulama. Aynı devre Si4735-D60 tümdevresi ile kullanıldığında, 150 kHz - 30 MHz arasında AM ve SSB kiplerinde çalışabiliyor.
Bu arada, devreyi tek bir li-ion pil ile besleyip, bir gerilim yükseltici ile 5v elde etmeyi, ses frekansı güç kuvvetlendiricisi olarak da D sınıfı hazır bir modül kullanmayı plânlamıştım. Ancak hem gerilim yükseltme devresi ve hem de D sınıfı amplifikatör -anahtarlamalı çalışma sistemleri sebebiyle- özellikle MW alışında çok gürültüye sebep oluyor. Bu yüzden, bir dengeleyici devresiyle 2 adet li-ion pil ve amplifikatör olarak LM386 kullandım. Bu yeni yapılanmayı gösteren yerleştirme planı aşağıdadır. Alış şimdi çok iyi. Sayfanın en altında gerçekleştirdiğim devrenin kısa bir videosu var.
Şimdi bir Si4735-D60 temin edip devam etmek düşüncesine geldim.
Sâdece AM ve FM bandında çalışan devre için, orijinal yazılımı kısalttım ve çalışmayan bandları çıkarttım.
YAZILIM
Yeni yazılımın kodları aşağıdadır.
Devrenin baskı devre planları ve yazılımıyla ilgili bilgilere https://qsl.net/ta2ei adresinden ulaşabilirsiniz.
Ayrıca, https://github.com/RecepAGulec/Si4735-ALICI-TFT-Ekran adresinde yazılımı bulabilirsiniz.
/*******************************************************************************************************************************************************
SI4735/30 AM/FM STEREO - LW/MW/SW/CB RADIO RECEIVER WITH ST7735 COLOR TFT (LIB TFT_ST7735 BODMER) ARDUINO NANO/UNO/PRO MINI - WRITE BY JCR FEB/2020 RECEPTION RANGE: AM 150kHz TO 30MHz - FM 64 TO 108MHz
VERSION TO SHARE - JUN/2020
REV.2.1a - NOV/2020
********************************************************************************************************************************************************
ELECTRIC CONNECTIONS (ALSO SEE THE SCHEMATICS):
ST7735 DISPLAY PIN CONNECTION TO ARDUINO NANO/UNO/PRO MINI:
LED (BACKLIGHT) - 5V(VIA 100R RESISTOR SERIES); SCK - D13; SDA - D11; AO - D9; RESET - D8; CS - D10; GND - GND; VCC - 5V
ROTARY ENCODER TO ARDUINO: D2; GND; D3
PUSH BUTTONS:
BAND SELECT - A0; TUNING STEPS (1k / 5k / 10k) - A1; AM IF FILTER SEL - A2; COLOR THEME - A3 (NOTE: THE OTHER SIDE OF P.B. IS CONNECTED TO GND)
SI4735/30: SDA - A4 (VIA 1k RESISTOR SERIES); SCL - A5 (VIA 1k RESISTOR SERIES); RESET - D7 (VIA 10k RESISTOR SERIES); VCC - 3.3V; GND - GND
*********************************************************************************************************************************************************
ATTENTION!
-MUST INSTALL AND USE THE LIBRARIES LOCATED IN "INSTALL THESE LIBRARIES" FOLDER
-PLEASE BELOW CHOOSE THE CORRECT I2C ADDRESS FOR YOUR SI4730/35 (0x11 OR 0x63), BEFORE TO START. MODULE PL102BA-S V2.11 USE 0x63
-FOLLOW THE WIRING AS INDICATED ON SCHEMATICS
-WORKS WITH IC SI4730-D60 AND SI4731/32/34/35 OR RADIO MODULE PL102BA-S V2.11
-FOR ICs SI4730/31/34/35 - D60 A 10k PULLUP RESISTOR MUST BE USED IN EACH I2C LINES. FOR PL102BA-S MODULE PULLUPS NOT REQUIRED
*********************************************************************************************************************************************************/
#include <SPI.h>
#include "Wire.h"
#include <TFT_ST7735.h> //BODMER graphics and font library for ST7735 driver chip
#include <Si4735.h> //MICHAEL KENNEDY SI4735 I2C library modified by JCR
#include <Rotary.h> //BUXTON Rotary encoder library
TFT_ST7735 tft = TFT_ST7735(); //Invoke library, pins defined in User_Setup.h
Rotary r = Rotary(3, 2);
Si4735 radio;
const byte band = A0; //Band seçimi
const byte frstep = A1; //Tuning adımları
const byte filtsel = A2; //IF filtresi seçimi
const byte modesel = A3; //Renk düzenini değiştirir
byte SI7435_ADDRESS = 0x63; //I2C ADDRESS OF SI4735: 0x11 (SEN PIN TO GND) or 0x63 (SEN PIN TO 3v3)
const int bl[22] = {"160 ", "120 ", "90m ", "80m ", "75m ", "60m ", "49m ", "40m ", "41m ", "31m ", "30m ",
"25m ", "22m ", "20m ", "19m ", "17m ", "16m ", "15m ", "13m ", "12m ", "11m ", "10m "
};
unsigned int freq;
unsigned int fstep;
unsigned int freqold;
int sm, sm_old, mx, mod;
int stp = 0; // orj. 2
int mode = 2;
byte encoder = 1;
byte count = 6;
byte filter = 0x03;
byte fil = 4;
byte fr_h;
byte fr_l;
byte ssb_m = 0x00; //0x00 AM;
byte mw_sw = 0x00; //0x00 MW ; 0x01 SW
byte am_fm = 0x40; //0x40 AM ; 0x20 FM
int period = 100; //millis period timer for refresh RSQ
unsigned long time_now = 0; //millis init timer for refresh RSQ
int period_sm = 1000; //millis period timer for S-meter val peak hold
unsigned long time_now_sm = 0; //millis init timer S-meter val peak hold
uint16_t ca = 0x0005; //Mâvi - Arka plan
uint16_t cb = 0xFFFF; //Beyaz - Metin rengi (ORIG 0x07FF Cyan)
uint16_t cc = 0xFFFF; //Beyaz - çizgiler
uint16_t cd = 0x3FE0; //Yeşil - Smetre göstergesi
uint16_t ce = 0xF81F; //Macenta - MD göstergesi
uint16_t cf = 0x0000; //Siyah - SM/MD'nin zemin rengi
uint16_t cg = 0x1FFF; //Beyaz - Frekans rengi //eski değeri 0xFFFF
uint16_t ch = 0x07FF; //Camgöbeği - RIT göstergesi
void setup() {
tft.init();
tft.setRotation(1); // LCD ekranın yönünü belirleme
SPI.begin();
Wire.begin();
start_msg();
tft.fillScreen(ca); //
pinMode(band, INPUT_PULLUP);
pinMode(frstep, INPUT_PULLUP);
pinMode(filtsel, INPUT_PULLUP);
pinMode(modesel, INPUT_PULLUP);
radio.begin(0, SI7435_ADDRESS);
power_up_norm();
delay(400);
am_command();
count = 1; //Açılışta hangi band çalışacak?
bandpresets();
layout();
setstep();
frequency();
smeter();
band_ind();
filterAM();
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
}
void loop() {
if (freqold != freq) {
freqold = freq;
tune_freq();
frequency();
}
if ((digitalRead(band)) == LOW) {
inc_preset();
while (digitalRead(band) == LOW);
}
if ((digitalRead(frstep)) == LOW) {
if (am_fm != 0x20) inc_step();
if (am_fm == 0x20) setstepFM();
while (digitalRead(frstep) == LOW);
}
if ((digitalRead(filtsel)) == LOW) {
if (am_fm != 0x20) filterAM();
if (am_fm == 0x20) filterFM();
while (digitalRead(filtsel) == LOW);
}
if (digitalRead(modesel) == LOW) {
delay(500);
ca = 0x0000; //Siyah
cb = 0xFFFF; //Beyaz
cc = 0xFFFF; //Beyaz
cd = 0xF81F; //Macenta //0x001F; //Mâvi
ce = 0xF81F; //Macenta
cg = 0x3FE0; //Yeşil
ch = 0x07FF; //Camgöbeği
tft.fillScreen(ca);
//tft.setTextSize(1);
tft.setTextColor(cb, ca);
//tft.setCursor(20, 20);
layout();
bandpresets();
frequency();
if (am_fm != 0x20) {fil = 4; filterAM();}
if (am_fm == 0x20) {fil = 0; filterFM();}
}
if (millis() > time_now + period) {
time_now = millis();
rsq();
smeter();
modgraf();
if (am_fm != 0x20) band_ind();
if (am_fm == 0x20) pilot();
}
if (sm > mx) mx = sm;
if (millis() - time_now_sm >= period_sm) {
time_now_sm = millis();
mx = sm;
}
}
ISR(PCINT2_vect) {
char result = r.process();
if (result == DIR_CW)
set_frequency(1);
else if (result == DIR_CCW)
set_frequency(-1);
}
void set_frequency(short dir) {
if (encoder == 1) { //AM band sınırları
if (dir == 1) freq = freq + fstep;
if (freq >= 1701) freq = 1701;
if (dir == -1) freq = freq - fstep;
if (freq <= 531) freq = 531;
}
if (encoder == 2) { //FM band sınırları
if (dir == 1) freq = freq + fstep;
if (freq >= 10800) freq = 10800;
if (dir == -1) freq = freq - fstep;
if (freq <= 8750) freq = 8750;
}
}
void inc_preset() {
count++;
if (count > 2)
count = 1;
bandpresets();
delay(50);
}
void bandpresets() {
tft.setTextSize(1);
tft.setTextColor(cb, ca);
switch (count) {
case 1:
encoder = 1;
radio.begin(0, SI7435_ADDRESS);
power_down();
power_up_norm();
delay(200);
ssb_m = 0x00;
freq = 531;
am_fm = 0x40;
tune_freq();
am_command();
filter = 0x03;
stp = 3;
setstep();
tft.drawString("MW ", 30, 57, 2);
tft.drawString("2k ", 135, 74, 2);
break;
case 2:
encoder = 2;
power_down();
power_up_FM();
delay(200);
am_fm = 0x20;
ssb_m = 0x00;
freq = 10280;
fstep = 10;
tune();
radio.setMode(FM);
fil = 0; filterFM();
stp = 0; setstepFM();
break;
}
if (am_fm == 0x20) {
tft.setTextColor(cg, ca); tft.drawString("MHz", 132, 57, 2); tft.setTextColor(cb, ca); tft.drawString("FM ", 3, 57, 2);
}
else {
tft.setTextColor(cg, ca); tft.drawString("kHz ", 132, 57, 2); tft.setTextColor(cb, ca); tft.drawString("AM ", 3, 57, 2);
}
}
void filterAM() {
tft.setTextSize(1);
tft.setTextColor(cb, ca);
switch (fil) {
case 0:
fil = 1;
filter = 0x00; tft.drawString("6k ", 135, 74, 2);
break;
case 1:
fil = 2;
filter = 0x01; tft.drawString("4k ", 135, 74, 2);
break;
case 2:
fil = 3;
filter = 0x02; tft.drawString("3k ", 135, 74, 2);
break;
case 3:
fil = 4;
filter = 0x06; tft.drawString("2k5", 135, 74, 2);
break;
case 4:
fil = 5;
filter = 0x03; tft.drawString("2k ", 135, 74, 2);
break;
case 5:
fil = 6;
filter = 0x05; tft.drawString("1k8", 135, 74, 2);
break;
case 6:
fil = 0;
filter = 0x04; tft.drawString("1k ", 135, 74, 2);
break;
}
property_filter_AM();
}
void filterFM() {
tft.setTextSize(1);
tft.setTextColor(cb, ca);
switch (fil) {
case 0:
fil = 1;
filter = 0x00; tft.drawString("Otm", 135, 74, 2);
break;
case 1:
fil = 2;
filter = 0x01; tft.drawString("110", 135, 74, 2);
break;
case 2:
fil = 3;
filter = 0x02; tft.drawString("84k", 135, 74, 2);
break;
case 3:
fil = 4;
filter = 0x03; tft.drawString("60k", 135, 74, 2);
break;
case 4:
fil = 0;
filter = 0x04; tft.drawString("40k", 135, 74, 2);
break;
}
fm_command();
}
void inc_step() {
stp++;
if (stp > 4)
stp = 1;
setstep();
delay(50);
}
void setstep() {
tft.setTextSize(1);
tft.setTextColor(cb, ca);
switch (stp) {
case 1:
fstep = 1; // 1kHz
tft.drawString("1k ", 100, 57, 2);
break;
case 2:
fstep = 5; // 5kHz
tft.drawString("5k ", 100, 57, 2);
break;
case 3:
fstep = 9; // 9kHz
tft.drawString("9k ", 100, 57, 2); //MW'da adımlar 9 kHz olduğu için ekledim.
break;
case 4:
fstep = 10; // 10kHz
tft.drawString("10k", 100, 57, 2);
break;
}
}
void setstepFM() {
tft.setTextSize(1);
tft.setTextColor(cb, ca);
switch (stp) {
case 0:
stp = 1;
fstep = 10; // 50kHz
tft.drawString(" x1", 100, 57, 2);
break;
case 1:
stp = 0;
fstep = 20; // 100kHz
tft.drawString(" x2", 100, 57, 2);
break;
}
}
void frequency() { //Frekans göstergesindeki rakkamların biçimi
tft.setTextColor(cg, ca);
if (freq >= 10000) tft.drawNumber(freq, 0, 1, 7); if (freq < 10000 && freq >= 1000) tft.drawNumber(freq, 32, 1, 7);
if (freq < 1000 && freq >= 100) tft.drawNumber(freq, 64, 1, 7); if (freq < 100 && freq >= 10) tft.drawNumber(freq, 96, 1, 7);
if (freq < 10) tft.drawNumber(freq, 128, 1, 7); if (freq < 10000) tft.fillRect (2, 1, 28, 48, ca);
if (freq < 1000) tft.fillRect (34, 1, 28, 48, ca);
if (am_fm == 0x40 && freq >= 1000) tft.fillCircle(63, 51, 2, cg); else tft.fillCircle(63, 51, 2, ca);
if (am_fm == 0x20) tft.fillCircle(95, 51, 2, cg); else tft.fillCircle(95, 51, 2, ca);
}
void smeter() { //BARGRAPH SIGNAL METER
if (sm > 90) sm = 90;
tft.fillRect(31, 111, sm, 14, cd); // BAR DIRECT
tft.fillRect(31 + sm, 111, 90 - sm, 14, ST7735_BLACK); // BAR INVERSE
tft.setTextSize(1);
tft.setTextColor(cb, ca);
if (mx < 1) tft.drawString("S0 ", 136, 110, 2);
if ((mx >= 1) && (mx < 10)) tft.drawString("S1 ", 136, 110, 2);
if ((mx >= 10) && (mx < 25)) tft.drawString("S3 ", 136, 110, 2);
if ((mx >= 25) && (mx < 35)) tft.drawString("S5 ", 136, 110, 2);
if ((mx >= 35) && (mx < 55)) tft.drawString("S7 ", 136, 110, 2);
if ((mx >= 55) && (mx < 65)) tft.drawString("S9 ", 136, 110, 2);
if ((mx >= 65) && (mx < 75)) tft.drawString("+20", 136, 110, 2);
if ((mx >= 75) && (mx < 80)) tft.drawString("+40", 136, 110, 2);
if (mx >= 80) tft.drawString("+60", 136, 110, 2);
}
void modgraf() { //BARGRAPH SIGNAL TO NOISE
int mod_g = map(mod, 0, 65, 65, 0);
tft.fillRect(26, 77, mod_g, 10, ch); // BAR DIRECT
tft.fillRect(26 + mod_g, 77, 65 - mod_g, 10, ST7735_BLACK); // BAR INVERSE
}
void layout() {
tft.setTextColor(TFT_WHITE, TFT_BLUE);
tft.drawFastHLine(0, 56, 160, cc); //125
tft.drawFastVLine(125, 56, 20, cc);
tft.drawFastHLine(0, 73, 160, cc);
tft.drawFastHLine(0, 90, 160, cc);
tft.drawFastHLine(0, 107, 160, cc);
tft.drawFastVLine(125, 107, 20, cc);
tft.setTextSize(1);
tft.setTextColor(cb, ca);
tft.drawString("JCR", 3, 91, 2);
tft.drawString(" DSP MW-FM ALICI ", 30, 91, 2);
tft.drawString("MD", 3, 74, 2);
tft.drawString("BWF", 105, 74, 2);
tft.drawString("S|dB", 3, 110, 2);
}
void start_msg() {
tft.fillScreen(TFT_BLACK);
tft.setTextSize(1);
tft.setTextColor(TFT_WHITE, TFT_BLACK);
tft.drawString("JCR Radio 2020", 23, 10, 2);
tft.drawString("DSP MW - FM RECEIVER ", 3, 40, 2);
tft.drawString("REVISION 2.1a", 35, 70, 2);
tft.setTextColor(TFT_CYAN, TFT_BLACK);
tft.drawString("mod: TA2EI", 44, 100, 2);
delay(2000);
}
void band_ind() {
tft.setTextSize(1); tft.setTextColor(cb, ca);
if (freq >= 1800 && freq <= 2000) tft.drawString(bl[0], 30, 57, 2);
}
//----------------------------------------------------------------------------------------------------------------
void tune_freq() {
fr_h = (freq) >> 8; //Ondalık sayı iki byte'lık hexadesimal sayıya dönüştürülecek
fr_l = (freq) & 0x00FF;
if ((freq) < 1800) { //MW ayar kapasitörü - 0x00 - MW ; 0x01 - SW
mw_sw = 0x00;
}
else (mw_sw = 0x01);
tune();
}
void rsq() {
RSQMetrics rsq;
radio.getRSQ(&rsq);
sm = (rsq.RSSI);
mod = (rsq.SNR);
}
void pilot() {
RSQMetrics rsq;
radio.getRSQ(&rsq);
tft.setTextSize(1);
tft.setTextColor(cb, ca);
if (am_fm == 0x20) {
if (rsq.stereo == 1)
tft.drawString("> Stereo <", 30, 57, 2);
if (rsq.stereo == 0)
tft.drawString("< Mono >", 30, 57, 2);
}
}
void am_command() {
radio.setProperty(PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 1); // 0 (OFF) - 63
radio.setProperty(PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x32C8); // 0x1000 - 0x7800
radio.setProperty(PROP_AM_AGC_ATTACK_RATE, 4); // 4–248
radio.setProperty(PROP_AM_AGC_RELEASE_RATE, 4); // 4–248
}
void fm_command() {
radio.setProperty(PROP_FM_DEEMPHASIS, 0x0001); // 02 = 75 μs; 01 = 50 μs
radio.setProperty(PROP_FM_CHANNEL_FILTER, filter); // 0 = automat; 1 = 110kHz; 4 = 40kHz
radio.setProperty(PROP_FM_SOFT_MUTE_MAX_ATTENUATION, 0); // 0 = disable; 31 = max
radio.setProperty(PROP_FM_BLEND_STEREO_THRESHOLD, 0); // 0 = stereo; 127 = mono
radio.setProperty(PROP_FM_BLEND_MONO_THRESHOLD, 0); // 0 = stereo; 127 = mono
}
//----------------------------------------------------------------------------------------------------------------
void power_down() {
Wire.beginTransmission(SI7435_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
delay(1);
}
void power_up_norm() {
Wire.beginTransmission(SI7435_ADDRESS);
Wire.write(0x01);
Wire.write(0x11); //11 - NORM ; 31 - PATCH
Wire.write(0x05);
Wire.endTransmission();
delay(1);
}
void power_up_FM() {
Wire.beginTransmission(SI7435_ADDRESS);
Wire.write(0x01);
Wire.write(0x10); //10 - NORM ; 30 - PATCH
Wire.write(0x05);
Wire.endTransmission();
delay(1);
}
void tune() {
Wire.beginTransmission(SI7435_ADDRESS);
Wire.write(am_fm); //0x40 AM ; 0x20 FM
Wire.write(ssb_m);
Wire.write(fr_h); //Hi byte Tune
Wire.write(fr_l); //Lo byte Tune
Wire.write(0x00);
Wire.write(mw_sw); //0x00 MW ; 0x01 SW
Wire.endTransmission();
delay(1);
}
void property_filter_AM() {
Wire.beginTransmission(SI7435_ADDRESS);
Wire.write(0x12);
Wire.write(0x00);
Wire.write(0x31);
Wire.write(0x02);
Wire.write(0x00); //0x01 = Low cut filter 100Hz ON - 0x00 = OFF
Wire.write(filter); //0x00 = 6kHz; 1 = 4kHz; 2 = 3kHz; 3 = 2kHz; 4 = 1kHz; 5 = 1.8kHz; 6 = 2.5kHz;
Wire.endTransmission();
delay(1);
}
9 ocak 2021
Çinden beklediğim Si4735 D60 geldi. Bütün bantlarda çalışıyor alıcı şimdi. Tümdevre için bir de yeni modül tasarladım.
Şimdi alıcı 150 kHz ile 29.999 kHz arasını alıyor. SSB modunda da çalışıyor.
4 yorum:
Çok güzel olmuş bende yapmak istiyorum
elimde olan malzemeler şunlar;
1-Arduino uno
2-RDA5807M fm raduo modülü
3-Arkadan mavi aydınlatmalı 32 kare ekran var
şimdi ben fm biligilerini ekranda göstermek istiyorum
boş fm seslerinde sinyal durumunu gösteren bir gösterge yapmak istiyorum ama nasıl yapabilirim bilemiyorum sadece ekranda sinyal oranını göstermek istesem bana yetecek ama yapamadım
You can share your latest firmware?
Can you share the latest firmware?please
https://github.com/RecepAGulec/Si4735-ALICI-TFT-Ekran
Yorum Gönder