回到顶部 回到顶部
best-icon

基于Gravity: I2C 录放音模块和树莓派Pico的留言机 简单

头像 HonestQiao 2022.09.02 88 0

在这个实例中,使用Gravity: I2C录放音模块来负责声音的录制和播放,使用树莓派Pico负责逻辑的处理。

这个I2C录放音模块,可以录音10段,总计最长时间为100秒。可以通过按键单独操作,也可以通过I2C由其他设备进行控制。

本次实现的具体功能,就是利用树莓派Pico上的BOOTSEL按键,来控制录音和播放。

 

通常树莓派Pico上的BOOTSEL按键只能用于下载代码,但这个例子中,可以用于USER输入按键。

长按(3秒+左右),则进入录音模式;

短按,则负责结束录音,或者播放当前录制的内容。

 

正在代码的编写,使用Arduino IDE。

材料清单

  • Gravity: I2C 录放音模块 EDU X1 链接
  • 树莓派Pico X1 链接
  • 无源音箱小喇叭 (8Ω3W) X1 链接
  • 杜邦线 X4 链接

步骤1 连线参考下图:

project-image

具体接线说明:

1. 录放音板的SDA、SCL要接到Pico的4、5脚;Pico其他脚虽然可以复用为该功能,但是必须要接到这两个引脚,否则无法直接使用。

2. 小喇叭直接接到扬声器输出口。喇叭和耳机不能同时使用。

步骤2 代码编写

代码
#include "DFRobot_VoiceRecorder.h"

#define I2C_ADDRESS  0x30 // default I2C address 0x30
DFRobot_VoiceRecorder_I2C voicerecorder(&Wire, I2C_ADDRESS);

void setup()
{
  Serial.begin(115200);
  while (voicerecorder.begin() != 0) {
    Serial.print(voicerecorder.getI2CAddress());
    Serial.println("i2c device number error!");
    delay(1000);
  }
  Serial.println("i2c connect success!");

  voicerecorder.playVoiceEnd();
  voicerecorder.recordVoiceEnd();

  pinMode(LED_BUILTIN, OUTPUT);
}

int button_cnt = 0;
bool record_status = 0;
bool play_status = 0;
void loop()
{
  if(BOOTSEL==1) {
    Serial.print("Push BOOTSEL ");
    Serial.println(button_cnt+1);
    button_cnt++;
  } else {
    if(button_cnt>=10) {
      // 长按,重新录音
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("Long Button");
      // 检测现有录音
      voicerecorder.setVoiceNumber(VOICE_NUMBER_0);
      // 先停止
      voicerecorder.playVoiceEnd();
      // 再检查
      if(voicerecorder.getVoiceState()==0) {
        // 不为空,先删除现有的
        Serial.println("Delete old record");
        voicerecorder.deleteVoice();
        delay(3000);
      }
      // 设置录音状态
      play_status = 0;
      record_status = 1;
      Serial.println("Start new record");
      voicerecorder.recordvoiceStart();
    } else if(button_cnt>0) {
      // 短按,停止或者播放录音
      Serial.println("Short Button");
      voicerecorder.setVoiceNumber(VOICE_NUMBER_0);
      if(record_status) {
        // 录音中,先停止
        Serial.println("Stop new record");
        voicerecorder.recordVoiceEnd();
        record_status = 0;
      } else {
        if(play_status) {
          // 处于播放状态,停止
          Serial.println("Stop play record");
          voicerecorder.playVoiceEnd();
          play_status = 0;          
        } else {
          // 未播放,未录音,则检查是否有,有则播放
          if(voicerecorder.getVoiceState()==0) {
            // 有录音,则播放
            Serial.println("Play record");
            play_status = 1;
            voicerecorder.playVoiceStart();
          } else {
            // 没有录音,不播放
            Serial.println("No record");
            play_status = 0;
          }
        }
      }
    } else {
      // 无按键,不操作
    }
    button_cnt = 0;
  }
  if(record_status==0) {
    digitalWrite(LED_BUILTIN, LOW);
  } else {
    digitalWrite(LED_BUILTIN, HIGH);
  }
  delay(100);
}

步骤3 代码逻辑

project-image

步骤4 实物效果

project-image

步骤5 使用视频

步骤6 补充说明

1. 录放音模块的使用可以参考官方资料:https://wiki.dfrobot.com.cn/DFR0699_%E9%9F%B3%E9%A2%91%E5%BD%95%E6%94%BE%E6%A8%A1%E5%9D%97_Pro

其中有DFRobot_VOiceRecord库的安装说明。

 

2. 树莓派Pico的BOOTSEL按键使用,可以参考:https://www.reddit.com/r/raspberrypipico/comments/lymezt/say_i_want_to_use_the_boot_select_button_as_a/

评论

user-avatar