1

Тема: SI4703

http://forum.rcl-radio.ru/uploads/images/2021/09/0921f97ae2f4000fe5477b43e61299a2.png

Библиотека - Данный контент доступен только зарегистрированным пользователям.

http://forum.rcl-radio.ru/uploads/images/2022/01/99dae35c6da6b4530455b7f6b56ee66e.png



Тестовый скетч

#include <si4703.h>
 si4703 radio(3,2,4,5); // SDIO, SCLK, SEN, RST
 int f_cannel = 1019;

void setup() {
  radio.init();
  Serial.begin(9600); 
  
  radio.fm_start(f_cannel-760);
  radio.si_volume(10);// 0...15
}

void loop() {
  if(Serial.available()){
    char serial = Serial.read();
    if(serial == 'u'){radio.seek_up();}
    if(serial == 'd'){radio.seek_down();}
    }  
        
Serial.print(" F = ");
Serial.print(float((radio.nom_ch()+760.00)/10),2);
Serial.print(" RDS =");
Serial.print(radio.readRDS());
Serial.print(" STC =");
Serial.print(radio.seach());
Serial.print(" RSSI =");
Serial.print(radio.rss());
Serial.print(" ST =");
Serial.println(radio.st_mn());
}

2

Re: SI4703

http://forum.rcl-radio.ru/uploads/images/2021/09/7b4a421d76ff8934cb34c527574814b4.png

http://forum.rcl-radio.ru/uploads/images/2022/01/55cdf54bc40089f80db17d362dc8ac29.png



Реализовано:
1. Поиск станции - увеличение и уменьшение частоты
2. Запуск станции при включении (включение станции которая была выбрана перед выключением и работала в течении минуты)
3. Запоминание уровня громкости (0...15) и последней выбранной станции (была включена не менее одной минуты) перед выключением.
4. RDS - название станции
5. Индикатор уровня сигнала
6. Индикатор моно/стерео

Управление 4 кнопки:
UP - поиск станции увеличение частоты
DOWN - поиск станции уменьшение частоты
VOLUME UP - увеличение громкости
VOLUME DOWN - уменьшение громкости

Кнопки - нажатие=замыкание на GND

#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <si4703.h>
 si4703 radio(3,2,4,5); // SDIO, SCLK, SEN, RST
 LiquidCrystal_I2C lcd(0x27,20,4);
 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
 byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};      
 byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
 byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
 byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
 byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};
 byte d1,d2,d3,d4,d5,d6,e1,e2,e3;
 int a[6],x;
 bool w=1,save_ch,w1;
 int canel,vol; 
 unsigned long times,times1;
 byte t;
 char  old[8];
 char * print_rds;

void setup() {
  Wire.begin();lcd.init();lcd.backlight();
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  //Serial.begin(9600);  
  radio.init();
  pinMode(7,INPUT_PULLUP);// button up
  pinMode(8,INPUT_PULLUP);// button down
  pinMode(9,INPUT_PULLUP);// button volume UP
  pinMode(10,INPUT_PULLUP);// button volume DOWN
  canel = ((EEPROM.read(400)<<8))|EEPROM.read(401);vol=EEPROM.read(402);
  if(canel>320){canel=0;}if(vol>15){vol=10;}
  Serial.print("Device ID: ");Serial.println(radio.read_device_id(),HEX);
  Serial.print("Chip ID: ");Serial.println(radio.read_chip_id(),HEX);
  radio.si_volume(vol);
}

void loop() {
//////// BUTTON /////////////////////////////////////////////////  
 if(digitalRead(7)==LOW){radio.seek_up();save_ch=1;times=millis();delay(100);}
 if(digitalRead(8)==LOW){radio.seek_down();save_ch=1;times=millis();delay(100);}

 if(digitalRead(9)==LOW){vol++;save_ch=1;times=millis();if(vol>15){vol=15;}radio.si_volume(vol);delay(100);}
 if(digitalRead(10)==LOW){vol--;save_ch=1;times=millis();if(vol<0){vol=0;}radio.si_volume(vol);delay(100);}
///////////////////////////////////////////////////////////////// 

/////// EEPROM ////////////////////////////////////////////////// 
 if(millis()-times>60000&&save_ch==1){save_ch=0;canel = radio.nom_ch();
 EEPROM.update(400,(canel>>8) & 0b11);EEPROM.update(401,canel & 0xFF);EEPROM.update(402,vol);}
 
/////// LCD STEREO/MONO SIGNAL VOLUME /////////////////////////////////////////////////
 if(w==1){w=0;radio.fm_start(canel);}
 if(millis()-times1>1000){times1=millis();lcd.setCursor(13,2);lcd.print("SIG ");lcd.print(radio.rss());lcd.print(" ");
 if(radio.st_mn()==0){lcd.setCursor(13,1);lcd.print("MONO  ");}
  else{lcd.setCursor(13,1);lcd.print("STEREO");}}
  lcd.setCursor(13,0);lcd.print("VOL ");lcd.print(vol);lcd.print(" ");
  lcd.setCursor(2,2);lcd.print("FM RADIO");
  
////// LCD PRINT RDS ST_NAME ///////////////////////////////////////////////  
if(radio.seach()==1 && radio.rss()>30){print_rds = radio.readRDS();}
  if(t==0){for(int i=0;i<8;i++){old[i]=print_rds[i];}}t++;
  if(radio.seach()==0){
  for(int i=0;i<8;i++){print_rds[i]=61;}t=0;lcd.setCursor(6,3);lcd.print(" No RDS ");} 
  byte d=0;for(int i=0;i<8;i++){if(old[i]==print_rds[i]){}else{d++;}}
  if(d==0 && t==5){t=0;
  for(int i=0;i<8;i++){lcd.setCursor(6+i,3);lcd.print(print_rds[i]);}}
  if(t>8){t=0;}
  lcd.setCursor(0,3);lcd.print("======");
  lcd.setCursor(14,3);lcd.print("======");
 
///////// LCD BIG ///////////////////////////////////////////////
 int f_ch = radio.nom_ch() + 760;
     a[0]=f_ch/1000;
     a[1]=f_ch/100%10;
     a[2]=f_ch/10%10;
     a[3]=f_ch%10;
     if(f_ch<1000){a[0]=10;}
   for(x=0;x<4;x++){
    switch(x){
        case 0: e1=0;e2=0,e3=1;break;
        case 1: e1=2,e2=3,e3=4;break;
        case 2: e1=5,e2=6,e3=7;break;
        case 3: e1=9,e2=10,e3=11;break;
   }digit();}
   lcd.setCursor(8,1);lcd.print(".");
//////////////////////////////////////////////////////////////////
delay(1);

}// loop

void digit(){switch(a[x]){
case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
case 10:d1=150,d2=150,d3=150,d4=150,d5=150,d6=150;break;}
if(x>0){lcd.setCursor(e1,0);lcd.write((uint8_t)d1);}
lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);
lcd.setCursor(e1,1);lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

3

Re: SI4703

liman324 пишет:

http://forum.rcl-radio.ru/uploads/images/2021/09/7b4a421d76ff8934cb34c527574814b4.png

  //Serial.begin(9600);  
 
 Serial.print("Device ID: ");Serial.println(radio.read_device_id(),HEX);
  Serial.print("Chip ID: ");Serial.println(radio.read_chip_id(),HEX);
 

Раскомментироанный serial begin в мониторе порта devise id и chip id выдают FFFFFF

4

Re: SI4703

Раскомментируйте Serial.begin(9600)

5 (2021-10-28 00:02:00 отредактировано Seledkin)

Re: SI4703

liman324 пишет:

Раскомментируйте Serial.begin(9600)

Он и так раскомментирован. Я это и написалhttp://forum.rcl-radio.ru/uploads/images/2021/10/96800c4397c18da125d7fb66449e045f.jpg

6

Re: SI4703

Загрузите тестовый скетч:

#include <si4703.h>
 si4703 radio(3,2,4,5); // SDIO, SCLK, SEN, RST
 int f_cannel = 1019;
 
void setup() {
  radio.init();
  Serial.begin(9600); 
 
  radio.fm_start(f_cannel-760);// 101.9 МГц (1019-760 = 259)
  radio.si_volume(10);// 0...15
}
 
void loop() {
  if(Serial.available()){
    char serial = Serial.read();
    if(serial == 'u'){radio.seek_up();}
    if(serial == 'd'){radio.seek_down();}
    }  
 
Serial.print(" F = ");
Serial.print(float((radio.nom_ch()+760.00)/10),2);
Serial.print(" RDS =");
Serial.print(radio.readRDS());
Serial.print(" STC =");
Serial.print(radio.seach());
Serial.print(" RSSI =");
Serial.print(radio.rss());
Serial.print(" ST =");
Serial.println(radio.st_mn());
}

7

Re: SI4703

Не переваривает его. Возможно мёртвый модуль

8

Re: SI4703

Здравствуйте!  Попробовал повторить, но после заливки скетча получаю "кашу" на экране. При этом кнопки громкости на экране работают, но в наушниках изменений нет. Кнопки каналов не работают. Что можно посмотреть? Спасибо!

9

Re: SI4703

Возможно у Вас I2C модуль экрана имеет другой адрес чем тот что указана в скетче, проверьте адрес при помощи I2C сканера - http://forum.rcl-radio.ru/viewtopic.php?id=64

10 (2022-01-05 13:47:15 отредактировано samand587)

Re: SI4703

liman324 пишет:

... имеет другой адрес чем тот что указана в скетче,...

Проверил, вот адресhttp://forum.rcl-radio.ru/uploads/images/2022/01/00a1f8128bae75edd6c22a9a2bafbc53.png

А это на экране http://forum.rcl-radio.ru/uploads/images/2022/01/14d419ebafb93a8a6c79e7837d6c3463.jpg

11

Re: SI4703

Загрузите тестовый скетч для радио модуля - http://forum.rcl-radio.ru/viewtopic.php?pid=4805#p4805

12

Re: SI4703

Тест загрузил. Вот с монитора и снимок дисплеяhttp://forum.rcl-radio.ru/uploads/images/2022/01/9789227571b18bfac9d5754f8813ea42.jpg

http://forum.rcl-radio.ru/uploads/images/2022/01/3a66632b3aaa2343bd1417efbb0048a1.png

13

Re: SI4703

Я соберу схему потестирую, посмотрю что не так.

14

Re: SI4703

Отлично! Жду!

15 (2022-01-05 14:40:29 отредактировано Seledkin)

Re: SI4703

Рекомендую проверить надёжность пайки  и ОТСУТСТВИЕ ЗАМЫКАНИЯ между шинами SCL и SDA. У меня тоже крякозябры рисовало. Только на часах. Оказалось - непропай шины SCL.
А радио у меня так и не заработало

16

Re: SI4703

Замкните GPO2 на GND.

Я переделаю схему на сайте и форуме.

17

Re: SI4703

http://forum.rcl-radio.ru/uploads/images/2022/01/06d2f160458f7171bcfe51359e0bed7d.png

18

Re: SI4703

К сожалению, мне это не помогло! Картинка на дисплее не изменилась. Все те же кряки. Плату мыл, К.З. проверял. Что еще смотреть, Х.З.!

З.Ы. На обновленной картинке исчезли пины Ардуино

19

Re: SI4703

З.Ы. На обновленной картинке исчезли пины Ардуино

Схему я поправил

К сожалению, мне это не помогло! Картинка на дисплее не изменилась. Все те же кряки. Плату мыл, К.З. проверял. Что еще смотреть, Х.З.!

У меня все работает, зависаний нет, экран показывает.

20

Re: SI4703

Попробуйте поставить конденсатор 22-47 мкФ на 3,3 В

21

Re: SI4703

Как можно проверить плату радио? С последними изменениями в схеме тест прогонял- Вот картинкаhttp://forum.rcl-radio.ru/uploads/images/2022/01/de18c91c58b29d44f088bde7343c7d8d.png

22

Re: SI4703

В мониторе порта в стоке запроса отправьте u для поиска станции

23

Re: SI4703

Запрос отправляю- никакой реакции. Вижу картинку что выше. Полный кирдык! Прошелся паяльником- изменений никаких. А какой резонатор стоит на плате? С платами RDA5807 сталкивался с неисправным кварцем.

24

Re: SI4703

Загружаю тестовый скетч

http://forum.rcl-radio.ru/uploads/images/2022/01/6f730b8707b847f7ffd7c5d1dc7a56c8.png

25

Re: SI4703

А какой резонатор стоит на плате?

32.768 kHz