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

描述

这是一位工程师基于硬禾学堂"暑期一起练"的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编译烧录到开发板上

FM

  •  

 

二. 运行现象

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

FM


 

FM

 

FM

三. 已知BUG

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

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

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

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

四. 笔记

1. 项目前瞻

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

  • 改进:

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

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

2. 开发环境的部署

  • 下载Arduino

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

FM

  •  
  • 安装VScode

    https://code.visualstudio.com/download

FM

  •  
  • 下载VS Code插件 Arduino

FM

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

FM

  •  

FM

  •  

FM

  •  

     

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


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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分