Newer
Older
m5stickcplus / src / speakerhat01.ino
#include <M5StickCPlus.h>

const int servo_pin = 26;
uint8_t ledChannel = 0;
uint8_t resolution = 8;
uint32_t sampling_rate = 16000; //16kの場合。8kの場合は、8000

/*
    別タブ(ファイル名はなんでもよい)に、音声データを以下の形式で貼っておく。
    【音1】
    const uint8_t coin05_8k_raw[] PROGMEM = { 0x80, ... };
    const uint32_t coin05_8k_raw_len = 7218; // ←配列のサイズ
    【音2】
    const uint8_t coin05_16k_raw[] PROGMEM = { 0x80, ... };
    const uint32_t coin05_16k_raw_len = 14437; // ←配列のサイズ
    PROGMEM と書くと、フラッシュメモリに配置する

    そのうえで、以下のextern文を、別タブの変数名と合わせて書く。
    変数名を一致させることが重要です。
*/
//    【音1】
extern const uint8_t coin05_8k_raw[];
extern const uint32_t coin05_8k_raw_len;
//    【音2】
extern const uint8_t coin05_16k_raw[];
extern const uint32_t coin05_16k_raw_len;

void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setCursor(0, 30, 4);
  M5.Lcd.println(" speaker hat test");
  ledcSetup(ledChannel, sampling_rate * 32, resolution);
  ledcAttachPin(servo_pin, ledChannel);
  ledcWrite(ledChannel, 0);
}
void playMusic(const uint8_t* music_data, uint32_t len, uint16_t sample_rate) {
  uint32_t delay_interval = ((uint32_t)1000000 / sample_rate);
  for (int i = 0; i < len; i++) {
    ledcWrite(ledChannel, music_data[i]);
    delayMicroseconds(delay_interval);
  }
  ledcWriteTone(ledChannel, 0);
}
void loop() {
  M5.update();
  if (M5.BtnA.wasReleased()) {
    playMusic(coin05_16k_raw, coin05_16k_raw_len, sampling_rate + 800); //なぜか音が低いので +800した
  } else if (M5.BtnB.wasReleased()) {
    playMusic(coin05_8k_raw, coin05_8k_raw_len, sampling_rate / 2); // 8kなので、2で割った
  }
  ledcWriteTone(ledChannel, 0);
  delay(100);
}