這個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
張貼留言