
暖冬造物-基于ESP32S3开发板的RDA5807M收音机
简介
基于ESP32S3开发板,驱动RDA5807M模块,开发一个带有温湿度显示的收音机。
简介:基于ESP32S3开发板,驱动RDA5807M模块,开发一个带有温湿度显示的收音机。开源协议
:TAPR Open Hardware License
描述
项目简介
本项目是基于立创的ESP32-S3开发板的收音机。
项目功能
本设计是基于立创的ESP32-S3开发板的收音机;
设置有4个独立按键;
设置有2个独立指示灯;
设置有1个温湿度采集。
项目参数
本设计采用ESP32-S3芯片,双核,主频高达240M;
本设计采用OLED液晶显示,显示当前的温度和湿度况;
选用全数字型温湿度传感器SHT40。
通过按键切换,可以静音,调整音量大小,切换频道
硬件说明
本项目由以下部分组成:主控部分、按键部分、显示部分、LED指示灯部分、收音机。
主控说明
立创ESP32-S3开发板是一款基于ESP32-S3芯片的高性能开发板,具备丰富的功能和特点,非常适合物联网、嵌入式开发等领域的应用。
一、芯片与性能
核心芯片:采用ESP32-S3芯片,该芯片集成了Xtensa® 32位LX7双核处理器,主频高达240MHz,内置512 KB SRAM(TCM),为复杂的数据处理和多任务执行提供了强大的计算能力。
AI加速:ESP32-S3增加了用于加速神经网络计算和信号处理等工作的向量指令,通过ESP-DSP和ESP-NN库,可以轻松实现高性能的图像识别、语音唤醒和识别等应用。
二、通信与连接
无线连接:支持Wi-Fi和Bluetooth 5(LE)双模通讯,降低了设备配网的难度,并支持蓝牙Mesh(Bluetooth Mesh)协议和乐鑫Wi-Fi Mesh,能够实现更高的通讯稳定性和更大的覆盖面积。
多种接口:拥有45个可编程GPIO管脚和丰富的通信接口,如SPI、I2C、UART等,便于与各种外设进行连接和扩展。
三、特色功能
电源管理:部分开发板可能集成了电源管理模块,支持锂电池充电和硬件开关机,提供了更加便捷的电源管理方案。
板载摄像头接口:部分型号的开发板板载了摄像头接口,并配备了独立的摄像头供电电路,减少了其他信号对摄像头的干扰,便于进行图像处理和视频传输等应用。
震动触觉:部分开发板还加入了手机般的人机交互震动触觉功能,通过振动电机驱动芯片实现更加丰富的交互体验。
四、开发工具与支持
开发环境:支持ArduinoIDE、ESP-IDF、MicroPython等多种开发环境,开发者可以根据自己的喜好和需求选择合适的开发工具进行编程。
例程与教程:官方提供了丰富的例程和教程,帮助开发者快速上手并进行项目开发。
技术支持:立创商城及其合作伙伴提供了多途径的技术支持,包括官方论坛、代码仓库、技术交流群等,方便开发者在遇到问题时寻求帮助。
五、适用场景
立创ESP32-S3开发板适用于多种场景,包括但不限于:
物联网设备开发:如智能家居、智能安防、智能穿戴等。
嵌入式系统开发:如工业自动化、农业自动化、智能交通等。
AI与机器学习应用:如图像识别、语音识别、自然语言处理等。
本项目使用的管脚和设计如下:
OLED显示
HS91L02W2C01显示屏是一款OLED显示屏,具有多种特性和应用场景。
基本参数
尺寸:0.91英寸
像素分辨率:128x32
接口类型:I2C
外形尺寸:38*12(单位可能为毫米,但具体单位需根据实物或数据手册确认)
工作温度:-40℃~+70℃,表明该显示屏在较宽的温度范围内都能正常工作。
技术特点
OLED技术:OLED(有机发光二极管)显示屏具有自发光的特性,能够实现更高的对比度和更广的色域,同时拥有更快的响应时间和更低的功耗。
I2C通讯:通过I2C接口进行通讯,使得该显示屏能够轻松与各种微控制器或处理器连接,实现数据的传输和控制。
黑底白光:采用黑底白光的显示方式,使得显示效果更加清晰明亮,适用于多种视觉环境。
应用场景
电子产品显示:由于尺寸小巧、功耗低且显示效果优异,HS91L02W2C01显示屏非常适合用于各种电子产品的显示界面,如智能手表、智能手环、便携式医疗设备等。
工业控制:在工业控制领域,该显示屏可以用于显示设备状态、参数设置等信息,帮助用户更直观地了解和控制设备。
其他领域:此外,该显示屏还可以应用于智能家居、汽车电子、安防监控等多个领域,为用户提供便捷的显示解决方案。
注意事项
在使用HS91L02W2C01显示屏时,需要参考其数据手册或相关文档,以确保正确连接和配置。
显示屏的显示效果和性能可能受到使用环境、驱动电路等多种因素的影响,因此在实际应用中需要进行适当的测试和调整。
按键电路
用来交互使用。
静音设置,
音量增大,
音量减小,
切换电台。
收音机模块
采用RDA5807M芯片,十分好用。
温湿度传感器
采用sht40模块,这里时为了学习使用。
指示灯电路
预留两路LED指示灯。
PCB设计
采用LC-EDA设计
3D外壳设计
采用LC-EDA设计
效果挺好的。
程序设计
采用VS-code进行编码。
主控代码如下:
#include
#include
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "oled.h"
#include "esp_timer.h"
#include "sht40.h"
#include "driver/gpio.h"
#include "RDA5807.h"
#define LED1_PIN 14
#define LED2_PIN 13
char ss[20];
u8 i = 0;
// 设置按键的引脚
#define KEY1_PIN 48
#define KEY2_PIN 47
#define KEY3_PIN 18
#define KEY4_PIN 17
#define GPIO_INPUT_PIN_SEL ((1ULL << KEY1_PIN) | (1ULL << KEY2_PIN) | (1ULL << KEY3_PIN) | (1ULL << KEY4_PIN))
void KeyGpioConfig(void)
{
// 初始化GPIO配置结构为零
gpio_config_t io_conf = {};
// 失能中断
io_conf.intr_type = GPIO_INTR_DISABLE;
// 设置输入引脚
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
// 设置输入模式
io_conf.mode = GPIO_MODE_INPUT;
// 使能上拉电阻
io_conf.pull_up_en = 1;
// 失能下拉电阻
io_conf.pull_down_en = 0;
////用给定的设置配置GPIO
gpio_config(&io_conf);
}
int GetKeyValue(void)
{
int key_value = 0;
if (gpio_get_level(KEY1_PIN) == 0)
{
key_value |= 0x01;
printf("k1\r\n");
}
if (gpio_get_level(KEY2_PIN) == 0)
{
key_value |= 0x02;
printf("k2\r\n");
}
if (gpio_get_level(KEY3_PIN) == 0)
{
key_value |= 0x04;
printf("k3\r\n");
}
if (gpio_get_level(KEY4_PIN) == 0)
{
key_value |= 0x08;
printf("k4\r\n");
}
return key_value;
}
void app_main(void)
{
OLED_Init(); // 初始化OLED
OLED_Clear();
OLED_DisplayTurn(1);
OLED_Refresh(); // 更新显示
gpio_reset_pin(LED1_PIN); // 初始化LED_PIN引脚
gpio_set_direction(LED1_PIN, GPIO_MODE_OUTPUT); // 配置引脚为输出模式
gpio_reset_pin(LED2_PIN); // 初始化LED_PIN引脚
gpio_set_direction(LED2_PIN, GPIO_MODE_OUTPUT); // 配置引脚为输出模式
gpio_set_level(LED2_PIN, 0);
gpio_set_level(LED1_PIN, 0);
IIC_Init();
KeyGpioConfig();
RDA5807M_init();
vTaskDelay(500 / portTICK_PERIOD_MS);
uint8_t Volume = 1;
RDA5807M_Set_Volume(Volume);
uint16_t basic_Freq = 8830;
// RDA5807M_Search_ALL_Freq();
RDA5807M_Set_Freq(basic_Freq);
RDA5807M_Search_Freq_TurnUp();
printf("Freq:%d\r\n", RDA5807M_Read_Freq());
// RDA5807M_SetMutea(0);
while (1)
{
int key_value = 0;
key_value = GetKeyValue();
if (key_value == 0x01) // 向左 频道减1
{
// basic_Freq++;
// RDA5807M_Set_Freq(basic_Freq); // 设置接收频率
RDA5807M_SetMutea(1);
}
else if (key_value == 0x02) // 向右 频道加1
{
// basic_Freq--;
// RDA5807M_Set_Freq(basic_Freq);
RDA5807M_Search_Freq_TurnUp();
printf("Freq:%d-Sig:%d\r\n", RDA5807M_Read_Freq(),RDA5807M_Read_Signal_Intensity());
RDA5807M_SetMutea(0);
}
else if (key_value == 0x04) // 确认 音量减1
{
if (Volume == 15)
{
Volume = 14;
}
Volume++;
RDA5807M_Set_Volume(Volume); // 设置声音大小范围:(0~15)
}
else if (key_value == 0x08) // 退出 音量加1
{
if (Volume == 0)
{
Volume = 2;
}
Volume--;
RDA5807M_Set_Volume(Volume);
}
OLED_Clear();
sprintf(ss, "Freq:%d", RDA5807M_Read_Freq());
OLED_ShowString(0, 0, (unsigned char *)ss, 8, 1); // 6*8
sprintf(ss, "Signal:%d", RDA5807M_Read_Signal_Intensity());
OLED_ShowString(63, 0, (unsigned char *)ss, 8, 1); // 6*8
i = SHT40_Cal();
if (!i)
{
sprintf(ss, "%3.1f", SHT40_GetTEM());
OLED_ShowString(0, 8, (unsigned char *)ss, 24, 1); // 6*8
OLED_ShowString(48, 20, (unsigned char *)"C", 8, 1); // 6*8
sprintf(ss, "%3.1f", SHT40_GetHUM());
OLED_ShowString(73, 8, (unsigned char *)ss, 24, 1); // 6*8
OLED_ShowString(121, 20, (unsigned char *)"%%", 8, 1); // 6*8
}
else
{
sprintf(ss, "%d", i);
OLED_ShowString(0, 8, (unsigned char *)ss, 24, 1); // 6*8
}
OLED_Refresh();
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
调试情况如下:
效果展示
可以移步B站观看
https://www.bilibili.com/video/BV1JzPyefE3Y/?vd_source=e36622a05269c0356d6cd566056a2488
设计图

BOM


评论