{"id":7812,"date":"2025-04-28T10:37:38","date_gmt":"2025-04-28T02:37:38","guid":{"rendered":"https:\/\/www.wangonc.com\/?p=7812"},"modified":"2025-04-28T10:37:38","modified_gmt":"2025-04-28T02:37:38","slug":"esp32-microcontroller-learning-fancy-led-lighting","status":"publish","type":"post","link":"https:\/\/www.wangonc.com\/index.php\/2025\/04\/28\/esp32-microcontroller-learning-fancy-led-lighting\/","title":{"rendered":"ESP32\u5355\u7247\u673a\u5b66\u4e60\u2014\u2014\u82b1\u5f0f\u70b9\u4eaeLED"},"content":{"rendered":"<h2>\u524d\u8a00<\/h2>\n<p>\u5927\u6982\u5c5e\u4e8e\u5fc3\u8840\u6765\u6f6e\uff0c\u76f8\u6bd4\u8d77\u64b8\u4ee3\u7801\u5199\u5de5\u5177\uff0c\u624b\u6413\u5b9e\u4f53\u7684\u5de5\u5177\u771f\u7684\u5f88\u9177\u3002\u6240\u4ee5\u7a81\u53d1\u5947\u60f3\u5f00\u59cb\u5b66\u5355\u7247\u673a\u5f00\u53d1\u3002\u5b9e\u9645\u4e0a\u4e5f\u662f\u770b\u89c1\u4e86<a href=\"https:\/\/github.com\/lmarzen\/esp32-weather-epd\" title=\"lmarzen\/esp32-weather-epd: A low-power E-Paper weather display powered by an ESP32 microcontroller. Utilizes the OpenWeatherMap API.\">lmarzen\/esp32-weather-epd<\/a>\u8fd9\u4e2a\u4f18\u7f8e\u4e14\u5b9e\u7528\u7684\u5f00\u6e90\u5929\u6c14\u9884\u62a5\u724c\u9879\u76ee\uff0c\u6fc0\u53d1\u8d77\u4e86\u5355\u7247\u673a\u5f00\u53d1\u7684\u5174\u8da3\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u5c31\u4ece\u5355\u7247\u673a\u7684hello world\uff0c\u70b9\u4eae<del>\u7535\u5bb9<\/del>LED\u5f00\u59cb\u5427\uff01<\/p>\n<p>\u81f3\u4e8e\u4e3a\u4ec0\u4e48\u662fesp32\uff0c\u56e0\u4e3a\u4e0a\u9762\u90a3\u4e2a\u9879\u76ee\u7528\u7684\u5c31\u662fesp32\uff08\u5176\u5b9e\u4e5f\u662f\u7b80\u5355\uff0c\u5bf9\u4e8e\u6211\u8fd9\u79cd\u786c\u4ef6\u95e8\u5916\u6c49\u6765\u8bf4\u6bd4\u8f83\u597d\u4e0a\u624b\uff09&#8230;<\/p>\n<p>\u4ee5\u4e0b\u6240\u6709\u5185\u5bb9\u90fd\u4f7f\u7528\u4eff\u771f\u5e73\u53f0<a href=\"https:\/\/wokwi.com\/\" title=\"Wokwi\">Wokwi<\/a>\u5b8c\u6210<\/p>\n<h2>\u70b9\u4eaeLED\u706f\u73e0<\/h2>\n<p>\u70b9\u4eaeled\u706f\u73e0\u975e\u5e38\u7b80\u5355\uff0c\u9633\u6781\u7ed9\u9ad8\u7535\u5e73\uff0c\u9634\u6781\u63a5\u5730\uff08\u4f4e\u7535\u5e73\uff09\u5f62\u6210\u56de\u8def\u5373\u53ef\u3002<\/p>\n<p>\u9633\u6781\u8fde\u63a5goip0\uff0c\u9634\u6781\u8fde\u63a5GND\uff08\u63a5\u5730\uff0c0\u7535\u538b\uff09\uff0c\u5f62\u6210\u56de\u8def\uff0c\u7136\u540e\u7ed9gpio0\u4e00\u4e2a\u9ad8\u7535\u538b\u5373\u53ef\u70b9\u4eae\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734439520787.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734439520787.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u4e0b\u4e3aArduino\u4ee3\u7801\uff0c\u975e\u5e38\u7684\u7b80\u5355\uff0c\u5c06\u5bf9\u5e94\u5f15\u811a\u8bbe\u5b9a\u4e3a\u8f93\u51fa\uff0c\u7136\u540e\u7ed9\u4e00\u4e2a\u9ad8\u7535\u5e73\u5373\u53ef\u3002<\/p>\n<pre><code class=\"language-ino\">const int GPIO_LED_1 = 0;\nvoid setup() {\n  pinMode(GPIO_LED_1, OUTPUT);\n  digitalWrite(GPIO_LED_1, HIGH);\n}\n\nvoid loop() {\n}<\/code><\/pre>\n<blockquote>\n<p>[!INFO]-<\/p>\n<ol>\n<li>\u8fd9\u91cc\u5728\u4eff\u771f\u73af\u5883\u4e2d\u7701\u7565\u4e86\u7535\u963b\uff0c\u771f\u5b9e\u7684\u7535\u8def\u4e2d\uff0c\u5e94\u5f53\u5728\u7ed9\u4e88\u4e00\u4e2a\u5408\u9002\u7684\u7535\u963b\uff0cESP32\u7684\u7535\u538b\u662f3.3V\uff0c\u53ef\u80fd\u4f1a\u7531\u4e8e\u7535\u6d41\u8fc7\u5927\u800c\u70e7\u574fled\u706f\u73e0\u3002<\/li>\n<li>\u8fd9\u91ccpinMode\u7528\u4e8e\u8bbe\u5b9a\u5f15\u811a\u7684\u5de5\u4f5c\u6a21\u5f0f\u3002\u4e0a\u8ff0\u4ee3\u7801\u4e2d\u5c06\u5176\u8bbe\u5b9a\u4e3a\u4e86\u8f93\u51fa\u6a21\u5f0f\uff0c\u53ef\u4ee5\u4e3b\u52a8\u63a7\u5236\u8f93\u51fa\u9ad8\u4f4e\u7535\u5e73\u3002\u9664\u6b64\u4e4b\u5916\u8fd8\u6709INPUT\u548cINPUT_PULLUP\u7b49\u6a21\u5f0f\u3002INPUT_PULLUP\u5219\u662f\u9ed8\u8ba4\u9ad8\u7535\u5e73\uff0c\u63a5\u5730\u65f6\u53d8\u4e3a\u4f4e\u7535\u5e73\uff0cINPUT\u5219\u4e0d\u786e\u5b9a\u9ad8\u4f4e\u7535\u5e73\uff0c\u9700\u8981\u5916\u90e8\u7684\u4e0a\u4e0b\u62c9\u7535\u963b\u786e\u5b9a\u3002\u4e0d\u540c\u5f15\u811a\u6a21\u5f0f\u95f4\u7684\u533a\u522b\u5b9e\u9645\u4e0a\u5c31\u5728\u4e8e\u7535\u5e73\u7684\u63a7\u5236\u65b9\u5f0f\u548c\u9ed8\u8ba4\u72b6\u6001\u3002<\/li>\n<li>digitalWrite\u63a7\u5236\u4e86\u7535\u5e73\uff0c\u8fd9\u91cc\u7ed9\u5b9a\u4e86\u4e00\u4e2a\u9ad8\u7535\u5e73\uff0c\u4f7f\u5f15\u811a\u9664\u6709\u4e86\u4e00\u4e2a3.3v\u7684\u7535\u538b\uff0c\u4f7fled\u706f\u4e24\u4fa7\u4ea7\u751f\u7535\u52bf\u5dee\uff0c\u53ef\u4ee5\u70b9\u4eae\u3002<\/li>\n<li>\u6240\u4ee5\u7efc\u4e0a\u6240\u8ff0\uff0c\u53ea\u7528<code>pinMode(GPIO_LED_1, OUTPUT);<\/code>\u540c\u6837\u53ef\u4ee5\u70b9\u4eaeled\u706f\u73e0<\/li>\n<\/ol>\n<\/blockquote>\n<h2>LED\u706f\u73e0\u4ea4\u66ff\u95ea\u70c1<\/h2>\n<p>\u60f3\u8ba9\u4e00\u4e2a\u6216\u591a\u4e2aled\u706f\u73e0\u4ea4\u66ff\u95ea\u70c1\uff0c\u53ea\u9700\u8981\u5faa\u73af\u7ed9\u4e88\u706f\u73e0\u6240\u5728\u7684\u5f15\u811a\u9ad8\u4f4e\u7535\u5e73\u5373\u53ef\u3002\u9ad8\u7535\u5e73\u70b9\u4eae\uff0c\u4f4e\u7535\u5e73\u4e0d\u4eae\u3002<\/p>\n<p>\u8fd9\u91cc\u6dfb\u52a0\u4e86\u4e00\u4e2a\u9633\u6781\u8fde\u63a5\u57284\u53f7\u5f15\u811a\uff0c\u9634\u6781\u540c\u6837\u63a5\u5730\u7684\u7eff\u8272\u706f\u73e0\u3002<br \/>\n<div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734441810457.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734441810457.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u8fd9\u91cc\u7531\u4e8e\u7528\u5230\u4e86\u4e24\u9897\u706f\u73e0\uff0c\u6240\u4ee5\u9700\u8981\u8bbe\u5b9a\u4e24\u4e2a\u5f15\u811a\u7684\u72b6\u6001\u3002\u7136\u540e\u628a\u5faa\u73af\u6267\u884c\u7684\u903b\u8f91\u653e\u5728loop\u5185\uff0c\u5faa\u73af\u6267\u884c\uff0c\u5148\u540e\u7ed9\u4e24\u9897\u706f\u73e0\u7684\u9633\u6781\u8bbe\u5b9a\u9ad8\u4f4e\u7535\u5e73\u4ea4\u66ff\uff0c\u8bbe\u5b9a\u4e00\u5b9a\u7684\u5ef6\u65f6\uff0c\u5373\u53ef\u5b9e\u73b0\u4ea4\u66ff\u95ea\u70c1\u7684\u72b6\u6001\u3002<\/p>\n<pre><code class=\"language-ino\">const int GPIO_LED_1 = 0;\nconst int GPIO_LED_2 = 4;\nvoid setup() {\n  pinMode(GPIO_LED_1, OUTPUT);\n  pinMode(GPIO_LED_2, OUTPUT);}\n\nvoid loop() {\n  \/\/ \u70b9\u4eae\u7ea2\u8272,\u7184\u706d\u7eff\u8272\n  digitalWrite(GPIO_LED_1, HIGH);\n  digitalWrite(GPIO_LED_2, LOW);\n\n  \/\/ \u5ef6\u8fdf200\u6beb\u79d2\n  delay(200);\n\n  \/\/ \u70b9\u4eae\u7eff\u8272\uff0c\u7184\u706d\u7ea2\u8272\n  digitalWrite(GPIO_LED_1, LOW);\n  digitalWrite(GPIO_LED_2, HIGH);\n\n  \/\/ \u5ef6\u8fdf200\u6beb\u79d2\n  delay(200);\n}<\/code><\/pre>\n<p>\u6548\u679c\u5982\u4e0b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/LED.gif'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/LED.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>LED\u6d41\u6c34\u706f<\/h2>\n<p>\u65e2\u7136\u53ef\u4ee5\u4e24\u9897\u706f\u73e0\u4ea4\u66ff\u95ea\u70c1\uff0c\u5c31\u540c\u7406\u6309\u7167\u7c7b\u4f3c\u7684\u903b\u8f91\u5b9e\u73b0\u591a\u4e2aled\u7684\u6d41\u6c34\u706f\uff0c\u53ea\u9700\u8981\u591a\u8fde\u63a5\u51e0\u9897\u706f\u73e0\u5373\u53ef\u3002<\/p>\n<p>\u8fd9\u91cc\u6dfb\u52a0\u4e86\u5341\u9897\u706f\u73e0\uff0c\u5206\u522b\u8fde\u63a5\u4e860\uff0c4\uff0c16\uff0c17\uff0c5\uff0c18\uff0c19\uff0c21\uff0c22\uff0c23\u53f7\u5f15\u811a\uff0c\u6309\u7167\u4e0a\u9762\u76f8\u540c\u7684\u65b9\u6cd5\u5206\u522b\u4ea4\u66ff\u8bbe\u5b9a\u9ad8\u4f4e\u7535\u5e73\u5373\u53ef\u3002\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-ino\">\/\/ \u5b9a\u4e49LED\u5f15\u811a\nconst int LED_COUNT = 10;\nconst int LED_PINS[LED_COUNT] = {0, 4, 16, 17, 5, 18, 19, 21, 22, 23};\nconst int DELAY_MS = 100;  \/\/ \u6d41\u6c34\u706f\u95f4\u9694\n\nvoid setup() {\n  \/\/ \u521d\u59cb\u5316\u6240\u6709LED\u4e3a\u8f93\u51fa\u6a21\u5f0f\n  for(int i = 0; i &lt; LED_COUNT; i++) {\n    pinMode(LED_PINS[i], OUTPUT);\n  }\n}\n\nvoid loop() {\n  \/\/ \u4ece\u5de6\u5230\u53f3\u6d41\u52a8\n  for(int i = 0; i &lt; LED_COUNT; i++) {\n    digitalWrite(LED_PINS[i], HIGH);\n    delay(DELAY_MS);\n    digitalWrite(LED_PINS[i], LOW);\n  }\n\n  \/\/ \u4ece\u53f3\u5230\u5de6\u6d41\u52a8\uff0c\u53cd\u5411\u904d\u5f15\u811a\n  for(int i = LED_COUNT-1; i &gt;= 0; i--) {\n    digitalWrite(LED_PINS[i], HIGH);\n    delay(DELAY_MS);\n    digitalWrite(LED_PINS[i], LOW);\n  }\n}<\/code><\/pre>\n<p>\u6548\u679c\u5982\u4e0b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/led21.gif'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/led21.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>\u66f4\u591aLED\u7684\u706f\u73e0\u7684\u6d41\u6c34\u706f<\/h2>\n<p>\u4e0a\u8ff0\u7684\u4ee3\u7801\u53ef\u4ee5\u5f88\u597d\u7684\u5b9e\u73b0\u4e00\u4e2a\u6d41\u6c34\u706f\uff0c\u4f46\u662f\u6bcf\u4e00\u4e2a\u706f\u73e0\u5360\u7528\u4e86\u4e00\u4e2agpio\u5f15\u811a\uff0c\u5982\u679c\u60f3\u8981\u6dfb\u52a0\u66f4\u591a\u7684\u706f\u73e0\uff0c\u706f\u73e0\u6570\u91cf\u5927\u4e8e\u5f15\u811a\uff0c\u5c31\u65e0\u6cd5\u5b9e\u73b0\u4e86\uff0c\u6240\u4ee5\u8fd9\u91cc\u5f15\u5165\u4e00\u4e2aIC\u6765\u5b9e\u73b0\u63a7\u5236\u66f4\u591a\u7684\u706f\u73e0\uff1a74HC595\u3002<\/p>\n<h3>74HC595\u82af\u7247\u7b80\u4ecb<\/h3>\n<p>74HC595\u662f\u4e00\u4e2a\u975e\u5e38\u5b9e\u7528\u7684\u96c6\u6210\u7535\u8def\u82af\u7247\uff0c\u5b83\u6700\u5927\u7684\u7279\u70b9\u5c31\u662f\u53ef\u4ee5\u7528\u5c11\u91cf\u7684\u8f93\u5165\u63a7\u5236\u591a\u4e2a\u8f93\u51fa\u3002\u60f3\u8c61\u4e00\u4e0b\uff0c\u5982\u679c\u4f60\u6709\u4e00\u4e2a8\u4f4d\u7684\u4e8c\u8fdb\u5236\u6570\u5b57(\u6bd4\u598210101010)\uff0c74HC595\u53ef\u4ee5\u628a\u8fd9\u4e2a\u6570\u5b57\u7684\u6bcf\u4e00\u4f4d\u90fd\u8f6c\u6362\u6210\u4e00\u4e2a\u72ec\u7acb\u7684\u8f93\u51fa\u7aef\u53e3\uff0c\u8f93\u51fa\u9ad8\u7535\u5e73(1)\u6216\u4f4e\u7535\u5e73(0)\u3002<\/p>\n<p>\u8fd9\u4e2a\u82af\u7247\u4e3b\u8981\u6709\u4e09\u4e2a\u91cd\u8981\u7684\u5de5\u4f5c\u7279\u6027\uff1a<\/p>\n<ol>\n<li><strong>\u4e32\u884c\u8f93\u5165\uff0c\u5e76\u884c\u8f93\u51fa<\/strong> &#8211; \u53ef\u4ee5\u4e00\u4f4d\u4e00\u4f4d\u5730\u8f93\u5165\u6570\u636e(\u50cf\u961f\u5217\u4e00\u6837)\uff0c\u4f46\u53ef\u4ee5\u540c\u65f6\u8f93\u51fa8\u4f4d<\/li>\n<li><strong>\u591a\u7247\u7ea7\u8054<\/strong> &#8211; \u53ef\u4ee5\u628a\u591a\u4e2a\u82af\u7247\u4e32\u8d77\u6765\uff0c\u6bd4\u5982\u75283\u4e2a\u82af\u7247\u5c31\u80fd\u63a7\u523624\u4e2aLED<\/li>\n<li><strong>\u5e26\u9501\u5b58\u529f\u80fd<\/strong> &#8211; \u53ef\u4ee5\u5148\u51c6\u5907\u597d\u6240\u6709\u6570\u636e\uff0c\u7136\u540e\u4e00\u6b21\u6027\u8f93\u51fa\uff0c\u907f\u514d\u4e2d\u95f4\u72b6\u6001\u7684\u663e\u793a<\/li>\n<\/ol>\n<p>\u5173\u952e\u5f15\u811a\u53ca\u5176\u529f\u80fd\uff08\u5c31\u50cf\u82af\u7247\u7684&quot;\u63a5\u53e3&quot;\uff09\uff1a<\/p>\n<ul>\n<li><strong>DS (\u4e32\u884c\u6570\u636e\u8f93\u5165)<\/strong> &#8211; \u7528\u6765\u8f93\u51650\u62161\u7684\u6570\u636e\uff0c\u5c31\u50cf\u5f80\u74f6\u5b50\u91cc\u4e00\u6ef4\u4e00\u6ef4\u52a0\u6c34<\/li>\n<li><strong>SHCP (\u79fb\u4f4d\u5bc4\u5b58\u5668\u65f6\u949f)<\/strong> &#8211; \u6bcf\u6b21\u53d8\u5316\u4f1a\u8ba9\u6570\u636e\u5f80\u91cc\u79fb\u52a8\u4e00\u4f4d\uff0c\u5c31\u50cf\u628a\u74f6\u5b50\u91cc\u7684\u6c34\u5f80\u524d\u63a8<\/li>\n<li><strong>STCP (\u5b58\u50a8\u5bc4\u5b58\u5668\u65f6\u949f)<\/strong> &#8211; \u51b3\u5b9a\u4ec0\u4e48\u65f6\u5019\u628a\u6570\u636e\u663e\u793a\u51fa\u6765\uff0c\u50cf\u662f\u6253\u5f00\u74f6\u76d6\u8ba9\u6c34\u6d41\u51fa\u6765<\/li>\n<\/ul>\n<p>\u6240\u4ee5\u5c06\u8fd9\u4e09\u4e2a\u5f15\u811a\u8fde\u63a5esp32\u7684\u4e09\u4e2agpio\u5f15\u811a\u5373\u53ef\uff0c\u9664\u6b64\u4e4b\u5916\uff0c\u8fd8\u9700\u8981\u5c06VCC\u5f15\u811a\u8fde\u63a5\u4f9b\u7535\uff0cGND\u5f15\u811a\u63a5\u5730\uff0c\u5982\u4e0b\u56fe<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734448368546.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734448368546.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h3>\u6570\u636e\u4f20\u8f93\u539f\u7406<\/h3>\n<p>\u6570\u636e\u4f20\u8f93\u8fc7\u7a0b\u53ef\u4ee5\u7c7b\u6bd4\u4e00\u4e2a8\u683c\u7684&quot;\u5c0f\u706b\u8f66&quot;\uff1a<\/p>\n<ol>\n<li>DS\u5f15\u811a\u5c31\u50cf\u88c5\u8d27\u7684\u5165\u53e3\uff0c\u6bcf\u6b21\u53ea\u80fd\u653e\u5165\u4e00\u4e2a0\u62161<\/li>\n<li>SHCP\u5c31\u50cf\u706b\u8f66\u7684\u524d\u8fdb\u4fe1\u53f7\uff0c\u6bcf\u6765\u4e00\u6b21\u4fe1\u53f7\uff0c\u706b\u8f66\u524d\u8fdb\u4e00\u683c<\/li>\n<li>STCP\u5c31\u50cf\u53d1\u8f66\u4fe1\u53f7\uff0c\u5f538\u4e2a\u6570\u636e\u90fd\u88c5\u597d\u540e\uff0c\u4e00\u6b21\u6027\u53d1\u51fa\u53bb<\/li>\n<\/ol>\n<p>\u4ee5\u4e0b\u4ee3\u7801\u5c55\u793a\u4e86\u5982\u4f55\u5411\u82af\u7247\u53d1\u9001\u4e00\u4e2a\u5b57\u8282\u7684\u6570\u636e\uff1a<\/p>\n<pre><code class=\"language-ino\">void shiftOut(uint8_t data) {\n  \/\/ \u4ece\u6700\u9ad8\u4f4d(MSB)\u5f00\u59cb\u53d1\u9001\uff0c\u5c31\u50cf\u4ece\u706b\u8f66\u5934\u5f00\u59cb\u88c5\u8d27\n  for(int i = 7; i &gt;= 0; i--) {\n    digitalWrite(clockPin, LOW);  \/\/ \u51c6\u5907\u63a5\u6536\u65b0\u6570\u636e\n\n    \/\/ (data &gt;&gt; i) &amp; 0x01 \u7684\u542b\u4e49\uff1a\n    \/\/ data &gt;&gt; i\uff1a\u628a\u6570\u636e\u53f3\u79fbi\u4f4d\uff0c\u628a\u8981\u5904\u7406\u7684\u4f4d\u653e\u5230\u6700\u53f3\u8fb9\n    \/\/ &amp; 0x01\uff1a\u53ea\u4fdd\u7559\u6700\u540e\u4e00\u4f4d\uff0c\u5176\u4ed6\u4f4d\u90fd\u53d8\u62100\n    uint8_t bitValue = (data &gt;&gt; i) &amp; 0x01;\n\n    digitalWrite(dataPin, bitValue);  \/\/ \u653e\u5165\u6570\u636e\n    digitalWrite(clockPin, HIGH);     \/\/ \u4e0a\u5347\u6cbf\uff0c\u786e\u8ba4\u6570\u636e\n    \/\/ \u8fd9\u91cc\u7684&quot;\u4e0a\u5347\u6cbf&quot;\u6307\u7684\u662f\u4fe1\u53f7\u4ece\u4f4e\u7535\u5e73(0)\u53d8\u5230\u9ad8\u7535\u5e73(1)\u7684\u8fc7\u7a0b\n  }\n}<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u9700\u8981\u63a7\u5236\u591a\u4e2a595\u82af\u7247\u65f6\uff0c\u5c31\u9700\u8981\u4e00\u6b21\u53d1\u9001\u591a\u4e2a\u5b57\u8282\uff1a<\/p>\n<pre><code class=\"language-ino\">void shiftMultiBytes(uint8_t* data, int numBytes) {\n  digitalWrite(latchPin, LOW);   \/\/ \u5173\u95ed\u8f93\u51fa\uff0c\u51c6\u5907\u63a5\u6536\u65b0\u6570\u636e\n\n  \/\/ \u4ece\u6700\u540e\u4e00\u7247\u5f00\u59cb\u53d1\u9001\uff0c\u56e0\u4e3a\u6570\u636e\u8981\u4e00\u76f4\u5f80\u540e\u4f20\n  for(int i = numBytes-1; i &gt;= 0; i--) {\n    shiftOut(data[i]);  \/\/ \u53d1\u9001\u6bcf\u4e2a\u5b57\u8282\n  }\n\n  digitalWrite(latchPin, HIGH);  \/\/ \u6253\u5f00\u8f93\u51fa\uff0c\u6570\u636e\u4f1a\u540c\u65f6\u663e\u793a\n}<\/code><\/pre>\n<h3>\u5b8c\u6574\u903b\u8f91\u4ee3\u7801<\/h3>\n<pre><code class=\"language-ino\">\n\/\/ \u5b9a\u4e49595\u4e32\u8054\u4f7f\u7528\u7684\u5f15\u811a\nconst int dataPin = 2;    \/\/ DS(\u6570\u636e\u8f93\u5165)\nconst int latchPin = 0;   \/\/ STCP(\u5b58\u50a8\u5bc4\u5b58\u5668\u65f6\u949f)\nconst int clockPin = 4;   \/\/ SHCP(\u79fb\u4f4d\u5bc4\u5b58\u5668\u65f6\u949f)\nconst int NUM_REGISTERS = 6;   \/\/ 595\u82af\u7247\u6570\u91cf\nconst int NUM_LEDS = NUM_REGISTERS * 8;  \/\/ \u603bLED\u6570(\u6bcf\u7247595\u63a7\u52368\u4e2aLED)\nconst int DELAY_MS = 100;  \/\/ \u6d41\u6c34\u706f\u79fb\u52a8\u95f4\u9694\n\nvoid setup() {\n  \/\/ \u8bbe\u7f6e595\u63a7\u5236\u5f15\u811a\u4e3a\u8f93\u51fa\u6a21\u5f0f\n  pinMode(dataPin, OUTPUT);   \/\/ \u6570\u636e\u7ebf\n  pinMode(clockPin, OUTPUT);  \/\/ \u65f6\u949f\u7ebf\n  pinMode(latchPin, OUTPUT);  \/\/ \u9501\u5b58\u7ebf\n}\n\n\/\/ \u5411595\u53d1\u9001\u4e00\u4e2a\u5b57\u8282\u6570\u636e\nvoid shiftOut(uint8_t data) {\n  \/\/ \u4ece\u6700\u9ad8\u4f4d(MSB)\u5f00\u59cb\u53d1\u9001\n  for(int i = 7; i &gt;= 0; i--) {\n    digitalWrite(clockPin, LOW);  \/\/ \u65f6\u949f\u4f4e\u7535\u5e73\n\n    \/\/ \u83b7\u53d6\u5f53\u524d\u4f4d\u7684\u503c\u5e76\u6253\u5370\n    uint8_t bitValue = (data &gt;&gt; i) &amp; 0x01;\n    Serial.print(bitValue);\n\n    digitalWrite(dataPin, bitValue);  \/\/ \u8bbe\u7f6e\u6570\u636e\u4f4d\n    digitalWrite(clockPin, HIGH);     \/\/ \u65f6\u949f\u4e0a\u5347\u6cbf\uff0c\u6570\u636e\u88ab\u79fb\u5165\n  }\n  Serial.println(); \/\/ \u6362\u884c\n}\n\n\/\/ \u5411\u591a\u7247\u7ea7\u8054\u7684595\u53d1\u9001\u6570\u636e\nvoid shiftMultiBytes(uint8_t* data, int numBytes) {\n  digitalWrite(latchPin, LOW);   \/\/ \u51c6\u5907\u6570\u636e\u4f20\u8f93\n\n  \/\/ \u4ece\u6700\u540e\u4e00\u7247595\u5f00\u59cb\u53d1\u9001\n  for(int i = numBytes-1; i &gt;= 0; i--) {\n    shiftOut(data[i]);\n  }\n\n  digitalWrite(latchPin, HIGH);  \/\/ \u6570\u636e\u9501\u5b58\u8f93\u51fa\n}\n\nvoid loop() {\n  uint8_t ledData[NUM_REGISTERS] = {0};  \/\/ \u5b58\u50a8\u6bcf\u4e2a595\u7684LED\u72b6\u6001\n\n  \/\/ \u6b63\u5411\u6d41\u52a8(\u4ece\u7b2c\u4e00\u4e2aLED\u5230\u6700\u540e\u4e00\u4e2a)\n  for(int i = 0; i &lt; NUM_LEDS; i++) {\n    memset(ledData, 0, NUM_REGISTERS);  \/\/ \u6e05\u7a7a\u6240\u6709LED\u72b6\u6001\n    ledData[i \/ 8] = (1 &lt;&lt; (i % 8));    \/\/ \u8bbe\u7f6e\u5f53\u524dLED\u4f4d\uff0c\u901a\u8fc7\u4f4d\u79fb\n    shiftMultiBytes(ledData, NUM_REGISTERS);\n    delay(DELAY_MS);\n  }\n\n  \/\/ \u53cd\u5411\u6d41\u52a8(\u4ece\u6700\u540e\u4e00\u4e2aLED\u5230\u7b2c\u4e00\u4e2a)\n  for(int i = NUM_LEDS-1; i &gt;= 0; i--) {\n    memset(ledData, 0, NUM_REGISTERS);\n    ledData[i \/ 8] = (1 &lt;&lt; (i % 8));\n    shiftMultiBytes(ledData, NUM_REGISTERS);\n    delay(DELAY_MS);\n  }\n}<\/code><\/pre>\n<h3>\u5de5\u4f5c\u903b\u8f91\u8be6\u89e3<\/h3>\n<p>\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u66f4\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u7406\u89e3595\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1a<\/p>\n<pre><code class=\"language-ino\">\/\/ \u5047\u8bbe\u6211\u4eec\u8981\u70b9\u4eae3\u4e2a595\u82af\u7247\u63a7\u5236\u7684\u7b2c17\u4e2aLED\n\/\/ 17 = 8 + 8 + 1\uff0c\u6240\u4ee5\u8fd9\u4e2aLED\u5728\u7b2c\u4e09\u7247595\u4e0a\n\n\/\/ 1. \u786e\u5b9aLED\u4f4d\u7f6e\nint ledIndex = 17;\nint chipIndex = ledIndex \/ 8;    \/\/ = 2\uff0c\u8868\u793a\u7b2c\u4e09\u7247\u82af\u7247\nint pinIndex = ledIndex % 8;     \/\/ = 1\uff0c\u8868\u793a\u8be5\u82af\u7247\u7684\u7b2c2\u4e2a\u8f93\u51fa\n\n\/\/ 2. \u8bbe\u7f6e\u6570\u636e\nuint8_t ledData[3] = {0, 0, 0};  \/\/ 3\u7247595\uff0c\u521d\u59cb\u5168\u7f6e0\nledData[chipIndex] = (1 &lt;&lt; pinIndex);  \/\/ \u53ea\u5c06\u76ee\u6807\u4f4d\u7f6e1\n\n\/\/ 3. \u53d1\u9001\u6570\u636e\nshiftMultiBytes(ledData, 3);<\/code><\/pre>\n<p>\u5b9e\u9645\u4e0aArduino\u662f\u6709<code>shiftOut<\/code>\u51fd\u6570\u5c01\u88c5\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\uff0c\u7528\u57fa\u7840\u903b\u8f91\u81ea\u884c\u5b9e\u73b0\u4e86\u3002<\/p>\n<p>\u5bf9\u4e8e\u5927\u91cf\u7684\u706f\u73e0\uff0c\u4e3b\u8981\u65b9\u6848\u5c31\u662f\u4f7f\u752874HC595\u6765\u6269\u5c55gpio\u3002\u5176\u53ef\u4ee5\u5bf9\u4e00\u4e2a\u8f93\u5165\u5e76\u884c\u8f93\u51fa\uff0c\u4e5f\u5c31\u662f\u8bf4\u5bf9\u4e00\u4e2a8\u4f4d\u7684\u8f93\u5165\u5206\u522b\u8f93\u51fa\u5230\u51768\u4e2a\u5f15\u811a\u4e0a\uff0c\u5e76\u4e14ic\u4e4b\u95f4\u53ef\u4ee5\u4e32\u8054\u4f7f\u7528\uff0c\u95f4\u63a5\u5b9e\u73b0\u4e86\u901a\u8fc7\u4e09\u4e2a\u5f15\u811a\u6765\u6269\u5c55\u51fa\u65e0\u9650\u4e2a\u5f15\u811a\u3002<\/p>\n<p>\u8ba9\u6211\u4eec\u901a\u8fc7\u4e00\u4e2a\u5177\u4f53\u7684\u4f8b\u5b50\u6765\u7406\u89e3\u72b6\u6001\u63a7\u5236\uff1a<\/p>\n<pre><code class=\"language-ino\">\/\/ \u793a\u4f8b\uff1a\u70b9\u4eae\u7b2c\u4e00\u4e2aLED\nuint8_t ledData[NUM_REGISTERS] = {0};  \/\/ \u5168\u90e8\u521d\u59cb\u5316\u4e3a0\nledData[0] = 0b00000001;  \/\/ \u7b2c\u4e00\u4e2a595\u7684\u7b2c\u4e00\u4e2a\u8f93\u51fa\u7f6e1\nshiftMultiBytes(ledData, NUM_REGISTERS);\n\n\/\/ \u793a\u4f8b\uff1a\u70b9\u4eae\u7b2c\u4e5d\u4e2aLED\uff08\u7b2c\u4e8c\u4e2a595\u7684\u7b2c\u4e00\u4e2a\u8f93\u51fa\uff09\nledData[1] = 0b00000001;  \/\/ \u7b2c\u4e8c\u4e2a595\u7684\u7b2c\u4e00\u4e2a\u8f93\u51fa\u7f6e1\nshiftMultiBytes(ledData, NUM_REGISTERS);<\/code><\/pre>\n<p>\u4e0a\u8ff0\u4ee3\u7801\u4e2d\uff0c\u4e3a\u4e86\u65b9\u4fbf595\u82af\u7247\u7684\u6269\u5c55\uff0c\u5f15\u5165\u4e86\u4e00\u4e2a\u603b595\u82af\u7247\u6570\u91cf\u7684\u6570\u7ec4\uff0c\u6bcf\u4e2a\u5143\u7d20\u5b58\u653e\u4e00\u4e2a8\u4f4d\u7684\u6570\u503c\u7528\u4e8e\u63a7\u5236\u6bcf\u4e2a595\u82af\u7247\u6269\u5c55\u51fa\u76848\u4e2a\uff08Q0-Q7\uff09\u5f15\u811a\uff0c\u6240\u4ee5\u603b\u706f\u73e0\u6570\u91cf\u5c31\u662f595\u82af\u7247\u6570*8\u3002<\/p>\n<p>\u6570\u636e\u7684\u8ba1\u7b97\u548c\u53d1\u9001\u8fc7\u7a0b\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"language-ino\">\/\/ \u8ba1\u7b97\u5f53\u524dLED\u5c5e\u4e8e\u54ea\u4e2a595\u82af\u7247\nint chipIndex = ledIndex \/ 8;\n\/\/ \u8ba1\u7b97\u5f53\u524dLED\u5728\u82af\u7247\u4e0a\u7684\u4f4d\u7f6e\nint pinIndex = ledIndex % 8;\n\/\/ \u8bbe\u7f6e\u5bf9\u5e94\u4f4d\nledData[chipIndex] = (1 &lt;&lt; pinIndex);<\/code><\/pre>\n<p>\u4e0a\u6587\u4e2d\u63d0\u5230\uff0c595\u82af\u7247\u53ef\u4ee5\u63a5\u6536\u4e00\u4e2a8\u4f4d\u7684\u8f93\u5165\uff0c\u5206\u522b\u8f93\u51fa\u52308\u4e2a\u5f15\u811a\uff0c\u6240\u4ee5\u63a7\u5236led\u706f\u73e0\u7684\u4e00\u6b21\u4eae\u8d77\uff0c\u53ea\u9700\u8981\u6309\u987a\u5e8f\u5411595\u82af\u7247\u53d1\u9001\u706f\u73e0\u72b6\u6001\u6570\u7ec4000&#8230;\uff0c100&#8230;\uff0c010&#8230;\uff0c001&#8230;\uff0c0001&#8230;,\u4ee5\u6b64\u7c7b\u63a8\uff0c595\u82af\u7247\u5c31\u662f\u5206\u522b\u57fa\u4e8e\u5bf9\u5e94\u5f15\u811a\u4e3a\u9ad8\u7535\u5e73\uff0c\u5373\u53ef\u63a7\u5236led\u706f\u73e0\u7684\u4f9d\u6b21\u4eae\u706d\u3002<\/p>\n<p>\u4e0a\u9762\u4ee3\u7801\u4e2d\uff0c\u540c\u6837\u4e3a\u4e86\u65b9\u4fbf\u6269\u5c55\uff0c595\u82af\u7247\u6570\u91cf\u5e76\u6ca1\u6709\u76f4\u63a5\u5199\u6b7b\u5728\u4ee3\u7801\u903b\u8f91\u4e2d\uff0c\u800c\u662f\u901a\u8fc7\u9884\u5148\u7684\u5e38\u91cf\u8bbe\u5b9a\uff0c\u901a\u8fc7\u5f53\u524d\u706f\u73e0\u7684\u7d22\u5f15\/8\u6765\u8ba1\u7b97\u51fa\u5f53\u524d\u7684\u706f\u73e0\u5c5e\u4e8e\u54ea\u4e2a595\u82af\u7247\uff0c\u5373\u5e94\u8be5\u4fee\u6539\u72b6\u6001\u6570\u7ec4\u4e2d\u7684\u54ea\u4e00\u4e2a\u6570\u503c\uff0c\u901a\u8fc7\u7d22\u5f15%8\u6765\u786e\u5b9a\u504f\u79fb\u4f4d\u6570\uff0c\u5373\u54ea\u4e2a\u706f\u73e0\u3002\u6700\u540e\u5c06\u6570\u636e\u4e00\u6b21\u53d1\u7ed9\u4e94\u4e2a595\u82af\u7247\uff0c\u5b9e\u73b0\u5bf9\u6240\u6709\u706f\u73e0\u7684\u63a7\u5236\u3002<\/p>\n<p>\u867d\u7136\u7406\u8bba\u4e0a\u8bb2\uff0c\u8fd9\u79cd\u65b9\u5f0f\u53ef\u4ee5\u6269\u5c55\u51fa\u65e0\u9650\u4e2a\u706f\u73e0\uff0c\u4f46\u662f\u5b9e\u9645\u4e0a\u8fd8\u9700\u8981\u8003\u8651\u7535\u6e90\u548c\u529f\u8017\u7b49\u56e0\u7d20\u3002<\/p>\n<p>\u6700\u7ec8\u6548\u679c\u5982\u4e0b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/QQ\u5f55\u5c4f20241217230323.gif'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/QQ\u5f55\u5c4f20241217230323.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>\u52a8\u6001\u8c03\u901fLED\u6d41\u6c34\u706f<\/h2>\n<p>\u5728\u6b64\u6280\u672f\u4e0a\u4f7f\u7528\u4e24\u4e2a\u6309\u94ae\u8fdb\u884c\u52a8\u6001\u8c03\u901f\uff0c\u6574\u4f53\u903b\u8f91\u5c31\u662f\u6dfb\u52a0\u4e24\u4e2a\u6309\u94ae\uff0c\u4e00\u4e2a\u52a0\u901f\uff0c\u4e00\u4e2a\u51cf\u901f\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u8c03\u8282\u5f53\u524d\u7684\u70b9\u4eae\u5ef6\u65f6\uff0c\u901a\u8fc7\u4e00\u4e2a\u6bb5\u7801\u5c4f\u663e\u793a\u5f53\u524d\u7684\u5ef6\u65f6\u3002<\/p>\n<p>\u8fd9\u91cc\u6bb5\u7801\u5c4f\u4f7f\u7528TM1637\uff0c\u6dfb\u52a0\u5176\u5bf9\u5e94\u7684\u5e93\uff0c\u8fd9\u91cc\u4f7f\u7528TM1637Display\u70b9\u4eae\u4ed6\u3002VCC\u548cGND\u5206\u522b\u8fde\u63a53V3\u548cGND\uff0cCLK\u548cDIO\u8fde\u63a5\u5728\u4e24\u4e2aGPIO\u5f15\u811a\u4e0a\u5373\u53ef\u4f7f\u7528<\/p>\n<p>\u6309\u94ae\u9009\u62e9\u5e38\u89c4\u7684\u6309\u94ae\u5373\u53ef\uff0c\u4e00\u7aef\u63a5\u5730\uff0c\u4e00\u7aef\u63a5gpip\u5f15\u811a\uff0c\u4f46\u662f\u8fd9\u91cc\u7684\u5f15\u811a\u53ef\u4ee5\u9009\u62e9<code>INPUT_PULLUP<\/code>\uff0c\u9ed8\u8ba4\u4e3a\u9ad8\u7535\u5e73\uff0c\u63a5\u5730\u5bfc\u901a\u540e\u53d8\u4e3a\u4f4e\u7535\u5e73\uff0c\u6240\u4ee5\u5bf9\u5e94\u5f15\u811a\u53d8\u4e3a\u4e86\u4f4e\u7535\u5e73\u5219\u8bf4\u660e\u5bf9\u5e94\u6309\u94ae\u6309\u4e0b\u3002<\/p>\n<p>\u9664\u6b64\u4e4b\u5916\u4e5f\u53ef\u4ee5\u9009\u62e9INPUT\u6a21\u5f0f\uff0c\u8fd9\u65f6\u5c31\u9700\u8981\u81ea\u884c\u6dfb\u52a0\u989d\u5916\u7684\u4e0a\u62c9\u6216\u8005\u4e0b\u62c9\u7535\u8def\u3002\u4ee5\u4e0a\u62c9\u4e3a\u4f8b\uff0c \u6309\u94ae\u5728\u4e00\u6bb5\u8fde\u63a5gpio\uff0c\u4e00\u6bb5\u63a5\u5730\u7684\u57fa\u7840\u4e0a\uff0c\u5c063V3\u8fde\u63a5\u5230gpio\uff0c\u540c\u65f6\u8fde\u63a5\u4e00\u4e2a\u9ad8\u989d\u7535\u963b\u3002\u793a\u610f\u56fe\u5982\u4e0b\u3002<br \/>\n\u672a\u6309\u4e0b\u65f6:<br \/>\n\u7535\u6d41: 3.3V \u2192 10k\u03a9\u7535\u963b \u2192 GPIO<br \/>\nGPIO\u8bfb\u53d6: HIGH(3.3V)<br \/>\n\u6309\u4e0b\u65f6<br \/>\n\u7535\u6d41: GPIO \u2192 \u6309\u94ae \u2192 GND\uff08\u7531\u4e8e\u53e6\u4e00\u7aef\u7535\u963b\u8f83\u9ad8\uff0c\u7535\u6d41\u4f1a\u53bb\u7535\u963b\u4f4e\u7684\uff09<br \/>\nGPIO\u8bfb\u53d6: LOW(0V)<\/p>\n<pre><code class=\"language-txt\">3.3V ----[10k\u03a9]----+\n                   |\n                   +---- GPIO (INPUT)\n                   |\n             [\u6309\u94ae]|\n                   |\n                  GND<\/code><\/pre>\n<p>\u8fd9\u91cc\u5c31\u4ee5INPUT_PULLUP\u6a21\u5f0f\u4e3a\u4f8b\uff0c\u63a5\u7ebf\u5982\u4e0b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734493825120.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734493825120.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<p>\u4e3a\u4e86\u5b9e\u73b0\u5b9e\u65f6\u66f4\u65b0\u901f\u5ea6\uff0c\u8fd9\u91cc\u6709\u4e24\u70b9\u9700\u8981\u6ce8\u610f<\/p>\n<p><strong>1. \u4e0d\u80fd\u518d\u4f7f\u7528\u963b\u585e\u5f0f\u7684delay\u6765\u63a7\u5236\u65f6\u95f4<\/strong><\/p>\n<p>\u56e0\u4e3adelay\u4f1a\u963b\u585e\u6574\u4e2a\u4ee3\u7801\u903b\u8f91\uff0c\u6240\u4ee5\u4e5f\u4f1a\u5f71\u54cd\u6309\u94ae\u5bf9\u4e8e\u5ef6\u65f6\u7684\u66f4\u65b0\uff0c\u5728\u8bbe\u5b9a\u4e3a\u5ef6\u65f6\u5f88\u957f\u4e4b\u540e\u4f1a\u5bfc\u81f4\u5ef6\u65f6\u66f4\u65b0\u5468\u671f\u8f83\u957f\uff08\u56e0\u4e3a\u5728\u963b\u585e\u5462\uff09\uff0c\u4f53\u73b0\u5728\u786c\u4ef6\u4e0a\u5c31\u662f\u901f\u5ea6\u53d8\u66f4\u4e0d\u7075\u654f\uff0c\u8fd9\u91cc\u8981\u66f4\u6362\u4e00\u79cd\u5b9e\u73b0\u65b9\u5f0f\u3002<\/p>\n<p>\u8fd9\u91cc\u6539\u4e3a\u624b\u52a8\u8ba1\u7b97\u6267\u884c\u65f6\u95f4\uff0c\u5373\u5728\u5faa\u73af\u4f53\u4e2d\u5ef6\u65f6\u5904\u7406\u7684\u903b\u8f91\u6bcf\u6b21\u9996\u5148\u6267\u884c\uff0c\u540e\u9762\u901a\u8fc7\u6bd4\u8f83\u4ee3\u7801\u6267\u884c\u7684\u65f6\u95f4\u548c\u76ee\u524d\u7684\u6700\u65b0\u5ef6\u65f6\u8bbe\u5b9a\u51b3\u5b9a\u9700\u4e0d\u9700\u8981\u66f4\u65b0\u6d41\u6c34\u706f\u72b6\u6001\uff0c\u5373<\/p>\n<pre><code class=\"language-ino\">void loop() {\n  static unsigned long previousMillis = 0;  \/\/ \u4e0a\u6b21\u66f4\u65b0\u65f6\u95f4\n  static int currentLed = 0;               \/\/ \u5f53\u524dLED\u4f4d\u7f6e\n  static bool direction = true;            \/\/ true\u4e3a\u6b63\u5411\uff0cfalse\u4e3a\u53cd\u5411\n  uint8_t ledData[NUM_REGISTERS] = {0};    \/\/ LED\u72b6\u6001\u6570\u7ec4\n\n  \/\/ \u5904\u7406\u6309\u94ae\u8f93\u5165\u4ee5\u53ca\u5ef6\u65f6\u53d8\u66f4\n  handleButtons();\n\n  \/\/ \u68c0\u67e5\u662f\u5426\u5230\u8fbe\u66f4\u65b0\u65f6\u95f4\n  unsigned long currentMillis = millis(); \/\/ \u5f53\u524d\u65f6\u95f4\n  if (currentMillis - previousMillis &gt;= DELAY_MS) {\n    previousMillis = currentMillis;\n    \/\/ \u66f4\u65b0led\u72b6\u6001\u76f8\u5173....\n  }\n}<\/code><\/pre>\n<p><strong>2. \u9700\u8981\u8003\u8651\u6d88\u6296<\/strong><\/p>\n<p>\u6309\u94ae\u7684\u6d88\u6296\uff0c\u5373\u6d88\u9664\u7531\u4e8e\u6309\u94ae\u88ab\u6309\u4e0b\u65f6\u4ea7\u751f\u7684\u673a\u68b0\u6296\u52a8\u5bf9\u6309\u94ae\u7684\u7ed3\u679c\u5224\u5b9a\u9020\u6210\u7684\u5f71\u54cd\u3002\u7531\u4e8e\u6309\u94ae\u88ab\u6309\u4e0b\u53ef\u80fd\u4f1a\u4ea7\u751f\u673a\u68b0\u6027\u6296\u52a8\uff0c\u5982\u679c\u4e0d\u505a\u5904\u7406\uff0c\u6309\u94ae\u53ef\u80fd\u4f1a\u88ab\u8bc6\u522b\u4e3a\u591a\u6b21\u6309\u4e0b\u3002\u5373<\/p>\n<pre><code>\u7535\u538b\n   ^\n3.3V|    \/\\\/\\\/\\____\n    |___\/\n    +---------------&gt; \u65f6\u95f4\n    \u6309\u4e0b\u77ac\u95f4\u51fa\u73b0\u591a\u6b21\u8df3\u53d8<\/code><\/pre>\n<p>\u8fd9\u65f6\u7684\u89e3\u51b3\u65b9\u6848\u4e00\u822c\u5206\u4e3a\u8f6f\u4ef6\u89e3\u51b3\u548c\u786c\u4ef6\u89e3\u51b3\u3002<\/p>\n<p>\u8f6f\u4ef6\u89e3\u51b3\u903b\u8f91\u8f83\u4e3a\u7b80\u5355\u7c97\u66b4\uff0c\u5373\u8bbe\u5b9a\u4e00\u4e2a\u5ef6\u65f6\uff0c\u7b49\u5f85\u6296\u52a8\u7ed3\u675f\u518d\u786e\u8ba4\u6309\u94ae\u72b6\u6001\u5373\u53ef\u3002\u5373<\/p>\n<pre><code class=\"language-ino\">void handleButtons() {\n  static unsigned long lastDebounceTime = 0;\n  const unsigned long debounceDelay = DEBOUNCEDELAY;  \/\/ \u6d88\u6296\u5ef6\u65f6\n\n  if ((millis() - lastDebounceTime) &gt; debounceDelay) {\n  if (digitalRead(speedUpPin) == LOW) {  \/\/ \u8bfb\u53d6\u52a0\u901f\u9488\u811a\u72b6\u6001\n  \/\/ \u52a0\u901f\u6309\u94ae\u6309\u4e0b...\n    }\n    if (digitalRead(speedDownPin) == LOW) {  \/\/ \u8bfb\u53d6\u51cf\u901f\u6309\u94ae\u72b6\u6001\n    \/\/ \u51cf\u901f\u6309\u94ae\u6309\u4e0b...\n    }\n  }\n}<\/code><\/pre>\n<p>\u786c\u4ef6\u6d88\u6296\u6709\u591a\u79cd\u89e3\u51b3\u65b9\u6848\uff0c\u5e38\u89c1\u7684\u65b9\u6cd5\u6709\u901a\u8fc7RC\u6ee4\u6ce2\u6216\u901a\u8fc7\u65bd\u5bc6\u7279\u89e6\u53d1\u5668<\/p>\n<p>RC\u6ee4\u6ce2\u5373\u901a\u8fc7\u5728\u7535\u8def\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u7535\u5bb9\uff0c\u901a\u8fc7\u5bf9\u7535\u5bb9\u7684\u5145\u7535\u6765\u6d88\u9664\u77ed\u65f6\u95f4\u5185\u7684\u4fe1\u53f7\u6296\u52a8\uff0c\u540c\u65f6\u8fd9\u6837\u7684\u601d\u60f3\u8fd8\u88ab\u7528\u4e8e\u7535\u8def\u5ef6\u65f6\u3002\u793a\u610f\u56fe\u5982\u4e0b<\/p>\n<pre><code>VCC(3.3V) ----[10k\u03a9]----+\n                        |\n                        +----[0.1\u00b5F]----GND\n                        |\n                        +---- GPIO\n                        |\n                  [\u6309\u94ae]|\n                        |\n                       GND<\/code><\/pre>\n<p>\u6216\u8005\u662f\u53ccRC\u6ee4\u6ce2\uff0c\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u53ef\u4ee5\u8d77\u5230\u66f4\u597d\u7684\u6548\u679c<\/p>\n<pre><code>VCC ----[R1]----+----[R2]----+----OUTPUT\n                |            |\n              [C1]         [C2]\n                |            |\n               GND          GND<\/code><\/pre>\n<p>\u800c\u65bd\u5c3c\u7279\u89e6\u53d1\u5668\u5219\u53ef\u4ee5\u53ea\u6709\u5f53\u7535\u538b\u8d85\u8fc7\u9608\u503c\u7684\u65f6\u5019\uff0c\u624d\u6539\u53d8\u72b6\u6001\uff0c\u6296\u52a8\u5f15\u8d77\u7684\u8f83\u5c0f\u7535\u538b\u53d8\u5316\u5e76\u4e0d\u4f1a\u8ba9\u65bd\u5bc6\u7279\u89e6\u53d1\u5668\u6539\u53d8\u72b6\u6001\uff0c\u4ece\u800c\u5b9e\u73b0\u4e86\u6d88\u6296\u3002\u793a\u4f8b\u5982\u4e0b<\/p>\n<pre><code>VCC(3.3V) ----[10k\u03a9]----+\n                        |\n                  [\u6309\u94ae]|\n                        +---- [74HC14] ---- GPIO\n                        |      Pin1     Pin2\n                  [0.1\u00b5F]\n                        |\n                       GND<\/code><\/pre>\n<p>\u8fd9\u91cc\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\uff0c\u4f7f\u7528\u8f6f\u4ef6\u6d88\u6296\uff0c\u6700\u7ec8\u5b8c\u6574\u7684\u903b\u8f91\u4ee3\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-ino\">#include &lt;TM1637Display.h&gt;\n\n\/\/ \u5b9a\u4e49595\u4e32\u8054\u4f7f\u7528\u7684\u5f15\u811a\nconst int dataPin = 2;    \/\/ DS(\u6570\u636e\u8f93\u5165)\nconst int latchPin = 0;   \/\/ STCP(\u5b58\u50a8\u5bc4\u5b58\u5668\u65f6\u949f)\nconst int clockPin = 4;   \/\/ SHCP(\u79fb\u4f4d\u5bc4\u5b58\u5668\u65f6\u949f)\n\n\/\/ \u5b9a\u4e49\u6570\u7801\u7ba1\u663e\u793a\u5668\u5f15\u811a\nconst int displayCLK = 18;  \/\/ \u6570\u7801\u7ba1\u65f6\u949f\u5f15\u811a\nconst int displayDIO = 5;   \/\/ \u6570\u7801\u7ba1\u6570\u636e\u5f15\u811a\n\n\/\/ \u5b9a\u4e49\u6309\u94ae\u5f15\u811a\nconst int speedUpPin = 16;    \/\/ \u52a0\u901f\u6309\u94ae\nconst int speedDownPin = 17;  \/\/ \u51cf\u901f\u6309\u94ae\n\nconst int NUM_REGISTERS = 6;   \/\/ 595\u82af\u7247\u6570\u91cf\nconst int NUM_LEDS = NUM_REGISTERS * 8;  \/\/ \u603bLED\u6570\nint DELAY_MS = 50;  \/\/ \u6d41\u6c34\u706f\u79fb\u52a8\u95f4\u9694(\u73b0\u5728\u53ef\u8c03)\nconst int MIN_DELAY = 0;   \/\/ \u6700\u5c0f\u5ef6\u8fdf\nconst int MAX_DELAY = 9999;   \/\/ \u6700\u5927\u5ef6\u8fdf\n\nconst int STEP_ON = 10; \/\/ \u8c03\u8282\u6b65\u957f\nconst int DEBOUNCEDELAY = 50; \/\/ \u6d88\u6296\u5ef6\u65f6\uff0c\u653e\u7f6e\u6309\u94ae\u5728\u6309\u538b\u540e\u4ea7\u751f\u7684\u673a\u68b0\u6296\u52a8\u800c\u88ab\u9519\u8bef\u8bc6\u522b\u591a\u6b21\u6309\u538b\n\n\/\/ \u521b\u5efa\u6570\u7801\u7ba1\u663e\u793a\u5bf9\u8c61\nTM1637Display display(displayCLK, displayDIO);\n\nvoid setup() {\n\n  \/\/ \u8bbe\u7f6e595\u63a7\u5236\u5f15\u811a\n  pinMode(dataPin, OUTPUT);\n  pinMode(clockPin, OUTPUT);\n  pinMode(latchPin, OUTPUT);\n\n  \/\/ \u8bbe\u7f6e\u6309\u94ae\u8f93\u5165\n  pinMode(speedUpPin, INPUT_PULLUP);\n  pinMode(speedDownPin, INPUT_PULLUP);\n\n  \/\/ \u521d\u59cb\u5316\u6570\u7801\u7ba1\n  display.setBrightness(0x0f);\n  display.showNumberDec(DELAY_MS);\n}\n\n\/\/ \u5904\u7406\u6309\u94ae\u8f93\u5165\nvoid handleButtons() {\n  static unsigned long lastDebounceTime = 0;\n  const unsigned long debounceDelay = DEBOUNCEDELAY;  \/\/ \u6d88\u6296\u5ef6\u65f6\n\n  if ((millis() - lastDebounceTime) &gt; debounceDelay) {\n    if (digitalRead(speedUpPin) == LOW) {  \/\/ \u52a0\u901f\n      DELAY_MS = max(MIN_DELAY, DELAY_MS - STEP_ON);\n      display.showNumberDec(DELAY_MS);\n      lastDebounceTime = millis();\n    }\n    if (digitalRead(speedDownPin) == LOW) {  \/\/ \u51cf\u901f\n      DELAY_MS = min(MAX_DELAY, DELAY_MS + STEP_ON);\n      display.showNumberDec(DELAY_MS);\n      lastDebounceTime = millis();\n    }\n  }\n}\n\n\/\/ \u5411595\u53d1\u9001\u4e00\u4e2a\u5b57\u8282\u6570\u636e\nvoid shiftOut(uint8_t data) {\n  Serial.print(&quot;\u53d1\u9001\u6570\u636e: &quot;);\n  \/\/ \u4ece\u6700\u9ad8\u4f4d(MSB)\u5f00\u59cb\u53d1\u9001\n  for(int i = 7; i &gt;= 0; i--) {\n    digitalWrite(clockPin, LOW);  \/\/ \u65f6\u949f\u4f4e\u7535\u5e73\n\n    \/\/ \u83b7\u53d6\u5f53\u524d\u4f4d\u7684\u503c\u5e76\u6253\u5370\n    uint8_t bitValue = (data &gt;&gt; i) &amp; 0x01;\n    Serial.print(bitValue);\n\n    digitalWrite(dataPin, bitValue);  \/\/ \u8bbe\u7f6e\u6570\u636e\u4f4d\n    digitalWrite(clockPin, HIGH);     \/\/ \u65f6\u949f\u4e0a\u5347\u6cbf\uff0c\u6570\u636e\u88ab\u79fb\u5165\n  }\n  Serial.println(); \/\/ \u6362\u884c\n}\n\n\/\/ \u5411\u591a\u7247\u7ea7\u8054\u7684595\u53d1\u9001\u6570\u636e\nvoid shiftMultiBytes(uint8_t* data, int numBytes) {\n  digitalWrite(latchPin, LOW);   \/\/ \u51c6\u5907\u6570\u636e\u4f20\u8f93\n\n  \/\/ \u4ece\u6700\u540e\u4e00\u7247595\u5f00\u59cb\u53d1\u9001\n  for(int i = numBytes-1; i &gt;= 0; i--) {\n    Serial.printf(&quot;595\u82af\u7247[%d]: &quot;, i);\n    shiftOut(data[i]);\n  }\n\n  digitalWrite(latchPin, HIGH);  \/\/ \u6570\u636e\u9501\u5b58\u8f93\u51fa\n}\n\nvoid loop() {\n  static unsigned long previousMillis = 0;  \/\/ \u4e0a\u6b21\u66f4\u65b0\u65f6\u95f4\n  static int currentLed = 0;               \/\/ \u5f53\u524dLED\u4f4d\u7f6e\n  static bool direction = true;            \/\/ true\u4e3a\u6b63\u5411\uff0cfalse\u4e3a\u53cd\u5411\n  uint8_t ledData[NUM_REGISTERS] = {0};    \/\/ LED\u72b6\u6001\u6570\u7ec4\n\n  \/\/ \u5904\u7406\u6309\u94ae\u8f93\u5165\n  handleButtons();\n\n  \/\/ \u68c0\u67e5\u662f\u5426\u5230\u8fbe\u66f4\u65b0\u65f6\u95f4\n  unsigned long currentMillis = millis();\n  if (currentMillis - previousMillis &gt;= DELAY_MS) {\n    previousMillis = currentMillis;\n\n    \/\/ \u6e05\u7a7a\u6240\u6709LED\n    memset(ledData, 0, NUM_REGISTERS);\n\n    \/\/ \u8bbe\u7f6e\u5f53\u524dLED\n    ledData[currentLed \/ 8] = (1 &lt;&lt; (currentLed % 8));\n    shiftMultiBytes(ledData, NUM_REGISTERS);\n\n    \/\/ \u66f4\u65b0LED\u4f4d\u7f6e\n    if (direction) {\n      currentLed++;\n      if (currentLed &gt;= NUM_LEDS) {\n        currentLed = NUM_LEDS - 1;\n        direction = false;\n      }\n    } else {\n      currentLed--;\n      if (currentLed &lt; 0) {\n        currentLed = 0;\n        direction = true;\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>\u6700\u7ec8\u6548\u679c\u5982\u4e0b<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/QQ\u5f55\u5c4f20241218154755.gif'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/QQ\u5f55\u5c4f20241218154755.gif\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n<h2>\u8054\u7f51\u5929\u6c14\u9884\u62a5<\/h2>\n<p>\u53d1\u5c55\u5230\u8fd9\u91cc\uff0c\u5176\u5b9e\u5df2\u7ecf\u548cled\u706f\u73e0\u6ca1\u5173\u7cfb\u4e86\uff0c\u4f46\u662f\u8f9b\u8f9b\u82e6\u82e6\u642d\u7684\uff0c\u603b\u4e0d\u80fd\u5220\u6389\uff0c\u7559\u7740\u968f\u4fbf\u663e\u793a\u4e86\u4e2a\u6e29\u5ea6\u7684\u767e\u5206\u6bd4\u3002\u6574\u4f53\u6765\u8bf4\u4f9d\u65e7\u975e\u5e38\u7b80\u5355\u3002<\/p>\n<h3>\u83b7\u53d6\u4f20\u611f\u5668\u7684\u503c<\/h3>\n<p>\u8fd9\u91cc\u4f7f\u7528\u4eff\u771f\u5e73\u53f0\u4e2d\u7684\u865a\u62df\u4f20\u611f\u5668DHT22\u83b7\u53d6\u6e29\u5ea6\u548c\u6e7f\u5ea6\uff0c\u4f7f\u7528\u7684\u662fIIC\u534f\u8bae\u3002<\/p>\n<p>\u8fd9\u91cc\u4e3a\u4e86\u7b80\u5355\u8d77\u89c1\uff0c\u4f7f\u7528DHTesp\u5e93\u83b7\u53d6\u6e29\u5ea6\u548c\u6e7f\u5ea6<\/p>\n<pre><code class=\"language-ino\">DHTesp dhtSensor;\ndhtSensor.setup(DHT_PIN, DHTesp::DHT22);\n\nTempAndHumidity data = dhtSensor.getTempAndHumidity();<\/code><\/pre>\n<h3>\u58a8\u6c34\u5c4f\u663e\u793a\u6280\u672f\u8be6\u89e3<\/h3>\n<p>\u8fd9\u91cc\u4f7f\u7528\u7684\u662f\u57fa\u4e8eSPI\u901a\u4fe1\u76842.9\u5bf8\u58a8\u6c34\u5c4f\uff0c\u5206\u8fa8\u7387296\u00d7128\u3002\u4f7f\u7528\u4e86\u4ee5\u4e0b\u5173\u952e\u5e93\uff1a<\/p>\n<ol>\n<li>GxEPD\uff1a\u58a8\u6c34\u5c4f\u9a71\u52a8\u57fa\u7840\u5e93<\/li>\n<li>U8g2_for_Adafruit_GFX\uff1a\u7528\u4e8e\u663e\u793a\u4e2d\u6587\u5b57\u4f53<\/li>\n<li>Adafruit_GFX\uff1a\u56fe\u5f62\u5e93\u57fa\u7840\u7c7b<\/li>\n<\/ol>\n<p>\u663e\u793a\u7cfb\u7edf\u521d\u59cb\u5316\u8fc7\u7a0b\uff1a<\/p>\n<pre><code class=\"language-cpp\">\/\/ 1. SPI\u914d\u7f6e\nSPI.begin(CLK_PIN, -1, DIN_PIN);  \/\/ SCLK, MISO(\u672a\u7528), MOSI\n\n\/\/ 2. \u663e\u793a\u9a71\u52a8\u521d\u59cb\u5316\nGxIO_Class io(SPI, CS_PIN, DC_PIN, RST_PIN); \nGxEPD_Class display(io, RST_PIN, BUSY_PIN);\ndisplay.init(115200);  \/\/ \u6ce2\u7279\u7387\u5f71\u54cd\u5237\u65b0\u901f\u5ea6\n\n\/\/ 3. \u4e2d\u6587\u5b57\u4f53\u7cfb\u7edf\u521d\u59cb\u5316\nU8G2_FOR_ADAFRUIT_GFX u8g2Fonts;\nu8g2Fonts.begin(display);\nu8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312a);  \/\/ \u6587\u6cc9\u9a7f16\u50cf\u7d20\u4e2d\u6587\u5b57\u4f53<\/code><\/pre>\n<p>\u663e\u793a\u5750\u6807\u7cfb\u7edf\u8bf4\u660e\uff1a<\/p>\n<pre><code>(0,0) \u2192\u2192\u2192\u2192\u2192 X\u8f74 (296)\n  \u2193\n  \u2193  ------------------\n  \u2193  |     \u5c4f\u5e55      |\n  \u2193  ------------------\n  Y\u8f74\n(128)<\/code><\/pre>\n<p>\u663e\u793a\u51fd\u6570\u8be6\u89e3\uff1a<\/p>\n<pre><code class=\"language-cpp\">\/\/ \u5c4f\u5e55\u65b9\u5411\u8bbe\u7f6e (0-3)\ndisplay.setRotation(1);  \/\/ 1=\u6a2a\u5411\uff0c\u663e\u793a\u65b9\u5411\u987a\u65f6\u9488\u65cb\u8f6c90\u00b0\n\n\/\/ \u6e05\u5c4f\u64cd\u4f5c\ndisplay.fillScreen(GxEPD_WHITE);  \/\/ \u6574\u5c4f\u586b\u5145\u767d\u8272\ndisplay.fillRect(x, y, w, h, color);  \/\/ \u5c40\u90e8\u586b\u5145\n\n\/\/ \u6587\u672c\u663e\u793a\nu8g2Fonts.setCursor(x, y);  \/\/ \u8bbe\u7f6e\u8d77\u59cb\u5750\u6807\nu8g2Fonts.setForegroundColor(GxEPD_BLACK);  \/\/ \u6587\u5b57\u989c\u8272\nu8g2Fonts.setBackgroundColor(GxEPD_WHITE);  \/\/ \u80cc\u666f\u8272\nu8g2Fonts.printf(&quot;\u663e\u793a\u5185\u5bb9&quot;);  \/\/ \u652f\u6301\u683c\u5f0f\u5316\u5b57\u7b26\u4e32\n\n\/\/ \u56fe\u5f62\u663e\u793a\ndisplay.drawBitmap(x, y, bitmap_data, w, h, color);  \/\/ \u4f4d\u56fe\u663e\u793a<\/code><\/pre>\n<h3>\u7f51\u7edc\u901a\u4fe1\u8be6\u89e3<\/h3>\n<p>\u8fd9\u91cc\u4f7f\u7528\u63a5\u53e3https:\/\/goweather.herokuapp.com\/weather\/Shanghai \u83b7\u53d6\u7b80\u6613\u7684\u5929\u6c14\u9884\u62a5\u6570\u636e\u3002<\/p>\n<p>ESP32 WiFi\u8fde\u63a5\u8fc7\u7a0b\uff1a<\/p>\n<pre><code class=\"language-cpp\">WiFi.begin(ssid, password);\n\/\/ \u7b49\u5f85\u8fde\u63a5\u5b8c\u6210\nwhile (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(&quot;.&quot;);\n}<\/code><\/pre>\n<p>HTTP\u8bf7\u6c42\u5b9e\u73b0\uff1a<\/p>\n<pre><code class=\"language-cpp\">bool getWeatherData() {\n    HTTPClient http;\n    http.begin(weatherUrl);  \/\/ \u8bbe\u7f6e\u76ee\u6807URL\n\n    int httpCode = http.GET();  \/\/ \u53d1\u9001GET\u8bf7\u6c42\n    if (httpCode == HTTP_CODE_OK) {\n        String payload = http.getString();  \/\/ \u83b7\u53d6\u54cd\u5e94\u5185\u5bb9\n\n        \/\/ ArduinoJson\u89e3\u6790\n        StaticJsonDocument&lt;1024&gt; doc;  \/\/ \u5206\u914dJSON\u89e3\u6790\u7f13\u51b2\u533a\n        DeserializationError error = deserializeJson(doc, payload);\n\n        if (!error) {\n            \/\/ \u89e3\u6790\u6570\u636e...\n            return true;\n        }\n    }\n    http.end();  \/\/ \u91ca\u653e\u8d44\u6e90\n    return false;\n}<\/code><\/pre>\n<h3>\u6700\u7ec8\u6548\u679c<\/h3>\n<p>\u8fd9\u91cc\u662f\u5b8c\u6574\u7684\u4ee3\u7801\u5b9e\u73b0<\/p>\n<pre><code class=\"language-ino\">#include &quot;DHTesp.h&quot;\n\n#include &lt;GxEPD.h&gt;\n#include &lt;GxGDEM029T94\/GxGDEM029T94.h&gt;   \n#include &lt;GxIO\/GxIO_SPI\/GxIO_SPI.h&gt;\n#include &lt;GxIO\/GxIO.h&gt;  \n#include &lt;SPI.h&gt;\n#include &lt;Fonts\/FreeMonoBold9pt7b.h&gt;\n#include &lt;Fonts\/FreeMonoBold12pt7b.h&gt;\n#include &lt;U8g2_for_Adafruit_GFX.h&gt;\n#include &lt;WiFi.h&gt;\n#include &lt;HTTPClient.h&gt;\n#include &lt;ArduinoJson.h&gt;\n\n\/\/ \u786c\u4ef6\u5f15\u811a\u5b9a\u4e49\n\/\/ 74HC595\u7ea7\u8054\u63a7\u5236\u5f15\u811a\nconst int dataPin = 2;    \/\/ \u4e32\u884c\u6570\u636e\u8f93\u5165\nconst int latchPin = 0;   \/\/ \u5b58\u50a8\u5bc4\u5b58\u5668\u65f6\u949f\uff0c\u7528\u4e8e\u6570\u636e\u9501\u5b58\nconst int clockPin = 4;   \/\/ \u79fb\u4f4d\u5bc4\u5b58\u5668\u65f6\u949f\uff0c\u63a7\u5236\u6570\u636e\u79fb\u4f4d\n\n\/\/ E-Paper\u663e\u793a\u5c4fSPI\u63a5\u53e3\u5f15\u811a\nconst int DIN_PIN = 23;   \/\/ MOSI\u5f15\u811a\nconst int CLK_PIN = 22;   \/\/ SCK\u5f15\u811a\nconst int CS_PIN = 5;     \/\/ \u7247\u9009\u4fe1\u53f7\nconst int DC_PIN = 19;    \/\/ \u6570\u636e\/\u547d\u4ee4\u63a7\u5236\nconst int RST_PIN = 18;   \/\/ \u590d\u4f4d\u4fe1\u53f7\nconst int BUSY_PIN = 21;  \/\/ \u5fd9\u72b6\u6001\u6307\u793a\n\n\/\/ DHT22\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u5f15\u811a\nconst int DHT_PIN = 25;   \/\/ \u5355\u603b\u7ebf\u6570\u636e\u5f15\u811a\n\n\/\/ LED\u63a7\u5236\u76f8\u5173\u5e38\u91cf\nconst int NUM_REGISTERS = 6;   \/\/ 74HC595\u82af\u7247\u6570\u91cf\nconst int NUM_LEDS = NUM_REGISTERS * 8;  \/\/ LED\u603b\u6570\uff08\u6bcf\u4e2a595\u63a7\u52368\u4e2aLED\uff09\n\n\/\/ \u5b9a\u65f6\u5668\u95f4\u9694\u8bbe\u7f6e\nconst unsigned long DISPLAY_REFRESH_INTERVAL = 5000;  \/\/ \u663e\u793a\u5237\u65b0\u95f4\u9694(ms)\nconst unsigned long WEATHER_UPDATE_INTERVAL = 1800000; \/\/ \u5929\u6c14\u66f4\u65b0\u95f4\u9694(30\u5206\u949f)\n\n\/\/ WiFi\u914d\u7f6e\nconst char* ssid = &quot;Wokwi-GUEST&quot;;\nconst char* password = &quot;&quot;;\nconst char* weatherUrl = &quot;https:\/\/goweather.herokuapp.com\/weather\/Shanghai&quot;;\n\n\/\/ \u5929\u6c14\u6570\u636e\u7ed3\u6784\u5b9a\u4e49\nstruct WeatherData {\n  String temperature;     \/\/ \u5f53\u524d\u6e29\u5ea6\n  String wind;           \/\/ \u98ce\u901f\n  String description;    \/\/ \u5929\u6c14\u63cf\u8ff0\n  String forecast[3][2]; \/\/ \u672a\u67653\u5929\u9884\u62a5[\u5929\u6570][\u6e29\u5ea6,\u98ce\u901f]\n};\n\nWeatherData currentWeather;\n\n\/\/ \u5929\u6c14\u56fe\u6807\u5b9a\u4e49 (32x32\u4f4d\u56fe)\nconst unsigned char icon_sunny[] PROGMEM = {\n    0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00,\n    0x06, 0x03, 0xc0, 0x60, 0x0f, 0x07, 0xe0, 0xf0, 0x0f, 0x9f, 0xf9, 0xf0, 0x07, 0xfc, 0x3f, 0xe0,\n    0x03, 0xe0, 0x07, 0xc0, 0x01, 0xc7, 0xe3, 0x80, 0x01, 0x8f, 0xf1, 0x80, 0x03, 0x1f, 0xfc, 0xc0,\n    0x03, 0x3f, 0xfc, 0xc0, 0x07, 0x7f, 0xfe, 0xe0, 0x7e, 0x7f, 0xfe, 0x7e, 0xfe, 0x7f, 0xfe, 0x7f,\n    0xfe, 0x7f, 0xfe, 0x7f, 0x7e, 0x7f, 0xfe, 0x7e, 0x07, 0x7f, 0xfe, 0xe0, 0x03, 0x3f, 0xfc, 0xc0,\n    0x03, 0x1f, 0xfc, 0xc0, 0x01, 0x8f, 0xf1, 0x80, 0x01, 0xc7, 0xe3, 0x80, 0x03, 0xe0, 0x07, 0xc0,\n    0x07, 0xf8, 0x1f, 0xe0, 0x0f, 0x9f, 0xf9, 0xf0, 0x0f, 0x07, 0xe0, 0xf0, 0x06, 0x03, 0xc0, 0x60,\n    0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x01, 0x80, 0x00\n};\n\nconst unsigned char icon_cloudy[] PROGMEM = {\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xfc, 0x00, 0x00, 0x07, 0xfe, 0x00,\n    0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x7e, 0x3f, 0x00, 0x01, 0xff, 0x9f, 0x80,\n    0x03, 0xff, 0x8f, 0xf8, 0x03, 0xff, 0xcf, 0xfe, 0x07, 0xff, 0xe7, 0xfe, 0x0f, 0xff, 0xe0, 0x7f,\n    0x3f, 0xff, 0xe0, 0x1f, 0x7f, 0xff, 0xff, 0x9f, 0x7f, 0xff, 0xff, 0xce, 0xff, 0xff, 0xff, 0xce,\n    0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xe0,\n    0x7f, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0x80, 0x0f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\nDHTesp dhtSensor;\n\nGxIO_Class io(SPI, \/*CS=D8*\/ CS_PIN, \/*DC=D3*\/ DC_PIN, \/*RST=D4*\/ RST_PIN); \/\/ arbitrary selection of D3(=0), D4(=2), selected for default of GxEPD_Class\nGxEPD_Class display(io, \/*RST=D4*\/ RST_PIN, \/*BUSY=D2*\/ BUSY_PIN); \/\/ default selection of D4(=2), D2(=4)\n\nU8G2_FOR_ADAFRUIT_GFX u8g2Fonts;\n\n\/\/ \u786c\u4ef6\u521d\u59cb\u5316\u548c\u914d\u7f6e\nvoid setup() {\n  Serial.begin(115200);\n  \/\/ \u8bbe\u7f6e595\u63a7\u5236\u5f15\u811a\n  pinMode(dataPin, OUTPUT);\n  pinMode(clockPin, OUTPUT);\n  pinMode(latchPin, OUTPUT);\n\n  \/\/ \u8bbe\u7f6eDHT22\n  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);\n\n  SPI.begin(CLK_PIN, -1, DIN_PIN);\n\n  display.init(115200); \/\/ enable diagnostic output on Serial\n\n  u8g2Fonts.begin(display);                        \/\/ \u5c06u8g2\u8fc7\u7a0b\u8fde\u63a5\u5230Adafruit GFX\n  \/\/u8g2Fonts.setFontMode(1);                        \/\/ \u4f7f\u7528u8g2\u900f\u660e\u6a21\u5f0f\uff08\u8fd9\u662f\u9ed8\u8ba4\u8bbe\u7f6e\uff09\n  u8g2Fonts.setFontDirection(0);      \n  u8g2Fonts.setForegroundColor(GxEPD_BLACK);             \/\/ \u8bbe\u7f6e\u524d\u666f\u8272\n  u8g2Fonts.setBackgroundColor(GxEPD_WHITE);             \/\/ \u8bbe\u7f6e\u80cc\u666f\u8272\n  \/\/u8g2Fonts.setFont(chinese_gb2312);\n\n  display.setTextColor(GxEPD_BLACK);\n  u8g2Fonts.setFont(u8g2_font_wqy16_t_gb2312a); \/\/ select u8g2 font from here: https:\/\/github.com\/olikraus\/u8g2\/wiki\/fntlistall\n\n  \/\/ \u521d\u59cb\u5316WiFi\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(&quot;.&quot;);\n  }\n  Serial.println(&quot;\\nWiFi connected&quot;);\n\n  \/\/ \u83b7\u53d6\u521d\u59cb\u5929\u6c14\u6570\u636e\n  getWeatherData();\n}\n\n\/\/ 74HC595\u6570\u636e\u53d1\u9001\u51fd\u6570\nvoid shiftOut(uint8_t data) {\n  \/\/ \u6309\u4f4d\u53d1\u90018\u4f4d\u6570\u636e\uff08MSB\u4f18\u5148\uff09\n  for(int i = 7; i &gt;= 0; i--) {\n    digitalWrite(clockPin, LOW);\n    digitalWrite(dataPin, (data &gt;&gt; i) &amp; 0x01);\n    digitalWrite(clockPin, HIGH);  \/\/ \u4e0a\u5347\u6cbf\u9501\u5b58\u6570\u636e\n  }\n}\n\n\/\/ \u5411\u591a\u4e2a595\u53d1\u9001\u6570\u636e\nvoid shiftMultiBytes(uint8_t* data, int numBytes) {\n  digitalWrite(latchPin, LOW);  \/\/ \u51c6\u5907\u6570\u636e\u4f20\u8f93\n\n  \/\/ \u4ece\u6700\u540e\u4e00\u7247595\u5f00\u59cb\u53d1\u9001\uff08\u7ea7\u8054\u6570\u636e\u6d41\u5411\uff09\n  for(int i = numBytes-1; i &gt;= 0; i--) {\n    shiftOut(data[i]);\n  }\n\n  digitalWrite(latchPin, HIGH);  \/\/ \u8f93\u51fa\u9501\u5b58\n}\n\n\/\/ LED\u663e\u793a\u63a7\u5236\u51fd\u6570\nvoid lightupLed(float num) {\n  \/\/ num: 0-1\u4e4b\u95f4\u7684\u6bd4\u4f8b\u503c\uff0c\u63a7\u5236\u70b9\u4eae\u7684LED\u6570\u91cf\n  if (num &gt; 1) num = 1;\n  if (num &lt; 0) num = 0;\n\n  int ledNum = (int)(NUM_LEDS * num);\n  uint8_t ledData[NUM_REGISTERS] = {0};\n\n  \/\/ \u8ba1\u7b97\u5b8c\u5168\u70b9\u4eae\u7684595\u6570\u91cf\n  int fullICs = ledNum \/ 8;\n  int remainingLEDs = ledNum % 8;\n\n  \/\/ \u8bbe\u7f6e\u5b8c\u5168\u70b9\u4eae\u7684\u82af\u7247\n  for(int i = 0; i &lt; fullICs; i++) {\n    ledData[i] = 0xFF;\n  }\n\n  \/\/ \u5904\u7406\u90e8\u5206\u70b9\u4eae\u7684\u6700\u540e\u4e00\u4e2a\u82af\u7247\n  if (remainingLEDs &gt; 0 &amp;&amp; fullICs &lt; NUM_REGISTERS) {\n    ledData[fullICs] = (1 &lt;&lt; remainingLEDs) - 1;\n  }\n\n  shiftMultiBytes(ledData, NUM_REGISTERS);\n}\n\n\/\/ \u6e29\u5ea6\u6620\u5c04\u51fd\u6570\uff1a\u5c06\u6e29\u5ea6(-40\u523080\u00b0C)\u6620\u5c04\u52300-1\u8303\u56f4\nfloat mapTemperature(float temp) {\n  const float MIN_TEMP = -40.0;\n  const float MAX_TEMP = 80.0;\n  float percentage = (temp - MIN_TEMP) \/ (MAX_TEMP - MIN_TEMP);\n  return constrain(percentage, 0, 1);\n}\n\n\/\/ HTTP\u83b7\u53d6\u5929\u6c14\u6570\u636e\nbool getWeatherData() {\n  if (WiFi.status() == WL_CONNECTED) {\n    HTTPClient http;\n    http.begin(weatherUrl);\n\n    int httpCode = http.GET();\n    if (httpCode == HTTP_CODE_OK) {\n      String payload = http.getString();\n\n      \/\/ \u4f7f\u7528ArduinoJson\u89e3\u6790\u6570\u636e\n      StaticJsonDocument&lt;1024&gt; doc;\n      DeserializationError error = deserializeJson(doc, payload);\n\n      if (!error) {\n        currentWeather.temperature = doc[&quot;temperature&quot;].as&lt;String&gt;();\n        currentWeather.wind = doc[&quot;wind&quot;].as&lt;String&gt;();\n        currentWeather.description = doc[&quot;description&quot;].as&lt;String&gt;();\n\n        \/\/ \u83b7\u53d6\u9884\u62a5\u6570\u636e\n        for(int i = 0; i &lt; 3; i++) {\n          currentWeather.forecast[i][0] = doc[&quot;forecast&quot;][i][&quot;temperature&quot;].as&lt;String&gt;();\n          currentWeather.forecast[i][1] = doc[&quot;forecast&quot;][i][&quot;wind&quot;].as&lt;String&gt;();\n        }\n\n        return true;\n      }\n    }\n    http.end();\n  }\n  return false;\n}\n\n\/\/ \u7ed8\u5236\u5929\u6c14\u56fe\u6807\nvoid drawWeatherIcon(const String&amp; description, int x, int y) {\n  const unsigned char* icon = icon_sunny;  \/\/ \u9ed8\u8ba4\u6674\u5929\u56fe\u6807\n\n  \/\/ \u6839\u636e\u63cf\u8ff0\u9009\u62e9\u56fe\u6807\n  if (description.indexOf(&quot;Clear&quot;) &gt;= 0) {\n    icon = icon_sunny;\n  } else if (description.indexOf(&quot;Cloud&quot;) &gt;= 0) {\n    icon = icon_cloudy;\n  }\n\n  display.drawBitmap(x, y, icon, 32, 32, GxEPD_BLACK);\n}\n\n\/\/ \u4e3b\u5faa\u73af\nvoid loop() {\n  unsigned long currentMillis = millis();\n  static unsigned long lastWeatherUpdate = 0;\n  static unsigned long lastDisplayRefresh = 0;\n\n  \/\/ 1. \u83b7\u53d6\u5e76\u663e\u793a\u6e29\u6e7f\u5ea6\u6570\u636e\n  TempAndHumidity data = dhtSensor.getTempAndHumidity();\n  float tempPercentage = mapTemperature(data.temperature);\n  lightupLed(tempPercentage);  \/\/ LED\u663e\u793a\u6e29\u5ea6\u6bd4\u4f8b\n\n  \/\/ 2. \u5b9a\u671f\u66f4\u65b0\u5929\u6c14\u6570\u636e\n  if (currentMillis - lastWeatherUpdate &gt;= WEATHER_UPDATE_INTERVAL) {\n    if (getWeatherData()) {\n      lastWeatherUpdate = currentMillis;\n    }\n  }\n\n  \/\/ 3. \u5b9a\u671f\u66f4\u65b0\u663e\u793a\u5c4f\n  if (currentMillis - lastDisplayRefresh &gt;= DISPLAY_REFRESH_INTERVAL) {\n    lastDisplayRefresh = currentMillis;\n\n    \/\/ \u663e\u793a\u5e03\u5c40\u66f4\u65b0\n    display.setRotation(1);\n    display.fillScreen(GxEPD_WHITE);\n\n    \/\/ 3.1 \u663e\u793a\u5ba4\u5185\u73af\u5883\u6570\u636e\n    u8g2Fonts.setCursor(0, 20);\n    u8g2Fonts.printf(&quot;\u5ba4\u5185: %.1f\u00b0C %.1f%%&quot;, \n                     data.temperature,\n                     data.humidity);\n\n    \/\/ 3.2 \u663e\u793a\u5ba4\u5916\u5929\u6c14\u6570\u636e\n    u8g2Fonts.setCursor(0, 45);\n    u8g2Fonts.printf(&quot;\u5ba4\u5916: %s %s&quot;, \n                     currentWeather.temperature.c_str(),\n                     currentWeather.wind.c_str());\n\n    \/\/ 3.3 \u663e\u793a\u5929\u6c14\u56fe\u6807\n    drawWeatherIcon(currentWeather.description, 200, 15);\n\n    \/\/ 3.4 \u663e\u793a\u5929\u6c14\u9884\u62a5\n    u8g2Fonts.setCursor(0, 75);\n    for(int i = 0; i &lt; 3; i++) {\n      u8g2Fonts.printf(&quot;%d\u5929\u540e: %s %s\\n&quot;, \n                       i+1,\n                       currentWeather.forecast[i][0].c_str(),\n                       currentWeather.forecast[i][1].c_str());\n    }\n\n    display.update();  \/\/ \u66f4\u65b0\u663e\u793a\u5185\u5bb9\n  }\n\n  delay(50);  \/\/ \u9002\u5f53\u5ef6\u65f6\uff0c\u907f\u514dCPU\u5360\u7528\u8fc7\u9ad8\n}<\/code><\/pre>\n<p>\u6700\u7ec8\u6548\u679c\u5982\u4e0b\uff0c\u901a\u8fc7wifi\u8054\u7f51\u83b7\u53d6\u7b80\u6613\u5929\u6c14\u9884\u62a5\u6570\u636e\uff0c\u5e76\u7ed3\u5408\u6e29\u5ea6\u6e7f\u5ea6\u4f20\u611f\u5668\u7684\u6570\u503c\uff0c\u663e\u793a\u57282.9\u82f1\u5bf8\u58a8\u6c34\u5c4f\u4e0a\uff0c\u5e76\u663e\u793a\u4e00\u4e2a\u56fe\u6807\u4f53\u73b0\u73b0\u5728\u7684\u5929\u6c14\u72b6\u6001\u3002\u6e29\u5ea6\u7684\u6bd4\u4f8b\u4f53\u73b0\u5728led\u706f\u73e0\u4e0a\u3002<\/p>\n<p><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734532009604.png'><img class=\"lazyload lazyload-style-3\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" data-original=\"https:\/\/www.wangonc.com\/wp-content\/uploads\/2024\/12\/image-1734532009604.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"file\" \/><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u8a00 \u5927\u6982\u5c5e\u4e8e\u5fc3\u8840\u6765\u6f6e\uff0c\u76f8\u6bd4\u8d77\u64b8\u4ee3\u7801\u5199\u5de5\u5177\uff0c\u624b\u6413\u5b9e\u4f53\u7684\u5de5\u5177\u771f\u7684\u5f88\u9177\u3002\u6240\u4ee5\u7a81\u53d1\u5947\u60f3\u5f00\u59cb\u5b66\u5355\u7247\u673a\u5f00\u53d1\u3002\u5b9e\u9645\u4e0a\u4e5f\u662f\u770b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[106],"tags":[103,105,104],"series":[],"class_list":["post-7812","post","type-post","status-publish","format-standard","hentry","category-embedded","tag-esp32","tag-105","tag-104"],"_links":{"self":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7812","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/comments?post=7812"}],"version-history":[{"count":15,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7812\/revisions"}],"predecessor-version":[{"id":7876,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/posts\/7812\/revisions\/7876"}],"wp:attachment":[{"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/media?parent=7812"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/categories?post=7812"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/tags?post=7812"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.wangonc.com\/index.php\/wp-json\/wp\/v2\/series?post=7812"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}