{"id":1360,"date":"2026-02-26T09:00:00","date_gmt":"2026-02-26T01:00:00","guid":{"rendered":"https:\/\/www.640629.xyz\/?p=1360"},"modified":"2026-03-18T15:32:56","modified_gmt":"2026-03-18T07:32:56","slug":"%e8%9c%82%e9%b3%b4%e5%99%a8%e3%80%81tone%e9%80%b2%e9%9a%8e%e7%b7%b4%e7%bf%92","status":"publish","type":"post","link":"https:\/\/www.640629.xyz\/?p=1360","title":{"rendered":"\u8702\u9cf4\u5668\u3001ledcWriteTone()\u9032\u968e\u7df4\u7fd2\uff1a\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/img.640629.xyz\/i\/67bfbbc76be89.png\" alt=\"\"\/><\/figure>\n<\/div>\n\n\n<p>\u4f7f\u7528delay()\u51fd\u5f0f\u7684\u97f3\u6a02\u64ad\u653e\u7a0b\u5f0f\uff0c\u6703\u9020\u6210\u7a0b\u5f0f\u963b\u585e\uff0c\u7b49\u5f85\u66ab\u505c\u7684\u6642\u9593\u904e\u53bb\u5f8c\u624d\u6703\u7e7c\u7e8c\u57f7\u884c\u4e0b\u4e00\u884c\u6307\u4ee4\uff0c\u7121\u6cd5\u540c\u6642\u57f7\u884c\u5176\u4ed6\u4efb\u52d9\uff0c\u4f8b\u5982\uff1a\u6309\u9375\u8f38\u5165\u3001\u87a2\u5e55\u986f\u793a\u3001\u6307\u793a\u71c8\u986f\u793a\u7b49\u3002\u82e5\u9700\u8981\u591a\u5de5\u8655\u7406\u5176\u4ed6\u4efb\u52d9\uff0c\u5fc5\u9808\u6539\u7528millis()\u51fd\u5f0f\uff0c\u53c3\u8003\u7a0b\u5f0f\u5982\u4e0b\uff1a<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>\u539f\u4f7f\u7528delay()\u7a0b\u5f0f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u983b\u7387 (Hz)\n#define C4  262           \/\/ Do\n#define D4  294           \/\/ Re\n#define E4  330           \/\/ Mi\n#define F4  349           \/\/ Fa\n#define G4  393           \/\/ So\n#define A4  440           \/\/ La\n#define B4  494           \/\/ Si\n#define REST 0            \/\/ \u4f11\u6b62\u7b26 (\u983b\u7387 0 \u5373\u7121\u8072)\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u7d50\u69cb(Struct)\uff0c\u540d\u7a31\u70baNote\nstruct Note {\n  int frequency;          \/\/ \u97f3\u983b (Hz)\n  int length;             \/\/ \u97f3\u9577 (\u70ba base_duration \u7684\u500d\u6578)\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5efa\u7acb\u4e00\u500b Note \u7269\u4ef6\u9663\u5217\uff0c\u540d\u7a31\u70ba song \nNote song[] = {\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {D4, 1}, {E4, 1}, {F4, 1}, {G4, 1}, {G4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {E4, 2},\n  {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {E4, 1}, {F4, 2}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {F4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {C4, 4}\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u97f3\u7b26\u7e3d\u6578 = melody \u9663\u5217\u7e3d\u4f4d\u5143\u7d44\u6578 \/ \u55ae\u4e00\u6574\u6578\u4f4d\u5143\u7d44\u6578\nint total = sizeof(song) \/ sizeof(Note);\n\/\/ ---------------------------------------------------------------------\nint pin = 15;             \/\/ \u8702\u9cf4\u5668\u9023\u63a5\u8173\u4f4d (GPIO 15)\nint base_duration = 200;  \/\/ \u97f3\u7b26\u57fa\u6e96\u6642\u9593 (\u55ae\u4f4d: ms\uff0c\u6c7a\u5b9a\u7bc0\u594f\u5feb\u6162)\nint note_interval = 100;  \/\/ \u97f3\u7b26\u9593\u7684\u77ed\u66ab\u9593\u9694 (\u55ae\u4f4d: ms\uff0c\u907f\u514d\u8072\u97f3\u9ecf\u5728\u4e00\u8d77)\n\/\/ ---------------------------------------------------------------------\nint i = 0;      \/\/ \u7576\u524d\u64ad\u653e\u7684\u97f3\u7b26\u7d22\u5f15\nint state = 1;  \/\/ \u72c0\u614b\u6a5f\u63a7\u5236\u65d7\u6a19\uff1a\n                \/\/ 1\uff1a\u64ad\u653e\u97f3\u7b26\n                \/\/ 2\uff1a\u97f3\u7b26\u9593\u9694\n                \/\/ 3\uff1a\u5207\u63db\u81f3\u4e0b\u500b\u97f3\u7b26\n                \/\/ 4\uff1a\u64ad\u653e\u7d50\u675f\n\/\/ ---------------------------------------------------------------------\nvoid setup() {\n  \/\/ ESP32 LEDC \u8a2d\u5b9a\n  ledcAttach(pin, 2000, 10);    \/\/ \u8a2d\u5b9a\u8173\u4f4d, \u521d\u59cb\u983b\u7387 2000Hz, \u89e3\u6790\u5ea6 10 bits\n  ledcWriteTone(pin, 0);        \/\/ \u521d\u59cb\u72c0\u614b\u70ba\u975c\u97f3\n}\n\nvoid loop() {\n  switch(state)\n  {\n    case 1:   \/\/ \u64ad\u653e\u97f3\u7b26\n      if (i &lt; total)  \/\/ \u9084\u6709\u97f3\u7b26\u6c92\u64ad\u5b8c\n      {\n        int note_duration = base_duration * song[i].length;   \/\/ \u8a08\u7b97\u7576\u524d\u97f3\u7b26\u6301\u7e8c\u6642\u9593\n        ledcWriteTone(pin, song[i].frequency);                \/\/ \u767c\u51fa\u8072\u97f3\n        delay(note_duration);                                 \/\/ \u97f3\u7b26\u64ad\u653e\u6642\u9593\n        state = 2;  \/\/ \u9032\u5165\u72c0\u614b2\n      }\n      else  \/\/ \u6240\u6709\u97f3\u7b26\u5df2\u7d93\u64ad\u5b8c\n      {\n        state = 4;  \/\/ \u9032\u5165\u72c0\u614b4\n      }\n      break;\n\n    case 2:   \/\/ \u97f3\u7b26\u9593\u9694\n      ledcWriteTone(pin, 0);    \/\/ \u975c\u97f3\n      delay(note_interval);     \/\/ \u9593\u9694\u6642\u9593\n      state = 3;    \/\/ \u9032\u5165\u72c0\u614b3\n      break;\n\n    case 3:   \/\/ \u5207\u63db\u81f3\u4e0b\u4e00\u500b\u97f3\u7b26\n      i++;          \/\/ \u7d22\u5f15\u503c+1\n      state = 1;    \/\/ \u9032\u5165\u72c0\u614b1\n      break;\n\n    case 4:   \/\/ \u64ad\u653e\u7d50\u675f\n      ledcWriteTone(pin, 0); \/\/ \u975c\u97f3\n      delay(2000);           \/\/ \u64ad\u653e\u7d50\u675f\u5f8c\u66ab\u505c2\u79d2\n      i = 0;                 \/\/ \u7d22\u5f15\u503c\u6b78\u96f6(\u91cd\u65b0\u958b\u59cb)\n      state = 1;             \/\/ \u9032\u5165\u72c0\u614b1(\u91cd\u65b0\u958b\u59cb)\n      break;\n  }\n}<\/code><\/pre>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>\u6539\u7528millis()\u7a0b\u5f0f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u983b\u7387 (Hz)\n#define C4  262           \/\/ Do\n#define D4  294           \/\/ Re\n#define E4  330           \/\/ Mi\n#define F4  349           \/\/ Fa\n#define G4  393           \/\/ So\n#define A4  440           \/\/ La\n#define B4  494           \/\/ Si\n#define REST 0            \/\/ \u4f11\u6b62\u7b26 (\u983b\u7387 0 \u5373\u7121\u8072)\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u7d50\u69cb(Struct)\uff0c\u540d\u7a31\u70baNote\nstruct Note {\n  int frequency;          \/\/ \u97f3\u983b (Hz)\n  int length;             \/\/ \u97f3\u9577 (\u70ba base_duration \u7684\u500d\u6578)\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5efa\u7acb\u4e00\u500b Note \u7269\u4ef6\u9663\u5217\uff0c\u540d\u7a31\u70ba song \nNote song[] = {\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {D4, 1}, {E4, 1}, {F4, 1}, {G4, 1}, {G4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {E4, 2},\n  {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {E4, 1}, {F4, 2}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {F4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {C4, 4}\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u97f3\u7b26\u7e3d\u6578 = melody \u9663\u5217\u7e3d\u4f4d\u5143\u7d44\u6578 \/ \u55ae\u4e00\u6574\u6578\u4f4d\u5143\u7d44\u6578\nint total = sizeof(song) \/ sizeof(Note);\n\/\/ ---------------------------------------------------------------------\nint pin = 15;             \/\/ \u8702\u9cf4\u5668\u9023\u63a5\u8173\u4f4d (GPIO 15)\nint base_duration = 200;  \/\/ \u97f3\u7b26\u57fa\u6e96\u6642\u9593 (\u55ae\u4f4d: ms\uff0c\u6c7a\u5b9a\u7bc0\u594f\u5feb\u6162)\nint note_interval = 100;  \/\/ \u97f3\u7b26\u9593\u7684\u77ed\u66ab\u9593\u9694 (\u55ae\u4f4d: ms\uff0c\u907f\u514d\u8072\u97f3\u9ecf\u5728\u4e00\u8d77)\n\/\/ ---------------------------------------------------------------------\nint i = 0;      \/\/ \u7576\u524d\u64ad\u653e\u7684\u97f3\u7b26\u7d22\u5f15\nint state = 1;  \/\/ \u72c0\u614b\u6a5f\u63a7\u5236\u65d7\u6a19\uff1a\n                \/\/ 1\uff1a\u64ad\u653e\u97f3\u7b26\n                \/\/ 2\uff1a\u97f3\u7b26\u9593\u9694\n                \/\/ 3\uff1a\u5207\u63db\u81f3\u4e0b\u500b\u97f3\u7b26\n                \/\/ 4\uff1a\u64ad\u653e\u7d50\u675f\n\/\/ ---------------------------------------------------------------------\nunsigned long previousMillis = 0;   \/\/ \u4e0a\u4e00\u6b21\u72c0\u614b\u958b\u59cb\u7684\u6642\u9593\nint note_duration = 0;              \/\/ \u7576\u524d\u97f3\u7b26\u61c9\u8a72\u6301\u7e8c\u7684\u6642\u9593\n\/\/ ---------------------------------------------------------------------\nvoid setup() {\n  \/\/ ESP32 LEDC \u8a2d\u5b9a\n  ledcAttach(pin, 2000, 10);    \/\/ \u8a2d\u5b9a\u8173\u4f4d, \u521d\u59cb\u983b\u7387 2000Hz, \u89e3\u6790\u5ea6 10 bits\n  ledcWriteTone(pin, 0);        \/\/ \u521d\u59cb\u72c0\u614b\u70ba\u975c\u97f3\n}\n\nvoid loop() {\n  unsigned long currentMillis = millis();  \/\/ \u7576\u524d\u7684millis()\u6642\u9593\n\n  switch(state)\n  {\n    case 1:   \/\/ \u64ad\u653e\u97f3\u7b26\n      if (i &lt; total)  \/\/ \u9084\u6709\u97f3\u7b26\u6c92\u64ad\u5b8c\n      {\n        note_duration = base_duration * song[i].length; \/\/ \u8a08\u7b97\u7576\u524d\u97f3\u7b26\u6301\u7e8c\u6642\u9593\n        ledcWriteTone(pin, song[i].frequency);          \/\/ \u767c\u51fa\u8072\u97f3\n        previousMillis = currentMillis;                 \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n        state = 2;                                      \/\/ \u9032\u5165\u72c0\u614b2\n      }\n      else  \/\/ \u6240\u6709\u97f3\u7b26\u5df2\u7d93\u64ad\u5b8c\n      {\n        previousMillis = currentMillis; \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n        state = 4;  \/\/ \u9032\u5165\u72c0\u614b4\n      }\n      break;\n\n    case 2:   \/\/ \u97f3\u7b26\u9593\u9694\n      if (currentMillis - previousMillis &gt;= note_duration)  \/\/ \u97f3\u7b26\u64ad\u653e\u6642\u9593\u5230\n      {\n        ledcWriteTone(pin, 0);          \/\/ \u975c\u97f3\n        previousMillis = currentMillis; \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n        state = 3;                      \/\/ \u9032\u5165\u72c0\u614b3\n      }\n      break;\n\n    case 3:   \/\/ \u5207\u63db\u81f3\u4e0b\u4e00\u500b\u97f3\u7b26\n      if (currentMillis - previousMillis &gt;= note_interval)  \/\/ \u9593\u9694\u6642\u9593\u5230\n      {\n        i++;        \/\/ \u7d22\u5f15\u503c+1\n        state = 1;  \/\/ \u9032\u5165\u72c0\u614b1 (State 1 \u6703\u81ea\u5df1\u91cd\u7f6e\u8a08\u6642\u5668\uff0c\u6240\u4ee5\u9019\u88e1\u4e0d\u7528\u91cd\u7f6e)\n      }\n      break;\n\n    case 4:   \/\/ \u64ad\u653e\u7d50\u675f\n      if (currentMillis - previousMillis &gt;= 2000)  \/\/ \u66ab\u505c2\u79d2\u6642\u9593\u5230\n      {\n        i = 0;      \/\/ \u7d22\u5f15\u503c\u6b78\u96f6(\u91cd\u65b0\u958b\u59cb)\n        state = 1;  \/\/ \u9032\u5165\u72c0\u614b1(\u91cd\u65b0\u958b\u59cb)\n      }\n      break;\n  }\n}<\/code><\/pre>\n<\/div>\n<\/div>\n\n\n\n<p>\u52a0\u5165\u6309\u9215\u958b\u95dc(\u4f7f\u7528OneButton\u51fd\u5f0f\u5eab)\uff0c\u6309\u4e00\u4e0b\u958b\u59cb\u64ad\u653e\uff0c\u518d\u6309\u4e00\u4e0b\u505c\u6b62\u64ad\u653e\uff0c\u9577\u6309\u5f8c\u5f9e\u982d\u958b\u59cb\u64ad\u653e\uff0c\u53c3\u8003\u7a0b\u5f0f\u5982\u4e0b\uff1a(<a href=\"https:\/\/www.640629.xyz\/?p=1223&amp;swcfpc=1\" target=\"_blank\" rel=\"noreferrer noopener\">\u53c3\u8003\u8aaa\u660e\u9801\u9762<\/a>)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u983b\u7387 (Hz)\n#define C4  262           \/\/ Do\n#define D4  294           \/\/ Re\n#define E4  330           \/\/ Mi\n#define F4  349           \/\/ Fa\n#define G4  393           \/\/ So\n#define A4  440           \/\/ La\n#define B4  494           \/\/ Si\n#define REST 0            \/\/ \u4f11\u6b62\u7b26 (\u983b\u7387 0 \u5373\u7121\u8072)\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5b9a\u7fa9\u97f3\u7b26\u7d50\u69cb(Struct)\uff0c\u540d\u7a31\u70baNote\nstruct Note {\n  int frequency;          \/\/ \u97f3\u983b (Hz)\n  int length;             \/\/ \u97f3\u9577 (\u70ba base_duration \u7684\u500d\u6578)\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u5efa\u7acb\u4e00\u500b Note \u7269\u4ef6\u9663\u5217\uff0c\u540d\u7a31\u70ba song \nNote song[] = {\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {D4, 1}, {E4, 1}, {F4, 1}, {G4, 1}, {G4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {E4, 2},\n  {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {D4, 1}, {E4, 1}, {F4, 2}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {E4, 1}, {F4, 1}, {G4, 2},\n  {G4, 1}, {E4, 1}, {E4, 2}, {F4, 1}, {D4, 1}, {D4, 2}, {C4, 1}, {E4, 1}, {G4, 1}, {G4, 1}, {C4, 4}\n};\n\/\/ ---------------------------------------------------------------------\n\/\/ \u97f3\u7b26\u7e3d\u6578 = melody \u9663\u5217\u7e3d\u4f4d\u5143\u7d44\u6578 \/ \u55ae\u4e00\u6574\u6578\u4f4d\u5143\u7d44\u6578\nint total = sizeof(song) \/ sizeof(Note);\n\/\/ ---------------------------------------------------------------------\nint pin = 15;             \/\/ \u8702\u9cf4\u5668\u9023\u63a5\u8173\u4f4d (GPIO 15)\nint base_duration = 200;  \/\/ \u97f3\u7b26\u57fa\u6e96\u6642\u9593 (\u55ae\u4f4d: ms\uff0c\u6c7a\u5b9a\u7bc0\u594f\u5feb\u6162)\nint note_interval = 100;  \/\/ \u97f3\u7b26\u9593\u7684\u77ed\u66ab\u9593\u9694 (\u55ae\u4f4d: ms\uff0c\u907f\u514d\u8072\u97f3\u9ecf\u5728\u4e00\u8d77)\n\/\/ ---------------------------------------------------------------------\nint i = 0;      \/\/ \u7576\u524d\u64ad\u653e\u7684\u97f3\u7b26\u7d22\u5f15\nint state = 1;  \/\/ \u72c0\u614b\u6a5f\u63a7\u5236\u65d7\u6a19\uff1a\n                \/\/ 1\uff1a\u64ad\u653e\u97f3\u7b26\n                \/\/ 2\uff1a\u97f3\u7b26\u9593\u9694\n                \/\/ 3\uff1a\u5207\u63db\u81f3\u4e0b\u500b\u97f3\u7b26\n                \/\/ 4\uff1a\u64ad\u653e\u7d50\u675f\n\/\/ ---------------------------------------------------------------------\nunsigned long previousMillis = 0;   \/\/ \u4e0a\u4e00\u6b21\u72c0\u614b\u958b\u59cb\u7684\u6642\u9593\nint note_duration = 0;              \/\/ \u7576\u524d\u97f3\u7b26\u61c9\u8a72\u6301\u7e8c\u7684\u6642\u9593\n\/\/ ---------------------------------------------------------------------\n#include &lt;OneButton.h&gt;         \/\/ \u5f15\u7528OneButton\u51fd\u5f0f\u5eab\n#define pb 34                  \/\/ \u5b9a\u7fa9\u6309\u9215\u5f15\u8173\nOneButton button(pb, true);    \/\/ \u5efa\u7acbOneButton\u7269\u4ef6\uff0c\u540d\u7a31\u70babutton\uff0c\u6309\u9215\u70ba\u4f4e\u614b\u52d5\u4f5c\nboolean startPlay = 0;         \/\/ 0\uff1a\u505c\u6b62\u64ad\u653e\uff0c1\uff1a\u958b\u59cb\u64ad\u653e\n\/\/----------------------------------------------------------------------\n\/\/ \u55ae\u64ca\u8655\u7406\nvoid singleClick() {\n  Serial.println(\"Button Single Click.\");\n  startPlay = !startPlay;    \/\/ \u958b\u59cb\u64ad\u653e\u6216\u505c\u6b62\u64ad\u653e\n  if(startPlay == 0)         \/\/ \u505c\u6b62\u64ad\u653e\u6642\n  {\n    ledcWriteTone(pin, 0);   \/\/ \u975c\u97f3\n  }\n}\n\n\/\/ \u96d9\u64ca\u8655\u7406\nvoid doubleClick() {\n  Serial.println(\"Button Double Click.\");\n}\n\n\/\/ \u9577\u6309\u958b\u59cb\nvoid longPressStart() {\n  Serial.println(\"Button Long Press Start.\");\n  ledcWriteTone(pin, 0);   \/\/ \u975c\u97f3\n}\n\n\/\/ \u9577\u6309\u904e\u7a0b\u4e2d\nvoid longPress() {\n  Serial.println(\"Button Long Press ......\");\n  startPlay = 0;  \/\/ \u505c\u6b62\u64ad\u653e\n}\n\n\/\/ \u9577\u6309\u7d50\u675f\nvoid longPressStop() {\n  Serial.println(\"Button Long Press Stop.\");\n  i = 0;      \/\/ \u7d22\u5f15\u503c\u6b78\u96f6(\u91cd\u65b0\u958b\u59cb)\n  state = 1;  \/\/ \u9032\u5165\u72c0\u614b1(\u91cd\u65b0\u958b\u59cb)\n}\n\/\/----------------------------------------------------------------------\n\nvoid setup() {\n  \/\/----------------------------------------------------------------------\n  \/\/ ESP32 LEDC \u8a2d\u5b9a\n  ledcAttach(pin, 2000, 10);    \/\/ \u8a2d\u5b9a\u8173\u4f4d, \u521d\u59cb\u983b\u7387 2000Hz, \u89e3\u6790\u5ea6 10 bits\n  ledcWriteTone(pin, 0);        \/\/ \u521d\u59cb\u72c0\u614b\u70ba\u975c\u97f3\n  \/\/----------------------------------------------------------------------\n  Serial.begin(9600);  \/\/ \u555f\u7528\u4e32\u5217\u57e0\u76e3\u770b\u8996\u7a97\n  \/\/----------------------------------------------------------------------\n  button.attachClick(singleClick);              \/\/ \u55ae\u64ca\n  button.attachDoubleClick(doubleClick);        \/\/ \u96d9\u64ca\n  button.attachLongPressStart(longPressStart);  \/\/ \u9577\u6309\u958b\u59cb\n  button.attachDuringLongPress(longPress);      \/\/ \u9577\u6309\u904e\u7a0b\u4e2d\n  button.attachLongPressStop(longPressStop);    \/\/ \u9577\u6309\u7d50\u675f\n  \/\/----------------------------------------------------------------------\n}\n\nvoid loop() {\n  \/\/----------------------------------------------------------\n  button.tick(); \/\/ \u5b9a\u671f\u5075\u6e2c\u6309\u9215\u72c0\u614b\n  \/\/----------------------------------------------------------\n\n  if (startPlay == 1) \/\/ \u7576startPlay\u70ba1\u6642\uff0c\u72c0\u614b\u6a5f\u624d\u904b\u4f5c\n  {\n    unsigned long currentMillis = millis();  \/\/ \u7576\u524d\u7684millis()\u6642\u9593\n\n    switch(state)\n    {\n      case 1:   \/\/ \u64ad\u653e\u97f3\u7b26\n        if (i &lt; total)  \/\/ \u9084\u6709\u97f3\u7b26\u6c92\u64ad\u5b8c\n        {\n          note_duration = base_duration * song[i].length; \/\/ \u8a08\u7b97\u7576\u524d\u97f3\u7b26\u6301\u7e8c\u6642\u9593\n          ledcWriteTone(pin, song[i].frequency);          \/\/ \u767c\u51fa\u8072\u97f3\n          previousMillis = currentMillis;                 \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n          state = 2;                                      \/\/ \u9032\u5165\u72c0\u614b2\n        }\n        else  \/\/ \u6240\u6709\u97f3\u7b26\u5df2\u7d93\u64ad\u5b8c\n        {\n          previousMillis = currentMillis; \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n          state = 4;  \/\/ \u9032\u5165\u72c0\u614b4\n        }\n        break;\n\n      case 2:   \/\/ \u97f3\u7b26\u9593\u9694\n        if (currentMillis - previousMillis &gt;= note_duration)  \/\/ \u97f3\u7b26\u64ad\u653e\u6642\u9593\u5230\n        {\n          ledcWriteTone(pin, 0);          \/\/ \u975c\u97f3\n          previousMillis = currentMillis; \/\/ \u66f4\u65b0\u524d\u4e00\u6b21\u7684millis()\u6642\u9593\n          state = 3;                      \/\/ \u9032\u5165\u72c0\u614b3\n        }\n        break;\n\n      case 3:   \/\/ \u5207\u63db\u81f3\u4e0b\u4e00\u500b\u97f3\u7b26\n        if (currentMillis - previousMillis &gt;= note_interval)  \/\/ \u9593\u9694\u6642\u9593\u5230\n        {\n          i++;        \/\/ \u7d22\u5f15\u503c+1\n          state = 1;  \/\/ \u9032\u5165\u72c0\u614b1 (State 1 \u6703\u81ea\u5df1\u91cd\u7f6e\u8a08\u6642\u5668\uff0c\u6240\u4ee5\u9019\u88e1\u4e0d\u7528\u91cd\u7f6e)\n        }\n        break;\n\n      case 4:   \/\/ \u64ad\u653e\u7d50\u675f\n        if (currentMillis - previousMillis &gt;= 2000)  \/\/ \u66ab\u505c2\u79d2\u6642\u9593\u5230\n        {\n          i = 0;      \/\/ \u7d22\u5f15\u503c\u6b78\u96f6(\u91cd\u65b0\u958b\u59cb)\n          state = 1;  \/\/ \u9032\u5165\u72c0\u614b1(\u91cd\u65b0\u958b\u59cb)\n        }\n        break;\n    }\n  }\n\n}<\/code><\/pre>\n\n\n\n<p>\u4f5c\u696d\u7df4\u7fd2\uff1a\u8acb\u4f7f\u7528\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\uff0c\u5229\u7528OneButton Library\u5b8c\u6210\u4e0a\u9031\u7684\u97f3\u6a02\u64ad\u653e\u4f5c\u696d\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u958b\u6a5f\u5f8c\uff0c\u97f3\u6a02\u505c\u6b62\u64ad\u653e\u3001LED\u6307\u793a\u71c8\u4eae\u3002<\/li>\n\n\n\n<li>\u6bcf\u6309\u4e00\u4e0b\u6309\u9215\u958b\u95dc\uff0c\u53ef\u958b\u59cb\u6216\u505c\u6b62\u64ad\u653e\u97f3\u6a02\u3002<\/li>\n\n\n\n<li>\u9577\u6309\u6309\u9215\u958b\u95dc\uff0c\u91cd\u982d\u64ad\u653e\u97f3\u6a02\u3002<\/li>\n\n\n\n<li>\u7576\u97f3\u6a02\u6b63\u5728\u64ad\u653e\u6642\uff0cLED\u6307\u793a\u71c8\u6703\u9583\u720d\uff1b\u7576\u97f3\u6a02\u505c\u6b62\u64ad\u653e\u6642\uff0cLED\u6307\u793a\u71c8\u6703\u505c\u6b62\u9583\u720d\u3002<\/li>\n\n\n\n<li>\u8acb\u5728Wokwi\u7db2\u7ad9\u6a21\u64ec\u5f8c\uff0c\u5b8c\u6210\u5be6\u9ad4\u63a5\u7dda\u3002<\/li>\n\n\n\n<li>\u8acb\u62cd\u7167\u3001\u9304\u5f71\uff0c\u4e26\u5b8c\u6210\u5be6\u7fd2\u5831\u544a(PDF\u683c\u5f0f)\uff0c\u4e0a\u50b3Google Classroom\u4f5c\u696d\u3002<\/li>\n\n\n\n<li>\u5be6\u7fd2\u5831\u544a\u9808\u5305\u542b\u4e0b\u5217\u5167\u5bb9\uff1a(1)\u6458\u8981 (2)\u52d5\u6a5f (3)\u4e3b\u984c (4)\u5be6\u4f5c\u6b65\u9a5f (5)\u5be6\u4f5c\u7d50\u679c (6)\u5fc3\u5f97\u8207\u8a0e\u8ad6 (7)\u53c3\u8003\u8cc7\u6599<\/li>\n\n\n\n<li>\u52a0\u5165Google Classroom\u8ab2\u7a0b\u4ee3\u78bc\uff1a<a href=\"https:\/\/classroom.google.com\/c\/ODI2MDE3MjkzODE2?cjc=e4mofe7z\" target=\"_blank\" rel=\"noreferrer noopener\">e4mofe7z<\/a><\/li>\n<\/ol>\n\n\n\n<p>\u4f5c\u696d\u7bc4\u4f8b\uff1a<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\u63a7\u5236115\u4e59\u9ec3\u90c1\u5584.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\u63a7\u5236115\u4e59\u9ec3\u90c1\u5584<\/a><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\u63a7\u5236115\u4e59\u8cf4\u54c1\u5a9b.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\u63a7\u5236115\u4e59\u8cf4\u54c1\u5a9b<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"2025\u5e742\u670827\u65e5\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/53800XW-9G8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/dpThZiVRZQY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u63a7\u5236116\u7532\u5f90\u5bb6\u7462-\u97f3\u6a02\u64ad\u653e\u5668.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u63a7\u5236116\u7532\u5f90\u5bb6\u7462-\u97f3\u6a02\u64ad\u653e\u5668<\/a><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u63a7\u5236116\u4e59\u6797\u6f84\u923a-\u97f3\u6a02\u64ad\u653e\u5668.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u63a7\u5236116\u4e59\u6797\u6f84\u923a-\u97f3\u6a02\u64ad\u653e\u5668<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u63a7116\u4e59\u9673\u7fca\u6db5-\u97f3\u6a02\u64ad\u653e\u5668.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u63a7116\u4e59\u9673\u7fca\u6db5-\u97f3\u6a02\u64ad\u653e\u5668<\/a><\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\"><a href=\"https:\/\/www.640629.xyz\/wp-content\/uploads\/2026\/02\/\u63a7\u5236116\u7532\u6d2a\u8efe\u6d0b.pdf\" class=\"pdfemb-viewer\" style=\"\" data-width=\"max\" data-height=\"max\" data-toolbar=\"bottom\" data-toolbar-fixed=\"off\">\u63a7\u5236116\u7532\u6d2a\u8efe\u6d0b<\/a><\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u7d50\u5408\u6309\u9215\u958b\u95dc\u3001\u8702\u9cf4\u5668\u3001LED\u6307\u793a\u71c8\u7684\u97f3\u6a02\u64ad\u653e\u5668\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/P7qTltdvsxw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">\u63a7\u5236116\u4e59\u9673\u7fca\u6db5<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u96d9\u8072\u90e8\u97f3\u6a02\u64ad\u653e\u5668\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/hUKjgdTyq1k?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">\u63a7\u5236116\u4e59\u6797\u6f84\u923a<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"ESP32 \u97f3\u6a02\u64ad\u653e\u5668 wokwi\u6a21\u64ec pvz\u97f3\u6a02\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/atDEhnc1D8g?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">\u63a7\u5236116\u4e59\u738b\u535a\u7384<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"\u96d9\u8072\u90e8\u97f3\u6a02\u64a5\u653e\u5668\" width=\"640\" height=\"480\" src=\"https:\/\/www.youtube.com\/embed\/ZNOQA4zXGaI?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><figcaption class=\"wp-element-caption\">\u63a7\u5236116\u4e59\u6797\u6f84\u923a<\/figcaption><\/figure>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528delay()\u51fd\u5f0f\u7684\u97f3\u6a02\u64ad\u653e\u7a0b\u5f0f\uff0c\u6703\u9020\u6210\u7a0b\u5f0f\u963b\u585e\uff0c\u7b49\u5f85\u66ab\u505c\u7684\u6642\u9593\u904e\u53bb\u5f8c\u624d\u6703\u7e7c\u7e8c\u57f7\u884c\u4e0b\u4e00\u884c\u6307\u4ee4\uff0c\u7121\u6cd5\u540c\u6642\u57f7\u884c<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-1360","post","type-post","status-publish","format-standard","hentry","category-programming"],"_links":{"self":[{"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/posts\/1360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1360"}],"version-history":[{"count":41,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/posts\/1360\/revisions"}],"predecessor-version":[{"id":2505,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=\/wp\/v2\/posts\/1360\/revisions\/2505"}],"wp:attachment":[{"href":"https:\/\/www.640629.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.640629.xyz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}