众所周不知,我是一个有拖延症的人。有多拖延呢?我在2020年画的一个板子,在2025年终于完成了基本调试。

严格来说不是我一个人画的,看名字就知道。这是我和骚尼哥一起设计的,其实就是我提需求,他来帮我实现。工程创建时间是2020年初,但实施的时间应该在下半年了。
为什么有这档事?
因为骚尼哥在群里一直是无所不知的存在,而且他自称对PCB设计有很高的要求。所以我很想见识下他画的板子,于是在2020年跟他提了个请求,基于ESP8266设计个开发板,他负责硬件,我负责软件。

骚尼哥做事很稳健,我提的需求他都评估了一遍,确认没问题后开始干活。我印象里,他画完原理图就忙别的去了,PCB应该是我画的。应该是2020年底画完的板子,根据记录,打样的时间是2021年的1月底。
板子回来后是这个样子的:

然后我也开始了调试。
等等,为什么想弄一个ESP8266的开发板?
说来话长(是的,我要开始讲故事了)…
我第一次接触ESP8266应该是在2016年8月份,当时在某宝买了一个ESP-01的串口模块,通过串口指令实现模块的WiFi组网和数据通信。这是当时的购买记录:

当时是想尝试一下如何将单片机接入网络,按照说明操作了一下。但后续没有相关的项目,就不了了之了。
然后时间来到了2016年的下半年(也可能是年底),这个时候国内出现了一家公司(应该是公司吧),注册了一个网站叫“开发快”,不知道还有没有人记得。
当时是我石家庄的一个粉丝给我发信息,告诉我开发快在搞活动,可以免费申请板子。他不光自己申请到了,还帮我申请了一套,直接寄给我了(大恩不言谢)。就是这两个:

当我尝试搭建开发环境,学习他们的源码时,我呆住了。
因为要先在电脑上安装一个Linux的虚拟机,在虚拟机中才能进行编译。
呵呵,一个单片机级别的东西,想要开发还要先装Linux系统???这个世界怎么了?
所以收到的这两个板子我也只是把现成的固件烧录进去,看一下代码的执行效果。但开发这件事,我迟迟没有动手,因为我实在是无法理解。
2017年2、3月份,开发快还搞了一次开发者大赛,当时我在QQ空间帮他们宣传了一下。但是对于这种开发方式,我还是持观望态度,想看看市场的反馈。
期间也登陆过他们的网站和论坛,看了一下反馈。毕竟,一个能直接连WiFi的单片机,对于所有单片机开发者来说,都是很有吸引力的。
一看不要紧,果然,开发方式有了转机,Arduino入场了,呵呵。
我的心情变得更复杂了,像过山车一样。Arduino在很长一段时间里,都是教育行业、非专业电子爱好者使用,很多专业做开发的人是看不上arduino的(当然,这个状况现在有了一些转变)。当时我也看不上!
一个我抱有如此期待的芯片,开发方式竟然如此的不走寻常路。我当时犹豫了,要不要尝试arduino?再看看吧。
到了2017年的7月份,无意中发现有一家叫安信可的公司,做了一件功德无量的事。他基于eclipse,把ESP8266开发的工具链做了整合。也就是说,在windows环境下也能开发了。
我顿时来了兴趣,想尝试一下,于是找了找,发现也有这方面教程了:

但是学习过程总感觉怪怪的。ESP8266不像别的单片机,它的内部寄存器是不公开的,你找不到数据手册。早期乐鑫官网也只提供了一些现成的函数来调用,而这些函数具体如何实现也看不到,都是封闭的。

生态少的可怜,官方不怎么宣传,相关资料几乎没有,早期就是这样。
断断续续,到了2019年,我学的差不多了。还写了一些笔记,放在了我的QQ空间:

回想起开发快,上网查了一下,果然!来的快,那啥也快…
当然,这两年乐鑫也没有闲着,推出了ESP32,更新了ESP8266的SDK。之前分为NON_RTOS和RTOS两个版本,后面只更新了带RTOS的版本。底层的源码逐步放开,但是依然没有数据手册,只能根据代码去猜~~~
他们也提供了在Windows环境下的开发方式ESP IDF,关于开发环境的评价么,自己看:




总之,就是一个字:很难用!
2019年下半年,我当时自学完成了ESP8266的一些常用操作,有点膨胀了。结果就是对所有使用AT指令的方式嗤之以鼻,然后自视清高。决定去学ESP32,买了模块,画了板子。
但是,学到后面我也不适应安信可提供的环境了,毕竟是个第三方,资料和服务很难和原厂实现闭环,我感觉我在一条野路上越走越远。
2020年初,我开始思考ESP8266能做点什么,争取用上自己所学的东西。通过查看它的外设资源,我发现它竟然有一个I2S接口,这是之前没有意识到的。而一旦能够正常使用,能做的事情就多了。

但是它的I2S有点奇怪,分成了输入和输出。通常来说,一组就行了,可以随时切换方向。
一个能接入WiFi的单片机+一个I2S接口,你想到了什么?不错,早就有人想到了:

这是2018年21ic论坛上的一个帖子,楼主说了个思路,但是后续没更新了。我想试试,但是语音对话就算了,我当时想做语音识别,I2S录音+第三方API调用。第三方我选的是百度的语音识别API,功能挺完善的。
所以我当时在硬件上的需求是:
1、点灯,基操不解释;
2、ADC采样,功能太弱,用来做按键检测;
3、I2C驱动OLED屏幕显示;
4、SPI接口驱动TF卡,实现fatfs文件系统;
5、从TF卡读取音频文件,通过I2S实现音乐播放;
6、通过I2S接口实现音频的录制,通过WiFi上传并转为文字。
当然,这些需求都是后续我和骚尼哥一起整理出来的。硬件就是ESP8266+WM8978+MIC+OLED+按键+串口一键下载电路。
所以,就出现了2021年初板子打样的事件。打样回来后,我也很快投入了调试。而这次我使用的不再是安信可的eclipse环境,我想尝试官方的ESP-IDF。更无语的事情出现了,官方的ESP-IDF明面上已经不再支持ESP8266,主推ESP32,也就是说乐鑫已经准备,逐步把ESP8266放弃了。
我在GitHub上找到了最新的SDK版本,里面的说明大致表达了一个意思:该版本以后只做bug修复,不再进行功能的更新。
不过还好,民间有些高手摸索出了继续使用IDF开发的方式,依次下载:msys2、xtensa-lx106-elf和ESP8266_RTOS_SDK,然后安装到指定位置即可。
msys2是在 Windows 系统上模拟类 Linux 命令行运行环境的工具集合 。它能让开发者在 Windows 下使用部分 Linux 命令和工具链,为编译 ESP8266 代码提供适配的终端环境。
xtensa – lx106 – elf是针对 Xtensa LX106 架构 的交叉编译工具链,因为8266就是Xtensa LX106 架构的。
使用这种方式,我也很快就入手了。点灯、IIC驱动屏幕,都很快完成。
运行起来后就是这么个界面,在Windows下通过这么个界面通过命令进行编译、下载、配置。代码的编辑可以使用常用的编辑器,例如VS code等。
遇到的第一个问题是如何通过SPI接口驱动TF卡,因为SDK中没有这方面例程。SDK中SPI的例程主要有两个,一个是主机和从机之间的通信,另一个是驱动OLED屏幕。而且这里的SPI还搞得比较特殊,弄了个HSPI,总之看的很累。
于是我又来到全球最大的程序员同性交友网站,试图找个轮子,结果还真被我找到了。某个外国程序员分享了自己写的驱动程序,实现SPI接口带fatfs文件系统操作TF卡。SDK用的是很低的版本,我尝试移植到当时使用的版本竟然成功了。但是不太稳定,只能运行在低速的情况,速度一旦提高就容易卡死。
然后是I2S,这部分功能要通过音频播放来实现。因为用的芯片是WM8978,我在某宝买了相应的模块,通过赠送的例程获取了WAV文件播放的源码。源码是基于STM32实现的,我研究了一下移植到了ESP8266。模块图片如下:
花了几天时间,音乐播放成功,我又膨胀了。
接下来我想试一下WAV文件上传到百度的语音识别平台,转换成文字。于是我来到百度的开发者平台,注册了账号。新用户貌似是有180万的免费token,有效期半年,刚好拿来练习。
因为涉及到http相关的一些操作,我先熟悉了一下8266的SDK中相关的例程,用天气预报的API练了一下手,没问题后尝试上传wav文件。
1、使用官网提供的wav文件,我存到了TF卡中,到时候直接从TF卡读取即可。
2、创建应用,获取API Key和Secret Key。

3、获取access_token,获取方式官网中有详细的说明。

简单来说,就是授权服务地址+grant_type+client_id+client_secret,组成一个链接,通过POST方式提交即可。我偷了个懒,这一步没做,直接在浏览器中输入链接,手动从返回信息中把token摘出来了。有效期一个月,先这么用。
4、POST方式上传,官网支持两种:JSON和RAW,这里我选的是RAW。

然而,这时遇到了一个很麻烦的问题,ESP8266的RAM总共才160KB,其中还有60多KB的指令RAM,也就是说用户能用的RAM总共90多KB。而一个wav文件,随随便便就过百了。

我把SDK中涉及POST上传部分的源码全都看了一遍,没有提到这种数据量大的情况如何处理。怎么办?
我决定修改SDK中的源码,把http通信中数据上传部分重写,在原有的功能基础之上写了一段新的函数。当需要进行大量数据传输时,把数据切片,例如每次传输2K,通过这种方式实现了数据的上传。
当我颤颤巍巍把程序烧录进去,看到返回信息:北京科技馆,我从椅子上跳了起来,成了!
当时是2021年的三四月份,原本想一鼓作气,把它弄完的。结果公司来了新项目,把我拉去加班了。项目忙的差不多以后,工作又有了变动,结果就搁置了。
2024年7月份,当时忙完了一个大项目,忙的麻木了,想给自己放松下。翻了翻之前的东西,结果把它翻出来了。拿在手里,莫名的开心从心里涌了出来,把它弄完吧。
经历了换电脑、资料整理、环境重新安装,LED亮起来了。但还是有很多事情要做:fatfs文件系统不稳定、MP3文件播放不支持、语音识别不完善等等。
先从fatfs文件系统开始吧,以那位国外工程师的源码为思路,找了个比较稳定的文件系统版本,结合SDK中SPI的操作函数,先把功能实现了。速度方面,发现HSPI的传输方式和传统SPI不太一样,做了适配之后终于提上来了。
然后是mp3,我想让ESP8266对mp3文件解码,然后I2S口送到WM8978进行播放。计划用Helix库来实现这方面的解码,我找了基于STM32的例程,研究了一下开始移植。
中间遇到了很多问题,前后差不多弄了十多天,总算编译出来一个不报错的工程。烧录进去以后,终于…
我放弃了!
是的,烧录进去后,8266直接卡死了,每隔几秒重启一下。在这种简陋、难排查、资料少、缺经验的情况下,下一步我真的不知道该怎么搞了。我承认我真的给自己挖了个大坑,老夫认了!
怎么办?
休息了几天,我看向了…

是的,我脏了,对不起您啊张老师,我竟然用上了这个!
我在问题排查阶段,搜索关键词:ESP8266+MP3,能看到很多文章,都是基于arduino中的一个库:

当我实在没办法的情况下,我想试试这个。
然后…

我开始怀疑我之前累死累活图什么…
但随着深入测试,发现还是有问题。播放单个音频没问题,播放列表的时候会时不时的卡死。一开始我以为是TF卡驱动有问题,做了调整、降了速率,没效果,后来无意中发现调整某个变量的定义位置就解决了。
我滴天…
好,mp3的问题解决,接下来又回到了关键地方:语音识别。结合之前的经验,要完成这一目标,我需要把问题分解。
第一步,录音。之前用的是官网提供的音频文件,现在要自己录音。格式我选的wav(其实最省事是pcm),但是没法存在TF,因为HSPI接口和I2S接口部分冲突。
于是我又研究了SPIFFS,准备存在ESP8266自身的flash中。时长定了5秒,够用即可。

第二步,放音。要确保录音文件正常,就要把它播放出来。文件存在了flash中,无法导入电脑,只能再写个程序从flash中读取文件,然后通过I2S送入WM8978中播放。

第三步,获取token。之前是通过手动的方式从浏览器那里摘出来,现在要通过代码实现。

第四步,从TF卡中上传wav文件到百度后台,进行识别。Arduino中也没有进行大文件http传输的函数,我借鉴之前的思路也进行了切片处理。

第五步,要你命三千。是的,把上述的各个功能集合到一起:获取token、录音、保存、上传、获取识别信息。
我外接了几个按键到ESP8266的ADC接口,通过电阻分压实现不同的按键检测,进而定义不同的功能,实现切换。
终于:

圆满!

那么,折腾这么久,就为了做个语音识别的功能,值吗?
2024~2025年,人工智能爆发,ESP32借着“小智”一下子吸满了眼球。当然,之前也已经很火了。所以,现在做这个其实意义不大了,因为物联网和人工智能的场景中,到处都是ESP32。
但是,我想给ESP8266一个体面的退场。
我现在还记得2017年,我的一个粉丝帮我申请的两个板子寄到我手里时的心情。一个单片机,竟然有wifi,竟然有如此大的flash,这对那个时候的一个单片机从业者是多么大的诱惑。
但是,开发环境是如此的难用,资料如此的少,生态如此的不完善,我是如此的恨铁不成钢。
好不容易等了几年,SDK更新了,ESP32出来了,但是IDF中已经不支持ESP8266了。可能从商业或者战略的角度上看,这样做没问题。
但是,就是替它觉得可惜!就这样吧!
原理图和源码上传到了公众号后台,回复关键词:029或者8266语音,可以获取下载链接。