這個FM收音機模組上印著S1740x,找了很多相關的文件,都沒有適合的函式庫或說明,試了很久都沒有辦法聽到聲音。可是改用CJMCU-470 (Si4703) Google一下,找到一些相關的文件,依照照片跟我購買的模組比對是一樣的,可是因為型號卻讓我浪費很多時間。後來試著使用 CJMCU-470 相關的函式庫:Si4703_Breakout,怎麼試還是沒有不行,後來試用SparkFun_Si4703的函式庫,才可以用了,這個過程雖然有點坎坷,為了怕以後忘記,還是要將歷程紀錄下來,避免以後重蹈先前的錯誤。
範例程式是透過串列監控視窗(Serial Monitor)下達指令,如調整頻道、聲音等,想說改用搖桿來控制,往左右方向調整音量,往上下方向調整頻道,從串列監控視窗下達a.b有兩個預設頻道。我們來看看連接方法跟結果:
範例程式是透過串列監控視窗(Serial Monitor)下達指令,如調整頻道、聲音等,想說改用搖桿來控制,往左右方向調整音量,往上下方向調整頻道,從串列監控視窗下達a.b有兩個預設頻道。我們來看看連接方法跟結果:
[安裝 Library]
本實作需要安裝以下程式庫:[線路圖]
| Arduino UNO | Si4703收音機 | 搖桿 | I2C LCD顯示器 |
|---|---|---|---|
| 3.3V | 3.3V | - | - |
| GND | GND | - | - |
| A4(SDA) | SDIO | - | - |
| A5(SCL) | SCLK | - | - |
| Pin2 | RST | - | - |
| 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(" ");
}
[結果]
[參考資料]
- Sparkfun:SparkFun_Si4703_Arduino_Library


張貼留言