ESP32S2小项目-FM-网络时钟/电台-Arduino开发环境
ESP32S2小项目,FM,网络时钟/电台,Arduino开发环境
效果展示
文章目录
- ESP32S2小项目,FM,网络时钟/电台,Arduino开发环境
- 效果展示
- 开机动画:
- 网络时钟:
- FM模块:
- 网络收音:
- 硬件平台
- 开发平台
- 简单环境配置
- 第一步:首选项中开发板管理网址:
- 第二步:开发板管理器,找ESP32,下载
- 第三步:换开发板
- 手动配置
- 首先,下载解压我这个包
- 然后,解压到自己的arduino安装路径里替换掉它
- 程序简述
- 代码逻辑:
- 连接WiFi:
- 网络时钟:
- FM收音机:
- 网络收音:
- 结语
开机动画:
网络时钟:
FM模块:
网络收音:
硬件平台
ESP32是乐鑫的一块国产WiFi芯片。
ESP32-S2-MINI-1采用PCB板载天线,模组配置了4MB SPI flash,32 位LX7 单核处理器,工作频率高达 240 MHz。43 个 GPIO 口,14 个电容式传感 IO,支持 SPI、I2C、I2S、UART、ADC/DAC 和 PWM 等各种标准外设,支持 LCD 接口(8-bit 并口 RGB、8080、6800 接口),支持 8-/16-bit DVP 图像传感器接口,最高时钟频率支持到 40 MHz ,支持全速 USB OTG。
硬核学堂在ESP32-S2-MINI-1的基础上,扩展了麦克风输入、按键输入、红外输入、FM收音机模块、12864OLED屏幕输出、扬声器(耳机接口)输出。
具体信息请参考下面网址:
电子森林基于ESP32-S2模块的物联网/音频信号处理平台
开发平台
可选择平台有:esp-idf、Arduino,CicruitPython,因为前段时间刚用Arduino平台玩过ESP8266模块,所以这里选择Arduino平台进行开发(我才不会告诉你们,我是因为esp-idf编译工具链没配置好)。
简单环境配置
第一步:首选项中开发板管理网址:
https://dl.espressif.com/dl/package_esp32_index.json
第二步:开发板管理器,找ESP32,下载
第三步:换开发板
因为下载太慢,一般会直接用别人下载好的ESP32的包,但问题是相当的多,给大家放一个我的环境配置历程图:
手动配置
最后把我成功试验过的一种方法告诉大家:
首先,下载解压我这个包
–来自百度网盘超级会员V4的分享
hi,这是我用百度网盘分享的内容~复制这段内容打开「百度网盘」APP即可获取
链接:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rQh7p6CG-1643251689534)(file:///C:\Users\lenovo\AppData\Roaming\Tencent\QQTempSys[5UQ[BL(6~BS2JV6W}N6[%S.png)]https://pan.baidu.com/s/1Pcb6X0YfKsrcxr-ZpKr4wA
提取码:qw35
然后,解压到自己的arduino安装路径里替换掉它
关掉,再打开Arduino就能看到开发板了。
以后大家想配置任何开发板的环境,只要把它的包放到这个路径里就好,亲测有效。
万事俱备,接下来就是进行软件开发了。
程序简述
代码逻辑:
逻辑不算复杂。
连接WiFi:
//wifi用户名与密码
char* ssid = "iron2222";
char* password = "*******9009";
//启动WiFi服务,这里是客户端(放在set up函数里)WiFi.begin(ssid, password); Serial.print("Connecting to "); // 串口监视器输出网络连接信息Serial.print(ssid); Serial.println(" ..."); // 告知用户正在尝试WiFi连接int i = 0; // 这一段程序语句用于检查WiFi是否连接成功while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函数的返回值是由WiFi连接状态所决定的。 delay(1000); // 如果WiFi连接成功则返回值为WL_CONNECTED Serial.print(i++); Serial.print(' '); // 此处通过While循环让NodeMCU每隔一秒钟检查一次WiFi.status()函数返回值} // 同时NodeMCU将通过串口监视器输出连接时长读秒。// 这个读秒是通过变量i每隔一秒自加1来实现的。 Serial.println(""); // WiFi连接成功后Serial.println("Connection established!"); // 将通过串口监视器输出"连接成功"信息。Serial.print("IP address: "); // 同时还将输出IP地址。这一功能是通过调用Serial.println(WiFi.localIP()); // WiFi.localIP()函数来实现的。该函数的返回值即NodeMCU的IP地址。ipaddress = WiFi.localIP().toString();
网络时钟:
//网络时钟设置
const char *ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 8 * 3600;
const int daylightOffset_sec = 0;
// 从网络时间服务器上获取并设置时间,获取成功后芯片会使用RTC时钟保持时间的更新(放在set up函数里)configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);printLocalTime();
//网络时钟显示函数
void timer_show() {struct tm timeinfo;if (!getLocalTime(&timeinfo)){u8g2.clearBuffer();u8g2.setFontDirection(0);u8g2.setFont(u8g2_font_ncenB08_tr);u8g2.setCursor(0, 40);u8g2.print("Failed to obtain time");u8g2.setCursor(2,55);u8g2.print(ipaddress);u8g2.sendBuffer();return;}u8g2.clearBuffer();u8g2.setFontDirection(0);u8g2.setFont(u8g2_font_ncenB14_tr);u8g2.setCursor(20, 15);u8g2.print(&timeinfo, "%H:%M:%S");u8g2.setCursor(15, 35);u8g2.print(&timeinfo, "%Y/%m/%d");u8g2.setCursor(2,55);u8g2.print(ipaddress);u8g2.sendBuffer();
}
FM收音机:
因为FM模块是通过I2C进行数据传输的,所以要打开相应的配置。
//I2C引脚设置
#define ESP32_I2C_SDA 5
#define ESP32_I2C_SCL 4
#define MAX_DELAY_RDS 40 // 40ms - polling method
long rds_elapsed = millis();
RDA5807 rx;
// I2C相关设置(放在set up函数里)Wire.begin(ESP32_I2C_SDA, ESP32_I2C_SCL);rx.setup();rx.setVolume(0);//音量大小设置,可调delay(500);//FM相关设置rx.setFrequency(10650); //开启是频率,可调//使能SDRrx.setRDS(true);
//FM模式显示函数
void FM_show() {char str[64] = {0};u8g2.firstPage();u8g2.clearBuffer(); //清除内部缓冲区u8g2.setFontDirection(0); //设置字体方向u8g2.setFont(u8g2_font_ncenB14_tr); //设置字体u8g2.setCursor(15, 20);u8g2.print("FM Radio");u8g2.setFont(u8g2_font_ncenB10_tf); u8g2.setCursor(15, 40);sprintf(str, "%u MHz",rx.getFrequency() );u8g2.print(str);u8g2.setCursor(15, 55);sprintf(str, "Vol: %2.2u",rx.getVolume());u8g2.print(str);u8g2.sendBuffer();delay(1000);
}
网络收音:
这里其实可以重点讲解一下,因为涉及到了DAC。关于什么是ADC/DAC大家可以看这篇博文:
博客园:https://www.cnblogs.com/iron2222/p/15833426.html
CSDN: https://iron2222.blog.csdn.net/article/details/122636386?spm=1001.2014.3001.5502
整个webradio的实现过程可以划分为三部分:
- 获取音频流,程序使用的 http 协议从一个服务器上面获取的音频数据,并将整个数据存放到一个 buffer 中。
- 对音频流进行解码,当 buffer 中有一定的数据后(可以通过宏进行调整),开启解码线程。解码线程会从这个 buffer 中取出数据,然后调用解码库,将音频流解码为可直接输出的数字信号。
- 将解码后的数据通过 DAC 输出,解码线程每解完一帧数据后,将它通过 I2C 驱动程序直接送给 DAC。
这里面存在一个同步的问题,即从服务器上面获取音频流与对音频流进行解码的同步。如果获取的音频流过快,超过了解码的速度,则它可能将 buffer 撑爆,因此会丢失部分数据;如果解码的速度过快,超过了获取音频的速度,则它可能将 buffer 消耗的干干净净,从而也会出现声音卡顿问题。这需要进行权衡。
但是在S2中无法实现在线音频流的解码,所以利用ESP8266作为网络服务器用socketTCP传输搭建了了独立的网络音频库,上面看到的那个黑色的模块。
//网络收音
uint16_t num=0;
#define WEBSERVERIP "192.168.43.212"
#define WEBSERVERPORT 3999
uint8_t netbuf[3][1024]; //网络数据缓冲区
uint16_t writep = 0; //写入数量
uint16_t readp = 0; //读取数量
WiFiClient client; //声明一个客户端对象,用于与服务器进行连接
bool connstat = false; //连接状态
bool iswaitecho = false; //是否等待服务器回应
Ticker flipper; //时间中断
uint16_t m_offset = 0;void onTimer(void) {if(readp<=writep) dacWrite(17, netbuf[readp % 3][m_offset++]); //播放一次声音if (m_offset >= 1024) {m_offset = 0;readp++; //读取完成一个缓冲区}
}
bool connNetMusic() {uint8_t i = 0;while (i < 5) { //最多连接5次if (client.connect(WEBSERVERIP, WEBSERVERPORT)) {connstat = true;Serial.println("连接成功");return true;} else {Serial.println("访问失败");client.stop(); //关闭客户端}i++;delay(100);}return false;
}void playMusic() {digitalWrite(41, HIGH);digitalWrite(42, HIGH);if (connstat == true){if (iswaitecho == false && (writep - readp) < 2) {client.write('n'); //申请一个缓冲片iswaitecho = true;}if (client.available()) { //如果有数据可读取num = client.read(netbuf[writep % 3], 1024);if (writep == 0 && readp == 0) {flipper.attach(0, onTimer); //开启定时中断 就是每秒中断20000次}writep++;iswaitecho = false;}}
}
以上便是代码的各个模块配置,完整代码,可以去我的gitee库上下载,最终程序文件夹名字是arduino_final_test,其他文件夹是我对各个模块的功能测试,大家都可以拿来玩玩,一步一步的完成这个项目。
码云:https://gitee.com/iron2222/esp32
结语
这个项目还有很多可以改善的的地方,比如FM的自动搜索较好频道功能,以及网络电台的连接等。
下一步我会使用刚搭建好的esp-idf平台重新开发,arduino平台开发起来有些不是那么的得心应手,祝我bug少少!!!
祝大家有一个愉快的假期与春节哦!
ESP32S2小项目-FM-网络时钟/电台-Arduino开发环境相关推荐
- Java web小项目_个人主页(1)—— 云环境搭建与项目部署
摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...
- 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)
实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制"大白"颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮, ...
- Arduino基础入门篇02—Arduino开发环境IDE安装使用
工欲善其事,必先利其器.本文主要介绍Arduino开发环境IDE的安装及功能介绍. Arduino IDE安装 从官网下载IDE开发环境,IDE下载地址 .笔者使用Win10系统,点击 Windows ...
- arduino编码器计数_基于Arduino开发环境的光电编码器检测仪设计方案 - 全文
0 引言 Arduino是一款基于单片机系统的电子产品开发平台,它的软硬件系统都具有高度的模块化,而且软件系统是完全开源的.其硬件系统也是高度模块化的,在核心控制板的外围有开关量输入/输出模块.各种模 ...
- 项目应当经历的四种开发环境
项目应当经历的四种开发环境 在这里跟大家分享下,本人在实际的项目开发过程中,项目要经历的四种开发环境,以及环境所应用的场景. 1.本地环境 这个是指程序员自己电脑启动的环境,进行的改动会经常发生. 项 ...
- 【视觉运控一体机小课堂】三分钟搭建机器视觉开发环境
回顾之前课程正运动技术与大家分享了,VPLC系列机器视觉运动控制一体机快速入门和应用案例等系列课程. 今天,我们来讲解一下正运动技术VPLC系列控制器ZDevelop编程软件如何来建立ZVision软 ...
- 【花雕体验】12 搭建ESP32C3之Arduino开发环境
1.连接 ESP32-C3 和 PC,安装驱动(CH343) (1)WCH官网下载驱动 https://www.wch.cn/downloads/CH343SER_EXE.html (2)运行安装 ( ...
- Arduino可穿戴开发入门教程Arduino开发环境介绍
Arduino可穿戴开发入门教程Arduino开发环境介绍 Arduino开发环境介绍 Arduino不像我们使用的PC端操作系统一样,可以直接在操作系统中安装软件为操作系统编程.Arduino的软件 ...
- Arduino 002 --- 在Ubuntu(Linux) 中搭建Arduino开发环境
在Ubuntu/Linux 中搭建Arduino开发环境 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 需要安装的Arduino的版本:Arduino 1.6.11(最新版本) ...
最新文章
- python 编程入门-python编程入门(第3版)
- 【测试面试题】偶数和奇数
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
- linux ftp查看用户目录权限,linux 指定ftp用户 特定目录及权限
- WF4 常用类第二篇
- 野外帐篷露营避难有感
- rost反剽窃检测系统_学术不端检测规则是什么?
- 技术对接场景,打破创新窘境
- 【亲测可行】Autodesk 卸载工具,一键完全彻底卸载删除autodesk软件专门卸载工具...
- qt qml StackView 触摸滑动返回(swiping pop)
- uniapp H5 seo 百度自动收录(html通用代码)
- JAVA单车管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 51单片机数码管表白
- 代码实现判断主机字节序(大端 or小端 )-- 面试题
- vue2-element,vue3-element-plus 的列表翻页的序号
- 360全景拍摄有哪些技巧?
- 硬件学习-电子元器件相关资料汇总
- 关于计算机天赋测试,这是一道你绝没测过的测试题,能测出你的天赋究竟是什么...
- 未来计算机可能无处不在,未来计算机科学的发展趋势是什么?
- 使用Layui制作界面及功能
热门文章
- ChinaSkills-网络系统管理(2022年全国职业院校技能大赛-模块C-Linux部署-02卷-评分标准 )
- 软件工程作业-方舟学习笔记01-认识phase
- 房地产行业S2B2B电商交易系统移动应用一体化,S2B2B平台提高精细化运营能力
- 磨金石教育摄影技能干货分享|春之旅拍
- 微信 企业付款到零钱 提现
- Android:实现仿 美团/淘宝 多级分类菜单效果
- python win32转pdf 横版_Python 小技巧之 Office 文件转 PDF
- 这家伙有点懒,还没有个性签名 :) --工具篇02
- PVE-LXC容器启动ubuntu\debian 黑屏,切换控制台A start job is running for Raise network interface(5min 1s)
- Windows软件卸载不干净或异常导致无法重装的解决方案