基於ESP32-S2實現的網絡/FM兩用收音機

2021-12-25 電子森林

這是一位工程師基於硬禾學堂"暑期一起練"的ESP32-S2平臺實現的網絡收音機、FM收音機的功能,項目開源在電子森林的項目頁面(點擊左下角的「閱讀原文」)。

以下是該項目的內容

實現的基本功能:

可以通過WiFi接收網絡上的電臺,也可以通過FM模塊接收空中的電臺,並可以通過按鍵進行切換、選臺

在OLED顯示屏上顯示網絡電臺的IP位址、節目名字等相關信息或FM信號的頻段

系統能夠自動校時,開機後自動調節到準確的時間(年、月、日、時、分、秒)

項目環境:

Arduino v1.8.16: 一款便捷靈活、方便上手的開源電子原型平臺

VS code v1.60.0: 微軟開發的跨平臺原始碼編輯器

Vscode-Arduino: VScode開發Arduino的插件

arduino-esp32 v2.0.0: ESP32平臺的Arduino開發庫

u8g2: Arduino使用I2C或SPI控制屏幕的庫

RDA5807: Arduino使用I2C控制收音機模塊的庫

硬體:

一. 如何使用

1. 使用編譯好的二進位程序

2. 使用源碼編譯燒錄

設置wifi帳號密碼

const char* SSID     = "sxxx";
const char* PASSWD = "xxx";

設置網絡收音機的IP和埠

const char* WEBSERVERIP "192.168.1.55"
const char* WEBSERVERPORT 8888

在searchFM()函數中設置開始頻率

void searchFM() {
  ...
  rx.setFrequency(9600);
  ...

安裝CH340串口驅動

使用Arduino編譯燒錄到開發板上

 

二. 運行現象

開機是會進入顯示John Radio的Logo頁面

開機後會總有有三個頁面時間顯示, FM收音機, 網絡收音機, 通過按鍵1可以進行切換

進入到時間顯示頁面: 會顯示和伺服器校對好的時間

進入到FM收音機的頁面: 會顯示當前的收音機頻率, 通過點擊按鍵2可以切換不同的頻率

進入到網絡收音機的頁面, 會顯示當前連接的網絡收音機IP及埠

1. 編譯日誌

項目使用了 722978 字節,佔用了 (55%) 程序存儲空間。最大為 1310720 字節。
全局變量使用了37348位元組,(11%)的動態內存,餘留290332位元組局部變量。最大為327680位元組。
esptool.py v3.1
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP32-S2FH32
Features: WiFi, Embedded 4MB Flash, 105C temp rating, ADC and temperature sensor calibration in BLK2 of efuse
Crystal is 40MHz
MAC: 7c:df:a1:97:44:da
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash will be erased from 0x0000e000 to 0x0000ffff...
Flash will be erased from 0x00001000 to 0x00004fff...
Flash will be erased from 0x00010000 to 0x000c0fff...
Flash will be erased from 0x00008000 to 0x00008fff...
Compressed 8192 bytes to 47...
Writing at 0x0000e000... (100 %)
Wrote 8192 bytes (47 compressed) at 0x0000e000 in 0.1 seconds (effective 755.2 kbit/s)...
Hash of data verified.
Compressed 13600 bytes to 9358...
Writing at 0x00001000... (100 %)
Wrote 13600 bytes (9358 compressed) at 0x00001000 in 0.4 seconds (effective 274.5 kbit/s)...
Hash of data verified.
Compressed 723360 bytes to 484945...
Writing at 0x00010000... (3 %)
Writing at 0x00019c43... (6 %)
...
Writing at 0x000bd11f... (100 %)
Wrote 723360 bytes (484945 compressed) at 0x00010000 in 11.4 seconds (effective 505.4 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 128...
Writing at 0x00008000... (100 %)
Wrote 3072 bytes (128 compressed) at 0x00008000 in 0.0 seconds (effective 511.0 kbit/s)...
Hash of data verified.

Leaving...

2. 運行串口日誌

192.168.43.143
Search FM8710:0
Search FM8720:0
Search FM8730:1
Search FM8740:1
Good Frequency: 8760
Search FM8770:0
Search FM8780:1
Search FM8790:1
Search FM8800:1
Good Frequency: 8810
Search FM8820:0
Search FM8830:0
Good Frequency: 8860
...
Good Frequency: 10370
info: FM Radio Page
info: Net Radio Page
info: Datetime Page


3. 開發板運行情況

三. 已知BUG

上電時如果沒有連接wifi失敗會停留在Logo界面

上電時如果沒有成功連接到時間伺服器上回停留在Logo界面

長按按鈕會出現連按的問題, 會在不同的界面裡面循環跳轉

即使關閉了揚聲器的輸出, FM收音機依然也會在耳機中輸出

四. 筆記

1. 項目前瞻

競爭力: 相較於手機來說, 此產品的成本更低, 續航更高, 專一性更強, 更加小巧

改進:

可以增加一塊電池, 增加便攜性

增加一塊藍牙模塊, 增加藍牙功能

2. 開發環境的部署

下載Arduino

https://www.arduino.cc/en/software

安裝VScode

https://code.visualstudio.com/download

下載VS Code插件 Arduino

在VScode的設置中, 添加ESP32 Arduino開發板庫

{
"arduino.path": "C:\\Program Files (x86)\\Arduino",
"arduino.ignoreBoards": [


],
"editor.insertSpaces": true,
"files.autoGuessEncoding": true,
"arduino.logLevel": "info",
"explorer.confirmDelete": false,
"editor.detectIndentation": false,
"arduino.additionalUrls": [
"http://arduino.esp8266.com/stable/package_esp8266com_index.json",
"https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"
],
"editor.quickSuggestions": true,
"C_Cpp.clang_format_style": "{ BasedOnStyle: LLVM, UseTab: Never, IndentWidth: 4, TabWidth: 4, BreakBeforeBraces: Attach, AllowShortIfStatementsOnASingleLine: true, IndentCaseLabels: false, ColumnLimit: 0, AccessModifierOffset: -4, NamespaceIndentation: All }",
"C_Cpp.default.includePath": [
"${workspaceFolder}/**",
"C:\\Program Files (x86)\\Arduino\\lib**",
"C:\\Program Files (x86)\\Arduino\\hardware\\esp\\arduino-esp32-master\\**",
"C:\\Program Files (x86)\\Arduino\\hardware\\esp\\arduino-esp32-master\\tools\\**",
"C:\\Program Files (x86)\\Arduino\\libraries**",
"C:\\Users\\{yourname}\\Documents\\Arduino\\libraries\\**"
],
"C_Cpp.default.intelliSenseMode": "clang-x64",
"C_Cpp.intelliSenseEngine": "Tag Parser",
"remote.portsAttributes": {

},

}

下載u8g2, RDA5807 第三方庫

 

 

3. 開發思路

上電: 進行屏幕, FM, WIFI等功能的初始化

pinMode(41, OUTPUT);
pinMode(42, OUTPUT);

digitalWrite(41, LOW);
digitalWrite(42, LOW);
Serial.begin(115200);
mointorInit();
displayWelcome();
Serial.println("connect wifi");
IPAddress = WifiConnecttion();
Serial.println(IPAddress.c_str());
fmInit();
searchFM();
SetFMFrequency();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(button4, INPUT_PULLUP);

循環: 監聽按鍵的輸入, 並且對用戶的輸入進行響應

num=0;
displayMessage();
if (digitalRead(button1) == LOW) {
delay(50);
if (digitalRead(button1) == LOW) {
buttonFlag = 1;
}
}
if (digitalRead(button2) == LOW) {
delay(50);
if (digitalRead(button2) == LOW) {
buttonFlag = 2;
}
}
if (digitalRead(button3) == LOW) {
delay(50);
if (digitalRead(button3) == LOW) {
buttonFlag = 3;
}
}
if (digitalRead(button4) == LOW) {
delay(50);
if (digitalRead(button4) == LOW) {
buttonFlag = 4;
}
}
if (buttonFlag != 0) {
FunctionUp();
delay(1000);
}
if (curr_sour == 2) {
playMusic();
}
buttonFlag = 0;

時間校對

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWD);
while (WiFi.status() != WL_CONNECTED) {
delay(400);
}

uint16_t i = 0;
uint8_t num = 0;
rx.setFrequency(9600);
while (i < 210) {
delay(100);
if (rx.isStereo() && rx.getRssi() > 20) {
fmstation[num++] = findMaxSing(rx.getFrequency(), rx.getRssi());
Serial.print("Good Frequency: ");
Serial.println(rx.getFrequency());
if (num >= MAX_STATIONS) return ;
}
rx.setFrequencyUp();
i++;
Serial.print("Search FM");
Serial.print(rx.getFrequency());
Serial.print(":");
Serial.print

 

4. 遇到的問題Windows版本的Arduino編譯速度慢的問題

1/ 因為活動接近尾聲, 希望快點開發出項目出來, 所以選擇了Arduino作為開發工具.

高效的編輯器, 緩慢的編譯器

但是Arduino的編輯器實在是太差了, 於是使用了VScode作為編輯器. 但是用VScode編譯的二次速度比Arduino的要慢一點. 後面再網上找到了解決方案, 在工程目錄的".vscode"中設置了一個Build選項, 就可以大大提高二次編譯的編譯速度

擁抱Linux的懷抱

不過隨著時間的推移, 發現編譯的速度還是跟不上調試的速度, 因為我是做軟體的出身, 主要語言還是使用Python這樣的可以即使運行的語言, 於是想有沒有辦法再把編譯的速度提升上去呢.

之前就有了解到Linux上面的Arduino比Windows上面要快不少, 之前一直覺得在Linux上面安裝東西太麻煩了, 這次就這這個機會嘗試著安裝了一下, 其實也只是下載安裝包, 解壓, 執行安裝腳本三步, 並且通過一些SSH軟體可以直接在命令行打開編輯窗口, 十分方便.

結果編譯速度提升了80%, 之後可以繼續嘗試把VScode安裝在Linux上面, 使用純Linux進行開發

2/ VS code對ESP32的庫提示庫不存在

艱難的安裝

我的Arduino ESP32庫安裝了好多次都有問題. 主要是網絡的問題, 在下載arduino-esp32的Git hub 倉庫的時候就打不開了

後面我Clone倉庫下載解壓到安裝目錄, 造成了之後的問題

VS code的嚎叫

在Arduino中可以使用, 之後我轉戰VScode, 結果發現VScode又不能正常使用ESP32, 直接在開發板管理工具裡面找不到了

最後只能刪掉庫, 在VScode的開發板管理工具裡面重新安裝才可以完成

解決網絡的問題

如果網絡有問題, 可以根據命令行的提示, 在github上面找到對應的zip包, 解壓到C://user/username/Appdata/Arduino15/staging/package中, Arduino會直接使用下載好的包, 這樣就可以大大減少重新安裝的時間和避免網絡比穩定到時下載失敗的情況. 比如說可以使用一些下載工具先進行下載. 

總是感覺Arduino作為編輯器還是有很多不足的地方, 比如代碼提示, 庫的安裝之類的. 以後進行開發我會優先使用Linux下的VSCode

相關焦點

  • 在 ESP32-S2 上試用 circuitpython
    ESP32-S2 是樂鑫去年推出的 SOC,它可以看作是 ESP32 的低成本簡化改進版本,在保持了 ESP32 的主要特點下,去掉了乙太網
  • 硬禾「暑期一起練」第3個平臺 - 基於ESP32-S2模塊的網絡收音機和音頻信號處理
    很多同學和工程師朋友對於樂鑫公司已經非常熟悉,從早期的ESP8266,到ESP32、ESP32-S,乃至現在基於RISC-V架構的ESP32-C系列,樂鑫的產品線越來越豐富,功能越來越強大,產品開發的生態資源也越來越完善。
  • 【玩轉ESP32】14、esp32 mqtt client
    收錄於話題 #玩轉esp32 點擊上方[物聯網思考],選擇置頂,第一時間查看物聯網分享!
  • 貿澤開售Espressif ESP32-S2-MINI Wi-Fi模塊
    2021年11月18日 – 專注於引入新品並提供海量庫存的電子元器件分銷商貿澤電子 (Mouser Electronics) 即日起備貨Espressif Systems的ESP32貿澤分銷的Espressif ESP32-S2-MINI模塊集成了具有240MHz LX7 CPU的Espressif ESP32-S2FH4 Xtensa® SoC,可提供高性價比的安全通信。該系列模塊配備4Mbytes外部SPI快閃記憶體和加密加速器,從而增強安全性能、提升保護能力。
  • ESP32-CAM打造低成本網絡監控攝像頭
    本篇教程,我們就來實驗一下如何使用ESP32-CAM開發板和Arduino IDE快速搭建一個低成本的家庭網絡監控攝像頭。我們使用的ESP32-CAM是基於AI-THINKER的ESP32-S模塊,板的正面還有TF卡卡槽和攝像頭的排線接口。
  • 【玩轉ESP32】7、ESP32連接wifi
    收錄於話題 #玩轉esp32sta;wifi_init_config_t cfg=WIFI_INIT_CONFIG_DEFAULT()用於獲取wifi的默認配置;esp_wifi_init(&cfg)用於初始化wifi;esp_event_handler_instance_register 用於向上面的esp_event_loop_create_default()`註冊回調函數,
  • 基於ESP32的幾款開發板
    下面為大家介紹一些基於ESP32的開發板:1. Heartypatch一款基於ESP32的完全開源的單引線ECG-HR可穿戴貼片,具有測量心電圖,心率和HRV(心率變異性)功能。HeartyPatch既可用作管理健身和壓力的生活方式設備,也可用於診斷和醫學研究,可用於更有趣的應用。2.
  • 用Arduino玩轉掌控板(ESP32):ESP32概述與Arduino軟體準備
    實際上,這些知識都是可以遷移的,因此在有時間的情況下,我準備給大家分享一系列用 Arduino 代碼對掌控板(ESP32)編程的教程:用 Arduino 玩轉掌控板(ESP32)系列,旨在更多地從 ESP32 晶片的角度出發,學習 ESP32 模塊的編程,然後應用到掌控板或其他基於 ESP32 的開發板上,讓大家可以觸類旁通。
  • 手機FM電臺收音機 v13.0
    註:本文轉載自網絡,不代表本平臺立場,僅供讀者參考,著作權屬歸原創者所有。我們分享此文出於傳播更多資訊之目的。如有侵權,請在後臺留言聯繫我們進行刪除,謝謝!手機FM電臺收音機是一款非常好用的手機fm電臺音頻軟體,軟體功能強大,用戶可以在這裡收聽喜歡的電臺,全都免費,操作簡單,給你一場動聽的電臺世界。
  • 基於Si4702和MM32的迷你FM收音機
    收音機的四個按鍵可以完成搜臺,換臺,存臺和音量調節等操作;   一個三色LED用於指示電量和操作反饋;   MicroUSB用於充電;   電源撥動開關;   3.5mm耳機插孔; 收音機的核心部件有三個:芯科的FM接收晶片Si4702,嘉興禾潤的免輸出電容耳機放大器HT4832(或者德州儀器的TPA6132A2RTER),還有靈動微電子的低功耗Cortex-M0單片機MM32L051NT。
  • ESP32-IDF環境搭建
    隨後ESP32發布,600MIPS運算能力、WIFI+BLE+ETH、QFN封裝、不到10元的價格。現在ESP32的生態可謂相當成熟,樂鑫ESP-IDF的教程遍天是,數款模組和開發板任君選擇,Arduino、PlatformIO、NodeMCU 都對ESP32提供了支持。
  • 【每日APP】蜻蜓fm收音機
    蜻蜓.fm已與數百個電臺、DJ合作,擁有的十三個分類、六大功能、三大特色,兩種模式為廣大廣播迷朋友打造跨地域收聽廣播的完美體驗
  • ESP32 For Arduino雜記
    ESP32 使用MicroPython 控制Gopro Hero Black4ESP32晶片-LEDC外設(另附Arduino代碼)Dji TT無人機擴展件ESP32晶片(D2WDQ5)Thonny燒錄ESP32 mpy固件ESP32+Thonny+固件燒錄+編寫建議ESP32
  • ESP32 入門教學,不入門,不教學
    把所有物品通過射頻識別等信息傳感設備與網際網路連接起來,實現智能化識別和管理。 物聯網通過智能感知、識別技術與普適計算、泛在網絡的融合應用,被稱為繼計算機、網際網路之後世界信息產業發展的第三次浪潮。我這次給大家介紹一個晶片,esp32,沒有收過任何費用,就是純技術分享,讓初學者少踩點坑吧,我也是最近用這個晶片,覺得爽得一X。
  • ESP32S2 與 ESP32 開發方式對比,帶你入門環境搭建
    當然了,你也可以用虛擬機實現!    因此,根據下面文檔,搭建最新的 ** ESP32** 即可支持 ESP32S2 啦!    Bash on Ubuntu on Windows 是通過 Windows Subsystem for Linux(WSL)這一 Windows 10 的最新特性實現的,使用此功能,你可以在 Windows 中原生運行 Linux 的大多數命令行程序。
  • ESP32 coredump 分析
    上次寫了一個 ESP32 入門,我想有必要再寫這篇文章,這次主要是分析 coredump 的,這就像 Android 和 Linux 系統的死機分析,有意思,也有難度。我覺得 ESP32 還有一個好處是,對於初學者真的太方便了,買個 Linux 開發板可能要幾百塊,但是買一個 ESP32 模塊的話,也就 40 塊錢,而且也是跑 Freertos 系統的,還有還有就是非常方便攜帶,調試燒錄供電都可以用一個 usb 線搞定,說真的,我沒有收錢宣傳,是真的適合沒有錢又喜歡入門嵌入式的同學們,但是這個只是起點,嵌入式後期我覺得一定是要學習Linux 的。
  • 智能硬體晶片---------ESP32 介紹
    參考連結:https://docs.micropython.org/en/latest/esp32/tutorial/intro.htmlhttps://github.com/easytarget/esp32-cam-webserverhttps://www.espressif.com/sites/default/files/documentation/esp32_wrover_datasheet_cn.pdfhttp://m5edu.com/Product/m5stack-core-fire/https://flow.m5stack.com
  • ESP-NOW無線通信 | ESP32學習之旅-Arduino版
    開發板之間的通信,所有支持 ESP-NOW 的設備之間都可以進行通信,比如 ESP32 與 ESP32 之間、ESP8266 與 ESP8266 之間、甚至 ESP32 與 ESP8266 之間,都可以進行 ESP-NOW 無線通信。
  • 海弦WR-800F網絡收音機不完全感受
    ▼點擊下方名片,關注公眾號▼原創:bennysun      網絡收音機雖然叫「收音機」,但是本質上與傳統的收音機不是一回事,更像是wifi播放設備「偽裝」成傳統收音機的產物。2.音質網絡收音機有兩個77mm左右的喇叭,雖然低音略顯不足,但是有倒相孔設計,比那些刻意用被動振動膜提升低音的藍牙音箱、插卡音箱耐聽,三頻也比許多在產的傳統收音機要均衡,而且網絡收音機自身的處理器運算能力比較富餘,通過數字處理實現了多種的音色效果,比如流行,古典,爵士等音色不再話下,還可以自定義均衡器以及提升立體聲效果(應該就是通過SRS的算法改變音色,這些音調設置功能在以前的
  • ESP32 設備運行 FreeRTOS IoT 作業系統
    設置 ESP32 的 FreeRTOS 開發環境需要配置 ESP32 BoardManager 所需的 ToolChain,連接設備的串口轉換軟體,以及下載 FreeRTOS 軟體包等。/dl/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz解壓、設置環境變量:mkdir -p ~/espcd ~/esptar -xzf ~/Downloads/xtensa-esp32-elf-osx-1.22.0-80-g6c4433a-5.2.0.tar.gz