////////////////////////////////////////////////////////////////////////////////////
// #include <freertos/FreeRTOS.h>
// #include <freertos/task.h>
// #include"pitches.h"
// int buzzerPin1 = 13; // 第一個蜂鳴器的Pin腳
// int buzzerPin2 = 12; // 第二個蜂鳴器的Pin腳
// // 第一個蜂鳴器的任務函式
// void taskBuzzer1(void *pvParameters) {
// (void)pvParameters;
// while (1) {
// tone(buzzerPin1, NOTE_C4, 100);
// vTaskDelay(110 / portTICK_PERIOD_MS); // 等待500毫秒
// }
// }
// // 第二個蜂鳴器的任務函式
// void taskBuzzer2(void *pvParameters) {
// (void)pvParameters;
// while (1) {
// tone(buzzerPin2, NOTE_E4, 100);
// vTaskDelay(110 / portTICK_PERIOD_MS); // 等待500毫秒
// }
// }
// void setup() {
// pinMode(buzzerPin1, OUTPUT);
// pinMode(buzzerPin2, OUTPUT);
// // 建立兩個任務來控制蜂鳴器
// xTaskCreate(taskBuzzer1, "Buzzer1", 1000, NULL, 1, NULL);
// xTaskCreate(taskBuzzer2, "Buzzer2", 1000, NULL, 1, NULL);
// }
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// // 和音-同時控制多個蜂鳴器
// /* ESP32 Arduino開發平台2.x版 */
// #include"pitches.h"
// int BPM = 130; // 表示1分鐘有130個四分音符的長度
// double tempo = 60.0/BPM; // 每個四分音符的時間長度(秒)
// int keyTransition = 30; // pause for key transition
// // 定義蜂鳴器的腳位
// const int n = 3;
// const int buzzerPin[n] = {13, 12, 14};
// // 黑色幽默 4/4
// int musical_Alphabet[][n] = {
// /*
// // 前奏
// {NOTE_G5 ,NOTE_B4, NOTE_}, {NOTE_G5 ,NOTE_B4, NOTE_},
// {NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
// {NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
// {NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
// {NOTE_E5 ,NOTE_G5, NOTE_}, {NOTE_E5 ,NOTE_G5, NOTE_},
// {NOTE_D5 ,NOTE_F5, NOTE_},
// */
// // A
// {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
// {NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
// {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
// {NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
// {NOTE_F4 ,NOTE_D4, NOTE_A3}, {NOTE_G4, NOTE_, NOTE_}, {NOTE_G4 ,NOTE_E4, NOTE_C4}, {NOTE_G4 ,NOTE_, NOTE_},
// {NOTE_D5 ,NOTE_G4, NOTE_E4}, {NOTE_C5 ,NOTE_G4, NOTE_E4}, {NOTE_B4, NOTE_G4, NOTE_E4}, {NOTE_A4, NOTE_, NOTE_}, {NOTE_G4, NOTE_, NOTE_},
// {NOTE_B4 ,NOTE_G4, NOTE_D4}, {NOTE_B4, NOTE_, NOTE_}, {NOTE_A4, NOTE_, NOTE_},
// {NOTE_A5 ,NOTE_F4, NOTE_C4}, {NOTE_ ,NOTE_, NOTE_},{ NOTE_D4 ,NOTE_, NOTE_},
// // A
// {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
// {NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
// {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
// {NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
// {NOTE_F4 ,NOTE_D4, NOTE_A3}, {NOTE_G4, NOTE_, NOTE_}, {NOTE_G4 ,NOTE_E4, NOTE_C4}, {NOTE_G4 ,NOTE_, NOTE_},
// {NOTE_D5 ,NOTE_G4, NOTE_E4}, {NOTE_C5 ,NOTE_G4, NOTE_E4}, {NOTE_B4, NOTE_G4, NOTE_E4}, {NOTE_A4, NOTE_, NOTE_}, {NOTE_G4, NOTE_, NOTE_},
// {NOTE_B4 ,NOTE_G4, NOTE_D4}, {NOTE_B4, NOTE_, NOTE_}, {NOTE_A4, NOTE_, NOTE_},
// {NOTE_A5 ,NOTE_F4, NOTE_C4}, {NOTE_ ,NOTE_, NOTE_},{ NOTE_D4 ,NOTE_, NOTE_}
// };
// float beat[] = {
// /*
// // 前奏
// 2, 2,
// 1.5, 1.5, 1,
// 1.5, 1.5, 1,
// 1.5, 1.5, 1,
// 2, 2,
// 4,
// */
// // A
// 2, 1.5, 0.5,
// 1, 0.5, 1, 1.5,
// 2, 1.5, 0.5,
// 1, 0.5, 1, 1.5,
// 1, 0.5, 2, 0.5,
// 1, 1, 1, 0.5, 0.5,
// 3, 0.5, 0.5,
// 2, 1, 1,
// // A
// 2, 1.5, 0.5,
// 1, 0.5, 1, 1.5,
// 2, 1.5, 0.5,
// 1, 0.5, 1, 1.5,
// 1, 0.5, 2, 0.5,
// 1, 1, 1, 0.5, 0.5,
// 3, 0.5, 0.5,
// 2, 1, 1
// };
// void setup() {
// for(int i=0; i<n; i++){
// pinMode(buzzerPin[i], OUTPUT); // 設定蜂鳴器腳位為輸出模式
// /* ESP32 Arduino開發平台2.x版 */
// ledcSetup(i+1, 4095, 8); //ledcSetup(channel, freq, resolution_bits); //設定通道、頻率與解析度
// ledcAttachPin(buzzerPin[i], i+1); //ledcAttechPin(pin, channel); // 設定接腳與通道
// }
// }
// void loop() {
// for(int i=0; i < sizeof(beat)/sizeof(int); i++){
// /* ESP32 Arduino開發平台2.x版 */
// ledcWriteTone(1, musical_Alphabet[i][0]); //ledcWriteTone(channel, freq); //選擇PWM通道和頻率
// ledcWriteTone(2, musical_Alphabet[i][1]);
// ledcWriteTone(3, musical_Alphabet[i][2]);
// delay((beat[i]*tempo*1000)); // 持續撥放節拍長
// ledcWriteTone(1, 0);
// ledcWriteTone(2, 0);
// ledcWriteTone(3, 0);
// delay(keyTransition); // 停止播放(音符間隔時間)(pause for key transition)
// }
// //delay(3000); // 休息3秒
// }
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
// 和音-同時控制多個蜂鳴器
/* ESP32 Arduino開發平台3.x版 */
#include"pitches.h"
int BPM = 130; // 表示1分鐘有130個四分音符的長度
double tempo = 60.0/BPM; // 每個四分音符的時間長度(秒)
int keyTransition = 30; // pause for key transition
// 定義蜂鳴器的腳位
const int n = 3;
const int buzzerPin[n] = {13, 12, 14};
// 黑色幽默 4/4
int musical_Alphabet[][n] = {
/*
// 前奏
{NOTE_G5 ,NOTE_B4, NOTE_}, {NOTE_G5 ,NOTE_B4, NOTE_},
{NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
{NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
{NOTE_B5 ,NOTE_D5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_}, {NOTE_A5 ,NOTE_C5, NOTE_},
{NOTE_E5 ,NOTE_G5, NOTE_}, {NOTE_E5 ,NOTE_G5, NOTE_},
{NOTE_D5 ,NOTE_F5, NOTE_},
*/
// A
{NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
{NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
{NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
{NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
{NOTE_F4 ,NOTE_D4, NOTE_A3}, {NOTE_G4, NOTE_, NOTE_}, {NOTE_G4 ,NOTE_E4, NOTE_C4}, {NOTE_G4 ,NOTE_, NOTE_},
{NOTE_D5 ,NOTE_G4, NOTE_E4}, {NOTE_C5 ,NOTE_G4, NOTE_E4}, {NOTE_B4, NOTE_G4, NOTE_E4}, {NOTE_A4, NOTE_, NOTE_}, {NOTE_G4, NOTE_, NOTE_},
{NOTE_B4 ,NOTE_G4, NOTE_D4}, {NOTE_B4, NOTE_, NOTE_}, {NOTE_A4, NOTE_, NOTE_},
{NOTE_A5 ,NOTE_F4, NOTE_C4}, {NOTE_ ,NOTE_, NOTE_},{ NOTE_D4 ,NOTE_, NOTE_},
// A
{NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
{NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
{NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_},
{NOTE_C5 ,NOTE_E4, NOTE_}, {NOTE_B4 ,NOTE_D4, NOTE_}, {NOTE_A4 ,NOTE_C4, NOTE_}, {NOTE_G4 ,NOTE_B3, NOTE_},
{NOTE_F4 ,NOTE_D4, NOTE_A3}, {NOTE_G4, NOTE_, NOTE_}, {NOTE_G4 ,NOTE_E4, NOTE_C4}, {NOTE_G4 ,NOTE_, NOTE_},
{NOTE_D5 ,NOTE_G4, NOTE_E4}, {NOTE_C5 ,NOTE_G4, NOTE_E4}, {NOTE_B4, NOTE_G4, NOTE_E4}, {NOTE_A4, NOTE_, NOTE_}, {NOTE_G4, NOTE_, NOTE_},
{NOTE_B4 ,NOTE_G4, NOTE_D4}, {NOTE_B4, NOTE_, NOTE_}, {NOTE_A4, NOTE_, NOTE_},
{NOTE_A5 ,NOTE_F4, NOTE_C4}, {NOTE_ ,NOTE_, NOTE_},{ NOTE_D4 ,NOTE_, NOTE_}
};
float beat[] = {
/*
// 前奏
2, 2,
1.5, 1.5, 1,
1.5, 1.5, 1,
1.5, 1.5, 1,
2, 2,
4,
*/
// A
2, 1.5, 0.5,
1, 0.5, 1, 1.5,
2, 1.5, 0.5,
1, 0.5, 1, 1.5,
1, 0.5, 2, 0.5,
1, 1, 1, 0.5, 0.5,
3, 0.5, 0.5,
2, 1, 1,
// A
2, 1.5, 0.5,
1, 0.5, 1, 1.5,
2, 1.5, 0.5,
1, 0.5, 1, 1.5,
1, 0.5, 2, 0.5,
1, 1, 1, 0.5, 0.5,
3, 0.5, 0.5,
2, 1, 1
};
void setup() {
for(int i=0; i<n; i++){
pinMode(buzzerPin[i], OUTPUT); // 設定蜂鳴器腳位為輸出模式
/* ESP32 Arduino開發平台3.x版 */
ledcAttachChannel(buzzerPin[i], 4095, 8, i+1); // ledcAttachChannel(pin, freq, resolution_bits, channel) // 設定接腳、頻率、解析度、通道
}
}
void loop() {
for(int i=0; i < sizeof(beat)/sizeof(int); i++){
/* ESP32 Arduino開發平台3.x版 */
ledcWriteTone(buzzerPin[0], musical_Alphabet[i][0]); //ledcWriteTone(pin, freq); //選擇PWM接腳和頻率
ledcWriteTone(buzzerPin[1], musical_Alphabet[i][1]);
ledcWriteTone(buzzerPin[2], musical_Alphabet[i][2]);
delay((beat[i]*tempo*1000)); // 持續撥放節拍長
ledcWriteTone(buzzerPin[0], 0);
ledcWriteTone(buzzerPin[1], 0);
ledcWriteTone(buzzerPin[2], 0);
delay(keyTransition); // 停止播放(音符間隔時間)(pause for key transition)
}
//delay(3000); // 休息3秒
}
////////////////////////////////////////////////////////////////////////////////////