0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32-S2设计网络/FM两用收音机

电子森林 来源:电子森林 JOHN HUANG 作者:电子森林 JOHN HUA 2021-09-14 09:31 次阅读

这是一位工程师基于硬禾学堂"暑期一起练"的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控制收音机模块的库

硬件

  • ESP32-S2-MINI-1:ESP32-S2-FH4的芯片,320K的DRAM,无PSRAM

  • FM模块:RDA5807M

一. 如何使用

1. 使用编译好的二进制程序

  • 下载编译好的二进制程序:eetree.ino.esp32s2.bin

  • 安装CH340串口驱动

  • 使用Arduino将二进制程序上传到开发开发板上

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编译烧录到开发板上

46010134-149a-11ec-8fb8-12bb97331649.png

二. 运行现象

  • 开机是会进入显示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. 开发板运行情况

46120736-149a-11ec-8fb8-12bb97331649.png


46321404-149a-11ec-8fb8-12bb97331649.png

464f90ce-149a-11ec-8fb8-12bb97331649.png

三. 已知BUG

  • 上电时如果没有连接wifi失败会停留在Logo界面

  • 上电时如果没有成功连接到时间服务器上回停留在Logo界面

  • 长按按钮会出现连按的问题, 会在不同的界面里面循环跳转

  • 即使关闭了扬声器的输出, FM收音机依然也会在耳机中输出

四. 笔记

1. 项目前瞻

  • 竞争力: 相较于手机来说, 此产品的成本更低, 续航更高, 专一性更强, 更加小巧

  • 改进:

    • 可以增加一块电池, 增加便携性

    • 增加一块蓝牙模块, 增加蓝牙功能

2. 开发环境的部署

  • 下载Arduino

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

46695c52-149a-11ec-8fb8-12bb97331649.png

  • 安装VScode

    https://code.visualstudio.com/download

467941b2-149a-11ec-8fb8-12bb97331649.png

  • 下载VS Code插件 Arduino

4697bee4-149a-11ec-8fb8-12bb97331649.png

  • 在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第三方库

46ad1708-149a-11ec-8fb8-12bb97331649.png

46bae3e2-149a-11ec-8fb8-12bb97331649.png

46c7affa-149a-11ec-8fb8-12bb97331649.png

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连接

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

   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


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 收音机
    +关注

    关注

    57

    文章

    575

    浏览量

    74319
  • 工程师
    +关注

    关注

    59

    文章

    1553

    浏览量

    67501
  • FM
    FM
    +关注

    关注

    1

    文章

    177

    浏览量

    58748
  • WIFI
    +关注

    关注

    81

    文章

    5160

    浏览量

    199424
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15808

原文标题:基于ESP32-S2实现的网络/FM两用收音机

文章出处:【微信号:xiaojiaoyafpga,微信公众号:电子森林】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [建议]FM收音机集成电路

    是电调谐FM接收集成电路, TDA2822是小功率双声道功放集成电路。此收音机耳机作为天线,具有体积小、外围元件少、灵敏度高 、性能稳定、噪声小、分离度高、制作和调试简单等特点。此收音机
    发表于 12-31 16:31

    用在盒式录音,收录两用机收音机中的6V,1.5W的电路

    用在盒式录音,收录两用机收音机中的6V,1.5W的电路
    发表于 12-21 11:37

    收音机的电路原理

    ,保证了收音机的品质。再经过检波还原音频,加上级音频放大和功率放大,经扬声器输出。FM收音机现代FM
    发表于 07-10 10:15

    分享 由51单片控制的FM收音机

    由51单片控制的FM收音机 本设计研究FM收音机分为硬件电路和程序设计个方面。从硬件电路来说
    发表于 10-05 18:15

    FM收音机

    请问一般的FM收音机的频偏是多少。
    发表于 10-31 14:36

    【乐鑫ESP32-DevKitC-32D模组开发板试用连载】WiFi网络收音机

    项目名称:WiFi网络收音机试用计划:申请理由:学生,想在家学习乐鑫esp32的WiFi以及蓝牙,机智云app,以及其他功能项目计划:利用WiFi以及蓝牙实现网络
    发表于 07-03 10:15

    如何使用esp32-s2模拟实现u***多点触摸?

    如何使用esp32-s2模拟实现u***多点触摸?
    发表于 02-22 06:15

    ESP32-S2创建热点后,是使用API来收发数据吗?

    ESP32-S2创建了热点,并且连接成功。然后我需要手机通过连接ESP32-S2的热点上网,我想问下连接热点后,那个API是用来接收设备发来的数据?
    发表于 02-13 08:29

    ESP32-S2创建热点后,是使用哪个API来收发数据?

    ESP32-S2创建了热点,并且连接成功。然后我需要手机通过连接ESP32-S2的热点上网,我想问下连接热点后,那个API是用来接收设备发来的数据?
    发表于 03-07 07:39

    WWE例程为什么不支持esp32-s2

    有谁知道WWE例程为什么不支持esp32-s2吗?想用ESP32-S2,但想不明白为什么不支持WWE例程。
    发表于 03-10 07:32

    ESP32-S3(ESP32-S2,ESP32)在商用触摸按键面板上使用安全吗?

    ESP32ESP32-S2ESP32-S3 的数据表中提到:[indent]ESP32-S3(ESP32-S2,
    发表于 04-12 07:03

    ESP32-S2-SOLO和ESP32-S2-SOLO-U技术规格书

    款模组内置的 ESP32-S2 芯片和 ESP32-S2R2 芯片同属 ESP32-S2 芯片(版本 v0.0),搭载 Xtensa® 32 位LX7 单核处理器,工作频率高达 24
    发表于 09-18 09:12

    使用ESP32 TTGO T Display设计网络收音机

    电子发烧友网站提供《使用ESP32 TTGO T Display设计网络收音机.zip》资料免费下载
    发表于 10-19 11:25 1次下载
    使用<b class='flag-5'>ESP32</b> TTGO T Display<b class='flag-5'>设计网络</b><b class='flag-5'>收音机</b>

    带有有线以太网连接的ESP32网络收音机

    电子发烧友网站提供《带有有线以太网连接的ESP32网络收音机.zip》资料免费下载
    发表于 11-22 10:38 3次下载
    带有有线以太网连接的<b class='flag-5'>ESP32</b><b class='flag-5'>网络</b><b class='flag-5'>收音机</b>

    基于ESP32网络电台

    在对 esp32 进行了一些试验之后,我萌生了用它制作网络收音机的想法。互联网上已经有一大堆这样的例子,最后我想出了两个例子的组合:Simple_esp32_radio - https
    发表于 12-19 16:22 7次下载