在蜂鸣器上弹奏和弦,ESP32 Arduino



我想用esp32在蜂鸣器上同时播放两个频率(522和660(。

我尝试过这些不同的方法:

void loop()
{
unsigned long t = micros();
if(t % 261 <= 10) //for approximation
{
firstWave = !firstWave;
}
if(t % 330 <= 10)
{
secondWave = !secondWave;
}
if(firstWave && secondWave)
{
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);
}
}

这一次完全没有声音。然后我试着用FreeRTOS强迫它,没有想太多。。。

void secondWave(void* p)
{
while(true)
{
delayMicroseconds(330);
digitalWrite(13, HIGH);
delayMicroseconds(330);
digitalWrite(13, LOW);
} 
return;
}
void setup()
{
xTaskCreate(secondWave, "wave", 10000, NULL, 1, NULL);
}
void loop()
{
delayMicroseconds(261);
digitalWrite(13, HIGH);
delayMicroseconds(261);
digitalWrite(13, LOW);
}

这不起作用。。。但谁是看门狗,他为什么会被触发。

我不想买第二个蜂鸣器。我不想买不同的卡。

请帮忙,谢谢

如果只有一个蜂鸣器,您想要做的事情几乎是不可能的。

蜂鸣器通过以特定频率振动金属板来工作压电蜂鸣器一次只能播放一个频率。我知道你不想再买一个蜂鸣器,但这意味着你会被一次只播放一个音符的卡住

如果你想弹奏一个和弦,你甚至可能需要三个。你能做的就是试着制作一个扬声器或回收一个。这些通常可以同时播放多个频率。

这是一种粗糙但很好的演讲方式:引导

我对这个坏消息感到抱歉,我希望你会觉得这个有用——祝你今天愉快!

如果有人想知道,答案比我想象的要容易得多。不涉及数学。

基本上,这只是一个wav文件(16000赫兹(中的所有样本,我只是把它们塞进计时器,然后用dac写入蜂鸣器。

#include <driver/dac.h>
#include "sound.h"
hw_timer_t * timer = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
volatile uint32_t isrCounter = 0;
volatile uint32_t lastIsrAt = 0;
void IRAM_ATTR onTimer() {
portENTER_CRITICAL_ISR(&timerMux);
isrCounter++;
lastIsrAt = millis();
portEXIT_CRITICAL_ISR(&timerMux);
if (isrCounter > samplesLen) {
isrCounter = 0;
}
dac_output_voltage(DAC_CHANNEL_1, samples[isrCounter]);
}
void setup() {
pinMode(25, OUTPUT);
dac_output_enable(DAC_CHANNEL_1);
timer = timerBegin(0, 80, true);
timerAttachInterrupt(timer, &onTimer, true);
timerAlarmWrite(timer, 62, true);
timerAlarmEnable(timer);
}
void loop()
{
}

sound.h看起来像这样,但要长得多(大约长67923倍(:

const int samplesLen = 12;
const unsigned char samples[12] = {
0x8B, 0x91, 0x91, 0x91, 0x93, 0x94, 0x94, 0x95, 0x97, 0x8E, 0x77, 0x7C,
};

const关键字非常重要!!!

最新更新