これとお題がとても似ているのは課題かなにかなんでしょうか?
そういえばESP32って普通マルチコアだったよね、ということで、音を鳴らすコアとセンサを検出するコアを分けてみました。millis()を使っていないという点では質問者の意図に沿っていないのですが。
Arduino
1const int Sensor_LED = 25;
2const int Buzzer = 14;
3const int My_sensor = 13;
4int BEAT = 400 ;
5volatile int counter = 0;
6
7void setup()
8{
9 pinMode(Sensor_LED, OUTPUT);
10 digitalWrite(Sensor_LED, LOW);
11
12 ledcSetup(1, 12000, 8);
13 ledcAttachPin(Buzzer, 1);
14}
15
16//パッシブブザー///////////////////////////////////////////////////////////////
17
18void playmusic1() {
19
20 ledcWriteTone(1, 3136); // ソ
21 delay(BEAT);
22 ledcWriteTone(1, 2960); // ♯ファ
23 delay(BEAT);
24 ledcWriteTone(1, 2489); // ♯レ
25 delay(BEAT);
26 ledcWriteTone(1, 1760); // ラ
27 delay(BEAT);
28 ledcWriteTone(1, 1661); // ♯ソ
29 delay(BEAT);
30 ledcWriteTone(1, 2637); // ミ
31 delay(BEAT);
32 ledcWriteTone(1, 3322); // ♯ソ
33 delay(BEAT);
34 ledcWriteTone(1, 4186); // ド
35 delay(BEAT);
36 ledcWriteTone(1, 0); // 音を止める
37}
38
39void task1(void* p) {
40 while (1) {
41 if (counter == 0)
42 playmusic1(); //or playmusic2
43 }
44}
45
46TaskHandle_t th1;
47
48void loop() {
49 static bool lastSense = false;
50 bool currentSense = digitalRead(My_sensor);
51 if (!currentSense) {//センサー不感
52 ledcWriteTone(1, 0);
53 if (th1) { //タスクがあるなら
54 vTaskDelete(th1); //タスク終了
55 }
56 th1 = NULL;
57 } else {
58 if (!lastSense) {//センサーがOFF->ONになったとき
59 //音を鳴らすタスク起動
60 xTaskCreatePinnedToCore(
61 task1,
62 "Task1",
63 1024,//スタックサイズ 妥当性の検討はしていない
64 NULL,
65 8,//タスク優先度 妥当性の検討はしていない
66 &th1,
67 0 //CPU番号。loop()はCPU1で実行される
68 );
69 delay(1);//タスク起動を待つ。 妥当性の検討はしていない
70 }
71 }
72 lastSense = currentSense;
73}
とりあえず動かしてみただけですので、タスク管理まわりほんとに大丈夫?というところはあるかも。
LED追加。loop()差し替え。ここもスレッドを立てろの声もあるかも知れないけど「普通」に処理。で、millis()使ったヨ。
Arduino
1unsigned long t0;
2bool ledStat;
3void loop() {
4 static bool lastSense = false;
5 unsigned long currentTime=millis();
6 bool currentSense = digitalRead(My_sensor);
7 if (!currentSense) {//センサー不感
8 ledcWriteTone(1, 0);
9 if (th1) { //タスクがあるなら
10 vTaskDelete(th1); //タスク終了
11 }
12 th1 = NULL;
13 ledStat=false;
14 } else {
15 if (!lastSense) {//センサーがOFF->ONになったとき
16 //音を鳴らすタスク起動
17 xTaskCreatePinnedToCore(
18 task1,
19 "Task1",
20 1024,//スタックサイズ 妥当性の検討はしていない
21 NULL,
22 8,//タスク優先度 妥当性の検討はしていない
23 &th1,
24 0 //CPU番号。loop()はCPU1で実行される
25 );
26 delay(1);//タスク起動を待つ。 妥当性の検討はしていない
27 t0=currentTime;
28 ledStat=true;
29 }
30 if(currentTime-t0>BEAT){
31 ledStat=!ledStat;
32 t0=currentTime;
33 }
34 }
35 lastSense = currentSense;
36 digitalWrite(Sensor_LED,ledStat);
37}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。