Arduino筆記(76):使用搖桿調整Si4703 FM收音機頻道與音量

這個FM收音機模組上印著S1740x,找了很多相關的文件,都沒有適合的函式庫或說明,試了很久都沒有辦法聽到聲音。可是改用CJMCU-470 (Si4703) Google一下,找到一些相關的文件,依照照片跟我購買的模組比對是一樣的,可是因為型號卻讓我浪費很多時間。後來試著使用 CJMCU-470 相關的函式庫:Si4703_Breakout,怎麼試還是沒有不行,後來試用SparkFun_Si4703的函式庫,才可以用了,這個過程雖然有點坎坷,為了怕以後忘記,還是要將歷程紀錄下來,避免以後重蹈先前的錯誤。

範例程式是透過串列監控視窗(Serial Monitor)下達指令,如調整頻道、聲音等,想說改用搖桿來控制,往左右方向調整音量,往上下方向調整頻道,從串列監控視窗下達a.b有兩個預設頻道。我們來看看連接方法跟結果:


[安裝 Library]

本實作需要安裝以下程式庫:
程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)

[線路圖]

Arduino UNOSi4703收音機搖桿 I2C LCD顯示器
3.3V3.3V--
GNDGND--
A4(SDA)SDIO--
A5(SCL)SCLK--
Pin2RST--
A0-Vx-
A1-Vy-
SDA--SDA
SCL--SCL



[程式]

#include <SparkFunSi4703.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

int resetPin = 2;
int SDIO = A4;
int SCLK = A5;
int STC = 3;

#define JoyX A0   // 搖桿 X 軸的接腳連接 Uno A0
#define JoyY A1   // 搖桿 Y 軸的接腳連接 Uno A1

Si4703_Breakout radio(resetPin, SDIO, SCLK, STC);
int channel;
int volume;
char rdsBuffer[10];

LiquidCrystal_I2C lcd(0x27,16,2);  // 設定 LCD 位址為 0x27,有 16 個字元 2 列

void setup()
{
  lcd.init();       // 初始化 lcd 
  lcd.backlight();
  lcd.clear();
   
  radio.powerOn();
  radio.setVolume(0);
  // 頻道介於 875 跟 1080之間
  Serial.begin(9600);
  Serial.println("\n\nSi4703_Breakout Test Sketch");
  Serial.println("===========================");  
  Serial.println("a b     Favourite stations");
  Serial.println("+ -     Volume (max 15)");
  Serial.println("u d     Seek up / down");
  Serial.println("r       Listen for RDS Data (15 sec timeout)");
  Serial.println("Send me a command letter.");
}

void loop(){
  int valX = analogRead(JoyX); // 讀取目前搖桿 X 值
  int valY = analogRead(JoyY); // 讀取目前搖桿 Y 值

  if (valX < 400){            // u
      channel = radio.seekUp();
  }
  if (valX > 600){  //d
      channel = radio.seekDown();
  }
  if (valY < 400) {  //+
      volume ++;
      if (volume == 16) volume = 15;
      radio.setVolume(volume);
  }
  if (valY > 600){  //-
      volume --;
      if (volume < 0) volume = 0;
      radio.setVolume(volume);
  }
  displayInfo();    

  if (Serial.available()) {
    char ch = Serial.read();
    if (ch == 'a')  {
      channel = 967; 
      radio.setChannel(channel);
      displayInfo();
    }    
    else if (ch == 'b')  {
      channel = 974; 
      radio.setChannel(channel);
      displayInfo();
    }
    else if (ch == 'r')  {
      Serial.println("RDS listening");
      radio.readRDS(rdsBuffer, 15000);
      Serial.print("RDS heard:");
      Serial.println(rdsBuffer);      
    }
    Serial.print("Channel:"); Serial.print(channel); 
    Serial.print(" Volume:"); Serial.println(volume);     
  }
}

void displayInfo()
{
   // 在位置0,0 顯示時間
   lcd.setCursor(0,0);
   lcd.print("Channel: ");
   lcd.print(channel);
   lcd.print("   ");      
   lcd.setCursor(0,1);
   lcd.print("Volume : ");
   lcd.print(volume);
   lcd.print("   ");     
}

[結果]




[參考資料]

Post a Comment

較新的 較舊