在這個(gè)項(xiàng)目中,我將使用便宜的 ESP32 板構(gòu)建一個(gè)具有 3.5 英寸大顯示屏的互聯(lián)網(wǎng)廣播設(shè)備。
你可能不太相信,在這個(gè)項(xiàng)目,我們能夠以不到 10 分鐘的時(shí)間內(nèi)并且用不到 30 美元的成本構(gòu)建一個(gè)網(wǎng)絡(luò)收音機(jī)。接下來讓我們開始吧!
幾個(gè)月前,我完成了一個(gè)Arduino FM Radio 項(xiàng)目,效果很好。問題是,雖然那臺(tái)收音機(jī)看起來很酷,但它并不實(shí)用,我住的地方發(fā)射信號(hào)并不好。所以,我在筆記本電腦或平板電腦上在線收聽我最喜歡的收音機(jī),但這也不太實(shí)用。所以,今天我要構(gòu)建一個(gè)網(wǎng)絡(luò)廣播設(shè)備,以便能夠收聽來自世界各地的我最喜歡的廣播電臺(tái)!
我已經(jīng)收聽了真正的 FM 廣播電臺(tái),通過使用這些按鈕,我們可以更改我們正在收聽的廣播電臺(tái)。我已將我最喜歡的廣播電臺(tái)保存到 ESP32 的內(nèi)存中,因此我可以輕松訪問它們。使用這個(gè)電位器,我可以改變揚(yáng)聲器的音量。我在帶有復(fù)古用戶界面的 3.5 英寸大顯示屏上顯示我們正在收聽的廣播電臺(tái)的名稱。該項(xiàng)目運(yùn)行良好,并且非常容易構(gòu)建。
您可以在不到 10 分鐘的時(shí)間內(nèi)構(gòu)建相同的項(xiàng)目,但您需要有一些經(jīng)驗(yàn)。如果這是您的第一個(gè)項(xiàng)目,請(qǐng)考慮先構(gòu)建一個(gè)更簡(jiǎn)單的項(xiàng)目,以獲得一些經(jīng)驗(yàn)?,F(xiàn)在讓我們開始構(gòu)建我們自己的 Internet Radio。
第 1 步:獲取所有零件
我們將需要以下部分:
ESP32
MP3 解碼器
隔離變壓器
3W 揚(yáng)聲器
3.5“ Nextion 顯示器
按鈕
面包板
電線
第 2 步:ESP32 開發(fā)板
該項(xiàng)目的核心當(dāng)然是功能強(qiáng)大的 ESP32 開發(fā)板。如果您不熟悉,ESP32 芯片是我們過去多次使用的流行的 ESP8266 芯片的繼任者。它提供兩個(gè)運(yùn)行頻率為 160MHz 的 32 位處理內(nèi)核、大量內(nèi)存、WiFi、藍(lán)牙和許多其他功能。
ESP32功能如此強(qiáng)大,同時(shí)也提供了僅需要 10μA 電流的深度睡眠模式。這使得 ESP32 成為低功耗應(yīng)用的理想芯片。
在這個(gè)項(xiàng)目中,ESP32 板連接到 Internet,然后它從我們正在收聽的廣播電臺(tái)接收 MP3 數(shù)據(jù),并向顯示器發(fā)送一些命令。
第 3 步:MP3 解碼器
然后使用 SPI 接口將 MP3 數(shù)據(jù)發(fā)送到 MP3 解碼器模塊。該模塊使用VS1053 IC。本 IC 是專用的硬件 MP3 解碼器。它從 ESP32 獲取 MP3 數(shù)據(jù)并將其快速轉(zhuǎn)換為音頻信號(hào)。它在這個(gè)音頻插孔輸出的音頻信號(hào)很弱,所以我們需要放大它。這就是為什么我使用 PAM8403 音頻放大器來放大音頻信號(hào),然后將其發(fā)送到揚(yáng)聲器。
我還在 ESP32 上連接了兩個(gè)按鈕,只是為了改變我們從中獲取數(shù)據(jù)的 MP3 流和一個(gè) Nextion 顯示器來顯示我們正在收聽的廣播電臺(tái)。
第 4 步:Nextion 顯示
我選擇在這個(gè)項(xiàng)目中使用 Nextion 顯示器,因?yàn)樗浅R子谑褂谩N覀冎恍枰B接一根線來控制它。
Nextion 顯示器是一種新型顯示器。他們?cè)诒趁嬗凶约旱?ARM 處理器,負(fù)責(zé)驅(qū)動(dòng)顯示器和創(chuàng)建圖形用戶界面。因此,我們可以將它們與任何微控制器一起使用并取得驚人的效果。
第 5 步:連接所有部件
我們現(xiàn)在要做的就是根據(jù)這個(gè)示意圖將所有部件連接在一起。您可以在此處找到所附的示意圖。連接很簡(jiǎn)單。
不過有一點(diǎn)需要注意。MP3 解碼器模塊輸出立體聲信號(hào),但我在這個(gè)項(xiàng)目中只使用一個(gè)音頻通道。為了獲得音頻信號(hào),我將一條音頻線連接到模塊的音頻插孔,并剪斷它以露出里面的四根電線。我連接了兩根線。其中一個(gè)是 GND,另一個(gè)是兩個(gè)音頻通道之一的音頻信號(hào)。如果您愿意,您可以將兩個(gè)通道連接到放大器模塊并驅(qū)動(dòng)兩個(gè)揚(yáng)聲器。
要將數(shù)據(jù)發(fā)送到顯示器,我們只需要將一根線連接到 ESP32 的 TX0 引腳。連接部件后,我們必須將代碼加載到 ESP32,我們必須將 GUI 加載到 Nextion 顯示器。
要將 GUI 加載到 Nextion 顯示器,請(qǐng)將 InternetRadio.tft 文件復(fù)制到空的 SD 卡中。將 SD 卡放入顯示器背面的 SD 卡插槽中。然后打開顯示器電源,GUI 將被加載。然后取出 SD 卡并重新連接電源。
成功加載代碼后,讓我們啟動(dòng)項(xiàng)目。它會(huì)在顯示屏上顯示文本“正在連接。。.”幾秒鐘。連接到互聯(lián)網(wǎng)后,項(xiàng)目連接到預(yù)定義的廣播電臺(tái)。硬件按預(yù)期工作,但現(xiàn)在讓我們看看項(xiàng)目的軟件方面。
第 6 步:項(xiàng)目代碼
首先,讓我向您展示一些東西。該項(xiàng)目的代碼不到 140 行代碼。想想看,我們可以用 140 行代碼構(gòu)建一個(gè) 3.5 英寸顯示屏的網(wǎng)絡(luò)收音機(jī),這太神奇了。當(dāng)然,我們可以使用包含數(shù)千行代碼的各種庫來實(shí)現(xiàn)這一切。
在這個(gè)項(xiàng)目中,我將 VS1053 庫用于 ESP32 板。
首先,我們必須定義 Wi-Fi 網(wǎng)絡(luò)的 SSID 和密碼。接下來,我們必須在這里保存一些廣播電臺(tái)。我們需要主機(jī) URL、流所在的路徑以及我們需要使用的端口。我們將所有這些信息保存到這些變量中:
char ssid[] = "yourSSID"; ? ? ? ? ? ?// ?your network SSID (name) char pass[] = "yourWifiPassword"; ? // your network password// Few Radio Stations
char *host[4] = {"149.255.59.162","radiostreaming.ert.gr","realfm.live24.gr", "secure1.live24.gr"};
char *path[4] = {"/1","/ert-kosmos","/realfm","/skai1003"};
int ? port[4] = {8062,80,80,80};
我在這個(gè)例子中包含了 4 個(gè)廣播電臺(tái)。
在設(shè)置函數(shù)中,我們將中斷附加到按鈕,我們初始化 MP3 解碼器模塊并連接到 Wi-Fi。
void setup ()
?{
? ?Serial.begin(9600);
? ?delay(500);
? ?SPI.begin(); ? pinMode(previousButton, INPUT_PULLUP);
? ?pinMode(nextButton, INPUT_PULLUP); ? attachInterrupt(digitalPinToInterrupt(previousButton), previousButtonInterrupt, FALLING);
? ?attachInterrupt(digitalPinToInterrupt(nextButton), nextButtonInterrupt, FALLING); ? ? initMP3Decoder();
? ?connectToWIFI();
}
在循環(huán)函數(shù)中,首先,我們檢查用戶是否選擇了與我們從中獲取數(shù)據(jù)的電臺(tái)不同的電臺(tái)。如果是這樣,我們連接到新的廣播電臺(tái),否則我們從流中獲取數(shù)據(jù)并將它們發(fā)送到 MP3 解碼器模塊。
void loop() { ? ??
? ? ? if(radioStation!=previousRadioStation)
? ? ? {
? ? ? ? ? ?station_connect(radioStation);
? ? ? ? ? ?previousRadioStation = radioStation;?
? ? ? }
? ? ??
? ? ? if (client.available() > 0)
? ? ? {
? ? ? ? uint8_t bytesread = client.read(mp3buff, 32);
? ? ? ? player.playChunk(mp3buff, bytesread);
? ? ? }
}
就這樣!當(dāng)用戶按下按鈕時(shí),會(huì)發(fā)生中斷,并更改變量的值,該變量告訴要連接到哪個(gè)流。
void IRAM_ATTR previousButtonInterrupt() { ?static unsigned long last_interrupt_time = 0;
? unsigned long interrupt_time = millis();
?if (interrupt_time - last_interrupt_time > 200)?
?{
? ?if(radioStation>0)
? ? radioStation--;
? ? else
? ? radioStation = 3;
?}
?last_interrupt_time = interrupt_time;
}
要更新顯示,我們只需向串行端口發(fā)送一些命令。
void drawRadioStationName(int id){
? String command;
? switch (id) ?
? {
? ? case 0: ?command = "p1.pic=2"; Serial.print(command); endNextionCommand(); break; //1940 UK Radio
? ? case 1: ?command = "p1.pic=3"; Serial.print(command); endNextionCommand(); break; //KOSMOS ? ? GREEK
? ? case 2: ?command = "p1.pic=4"; Serial.print(command); endNextionCommand(); break; //REAL FM ? ?GREEK
? ? case 3: ?command = "p1.pic=5"; Serial.print(command); endNextionCommand(); break; //SKAI 100.3 GREEK
? }
}
現(xiàn)在讓我們看一下 Nextion Display GUI。Nextion GUI 由背景圖片和顯示電臺(tái)名稱的圖片組成。ESP32 板發(fā)送命令以從嵌入的圖像中更改廣播電臺(tái)的名稱。
第 7 步:最后的想法和改進(jìn)
這個(gè)項(xiàng)目非常簡(jiǎn)單。我想要一個(gè)簡(jiǎn)單的 Internet 廣播項(xiàng)目框架來使用。到了這一步,項(xiàng)目已經(jīng)準(zhǔn)備就緒,但我們還可以添加許多功能來改進(jìn)它。所以,我設(shè)計(jì)了一個(gè)外殼來容納所有電子設(shè)備。
評(píng)論
查看更多