基于FireBeetle 2 ESP32-E音乐频谱仪
——Funpack第二季第三期:FireBeetle 2 ESP32-E IoT 开发板
项目介绍
用FireBeetle ESP32-E开发板作为控制单元,搭配显示屏移植lvgl图形库,动态显示任意一个及以上传感器采集到的数据,或者使用触摸屏对执行器进行控制。
设计思路
使用FireBeetle ESP32-E开发板板载ADC对声音模块电压信号进行连续采样,采样完成后将声音ADC数据进行FFT变换,然后将FFT变换后的数据通过LVGL的图表显示在1.9寸TFT屏幕上。
硬件设计
主控使用FireBeetle ESP32-E开发板,由DFRobot公司设计生产,FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,支持WIFI和蓝牙双模通信
并具有体积小巧
、超低功耗
、板载充电电路
、接口易用
等特性。可灵活的用于家庭物联网改装
、工业物联网改装
、可穿戴设备
等等。
· 拥有更丰富的软硬件资源
· 体积小巧,仅25.4 × 60 mm
· ESP32双核低功耗主控,WiFi+BT4.0二合一
· GDI显示接口,可以单线连接显示屏
· 板载充电电路以及PH2.0锂电池接口
传感器 使用的是模拟声音传感器,可用来对周围环境中的声音强度进行检测,具有300倍的放大器,输出模拟信号能使用3.3V和5V为基准AD采集,可以用来实现根据声音大小进行互动的效果。
屏幕显示拓展板使用立创EDA软件设计了FireBeetle ESP32-E的TFT拓展板,板载1.9寸TFT屏幕、SHT30温湿度模块、4个触摸按键和3Pin外接接口。
原理图如下:(需要注意引脚34-39只能用做输入)
屏幕显示拓展板渲染图如下图:
FireBeetle ESP32-E开发板与屏幕显示拓展板装配效果如下图:
软件设计
软件开发使用PlatformIO
进行开发,框架使用Arduino
,上手较简单,同时Arduino
提供十分丰富的库,大大加快了开发速度。
音乐频谱显示
声音频谱显示效果如下图:
FFT使用的是arduinoFFT
库,通过将ADC的声音信号多次采样,然后进行FFT运算。
void Adc_fft(void)
{
sampling_period_us = round(1000000*(1.0/samplingFrequency));
microseconds = micros();
for(int i=0; i<samples; i++)
{
vReal[i] = analogRead(ADC_PIN);
vImag[i] = 0;
while(micros() - microseconds < sampling_period_us){
//empty loop
}
microseconds += sampling_period_us;
}
/* Print the results of the sampling according to time */
FFT.Windowing(vReal, samples, FFT_WIN_TYP_HAMMING, FFT_FORWARD); /* Weigh data */
FFT.Compute(vReal, vImag, samples, FFT_FORWARD); /* Compute FFT */
FFT.ComplexToMagnitude(vReal, vImag, samples); /* Compute magnitudes */
Serial.println("Computed magnitudes:");
PrintVector(vReal, (samples >> 1), SCL_FREQUENCY);
double x = FFT.MajorPeak(vReal, samples, samplingFrequency);
Serial.println(x, 6); //Print out what frequency is the most dominant.
}
FFT显示使用的是LVGL的chart控件,直接将运算的数据赋值到屏幕上进行显示。
void ui_FFT(void)
{
/*Create a chart*/
chart = lv_chart_create(lv_scr_act());
lv_obj_set_size(chart, 320, 170);
lv_obj_align(chart, LV_ALIGN_CENTER, 0, 0);
lv_chart_set_type(chart, LV_CHART_TYPE_BAR); /*Show lines and points too*/
lv_chart_set_point_count(chart, 16);
lv_chart_set_range(chart, LV_CHART_AXIS_PRIMARY_Y, 0, 2000);
chart_ser1 = lv_chart_add_series(chart, lv_color_hex(0xfb1505), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_next_value(chart, chart_ser1, vReal[0]);
lv_chart_refresh(chart); /*Required after direct set*/
}
屏幕驱动库使用的是TFT_espi
库,这个库作为屏幕开发常用库。
时钟显示器
系统上电后首先连接WIFI,连接成功后通过WIFI获取sntp时间,然后将时钟数据发送到LVGL对应的控件进行显示。因为FireBeetle ESP32-E板载了锂电池充放电电路,因此时钟也可通过电池驱动。
小结
FireBeetle ESP32-E具有丰富的开发方式,深度支持ArduinoIDE,还可以使用MicroPython、Mind+图形化等编程环境。同时ESP32丰富的板载资源使得完成相关的任务较为简单。音乐频谱显示有待优化,可以将不同的柱变换为不同的颜色增加观赏性。
最后,感谢电子森林和硬禾学堂提供的开发板和项目实战计划,同时给出了大量的开源学习资料和教学视频,让我可以很快上手。
源代码上传在附件。