<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>KUR Anon ส่งงานสมองกลฝังตัว by Anon Tg</title>
      <link>https://padlet.com/anont989/779fm6iczk6j5z9i</link>
      <description></description>
      <language>en-us</language>
      <pubDate>2025-08-08 05:34:38 UTC</pubDate>
      <lastBuildDate>2025-08-26 06:12:49 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url></url>
      </image>
      <item>
         <title>ครูนนท์</title>
         <author>anont989</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538359465</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพน่ารักๆสไตล์การ์ตูน3D Chibi Style ให้สร้างรูปภาพขนาด 16:9"</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3791929337/2d148394f74d86c3048b281dfe838b23/Copilot_20250808_114904.png" />
         <pubDate>2025-08-08 05:39:28 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538359465</guid>
      </item>
      <item>
         <title>ธรรมนูญ วิชชาธาร</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538360957</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพ 3D ช่วยสร้างรูปภาพ 3Dสไตล์ Cute 16:9</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202798095/4b73f400ff52c1c16b98b0ca468a4064/BCO_2e987056_c00a_4b31_8606_96cf151b0690__1_.png" />
         <pubDate>2025-08-08 05:42:41 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538360957</guid>
      </item>
      <item>
         <title></title>
         <author>chunphon2549</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538361487</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านเทคโนโลยีการสร้างภาพช่วยสร้างรูปภาพ3d</p><p>Studio Ghibli ขนาด16:9</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202799904/c8a53b88f494c541e81a932164f0dae3/Copilot_20250808_114749.png" />
         <pubDate>2025-08-08 05:43:25 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538361487</guid>
      </item>
      <item>
         <title>ธนพัฒน์ แก้วประเสริฐ</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538361588</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็น ผู้เชี่ยวชาญด้านการสร้างภาพ เป็นรุปภาพ pastel style 3D ให้สร้างขนาด 16:9</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202803375/e8c8aee3d2a5c3abae6856d86b39f522/Copilot_20250808_124228.png" />
         <pubDate>2025-08-08 05:43:45 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538361588</guid>
      </item>
      <item>
         <title>นาย นวิมนทร์ ผ่องใส</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364003</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างภาพ 3D ช่วยสร้างภาพ style chibi น่ารักๆ</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202811816/293f3d3ed451651cc6a6e8edf665bd08/Copilot_20250808_124648.png" />
         <pubDate>2025-08-08 05:48:10 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364003</guid>
      </item>
      <item>
         <title>อินทัช สุวรรณวงศ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364230</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202798939/43432f7c8529bbb0d0e70913d3df09f8/Copilot_20250808_124522.png" />
         <pubDate>2025-08-08 05:48:53 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364230</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364707</link>
         <description><![CDATA[<p>นัทพร สุภี</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202814538/37b8bdb8dab95fa37e2761092dc7e290/Copilot_20250808_124921.png" />
         <pubDate>2025-08-08 05:49:45 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364707</guid>
      </item>
      <item>
         <title>นาย กฤติกร คงจรูญ</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364725</link>
         <description><![CDATA[<p>ในฐานนะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพ3D เปลี่ยนเป็นภาพ สไตล์ Vector Cute Styleให้สร้างรุปขนาด 16:9</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202799099/9cb4adf906c6430f3d21c8dc2d296e1c/Copilot_20250808_124908.png" />
         <pubDate>2025-08-08 05:49:48 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538364725</guid>
      </item>
      <item>
         <title>ในธานะคุณเป็นผู้เชียวชาญในการสร้างรูปภาพ สไต pixza ขนาด16×9</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538365620</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202816730/06884b072baf0233fba65eba667997c2/Copilot_20250808_124903.png" />
         <pubDate>2025-08-08 05:51:04 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538365620</guid>
      </item>
      <item>
         <title>นิธิศ นุชทองม่วง</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538382291</link>
         <description><![CDATA[<p>ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการ สร้างรูปภาพ 3D ช่วยสร้างรูปภาพ 3Dสไตล์ Cute 16:9</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202885722/c6556b5fd571e492a9892c43afd20efd/1000013506.png" />
         <pubDate>2025-08-08 06:24:42 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538382291</guid>
      </item>
      <item>
         <title>นางสาวธัญชนก เทียมประสิทธิ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538395305</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202939916/13b04f6a4590d7ea23dd1f934173af17/Copilot_20250808_134647.png" />
         <pubDate>2025-08-08 06:48:14 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538395305</guid>
      </item>
      <item>
         <title>ครูนนท์</title>
         <author>anont989</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538400927</link>
         <description><![CDATA[<p>ใบงาน Wio Terminal </p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3791929337/bf5457aed7360d90cf5f187922d0f49a/______Wio_Terminal.pdf" />
         <pubDate>2025-08-08 06:55:28 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538400927</guid>
      </item>
      <item>
         <title>ครูนนท์</title>
         <author>anont989</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538403874</link>
         <description><![CDATA[<p>ข้อสอบแข่งทักษะไมโครคอนโทรลเลอร์ ระดับภาค ปี 2567 (2)</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3791929337/40eedd98d368ce4fd5110ce17752e7cb/543461566528881139______________________________________________2567__2_.pdf" />
         <pubDate>2025-08-08 06:59:12 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538403874</guid>
      </item>
      <item>
         <title>ครูนนท์</title>
         <author>anont989</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538404915</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3791929337/4249cccbc49f4af1835cc1d49d56c7f3/image.png" />
         <pubDate>2025-08-08 07:01:49 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538404915</guid>
      </item>
      <item>
         <title>นาย ธนพัฒน์ แก้วประเสริฐ</title>
         <author>maxxy110350</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538407697</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;  // ไลบรารีควบคุมจอ LCD</p><p>TFT_eSPI tft;</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า</p><p>  // --- ใบหน้า ---</p><p>  tft.drawCircle(160, 120, 101, TFT_BLACK);    // ขอบนอก</p><p>  tft.fillCircle(160, 120, 100, TFT_BLUE);   // หน้าเหลือง</p><p>  // --- ปาก ---</p><p>  tft.drawCircle(160, 135, 82, TFT_BLACK);</p><p>  tft.fillCircle(160, 135, 80, TFT_WHITE);</p><p>  // --- ตา ---</p><p>  // ตาขาว</p><p>  tft.drawCircle(120, 100, 36, TFT_BLACK);</p><p>  tft.fillCircle(120, 100, 34, TFT_WHITE);</p><p>  tft.drawCircle(200, 100, 36, TFT_BLACK);</p><p>  tft.fillCircle(200, 100, 34, TFT_WHITE);</p><p>  // ลูกตาดำ</p><p>  tft.fillCircle(120, 100, 15, TFT_BLACK);</p><p>  tft.fillCircle(200, 100, 15, TFT_BLACK);</p><p>  // --- จมูก ---</p><p>  tft.fillCircle(160, 129, 12, TFT_RED);</p><p>  // --- ลิ้น ---</p><p>  tft.fillTriangle(135, 175, 185, 175, 160, 195, TFT_PINK);</p><p>  tft.drawTriangle(135, 175, 185, 175, 160, 195, TFT_BLACK);</p><p>  // --- หนวด ---</p><p>  // ขวา</p><p>  tft.drawLine(200, 165, 250, 150, TFT_BLACK);</p><p>  tft.drawLine(200, 170, 250, 170, TFT_BLACK);</p><p>  tft.drawLine(200, 175, 250, 190, TFT_BLACK);</p><p>  // ซ้าย</p><p>  tft.drawLine(70, 150, 120, 160, TFT_BLACK);</p><p>  tft.drawLine(70, 170, 120, 170, TFT_BLACK);</p><p>  tft.drawLine(70, 190, 120, 180, TFT_BLACK);</p><p>  // --- กระดิ่ง ---</p><p>  tft.fillCircle(160, 220, 15, TFT_YELLOW);</p><p>  tft.drawCircle(160, 220, 15, TFT_BLACK);</p><p>  tft.drawLine(160, 220, 160, 235, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  </p><p>}</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202969406/08ee5f3cddb11945496082c816650203/23187.jpg" />
         <pubDate>2025-08-08 07:07:55 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538407697</guid>
      </item>
      <item>
         <title>นาย กฤติกร คงจรูญ</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538408707</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;  // ไลบรารีควบคุมจอ LCD</p><p>TFT_eSPI tft;</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า</p><p>  // --- ใบหน้า ---</p><p>  tft.drawCircle(160, 120, 101, TFT_BLACK);    // ขอบนอก</p><p>  tft.fillCircle(160, 120, 100, TFT_BLUE);   // หน้าเหลือง</p><p>  // --- ปาก ---</p><p>  tft.drawCircle(160, 135, 82, TFT_BLACK);</p><p>  tft.fillCircle(160, 135, 80, TFT_WHITE);</p><p>  // --- ตา ---</p><p>  // ตาขาว</p><p>  tft.drawCircle(120, 100, 36, TFT_BLACK);</p><p>  tft.fillCircle(120, 100, 34, TFT_WHITE);</p><p>  tft.drawCircle(200, 100, 36, TFT_BLACK);</p><p>  tft.fillCircle(200, 100, 34, TFT_WHITE);</p><p>  // ลูกตาดำ</p><p>  tft.fillCircle(120, 100, 15, TFT_BLACK);</p><p>  tft.fillCircle(200, 100, 15, TFT_BLACK);</p><p>  // --- จมูก ---</p><p>  tft.fillCircle(160, 129, 12, TFT_RED);</p><p>  // --- ลิ้น ---</p><p>  tft.fillTriangle(135, 175, 185, 175, 160, 195, TFT_PINK);</p><p>  tft.drawTriangle(135, 175, 185, 175, 160, 195, TFT_BLACK);</p><p>  // --- หนวด ---</p><p>  // ขวา</p><p>  tft.drawLine(200, 165, 250, 150, TFT_BLACK);</p><p>  tft.drawLine(200, 170, 250, 170, TFT_BLACK);</p><p>  tft.drawLine(200, 175, 250, 190, TFT_BLACK);</p><p>  // ซ้าย</p><p>  tft.drawLine(70, 150, 120, 160, TFT_BLACK);</p><p>  tft.drawLine(70, 170, 120, 170, TFT_BLACK);</p><p>  tft.drawLine(70, 190, 120, 180, TFT_BLACK);</p><p>  // --- กระดิ่ง ---</p><p>  tft.fillCircle(160, 220, 15, TFT_YELLOW);</p><p>  tft.drawCircle(160, 220, 15, TFT_BLACK);</p><p>  tft.drawLine(160, 220, 160, 235, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  // ไม่มีการอัปเดต</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202973440/79a35b5fb5b2ea60e4a46b106f35ab74/298641.jpg" />
         <pubDate>2025-08-08 07:09:17 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538408707</guid>
      </item>
      <item>
         <title>นิธิศ นุชทองม่วง</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538410182</link>
         <description><![CDATA[<p>งานที่1</p><p>#include"TFT_eSPI.h"        // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD</p><p>TFT_eSPI tft;               // สร้างออบเจ็กต์ชื่อ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD</p><p>void setup() </p><p>{</p><p>  </p><p>}</p><p>void loop() </p><p>{               </p><p>    tft.fillScreen(TFT_BLUE);  </p><p>   delay(500);</p><p>              </p><p>  tft.fillScreen(TFT_RED);  </p><p>   delay(500);</p><p>                 </p><p>  tft.fillScreen(TFT_BLACK);  </p><p>   delay(500);</p><p>             </p><p>  tft.fillScreen(TFT_ORANGE);  </p><p>   delay(500);</p><p>   tft.fillScreen(TFT_GREEN);  </p><p>   delay(500);</p><p>    </p><p>   tft.fillScreen(TFT_PURPLE);  </p><p>   delay(500);</p><p>    </p><p>   tft.fillScreen(TFT_WHITE);  </p><p>   delay(500);</p><p>  </p><p>   tft.fillScreen(TFT_YELLOW);  </p><p>   delay(500);</p><p>  </p><p>  tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,120,25,TFT_RED);   </p><p>   delay(500);</p><p><br/></p><p><br/></p><p>    tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,80,25,TFT_RED);   </p><p>  tft.fillCircle(160,160,25,TFT_RED); </p><p>   delay(500);</p><p><br/></p><p><br/></p><p>    tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,50,25,TFT_RED);   </p><p>  tft.fillCircle(160,120,25,TFT_RED); </p><p>  tft.fillCircle(160,190,25,TFT_RED); </p><p>   delay(500);</p><p><br/></p><p><br/></p><p>tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,75,25,TFT_RED);   </p><p>  tft.fillCircle(200,75,25,TFT_RED); </p><p>  tft.fillCircle(120,170,25,TFT_RED); </p><p>  tft.fillCircle(200,170,25,TFT_RED);</p><p>   delay(500);</p><p><br/></p><p><br/></p><p>tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,75,25,TFT_RED);   </p><p>  tft.fillCircle(200,75,25,TFT_RED); </p><p>  tft.fillCircle(120,170,25,TFT_RED); </p><p>  tft.fillCircle(200,170,25,TFT_RED);</p><p>  tft.fillCircle(160,120,25,TFT_RED);</p><p>   delay(500);</p><p><br/></p><p><br/></p><p><br/></p><p>   tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,60,25,TFT_RED);   </p><p>  tft.fillCircle(200,60,25,TFT_RED); </p><p>  tft.fillCircle(120,120,25,TFT_RED); </p><p>  tft.fillCircle(200,120,25,TFT_RED);</p><p>   tft.fillCircle(120,180,25,TFT_RED);</p><p>    tft.fillCircle(200,180,25,TFT_RED);</p><p>   delay(500);</p><p><br/></p><p>   </p><p>  tft.begin();              // เริ่มต้นการทำงานของจอแสดงผล LCD</p><p>  tft.setRotation(3);       // หมุนตำแหน่งการแสดงผลเป็นโหมด 3 </p><p>  tft.fillScreen(TFT_WHITE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  tft.fillCircle(160,120,110,TFT_BLUE);   //หัวสีน้ำเงิน</p><p>  tft.fillCircle(160,150,85,TFT_WHITE);   //หัวสีขาว</p><p>  tft.drawCircle(130,90,30,TFT_BLACK);   // ตาซ้าย</p><p>   tft.fillCircle(130,90,29,TFT_WHITE);   // ตาซ้าย</p><p>   tft.fillCircle(140,100,7,TFT_BLACK);   // ตาในซ้าย</p><p>  tft.drawCircle(190,90,30,TFT_BLACK);   // ตาขวา</p><p>   tft.fillCircle(190,90,29,TFT_WHITE);   // ตาขวา</p><p>  tft.fillCircle(180,100,7,TFT_BLACK);   // ตาในขวา</p><p>  tft.fillCircle(160,120,10,TFT_RED);   // จมุก</p><p>  tft.drawCircle(160,120,11,TFT_BLACK);   // เส้นจมุก </p><p>   tft.fillTriangle(160,200,110,170,210,170,TFT_RED);// ปาก  </p><p>tft.fillTriangle(160,200,142,190,176,190,TFT_ORANGE);// ลิ้น</p><p>   tft.drawLine(80,120,120,140,TFT_BLACK); </p><p>  tft.drawLine(80,140,120,140,TFT_BLACK); </p><p>  tft.drawLine(80,160,120,140,TFT_BLACK); </p><p>  tft.drawLine(240,120,200,140,TFT_BLACK); </p><p>  tft.drawLine(240,140,200,140,TFT_BLACK); </p><p>  tft.drawLine(240,160,200,140,TFT_BLACK); </p><p>  delay(5000);</p><p>  }</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202982747/4d2a0259dc0d22ed90261ad8c23c9494/1000013508.jpg" />
         <pubDate>2025-08-08 07:11:29 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538410182</guid>
      </item>
      <item>
         <title>นาย ธีรวัฒน์ สิงห์โตงาม </title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538412300</link>
         <description><![CDATA[<p>#include"TFT_eSPI.h"        // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD</p><p>TFT_eSPI tft;               // สร้างออบเจ็กต์ชื่อ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD</p><p>void setup() </p><p>{</p><p>  </p><p>}</p><p>void loop() </p><p>{               </p><p>    tft.fillScreen(TFT_BLUE);  </p><p>   delay(500);</p><p>              </p><p>  tft.fillScreen(TFT_RED);  </p><p>   delay(500);</p><p>                 </p><p>  tft.fillScreen(TFT_BLACK);  </p><p>   delay(500);</p><p>             </p><p>  tft.fillScreen(TFT_ORANGE);  </p><p>   delay(500);</p><p>   tft.fillScreen(TFT_GREEN);  </p><p>   delay(500);</p><p>    </p><p>   tft.fillScreen(TFT_PURPLE);  </p><p>   delay(500);</p><p>    </p><p>   tft.fillScreen(TFT_WHITE);  </p><p>   delay(500);</p><p>  </p><p>   tft.fillScreen(TFT_YELLOW);  </p><p>   delay(500);</p><p>  </p><p>  tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,120,25,TFT_RED);   </p><p>   delay(500);</p><p>    tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,80,25,TFT_RED);   </p><p>  tft.fillCircle(160,160,25,TFT_RED); </p><p>   delay(500);</p><p>    tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(160,50,25,TFT_RED);   </p><p>  tft.fillCircle(160,120,25,TFT_RED); </p><p>  tft.fillCircle(160,190,25,TFT_RED); </p><p>   delay(500);</p><p>tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,75,25,TFT_RED);   </p><p>  tft.fillCircle(200,75,25,TFT_RED); </p><p>  tft.fillCircle(120,170,25,TFT_RED); </p><p>  tft.fillCircle(200,170,25,TFT_RED);</p><p>   delay(500);</p><p>tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,75,25,TFT_RED);   </p><p>  tft.fillCircle(200,75,25,TFT_RED); </p><p>  tft.fillCircle(120,170,25,TFT_RED); </p><p>  tft.fillCircle(200,170,25,TFT_RED);</p><p>  tft.fillCircle(160,120,25,TFT_RED);</p><p>   delay(500);</p><p>   tft.begin();              // </p><p>  tft.setRotation(3);       // </p><p>  tft.fillScreen(TFT_WHITE);  //</p><p>  tft.fillCircle(120,60,25,TFT_RED);   </p><p>  tft.fillCircle(200,60,25,TFT_RED); </p><p>  tft.fillCircle(120,120,25,TFT_RED); </p><p>  tft.fillCircle(200,120,25,TFT_RED);</p><p>   tft.fillCircle(120,180,25,TFT_RED);</p><p>    tft.fillCircle(200,180,25,TFT_RED);</p><p>   delay(500);</p><p>   </p><p>  tft.begin();              // เริ่มต้นการทำงานของจอแสดงผล LCD</p><p>  tft.setRotation(3);       // หมุนตำแหน่งการแสดงผลเป็นโหมด 3 </p><p>  tft.fillScreen(TFT_WHITE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  tft.fillCircle(160,120,110,TFT_BLUE);   //หัวสีน้ำเงิน</p><p>  tft.fillCircle(160,150,85,TFT_WHITE);   //หัวสีขาว</p><p>  tft.drawCircle(130,90,30,TFT_BLACK);   // ตาซ้าย</p><p>   tft.fillCircle(130,90,29,TFT_WHITE);   // ตาซ้าย</p><p>   tft.fillCircle(140,100,7,TFT_BLACK);   // ตาในซ้าย</p><p>  tft.drawCircle(190,90,30,TFT_BLACK);   // ตาขวา</p><p>   tft.fillCircle(190,90,29,TFT_WHITE);   // ตาขวา</p><p>  tft.fillCircle(180,100,7,TFT_BLACK);   // ตาในขวา</p><p>  tft.fillCircle(160,120,10,TFT_RED);   // จมุก</p><p>  tft.drawCircle(160,120,11,TFT_BLACK);   // เส้นจมุก </p><p>   tft.fillTriangle(160,200,110,170,210,170,TFT_RED);// ปาก  </p><p>tft.fillTriangle(160,200,142,190,176,190,TFT_ORANGE);// ลิ้น</p><p>   tft.drawLine(80,120,120,140,TFT_BLACK); </p><p>  tft.drawLine(80,140,120,140,TFT_BLACK); </p><p>  tft.drawLine(80,160,120,140,TFT_BLACK); </p><p>  tft.drawLine(240,120,200,140,TFT_BLACK); </p><p>  tft.drawLine(240,140,200,140,TFT_BLACK); </p><p>  tft.drawLine(240,160,200,140,TFT_BLACK); </p><p>  delay(5000);</p><p>  }</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202983792/ba81686d5dc5c6e49c043608ca89dadb/3619.jpg" />
         <pubDate>2025-08-08 07:13:51 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538412300</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538418151</link>
         <description><![CDATA[<p>#include"TFT_eSPI.h"        // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD</p><p>TFT_eSPI tft; </p><p>#define LCD_BACKLIGHT (72Ul)  // สร้างออปเจ็กต์ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD</p><p>void setup() </p><p>{</p><p>  tft.begin();              // เริ่มต้นการทำงานของจอแสดงผล LCD</p><p>  tft.fillScreen(TFT_BLUE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);   </p><p>  tft.fillScreen(TFT_RED);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);  </p><p>  tft.fillScreen(TFT_BLACK);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);  </p><p>  tft.fillScreen(TFT_MAROON);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);</p><p>  tft.fillScreen(TFT_GREEN);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);  </p><p>  tft.fillScreen(TFT_PURPLE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);</p><p>  tft.fillScreen(TFT_WHITE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);  </p><p>  tft.fillScreen</p><p>  (TFT_YELLOW);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล</p><p>  delay(500);</p><p>  </p><p>   </p><p>   </p><p>   tft.fillScreen(TFT_WHITE); //รุป1</p><p>   tft.fillCircle(120,160,30,TFT_RED);  </p><p>   delay(500); </p><p>    tft.fillScreen(TFT_WHITE); //รุป1</p><p>   tft.fillCircle(70,160,30,TFT_BLACK);  </p><p>    tft.fillCircle(150,160,30,TFT_BLACK);  </p><p>   delay(500); </p><p>   tft.fillScreen(TFT_WHITE); //รุป1</p><p>   tft.fillCircle(40, 40, 30, TFT_BLACK);   // ลูกที่ 1 - มุมบนซ้าย</p><p>tft.fillCircle(130, 150, 30, TFT_BLACK);   // ลูกที่ 2 - ขยับเฉียงลงขวา</p><p>tft.fillCircle(200, 280, 30, TFT_BLACK); // ลูกที่ 3 - ขยับต่อไปในแนวทะแยง</p><p>   delay(500); </p><p>   </p><p>    tft.fillScreen(TFT_WHITE); //รุป1</p><p>   tft.fillCircle(60, 90, 30, TFT_RED);   // ลูกซ้ายบน</p><p>tft.fillCircle(170, 90, 30, TFT_RED);  // ลูกขวาบน</p><p>tft.fillCircle(60, 230, 30, TFT_RED);  // ลูกซ้ายล่าง</p><p>tft.fillCircle(170, 230, 30, TFT_RED); // ลูกขวาล่าง</p><p>   delay(500); </p><p>      tft.fillScreen(TFT_WHITE); //รุป1</p><p>      tft.fillCircle(60, 90, 30, TFT_BLACK);    // ลูกซ้ายบน</p><p>tft.fillCircle(170, 90, 30, TFT_BLACK);   // ลูกขวาบน</p><p>tft.fillCircle(120, 160, 30, TFT_BLACK);  // ลูกตรงกลาง</p><p>tft.fillCircle(60, 230, 30, TFT_BLACK);   // ลูกซ้ายล่าง</p><p>tft.fillCircle(170, 230, 30, TFT_BLACK);  // ลูกขวาล่าง</p><p>      delay(500); </p><p>      </p><p>tft.fillScreen(TFT_WHITE); //รุป1</p><p>    tft.fillCircle(50, 100, 30, TFT_BLACK);   // แถวซ้าย บน</p><p>tft.fillCircle(120, 100, 30, TFT_BLACK);  // แถวกลาง บน</p><p>tft.fillCircle(190, 100, 30, TFT_BLACK);  // แถวขวา บน</p><p>tft.fillCircle(50, 210, 30, TFT_BLACK);  // แถวซ้าย ล่าง</p><p>tft.fillCircle(120, 210, 30, TFT_BLACK); // แถวกลาง ล่าง</p><p>tft.fillCircle(190, 210, 30, TFT_BLACK); // แถวขวา ล่าง</p><p>delay(500); </p><p>tft.fillScreen(TFT_WHITE); //รุป1</p><p>tft.drawCircle(120,160,101,TFT_BLACK);</p><p>tft.fillCircle(120,160,100,TFT_BLUE);</p><p>tft.drawCircle(135,160,82,TFT_BLACK);</p><p>tft.fillCircle(135,160,80,TFT_WHITE); // พื้นหน้า</p><p>tft.drawCircle(100,120,36,TFT_BLACK);  </p><p>tft.drawCircle(100,200,36,TFT_BLACK);  // ตา</p><p>tft.fillCircle(100,120,34,TFT_WHITE);  </p><p>tft.fillCircle(100,200,34,TFT_WHITE);  // ตาขาว</p><p>tft.fillCircle(105,140,20,TFT_BLACK);  // ลูกตาซ้าย</p><p>tft.fillCircle(105,180,20,TFT_BLACK);  // ลูกตาขวา</p><p>tft.fillCircle(129,160,15,TFT_RED);    // จมูก</p><p>tft.fillTriangle(170,130,170,190,190,160,TFT_PINK); // ปากสามเหลี่ยมกลับหัวในแนว X</p><p>// หนวดขวา (แนวนอน)</p><p>tft.drawLine(165,200,150,250,TFT_BLACK);</p><p>tft.drawLine(170,200,170,250,TFT_BLACK);</p><p>tft.drawLine(176,200,190,250,TFT_BLACK);</p><p>// หนวดซ้าย (แนวนอน)</p><p>tft.drawLine(150,70,160,120,TFT_BLACK);</p><p>tft.drawLine(170,70,170,120,TFT_BLACK);</p><p>tft.drawLine(190,70,176,120,TFT_BLACK);</p><p>// กระดิ่ง</p><p>tft.fillCircle(220,160,15,TFT_YELLOW);</p><p>tft.drawLine(220,160,240,160,TFT_BLACK);</p><p>                        </p><p>                        </p><p>            </p><p>            </p><p> </p><p>  </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> </p><p> }</p><p>void loop()</p><p>{</p><p> </p><p>}</p><p>  </p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202965050/688a09f4728b3210dee46a5abea41f11/9350.jpg" />
         <pubDate>2025-08-08 07:19:48 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538418151</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538436863</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;  </p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();  </p><p>// สีที่กำหนดเอง</p><p>#define MY_BROWN     0xA145</p><p>#define MY_DARKGREY  0x7BEF</p><p>// ปุ่ม 5-way switch ของ Wio Terminal</p><p>#define BTN_LEFT   WIO_5S_LEFT</p><p>#define BTN_RIGHT  WIO_5S_RIGHT</p><p>#define BTN_UP     WIO_5S_UP</p><p>#define BTN_DOWN   WIO_5S_DOWN</p><p>int catX = 40;</p><p>int catY = 100;</p><p>int step = 10;</p><p>int moveX = 0;  // -1 ซ้าย, 1 ขวา</p><p>int moveY = 0;  // -1 ขึ้น, 1 ลง</p><p>unsigned long lastMoveTime = 0;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  delay(100);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  pinMode(BTN_LEFT, INPUT_PULLUP);</p><p>  pinMode(BTN_RIGHT, INPUT_PULLUP);</p><p>  pinMode(BTN_UP, INPUT_PULLUP);</p><p>  pinMode(BTN_DOWN, INPUT_PULLUP);</p><p>  drawBackground();</p><p>  drawCat(catX, catY);</p><p>}</p><p>void loop() {</p><p>  // อ่านปุ่มทิศทาง</p><p>  moveX = 0;</p><p>  moveY = 0;</p><p>  if (digitalRead(BTN_RIGHT) == LOW) moveX = 1;</p><p>  else if (digitalRead(BTN_LEFT) == LOW) moveX = -1;</p><p>  if (digitalRead(BTN_DOWN) == LOW) moveY = 1;</p><p>  else if (digitalRead(BTN_UP) == LOW) moveY = -1;</p><p>  if (millis() - lastMoveTime &gt; 200) {</p><p>    if (moveX != 0 || moveY != 0) {</p><p>      drawPawPrint(catX + 10, catY + 40, MY_DARKGREY);</p><p>      catX += step * moveX;</p><p>      catY += step * moveY;</p><p>      // ขอบจอ</p><p>      if (catX &gt; tft.width() - 30) catX = tft.width() - 30;</p><p>      if (catX &lt; 30) catX = 30;</p><p>      if (catY &gt; tft.height() - 40) catY = tft.height() - 40;</p><p>      if (catY &lt; 30) catY = 30;</p><p>      drawBackground();</p><p>      drawCat(catX, catY);</p><p>    }</p><p>    lastMoveTime = millis();</p><p>  }</p><p>}</p><p>// ===== วาดฉาก =====</p><p>void drawBackground() {</p><p>  tft.fillScreen(TFT_CYAN);</p><p>  int groundY = tft.height() / 2;</p><p>  tft.fillRect(0, groundY, tft.width(), tft.height() - groundY, TFT_GREEN);</p><p>  drawSun();</p><p>  drawCloud(40, 40);</p><p>  drawCloud(120, 60);</p><p>  drawTree(60, groundY);</p><p>  drawTree(180, groundY);</p><p>  drawText();</p><p>}</p><p>void drawSun() {</p><p>  int sunRadius = 30;</p><p>  tft.fillCircle(tft.width() - sunRadius - 10, sunRadius + 10, sunRadius, TFT_YELLOW);</p><p>}</p><p>void drawCloud(int x, int y) {</p><p>  tft.fillCircle(x, y, 12, TFT_WHITE);</p><p>  tft.fillCircle(x + 15, y - 5, 15, TFT_WHITE);</p><p>  tft.fillCircle(x + 30, y, 12, TFT_WHITE);</p><p>  tft.fillRect(x - 2, y, 34, 12, TFT_WHITE);</p><p>}</p><p>void drawTree(int x, int groundY) {</p><p>  int trunkWidth = 10;</p><p>  int trunkHeight = 20;</p><p>  int foliageRadius = 20;</p><p>  tft.fillRect(x, groundY - trunkHeight, trunkWidth, trunkHeight, MY_BROWN);</p><p>  tft.fillCircle(x + trunkWidth / 2, groundY - trunkHeight - foliageRadius / 2, foliageRadius, TFT_DARKGREEN);</p><p>}</p><p>void drawText() {</p><p>  tft.setTextColor(TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(20, 20);</p><p>  tft.println("Wio Terminal");</p><p>}</p><p>void drawCat(int x, int y) {</p><p>  tft.fillCircle(x, y, 15, TFT_ORANGE);</p><p>  tft.fillTriangle(x - 10, y - 10, x - 5, y - 20, x, y - 10, TFT_ORANGE);</p><p>  tft.fillTriangle(x + 10, y - 10, x + 5, y - 20, x, y - 10, TFT_ORANGE);</p><p>  tft.fillCircle(x - 5, y - 2, 3, TFT_BLACK);</p><p>  tft.fillCircle(x + 5, y - 2, 3, TFT_BLACK);</p><p>  tft.fillCircle(x, y + 4, 2, TFT_PINK);</p><p>  tft.drawLine(x - 3, y + 7, x + 3, y + 7, TFT_BLACK);</p><p>  tft.fillRect(x - 12, y + 15, 24, 20, TFT_ORANGE);</p><p>  tft.fillRect(x - 12, y + 35, 6, 10, TFT_ORANGE);</p><p>  tft.fillRect(x + 6, y + 35, 6, 10, TFT_ORANGE);</p><p>  tft.fillRect(x + 14, y + 20, 5, 15, TFT_ORANGE);</p><p>}</p><p>void drawPawPrint(int x, int y, uint16_t color) {</p><p>  tft.fillCircle(x - 6, y - 6, 2, color);</p><p>  tft.fillCircle(x + 6, y - 6, 2, color);</p><p>  tft.fillCircle(x - 4, y + 0, 2, color);</p><p>  tft.fillCircle(x + 4, y + 0, 2, color);</p><p>  tft.fillRoundRect(x - 4, y + 2, 8, 10, 3, color);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1pAwaSNbk4xIpLcgIzGblnQCLjod3VibQ/view?usp=sharing" />
         <pubDate>2025-08-08 07:43:35 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538436863</guid>
      </item>
      <item>
         <title>นาย กฤติกร คงจรูญ</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538456454</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft;</p><p>int scene = 0;</p><p>int trainX = 0;      // ตำแหน่งรถไฟ</p><p>int trainSpeed = 7;  // ความเร็ว (บวก = ขวา, ลบ = ซ้าย)</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  // ตั้งค่า Pin ของปุ่ม</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>}</p><p>void loop() {</p><p>  // กดปุ่มเปลี่ยนทิศทาง</p><p>  if (!digitalRead(WIO_5S_RIGHT)) {</p><p>    trainSpeed = abs(trainSpeed); // วิ่งขวา</p><p>  }</p><p>  if (!digitalRead(WIO_5S_LEFT)) {</p><p>    trainSpeed = -abs(trainSpeed); // วิ่งซ้าย</p><p>  }</p><p>  // ปุ่มเปลี่ยนฉาก</p><p>  if (!digitalRead(WIO_KEY_A)) {</p><p>    scene = (scene + 1) % 6;</p><p>    delay(200);</p><p>  }</p><p>  if (!digitalRead(WIO_KEY_B)) {</p><p>    scene = (scene + 5) % 6; // ย้อนกลับ</p><p>    delay(200);</p><p>  }</p><p>  // อัปเดตตำแหน่งรถไฟ</p><p>  trainX += trainSpeed;</p><p>  if (trainX &gt; 320) trainX = -120; // ออกขวาแล้ววนไปซ้าย</p><p>  if (trainX &lt; -120) trainX = 320; // ออกซ้ายแล้ววนไปขวา</p><p>  // วาดหน้าจอ</p><p>  tft.fillScreen(backgroundColor(scene));</p><p>  drawSceneDetails(scene);</p><p>  drawRail();</p><p>  drawTrain(trainX);</p><p>  delay(30);</p><p>}</p><p>// ---------------- ฟังก์ชันเดิม ----------------</p><p>uint16_t backgroundColor(int s) {</p><p>  switch (s) {</p><p>    case 0: return TFT_BLUE;</p><p>    case 1: return TFT_LIGHTGREY;</p><p>    case 2: return TFT_GREEN;</p><p>    case 3: return TFT_DARKGREY;</p><p>    case 4: return TFT_NAVY;</p><p>    case 5: return TFT_PURPLE;</p><p>    default: return TFT_BLACK;</p><p>  }</p><p>}</p><p>void drawRail() {</p><p>  tft.drawLine(0, 140, tft.width(), 140, TFT_MAROON);</p><p>  tft.drawLine(0, 160, tft.width(), 160, TFT_MAROON);</p><p>  for (int i = 0; i &lt; tft.width(); i += 20) {</p><p>    tft.drawLine(i, 140, i, 160, TFT_WHITE);</p><p>  }</p><p>}</p><p>void drawTrain(int x) {</p><p>  tft.fillRect(x, 100, 40, 30, TFT_RED);</p><p>  tft.fillRect(x + 30, 90, 10, 10, TFT_ORANGE);</p><p>  tft.fillCircle(x + 10, 135, 5, TFT_BLACK);</p><p>  tft.fillCircle(x + 30, 135, 5, TFT_BLACK);</p><p>  for (int i = 0; i &lt; 3; i++) {</p><p>    int bx = x + 50 + i * 50;</p><p>    tft.fillRect(bx, 105, 40, 25, TFT_YELLOW);</p><p>    tft.fillCircle(bx + 10, 135, 5, TFT_BLACK);</p><p>    tft.fillCircle(bx + 30, 135, 5, TFT_BLACK);</p><p>  }</p><p>}</p><p>void drawSceneDetails(int s) {</p><p>  switch (s) {</p><p>    case 0:</p><p>      tft.fillCircle(270, 40, 20, TFT_YELLOW);</p><p>      drawCloud(50, 30);</p><p>      drawCloud(120, 40);</p><p>      break;</p><p>    case 1:</p><p>      drawBuilding(20, 60, 30, 60);</p><p>      drawBuilding(60, 50, 25, 70);</p><p>      drawBuilding(100, 65, 35, 55);</p><p>      break;</p><p>    case 2:</p><p>      drawTree(30, 100);</p><p>      drawTree(80, 100);</p><p>      drawTree(200, 100);</p><p>      break;</p><p>    case 3:</p><p>      for (int i = 0; i &lt; 10; i++) {</p><p>        int rx = random(0, 320);</p><p>        int ry = random(0, 120);</p><p>        tft.drawLine(rx, ry, rx, ry + 5, TFT_CYAN);</p><p>      }</p><p>      break;</p><p>    case 4:</p><p>      for (int i = 0; i &lt; 10; i++) {</p><p>        int sx = random(0, 320);</p><p>        int sy = random(0, 80);</p><p>        tft.drawPixel(sx, sy, TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 5:</p><p>      tft.setTextColor(TFT_WHITE, TFT_PURPLE);</p><p>      tft.setTextSize(2);</p><p>      tft.setCursor(100, 50);</p><p>      tft.print("STATION");</p><p>      break;</p><p>  }</p><p>}</p><p>void drawTree(int x, int y) {</p><p>  tft.fillRect(x + 5, y, 5, 20, TFT_MAROON);</p><p>  tft.fillCircle(x + 7, y, 12, TFT_DARKGREEN);</p><p>}</p><p>void drawCloud(int x, int y) {</p><p>  tft.fillCircle(x, y, 10, TFT_WHITE);</p><p>  tft.fillCircle(x + 10, y - 5, 10, TFT_WHITE);</p><p>  tft.fillCircle(x + 20, y, 10, TFT_WHITE);</p><p>}</p><p>void drawBuilding(int x, int y, int w, int h) {</p><p>  tft.fillRect(x, y, w, h, TFT_DARKGREY);</p><p>  for (int i = 0; i &lt; h; i += 10) {</p><p>    for (int j = 0; j &lt; w; j += 8) {</p><p>      tft.fillRect(x + j + 2, y + i + 2, 4, 4, TFT_WHITE);</p><p>    }</p><p>  }</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202973440/654c8c69e3eeda7447195d0d4d441909/_________________________________________Mind_Map.png" />
         <pubDate>2025-08-08 07:52:27 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538456454</guid>
      </item>
      <item>
         <title>นาย นัทพร สุภี</title>
         <author>nudtapondupee</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538467856</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI(); </p><p>uint16_t rgb(uint8_t r, uint8_t g, uint8_t b){</p><p>  return tft.color565(r,g,b);</p><p>}</p><p>void drawDoraemonHead(int cx, int cy, int scale){</p><p>  // Colors</p><p>  uint16_t blue    = rgb(0,102,204);    </p><p>  uint16_t white   = rgb(255,255,255);  </p><p>  uint16_t black   = rgb(0,0,0);</p><p>  uint16_t red     = rgb(220,20,60);    </p><p>  uint16_t yellow  = rgb(255,200,0);    </p><p>  // หัว (วงกลมสีน้ำเงิน)</p><p>  int headR = 100 * scale;</p><p>  tft.fillCircle(cx, cy, headR, blue);</p><p>  tft.drawCircle(cx, cy, headR, black);</p><p>  // หน้า (วงรีสีขาว)</p><p>  for(int dy = -80*scale; dy &lt;= 80*scale; dy++){</p><p>    float yy = (float)dy / (80.0f*scale);</p><p>    int halfw = (int)(headR <em> 0.85 </em> sqrt(1 - yy*yy));</p><p>    for(int x = cx - halfw; x &lt;= cx + halfw; x++){</p><p>      tft.drawPixel(x, cy + dy + 10*scale, white);</p><p>    }</p><p>  }</p><p>  // ตา</p><p>  int eyeR = 20 * scale;</p><p>  int eyeOffsetX = 25 * scale;</p><p>  int eyeOffsetY = -40 * scale;</p><p>  tft.fillCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, white);</p><p>  tft.fillCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, white);</p><p>  tft.drawCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, black);</p><p>  tft.drawCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, black);</p><p>  // รูม่านตา</p><p>  tft.fillCircle(cx - eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);</p><p>  tft.fillCircle(cx + eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);</p><p>  // จมูก</p><p>  int noseR = 12 * scale;</p><p>  tft.fillCircle(cx, cy - 10*scale, noseR, red);</p><p>  tft.drawCircle(cx, cy - 10*scale, noseR, black);</p><p>  // เส้นหนวดซ้าย-ขวา</p><p>  for(int i=0;i&lt;3;i++){</p><p>    int y = cy - 5*scale + (i-1)*15*scale;</p><p>    tft.drawLine(cx - 15*scale, y, cx - 70*scale, y - 5*scale, black);</p><p>    tft.drawLine(cx + 15*scale, y, cx + 70*scale, y - 5*scale, black);</p><p>  }</p><p>  // ปาก</p><p>  tft.drawLine(cx, cy - 10*scale, cx, cy + 50*scale, black); // เส้นตรงกลาง</p><p>  for(int dy = 0; dy &lt;= 50*scale; dy++){</p><p>    float yy = (float)dy / (50.0f*scale);</p><p>    int halfw = (int)(60*scale <em> sqrt(1 - yy</em>yy));</p><p>    tft.drawPixel(cx - halfw, cy + dy, black);</p><p>    tft.drawPixel(cx + halfw, cy + dy, black);</p><p>  }</p><p>  // กระดิ่ง</p><p>  int bellR = 18 * scale;</p><p>  int bellCx = cx;</p><p>  int bellCy = cy + 110*scale;</p><p>  tft.fillCircle(bellCx, bellCy, bellR, yellow);</p><p>  tft.drawCircle(bellCx, bellCy, bellR, black);</p><p>  // เส้นคาดกระดิ่ง</p><p>  tft.drawFastHLine(bellCx - 12*scale, bellCy - 4*scale, 24*scale, black);</p><p>  // รูตรงกลาง</p><p>  tft.fillCircle(bellCx, bellCy + 4*scale, 5*scale, black);</p><p>  tft.drawLine(bellCx, bellCy + 4*scale, bellCx, bellCy + 12*scale, black);</p><p>}</p><p>void setup(){</p><p>  tft.init();</p><p>  tft.setRotation(1); // จอแนวนอน</p><p>  tft.fillScreen(rgb(255,255,255)); // พื้นหลังขาว</p><p>  // วาดหัวโดเรม่อนตรงกลางจอ</p><p>  drawDoraemonHead(160, 100, 1);</p><p>}</p><p>void loop(){}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202938829/874a2cf4f8ba23e5e6e001092185b3d8/S__16728074.jpg" />
         <pubDate>2025-08-08 07:58:09 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538467856</guid>
      </item>
      <item>
         <title>นายธนพัฒน์ แก้วประเสริฐ</title>
         <author>maxxy110350</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538467909</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define MAX_METEOR_COUNT 5</p><p>#define SHIP_WIDTH 30</p><p>#define SHIP_HEIGHT 20</p><p>#define MOVE_STEP 20</p><p>const int METEOR_SPEED = 10;</p><p>#define SHIP_COLOR TFT_CYAN</p><p>uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};</p><p>const int meteorColorCount = 3;</p><p>int shipX = 160;</p><p>int shipY = 200;</p><p>int backgroundMode = 0;</p><p>unsigned long startTime = 0;  // ใช้เก็บเวลาที่เริ่มเล่น</p><p>struct Meteor {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>};</p><p>Meteor meteors[MAX_METEOR_COUNT];</p><p>int currentMeteorCount = 3;</p><p>// ===== พื้นหลังแบบต่าง ๆ =====</p><p>void drawBackground() {</p><p>  switch (backgroundMode) {</p><p>    case 0: // ดำ + จุดขาว (เริ่มต้น)</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 50; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 1: // ดำ + จุดม่วง + น้ำเงิน</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_PURPLE);</p><p>      }</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_BLUE);</p><p>      }</p><p>      break;</p><p>    case 2: // เทาเข้ม + จุดวงกลมสีอ่อน ๆ แตกต่างจากเมเทียร์</p><p>      tft.fillScreen(TFT_DARKGREY);</p><p>      for (int i = 0; i &lt; 40; i++) {</p><p>        int r = random(2, 6);</p><p>        int x = random(r, 320 - r);</p><p>        int y = random(r, 240 - r);</p><p>        uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ หรือเทาอ่อน</p><p>        tft.drawCircle(x, y, r, circleColor);</p><p>      }</p><p>      break;</p><p>    case 3: // น้ำเงินเข้ม + ดาวสีเหลือง</p><p>      tft.fillScreen(TFT_NAVY);</p><p>      for (int i = 0; i &lt; 40; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_YELLOW);</p><p>        if (random(0, 2) == 0) {</p><p>          tft.drawPixel(x + 1, y, TFT_ORANGE);</p><p>          tft.drawPixel(x, y + 1, TFT_ORANGE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 4: // สีม่วงเข้ม + ดาวหลากสี (ธีม Honkai)</p><p>      tft.fillScreen(TFT_PURPLE);</p><p>      for (int i = 0; i &lt; 50; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        uint16_t c = meteorColors[random(0, meteorColorCount)];</p><p>        tft.drawPixel(x, y, c);</p><p>        if (random(0, 3) == 0) {</p><p>          tft.drawPixel(x + 1, y, TFT_WHITE);</p><p>          tft.drawPixel(x, y + 1, TFT_WHITE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 5: // สีดำ + วงกลมฟ้าสว่าง (ธีมอวกาศ)</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 25; i++) {</p><p>        int r = random(3, 12);</p><p>        int x = random(r, 320 - r);</p><p>        int y = random(r, 240 - r);</p><p>        tft.fillCircle(x, y, r, TFT_GREEN);</p><p>      }</p><p>      break;</p><p>  }</p><p>}</p><p>void drawShip(int x, int y) {</p><p>  tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);</p><p>  tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, TFT_WHITE);</p><p>}</p><p>void drawMeteor(Meteor m) {</p><p>  tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);</p><p>}</p><p>bool checkCollision(int sx, int sy, Meteor m) {</p><p>  int mx = m.x + m.size;</p><p>  int my = m.y + m.size;</p><p>  int dx = max(sx, min(mx, sx + SHIP_WIDTH));</p><p>  int dy = max(sy - SHIP_HEIGHT, min(my, sy));</p><p>  int distSq = (mx - dx) <em> (mx - dx) + (my - dy) </em> (my - dy);</p><p>  return distSq &lt; m.size * m.size;</p><p>}</p><p>void drawScore() {</p><p>  unsigned long elapsed = (millis() - startTime) / 1000;  // วินาทีที่เล่น</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10, 10);</p><p>  tft.printf("Time: %lus", elapsed);</p><p>}</p><p>void resetGame() {</p><p>  shipX = 160;</p><p>  shipY = 220;</p><p>  currentMeteorCount = 3;</p><p>  startTime = millis();  // เริ่มนับเวลาใหม่</p><p>  for (int i = 0; i &lt; MAX_METEOR_COUNT; i++) {</p><p>    meteors[i].x = random(0, 320);</p><p>    meteors[i].y = random(-240, -20);</p><p>    meteors[i].size = random(8, 16);</p><p>    meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>  }</p><p>  drawBackground();</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  resetGame();</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);</p><p>}</p><p>void loop() {</p><p>  // เปลี่ยนพื้นหลังเมื่อกดปุ่ม A/B/C</p><p>  if (!digitalRead(WIO_KEY_A)) {</p><p>    backgroundMode = (backgroundMode + 1) % 6;  // กด A เปลี่ยนฉาก +1</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if (!digitalRead(WIO_KEY_B)) {</p><p>    backgroundMode = (backgroundMode + 5) % 6;  // กด B เปลี่ยนฉาก -1 (วนรอบ)</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if (!digitalRead(WIO_KEY_C)) {</p><p>    backgroundMode = 0;  // กด C กลับฉากเริ่มต้น (ดำ+จุดขาว)</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  // Move ship</p><p>  if (!digitalRead(WIO_5S_LEFT))  shipX -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_UP))    shipY -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_DOWN))  shipY += MOVE_STEP;</p><p>  // Keep ship on screen</p><p>  shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);</p><p>  shipY = constrain(shipY, SHIP_HEIGHT, 240);</p><p>  drawBackground();</p><p>  drawScore();</p><p>  drawShip(shipX, shipY);</p><p>  for (int i = 0; i &lt; currentMeteorCount; i++) {</p><p>    meteors[i].y += METEOR_SPEED;</p><p>    if (meteors[i].y &gt; 240) {</p><p>      meteors[i].x = random(0, 320);</p><p>      meteors[i].y = random(-100, -20);</p><p>      meteors[i].size = random(8, 16);</p><p>      meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>      if (currentMeteorCount &lt; MAX_METEOR_COUNT) currentMeteorCount++;</p><p>    }</p><p>    if (checkCollision(shipX, shipY, meteors[i])) {</p><p>      tft.fillScreen(TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE, TFT_RED);</p><p>      tft.setTextSize(3);</p><p>      tft.setCursor(100, 110);</p><p>      tft.print("BOOM!");</p><p>      delay(1000);</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      tft.setTextColor(TFT_WHITE);</p><p>      tft.setTextSize(2);</p><p>      tft.setCursor(80, 120);</p><p>      tft.print("Press to Restart");</p><p>      while (digitalRead(WIO_5S_PRESS) == HIGH) delay(10);</p><p>      while (digitalRead(WIO_5S_PRESS) == LOW) delay(10);</p><p>      resetGame();</p><p>      break;</p><p>    }</p><p>    drawMeteor(meteors[i]);</p><p>  }</p><p>  delay(30);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1wd_LyjWmx3t0WJmOXh-C0iWNL1g1SS02/view?usp=drive_link" />
         <pubDate>2025-08-08 07:58:17 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538467909</guid>
      </item>
      <item>
         <title>อินทัช สุวรรณวงศ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538468410</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI(); </p><p>uint16_t rgb(uint8_t r, uint8_t g, uint8_t b){</p><p>  return tft.color565(r,g,b);</p><p>}</p><p>void drawDoraemonHead(int cx, int cy, int scale){</p><p>  // Colors</p><p>  uint16_t blue    = rgb(0,102,204);    </p><p>  uint16_t white   = rgb(255,255,255);  </p><p>  uint16_t black   = rgb(0,0,0);</p><p>  uint16_t red     = rgb(220,20,60);    </p><p>  uint16_t yellow  = rgb(255,200,0);    </p><p>  // หัว (วงกลมสีน้ำเงิน)</p><p>  int headR = 100 * scale;</p><p>  tft.fillCircle(cx, cy, headR, blue);</p><p>  tft.drawCircle(cx, cy, headR, black);</p><p>  // หน้า (วงรีสีขาว)</p><p>  for(int dy = -80*scale; dy &lt;= 80*scale; dy++){</p><p>    float yy = (float)dy / (80.0f*scale);</p><p>    int halfw = (int)(headR <em> 0.85 </em> sqrt(1 - yy*yy));</p><p>    for(int x = cx - halfw; x &lt;= cx + halfw; x++){</p><p>      tft.drawPixel(x, cy + dy + 10*scale, white);</p><p>    }</p><p>  }</p><p>  // ตา</p><p>  int eyeR = 20 * scale;</p><p>  int eyeOffsetX = 25 * scale;</p><p>  int eyeOffsetY = -40 * scale;</p><p>  tft.fillCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, white);</p><p>  tft.fillCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, white);</p><p>  tft.drawCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, black);</p><p>  tft.drawCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, black);</p><p>  // รูม่านตา</p><p>  tft.fillCircle(cx - eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);</p><p>  tft.fillCircle(cx + eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);</p><p>  // จมูก</p><p>  int noseR = 12 * scale;</p><p>  tft.fillCircle(cx, cy - 10*scale, noseR, red);</p><p>  tft.drawCircle(cx, cy - 10*scale, noseR, black);</p><p>  // เส้นหนวดซ้าย-ขวา</p><p>  for(int i=0;i&lt;3;i++){</p><p>    int y = cy - 5*scale + (i-1)*15*scale;</p><p>    tft.drawLine(cx - 15*scale, y, cx - 70*scale, y - 5*scale, black);</p><p>    tft.drawLine(cx + 15*scale, y, cx + 70*scale, y - 5*scale, black);</p><p>  }</p><p>  // ปาก</p><p>  tft.drawLine(cx, cy - 10*scale, cx, cy + 50*scale, black); // เส้นตรงกลาง</p><p>  for(int dy = 0; dy &lt;= 50*scale; dy++){</p><p>    float yy = (float)dy / (50.0f*scale);</p><p>    int halfw = (int)(60*scale <em> sqrt(1 - yy</em>yy));</p><p>    tft.drawPixel(cx - halfw, cy + dy, black);</p><p>    tft.drawPixel(cx + halfw, cy + dy, black);</p><p>  }</p><p>  // กระดิ่ง</p><p>  int bellR = 18 * scale;</p><p>  int bellCx = cx;</p><p>  int bellCy = cy + 110*scale;</p><p>  tft.fillCircle(bellCx, bellCy, bellR, yellow);</p><p>  tft.drawCircle(bellCx, bellCy, bellR, black);</p><p>  // เส้นคาดกระดิ่ง</p><p>  tft.drawFastHLine(bellCx - 12*scale, bellCy - 4*scale, 24*scale, black);</p><p>  // รูตรงกลาง</p><p>  tft.fillCircle(bellCx, bellCy + 4*scale, 5*scale, black);</p><p>  tft.drawLine(bellCx, bellCy + 4*scale, bellCx, bellCy + 12*scale, black);</p><p>}</p><p>void setup(){</p><p>  tft.init();</p><p>  tft.setRotation(1); // จอแนวนอน</p><p>  tft.fillScreen(rgb(255,255,255)); // พื้นหลังขาว</p><p>  // วาดหัวโดเรม่อนตรงกลางจอ</p><p>  drawDoraemonHead(160, 100, 1);</p><p>}</p><p>void loop(){}</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202798939/4ca79b969ac67cb94018b89a67f56f40/S__16728074.jpg" />
         <pubDate>2025-08-08 07:59:07 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538468410</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538473189</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>// ปุ่มทิศทาง (D-Pad) ของ Wio Terminal</p><p>#define BTN_LEFT   WIO_5S_LEFT</p><p>#define BTN_RIGHT  WIO_5S_RIGHT</p><p>#define BTN_UP     WIO_5S_UP</p><p>#define BTN_DOWN   WIO_5S_DOWN</p><p>// ปุ่มเปลี่ยนฉาก</p><p>#define BTN_C WIO_KEY_C</p><p>// ตัวแปรผู้เล่น</p><p>int playerX = 120;</p><p>int playerY = 200;</p><p>const int playerSize = 20;</p><p>// ตัวแปรสิ่งกีดขวาง</p><p>int obstacleX = 0;</p><p>int obstacleY = 0;</p><p>const int obstacleSize = 20;</p><p>int obstacleSpeed = 3;</p><p>// พื้นหลัง</p><p>int bgIndex = 0;</p><p>const int bgCount = 6;</p><p>// คะแนน</p><p>int score = 0;</p><p>// ควบคุมเฟรม</p><p>unsigned long lastFrame = 0;</p><p>const int frameDelay = 30;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  pinMode(BTN_LEFT, INPUT_PULLUP);</p><p>  pinMode(BTN_RIGHT, INPUT_PULLUP);</p><p>  pinMode(BTN_UP, INPUT_PULLUP);</p><p>  pinMode(BTN_DOWN, INPUT_PULLUP);</p><p>  pinMode(BTN_C, INPUT_PULLUP);</p><p>  randomSeed(analogRead(0));</p><p>  drawBackground(bgIndex);</p><p>  resetObstacle();</p><p>}</p><p>void loop() {</p><p>  if (millis() - lastFrame &gt; frameDelay) {</p><p>    updateInput();</p><p>    updateGame();</p><p>    drawGame();</p><p>    lastFrame = millis();</p><p>  }</p><p>}</p><p>// อ่านปุ่มควบคุม</p><p>void updateInput() {</p><p>  // ซ้าย</p><p>  if (digitalRead(BTN_LEFT) == LOW) {</p><p>    playerX -= 5;</p><p>    if (playerX &lt; 0) playerX = 0;</p><p>  }</p><p>  // ขวา</p><p>  if (digitalRead(BTN_RIGHT) == LOW) {</p><p>    playerX += 5;</p><p>    if (playerX &gt; tft.width() - playerSize) playerX = tft.width() - playerSize;</p><p>  }</p><p>  // ขึ้น</p><p>  if (digitalRead(BTN_UP) == LOW) {</p><p>    playerY -= 5;</p><p>    if (playerY &lt; 0) playerY = 0;</p><p>  }</p><p>  // ลง</p><p>  if (digitalRead(BTN_DOWN) == LOW) {</p><p>    playerY += 5;</p><p>    if (playerY &gt; tft.height() - playerSize) playerY = tft.height() - playerSize;</p><p>  }</p><p>  // เปลี่ยนฉาก</p><p>  if (digitalRead(BTN_C) == LOW) {</p><p>    bgIndex = (bgIndex + 1) % bgCount;</p><p>    drawBackground(bgIndex);</p><p>    delay(300); // ป้องกันกดค้าง</p><p>  }</p><p>}</p><p>// อัปเดตเกม</p><p>void updateGame() {</p><p>  obstacleY += obstacleSpeed;</p><p>  if (obstacleY &gt; tft.height()) {</p><p>    resetObstacle();</p><p>  }</p><p>  // ตรวจสอบการชน</p><p>  if (playerX &lt; obstacleX + obstacleSize &amp;&amp;</p><p>      playerX + playerSize &gt; obstacleX &amp;&amp;</p><p>      playerY &lt; obstacleY + obstacleSize &amp;&amp;</p><p>      playerY + playerSize &gt; obstacleY) {</p><p>    score++;</p><p>    resetObstacle();</p><p>  }</p><p>}</p><p>// วาดเกม</p><p>void drawGame() {</p><p>  drawBackground(bgIndex);</p><p>  // ผู้เล่น</p><p>  tft.fillRect(playerX, playerY, playerSize, playerSize, TFT_BLUE);</p><p>  // สิ่งกีดขวาง</p><p>  tft.fillRect(obstacleX, obstacleY, obstacleSize, obstacleSize, TFT_BLACK);</p><p>  // คะแนน</p><p>  tft.setTextColor(TFT_WHITE, tft.color565(0, 0, 0));</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(5, 5);</p><p>  tft.printf("Score: %d", score);</p><p>}</p><p>// รีเซ็ตสิ่งกีดขวาง</p><p>void resetObstacle() {</p><p>  obstacleX = random(0, tft.width() - obstacleSize);</p><p>  obstacleY = 0;</p><p>}</p><p>// วาดพื้นหลัง</p><p>void drawBackground(int index) {</p><p>  switch (index) {</p><p>    case 0: tft.fillScreen(TFT_CYAN); break;</p><p>    case 1: tft.fillScreen(TFT_YELLOW); break;</p><p>    case 2: tft.fillScreen(TFT_GREEN); break;</p><p>    case 3: tft.fillScreen(TFT_ORANGE); break;</p><p>    case 4: tft.fillScreen(TFT_MAGENTA); break;</p><p>    case 5: tft.fillScreen(TFT_DARKGREY); break;</p><p>  }</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1juX-taBCgXaYSlY-GRnvdZft3k7Hu6KB/view?usp=sharing" />
         <pubDate>2025-08-08 08:08:17 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538473189</guid>
      </item>
      <item>
         <title>นาย กฤติกร คงจรูญ</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538473503</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define MAX_METEOR_COUNT 5</p><p>#define SHIP_WIDTH 30</p><p>#define SHIP_HEIGHT 20</p><p>#define MOVE_STEP 20</p><p>const int METEOR_SPEED = 10;</p><p>#define SHIP_COLOR TFT_CYAN</p><p>uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};</p><p>const int meteorColorCount = 3;</p><p>int shipX = 160;</p><p>int shipY = 200;</p><p>int backgroundMode = 0;</p><p>unsigned long startTime = 0;  // ใช้เก็บเวลาที่เริ่มเล่น</p><p>struct Meteor {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>};</p><p>Meteor meteors[MAX_METEOR_COUNT];</p><p>int currentMeteorCount = 3;</p><p>// ===== พื้นหลังแบบต่าง ๆ =====</p><p>void drawBackground() {</p><p>  switch (backgroundMode) {</p><p>    case 0: // ดำ + จุดขาว (เริ่มต้น)</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 50; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 1: // ดำ + จุดม่วง + น้ำเงิน</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_PURPLE);</p><p>      }</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_BLUE);</p><p>      }</p><p>      break;</p><p>    case 2: // เทาเข้ม + จุดวงกลมสีอ่อน ๆ แตกต่างจากเมเทียร์</p><p>      tft.fillScreen(TFT_DARKGREY);</p><p>      for (int i = 0; i &lt; 40; i++) {</p><p>        int r = random(2, 6);</p><p>        int x = random(r, 320 - r);</p><p>        int y = random(r, 240 - r);</p><p>        uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ หรือเทาอ่อน</p><p>        tft.drawCircle(x, y, r, circleColor);</p><p>      }</p><p>      break;</p><p>    case 3: // น้ำเงินเข้ม + ดาวสีเหลือง</p><p>      tft.fillScreen(TFT_NAVY);</p><p>      for (int i = 0; i &lt; 40; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        tft.drawPixel(x, y, TFT_YELLOW);</p><p>        if (random(0, 2) == 0) {</p><p>          tft.drawPixel(x + 1, y, TFT_ORANGE);</p><p>          tft.drawPixel(x, y + 1, TFT_ORANGE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 4: // สีม่วงเข้ม + ดาวหลากสี (ธีม Honkai)</p><p>      tft.fillScreen(TFT_PURPLE);</p><p>      for (int i = 0; i &lt; 50; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        uint16_t c = meteorColors[random(0, meteorColorCount)];</p><p>        tft.drawPixel(x, y, c);</p><p>        if (random(0, 3) == 0) {</p><p>          tft.drawPixel(x + 1, y, TFT_WHITE);</p><p>          tft.drawPixel(x, y + 1, TFT_WHITE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 5: // สีดำ + วงกลมฟ้าสว่าง (ธีมอวกาศ)</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i = 0; i &lt; 25; i++) {</p><p>        int r = random(3, 8);</p><p>        int x = random(r, 320 - r);</p><p>        int y = random(r, 240 - r);</p><p>        tft.fillCircle(x, y, r, TFT_GREEN);</p><p>      }</p><p>      break;</p><p>  }</p><p>}</p><p>void drawShip(int x, int y) {</p><p>  tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);</p><p>  tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, TFT_WHITE);</p><p>}</p><p>void drawMeteor(Meteor m) {</p><p>  tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);</p><p>}</p><p>bool checkCollision(int sx, int sy, Meteor m) {</p><p>  int mx = m.x + m.size;</p><p>  int my = m.y + m.size;</p><p>  int dx = max(sx, min(mx, sx + SHIP_WIDTH));</p><p>  int dy = max(sy - SHIP_HEIGHT, min(my, sy));</p><p>  int distSq = (mx - dx) <em> (mx - dx) + (my - dy) </em> (my - dy);</p><p>  return distSq &lt; m.size * m.size;</p><p>}</p><p>void drawScore() {</p><p>  unsigned long elapsed = (millis() - startTime) / 1000;  // วินาทีที่เล่น</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10, 10);</p><p>  tft.printf("Time: %lus", elapsed);</p><p>}</p><p>void resetGame() {</p><p>  shipX = 160;</p><p>  shipY = 220;</p><p>  currentMeteorCount = 3;</p><p>  startTime = millis();  // เริ่มนับเวลาใหม่</p><p>  for (int i = 0; i &lt; MAX_METEOR_COUNT; i++) {</p><p>    meteors[i].x = random(0, 320);</p><p>    meteors[i].y = random(-240, -20);</p><p>    meteors[i].size = random(8, 16);</p><p>    meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>  }</p><p>  drawBackground();</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  resetGame();</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);</p><p>}</p><p>void loop() {</p><p>  // เปลี่ยนพื้นหลังเมื่อกดปุ่ม A/B/C</p><p>  if (!digitalRead(WIO_KEY_A)) {</p><p>    backgroundMode = (backgroundMode + 1) % 6;  // กด A เปลี่ยนฉาก +1</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if (!digitalRead(WIO_KEY_B)) {</p><p>    backgroundMode = (backgroundMode + 5) % 6;  // กด B เปลี่ยนฉาก -1 (วนรอบ)</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if (!digitalRead(WIO_KEY_C)) {</p><p>    backgroundMode = 0;  // กด C กลับฉากเริ่มต้น (ดำ+จุดขาว)</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  // Move ship</p><p>  if (!digitalRead(WIO_5S_LEFT))  shipX -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_UP))    shipY -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_DOWN))  shipY += MOVE_STEP;</p><p>  // Keep ship on screen</p><p>  shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);</p><p>  shipY = constrain(shipY, SHIP_HEIGHT, 240);</p><p>  drawBackground();</p><p>  drawScore();</p><p>  drawShip(shipX, shipY);</p><p>  for (int i = 0; i &lt; currentMeteorCount; i++) {</p><p>    meteors[i].y += METEOR_SPEED;</p><p>    if (meteors[i].y &gt; 240) {</p><p>      meteors[i].x = random(0, 320);</p><p>      meteors[i].y = random(-100, -20);</p><p>      meteors[i].size = random(8, 16);</p><p>      meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>      if (currentMeteorCount &lt; MAX_METEOR_COUNT) currentMeteorCount++;</p><p>    }</p><p>    if (checkCollision(shipX, shipY, meteors[i])) {</p><p>      tft.fillScreen(TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE, TFT_RED);</p><p>      tft.setTextSize(3);</p><p>      tft.setCursor(100, 110);</p><p>      tft.print("BOOM!");</p><p>      delay(1000);</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      tft.setTextColor(TFT_WHITE);</p><p>      tft.setTextSize(2);</p><p>      tft.setCursor(80, 120);</p><p>      tft.print("Press to Restart");</p><p>      while (digitalRead(WIO_5S_PRESS) == HIGH) delay(10);</p><p>      while (digitalRead(WIO_5S_PRESS) == LOW) delay(10);</p><p>      resetGame();</p><p>      break;</p><p>    }</p><p>    drawMeteor(meteors[i]);</p><p>  }</p><p>  delay(30);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1QPDmn1_VLVIJFVEoxU5nkv_TKPVVxMDM/view?usp=sharing" />
         <pubDate>2025-08-08 08:08:25 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538473503</guid>
      </item>
      <item>
         <title>นาย ธนพัฒน์ แก้วประเสริฐ</title>
         <author>maxxy110350</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538475956</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define TFT_BROWN 0xA145  // กำหนดสีน้ำตาลเอง</p><p>int backgroundMode = 0;</p><p>unsigned long lastButtonPress = 0;</p><p>#define DEBOUNCE_DELAY 300</p><p>void drawBackground(int mode) {</p><p>  switch (mode) {</p><p>    case 0: { // ฉากท้องฟ้ากลางคืนดาวกระจาย</p><p>      tft.fillScreen(TFT_NAVY);</p><p>      for (int i = 0; i &lt; 80; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        uint16_t starColor = (random(0, 10) &lt; 3) ? TFT_YELLOW : TFT_WHITE;</p><p>        tft.drawPixel(x, y, starColor);</p><p>      }</p><p>      // วาดพระจันทร์ครึ่งเสี้ยว</p><p>      tft.fillCircle(250, 50, 40, TFT_YELLOW);</p><p>      tft.fillCircle(265, 50, 40, TFT_NAVY);</p><p>      break;</p><p>    }</p><p>    case 1: { // ฉากทุ่งหญ้าสีเขียวและดอกไม้สีสดใส</p><p>      tft.fillScreen(TFT_DARKGREEN);</p><p>      // หญ้า</p><p>      for (int i = 0; i &lt; 250; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(180, 240);</p><p>        tft.drawLine(x, y, x, y - random(4, 10), TFT_GREEN);</p><p>      }</p><p>      // ดอกไม้กลมๆ สีแดงและเหลือง</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(180, 240);</p><p>        uint16_t color = (random(0, 2) == 0) ? TFT_RED : TFT_YELLOW;</p><p>        tft.fillCircle(x, y, 5, color);</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 2: { // ฉากทะเลสาบและภูเขา</p><p>      tft.fillScreen(TFT_BLUE);</p><p>      // ภูเขาสีเทา</p><p>      for (int x = 0; x &lt; 320; x += 40) {</p><p>        int peakHeight = random(80, 120);</p><p>        tft.fillTriangle(x, 180, x + 20, 180 - peakHeight, x + 40, 180, TFT_DARKGREY);</p><p>      }</p><p>      // น้ำทะเลสาบสีน้ำเงินเข้ม</p><p>      tft.fillRect(0, 180, 320, 60, TFT_BLUE);</p><p>      // ลบโค้ด drawArc เพราะไม่รองรับ</p><p>      // ถ้าต้องการใส่คลื่นน้ำง่าย ๆ ให้วาดเส้นขอบโค้งด้วย drawLine หรือ drawPixel แทน (ตรงนี้ขอข้าม)</p><p>      break;</p><p>    }</p><p>    case 3: { // ฉากเมืองตอนกลางคืน มีตึกและแสงไฟ</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      // ตึก</p><p>      for (int x = 0; x &lt; 320; x += 30) {</p><p>        int buildingHeight = random(50, 150);</p><p>        tft.fillRect(x, 240 - buildingHeight, 25, buildingHeight, TFT_DARKGREY);</p><p>        // หน้าต่างแสงไฟ</p><p>        for (int y = 240 - buildingHeight + 10; y &lt; 240; y += 20) {</p><p>          for (int wx = x + 5; wx &lt; x + 20; wx += 10) {</p><p>            if (random(0, 2)) {</p><p>              tft.fillRect(wx, y, 5, 10, TFT_YELLOW);</p><p>            }</p><p>          }</p><p>        }</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 4: { // ฉากทะเลทรายและตะวันตกดิน</p><p>      uint16_t sandColor = tft.color565(237, 201, 175);</p><p>      uint16_t skyColor = tft.color565(252, 156, 84);</p><p>      tft.fillScreen(skyColor);</p><p>      // ทะเลทราย</p><p>      tft.fillRect(0, 180, 320, 60, sandColor);</p><p>      // เนินทรายเป็นลูกคลื่น</p><p>      for (int i = 0; i &lt; 10; i++) {</p><p>        int x = i * 32;</p><p>        int y = 180 + ((i % 2) ? 20 : 10);</p><p>        tft.fillCircle(x, y, 30, sandColor);</p><p>      }</p><p>      // ดวงอาทิตย์ตก</p><p>      tft.fillCircle(280, 160, 40, TFT_ORANGE);</p><p>      break;</p><p>    }</p><p>    case 5: { // ฉากป่าไม้ยามเช้า</p><p>      tft.fillScreen(tft.color565(180, 230, 180)); // ฟ้าสีเขียวอมฟ้าอ่อน</p><p>      // ต้นไม้หลายต้น</p><p>      for (int i = 0; i &lt; 12; i++) {</p><p>        int x = i * 27 + 10;</p><p>        int trunkHeight = 40;</p><p>        int trunkY = 200;</p><p>        tft.fillRect(x + 10, trunkY - trunkHeight, 10, trunkHeight, TFT_BROWN);</p><p>        tft.fillCircle(x + 15, trunkY - trunkHeight, 25, TFT_GREEN);</p><p>      }</p><p>      // แสงแดดลอดผ่านใบไม้</p><p>      for (int i = 0; i &lt; 6; i++) {</p><p>        int x = i * 53 + 20;</p><p>        int y = 180;</p><p>        tft.fillCircle(x, y, 10, TFT_YELLOW);</p><p>      }</p><p>      break;</p><p>    }</p><p>  }</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  drawBackground(backgroundMode);</p><p>}</p><p>void loop() {</p><p>  if (!digitalRead(WIO_KEY_A)) {</p><p>    unsigned long now = millis();</p><p>    if (now - lastButtonPress &gt; DEBOUNCE_DELAY) {</p><p>      backgroundMode = (backgroundMode + 1) % 6;</p><p>      drawBackground(backgroundMode);</p><p>      lastButtonPress = now;</p><p>    }</p><p>  }</p><p>  delay(50);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1gFH_2yiqbeiCMIUTmCb7YVsAbeTG9Wri/view?usp=drive_web" />
         <pubDate>2025-08-08 08:13:32 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538475956</guid>
      </item>
      <item>
         <title></title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538477357</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;SPI.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>TFT_eSprite sprite = TFT_eSprite(&amp;tft);  // สร้าง sprite สำหรับลูกบอล</p><p>#define TOTAL_SCENES 6</p><p>int currentScene = 0;</p><p>bool lastCState = HIGH;</p><p>// ลูกบอลหลายลูก</p><p>#define BALL_COUNT 5</p><p>int ballX[BALL_COUNT];</p><p>int ballY[BALL_COUNT];</p><p>int ballRadius = 10;</p><p>int ballSpeed = 3;</p><p>// ผู้เล่น</p><p>int playerX = 160;</p><p>const int playerY = 220;</p><p>const int playerWidth = 30;</p><p>const int playerHeight = 10;</p><p>const int playerSpeed = 5;</p><p>// ปุ่ม</p><p>#define BTN_LEFT  WIO_5S_LEFT</p><p>#define BTN_RIGHT WIO_5S_RIGHT</p><p>#define BTN_SCENE WIO_KEY_C</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  pinMode(BTN_SCENE, INPUT_PULLUP);</p><p>  pinMode(BTN_LEFT, INPUT_PULLUP);</p><p>  pinMode(BTN_RIGHT, INPUT_PULLUP);</p><p>  sprite.createSprite(320, 240); // ขนาดเท่าหน้าจอ</p><p>  // เริ่มต้นตำแหน่งลูกบอลแบบสุ่ม</p><p>  for (int i = 0; i &lt; BALL_COUNT; i++) {</p><p>    ballX[i] = random(ballRadius, 320 - ballRadius);</p><p>    ballY[i] = random(-200, 0);</p><p>  }</p><p>  drawScene(currentScene);</p><p>}</p><p>void loop() {</p><p>  bool cPressed = (digitalRead(BTN_SCENE) == LOW);</p><p>  if (cPressed &amp;&amp; lastCState == HIGH) {</p><p>    currentScene = (currentScene + 1) % TOTAL_SCENES;</p><p>    drawScene(currentScene);</p><p>    // รีเซ็ตลูกบอลและผู้เล่น</p><p>    for (int i = 0; i &lt; BALL_COUNT; i++) {</p><p>      ballX[i] = random(ballRadius, 320 - ballRadius);</p><p>      ballY[i] = random(-200, 0);</p><p>    }</p><p>    playerX = 160;</p><p>    delay(200);</p><p>  }</p><p>  lastCState = !cPressed ? HIGH : LOW;</p><p>  // วาดฉากลง sprite</p><p>  drawSceneToSprite(currentScene);</p><p>  // อัปเดตตำแหน่งผู้เล่น</p><p>  if (digitalRead(BTN_LEFT) == LOW) {</p><p>    playerX -= playerSpeed;</p><p>    if (playerX &lt; 0) playerX = 0;</p><p>  }</p><p>  if (digitalRead(BTN_RIGHT) == LOW) {</p><p>    playerX += playerSpeed;</p><p>    if (playerX &gt; 320 - playerWidth) playerX = 320 - playerWidth;</p><p>  }</p><p>  // เคลื่อนที่ลูกบอลหลายลูกและตรวจสอบชน</p><p>  for (int i = 0; i &lt; BALL_COUNT; i++) {</p><p>    ballY[i] += ballSpeed;</p><p>    if (ballY[i] &gt; 240 - ballRadius) {</p><p>      ballY[i] = random(-100, 0);</p><p>      ballX[i] = random(ballRadius, 320 - ballRadius);</p><p>    }</p><p>    // ตรวจสอบการชนกับผู้เล่น</p><p>    if (ballY[i] + ballRadius &gt;= playerY &amp;&amp;</p><p>        ballX[i] + ballRadius &gt;= playerX &amp;&amp;</p><p>        ballX[i] - ballRadius &lt;= playerX + playerWidth) {</p><p>      gameOver();</p><p>      return;</p><p>    }</p><p>    // วาดลูกบอล</p><p>    sprite.fillCircle(ballX[i], ballY[i], ballRadius, TFT_WHITE);</p><p>  }</p><p>  // วาดผู้เล่น</p><p>  sprite.fillRect(playerX, playerY, playerWidth, playerHeight, TFT_RED);</p><p>  // แสดง sprite บนหน้าจอจริง</p><p>  sprite.pushSprite(0, 0);</p><p>  delay(30);</p><p>}</p><p>void gameOver() {</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_RED);</p><p>  tft.setTextSize(3);</p><p>  tft.setCursor(60, 100);</p><p>  tft.println("GAME OVER");</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(40, 150);</p><p>  tft.println("Press C to Restart");</p><p>  while (true) {</p><p>    if (digitalRead(BTN_SCENE) == LOW) {</p><p>      delay(200);</p><p>      // รีเซ็ตลูกบอลและผู้เล่น</p><p>      for (int i = 0; i &lt; BALL_COUNT; i++) {</p><p>        ballX[i] = random(ballRadius, 320 - ballRadius);</p><p>        ballY[i] = random(-200, 0);</p><p>      }</p><p>      playerX = 160;</p><p>      drawScene(currentScene);</p><p>      break;</p><p>    }</p><p>  }</p><p>}</p><p>// วาดฉากพื้นหลังลง sprite (ไม่วาดบนหน้าจอโดยตรง)</p><p>void drawSceneToSprite(int scene) {</p><p>  sprite.fillSprite(getBackgroundColor(scene));</p><p>  switch (scene) {</p><p>    case 0: // น้ำตก</p><p>      sprite.fillTriangle(50, 180, 120, 80, 190, 180, TFT_DARKGREEN);</p><p>      sprite.fillTriangle(60, 180, 130, 90, 200, 180, TFT_GREEN);</p><p>      sprite.fillRect(110, 80, 20, 100, TFT_CYAN);</p><p>      for (int y = 80; y &lt; 180; y += 10)</p><p>        sprite.drawLine(110, y, 130, y + 5, TFT_WHITE);</p><p>      sprite.fillCircle(40, 160, 15, TFT_DARKGREEN);</p><p>      sprite.fillCircle(210, 160, 15, TFT_DARKGREEN);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Waterfall");</p><p>      break;</p><p>    case 1: // ทะเล</p><p>      sprite.fillRect(0, 140, 320, 100, TFT_BLUE);</p><p>      sprite.fillRect(0, 220, 320, 20, TFT_YELLOW);</p><p>      sprite.fillTriangle(140, 170, 180, 170, 160, 140, TFT_RED);</p><p>      sprite.drawLine(160, 140, 160, 110, TFT_MAROON);</p><p>      sprite.drawRect(150, 170, 20, 10, TFT_BLACK);</p><p>      for (int x = 0; x &lt; 320; x += 20) {</p><p>        sprite.drawCircle(x, 140, 15, TFT_WHITE);</p><p>        sprite.fillRect(x - 15, 140, 30, 15, TFT_BLUE);</p><p>      }</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Sea");</p><p>      break;</p><p>    case 2: // ภูเขา</p><p>      sprite.fillTriangle(100, 200, 160, 80, 220, 200, TFT_DARKGREY);</p><p>      sprite.fillTriangle(120, 190, 160, 100, 200, 190, TFT_GREEN);</p><p>      sprite.fillTriangle(140, 90, 160, 80, 180, 90, TFT_WHITE);</p><p>      for (int x = 30; x &lt;= 280; x += 50) {</p><p>        sprite.fillTriangle(x, 200, x + 15, 170, x + 30, 200, TFT_GREEN);</p><p>        sprite.fillRect(x + 12, 200, 6, 10, TFT_MAROON);</p><p>      }</p><p>      sprite.setTextColor(TFT_BLACK);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Mountain");</p><p>      break;</p><p>    case 3: // พระอาทิตย์ขึ้น</p><p>      for (int y = 0; y &lt; 240; y++) {</p><p>        uint16_t color = tft.color565(</p><p>          map(y, 0, 239, 255, 255),</p><p>          map(y, 0, 239, 94, 182),</p><p>          map(y, 0, 239, 19, 193)</p><p>        );</p><p>        sprite.drawFastHLine(0, y, 320, color);</p><p>      }</p><p>      sprite.fillCircle(160, 230, 40, TFT_ORANGE);</p><p>      sprite.fillCircle(160, 230, 30, TFT_YELLOW);</p><p>      sprite.fillTriangle(0, 240, 80, 180, 160, 240, TFT_DARKGREY);</p><p>      sprite.fillTriangle(160, 240, 240, 180, 320, 240, TFT_DARKGREY);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Sunrise");</p><p>      break;</p><p>    case 4: // ป่า</p><p>      sprite.fillRect(150, 140, 20, 60, TFT_MAROON);</p><p>      sprite.fillCircle(160, 120, 40, TFT_GREEN);</p><p>      sprite.fillTriangle(90, 180, 110, 130, 130, 180, TFT_GREEN);</p><p>      sprite.fillRect(105, 180, 10, 20, TFT_MAROON);</p><p>      sprite.fillTriangle(210, 180, 230, 130, 250, 180, TFT_GREEN);</p><p>      sprite.fillRect(225, 180, 10, 20, TFT_MAROON);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Forest");</p><p>      break;</p><p>    case 5: // ท้องฟ้ายามค่ำคืน</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        sprite.drawPixel(x, y, TFT_WHITE);</p><p>      }</p><p>      sprite.fillCircle(250, 70, 30, TFT_WHITE);</p><p>      sprite.fillCircle(265, 70, 30, getBackgroundColor(scene));</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Night Sky");</p><p>      break;</p><p>  }</p><p>}</p><p>uint16_t getBackgroundColor(int scene) {</p><p>  switch (scene) {</p><p>    case 0: return TFT_BLUE;</p><p>    case 1: return TFT_BLUE;</p><p>    case 2: return TFT_LIGHTGREY;</p><p>    case 3: return tft.color565(255, 182, 193);</p><p>    case 4: return TFT_DARKCYAN;</p><p>    case 5: return TFT_BLUE;</p><p>    default: return TFT_BLACK;</p><p>  }</p><p>}</p><p>void drawScene(int scene) {</p><p>  drawSceneToSprite(scene);</p><p>  sprite.pushSprite(0, 0);</p><p>}</p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1Kogtq4sXhAVKCFz8Ue_wXB6Jw2GAUFAL/view?usp=sharing" />
         <pubDate>2025-08-08 08:16:44 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538477357</guid>
      </item>
      <item>
         <title>นาย ธรรมนูญ วิชชาธาร</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538481672</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;  // ไลบรารีควบคุมจอ LCD</p><p>TFT_eSPI tft;</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า</p><p>  // --- ใบหน้าฟ้า ---</p><p>  tft.fillCircle(160, 120, 100, TFT_BLUE); // วงกลมฟ้าใหญ่</p><p>  // --- แก้มขาว ---</p><p>  tft.fillCircle(160, 140, 80, TFT_WHITE); // วงกลมขาวใหญ่ด้านล่าง</p><p>  // --- ปากแดง ---</p><p>  tft.fillCircle(160, 180, 40, TFT_RED);   // ปากสีแดง</p><p>  // เส้นแบ่งปาก</p><p>  tft.drawLine(160, 140, 160, 200, TFT_BLACK);</p><p>  // --- จมูกแดง ---</p><p>  tft.fillCircle(160, 100, 12, TFT_RED);</p><p>  tft.drawCircle(160, 100, 12, TFT_BLACK);</p><p>  // เส้นตั้งจากจมูกลงปาก</p><p>  tft.drawLine(160, 112, 160, 140, TFT_BLACK);</p><p>  // --- ตา ---</p><p>  // ตาขาวซ้าย</p><p>  tft.fillCircle(140, 60, 25, TFT_WHITE);</p><p>  tft.drawCircle(140, 60, 25, TFT_BLACK);</p><p>  // ตาขาวขวา</p><p>  tft.fillCircle(180, 60, 25, TFT_WHITE);</p><p>  tft.drawCircle(180, 60, 25, TFT_BLACK);</p><p>  // ลูกตาดำ</p><p>  tft.fillCircle(140, 60, 8, TFT_BLACK);</p><p>  tft.fillCircle(180, 60, 8, TFT_BLACK);</p><p>  // --- หนวด ---</p><p>  // ซ้าย</p><p>  tft.drawLine(80, 100, 130, 90, TFT_BLACK);</p><p>  tft.drawLine(80, 115, 130, 110, TFT_BLACK);</p><p>  tft.drawLine(80, 130, 130, 130, TFT_BLACK);</p><p>  // ขวา</p><p>  tft.drawLine(190, 90, 240, 100, TFT_BLACK);</p><p>  tft.drawLine(190, 110, 240, 115, TFT_BLACK);</p><p>  tft.drawLine(190, 130, 240, 130, TFT_BLACK);</p><p>  // --- กระดิ่ง ---</p><p>  tft.fillCircle(160, 220, 15, TFT_YELLOW);</p><p>  tft.drawCircle(160, 220, 15, TFT_BLACK);</p><p>  tft.drawLine(150, 220, 170, 220, TFT_BLACK);</p><p>  tft.fillCircle(160, 225, 4, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  // ไม่มีการเคลื่อนไหว</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4203132621/f4a649c8cf9996ffdf5b0ce6a4e14fa0/image.png" />
         <pubDate>2025-08-08 08:24:28 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538481672</guid>
      </item>
      <item>
         <title>นาย ธีรวัฒน์ สิงห์โตงาม</title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538482560</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;SPI.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>TFT_eSprite sprite = TFT_eSprite(&amp;tft);</p><p>#define TOTAL_SCENES 6</p><p>int currentScene = 0;</p><p>bool lastCState = HIGH;</p><p>#define BTN_SCENE WIO_KEY_C</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  pinMode(BTN_SCENE, INPUT_PULLUP);</p><p>  sprite.createSprite(320, 240);</p><p>  drawScene(currentScene);</p><p>}</p><p>void loop() {</p><p>  bool cPressed = (digitalRead(BTN_SCENE) == LOW);</p><p>  if (cPressed &amp;&amp; lastCState == HIGH) {</p><p>    currentScene = (currentScene + 1) % TOTAL_SCENES;</p><p>    drawScene(currentScene);</p><p>    delay(200); // ดีเลย์เพื่อไม่ให้เลื่อนเร็วเกิน</p><p>  }</p><p>  lastCState = !cPressed ? HIGH : LOW;</p><p>}</p><p>// วาดฉากพื้นหลังลง sprite แล้วแสดงบนหน้าจอ</p><p>void drawScene(int scene) {</p><p>  drawSceneToSprite(scene);</p><p>  sprite.pushSprite(0, 0);</p><p>}</p><p>void drawSceneToSprite(int scene) {</p><p>  sprite.fillSprite(getBackgroundColor(scene));</p><p>  switch (scene) {</p><p>    case 0: // น้ำตก</p><p>      sprite.fillTriangle(50, 180, 120, 80, 190, 180, TFT_DARKGREEN);</p><p>      sprite.fillTriangle(60, 180, 130, 90, 200, 180, TFT_GREEN);</p><p>      sprite.fillRect(110, 80, 20, 100, TFT_CYAN);</p><p>      for (int y = 80; y &lt; 180; y += 10)</p><p>        sprite.drawLine(110, y, 130, y + 5, TFT_WHITE);</p><p>      sprite.fillCircle(40, 160, 15, TFT_DARKGREEN);</p><p>      sprite.fillCircle(210, 160, 15, TFT_DARKGREEN);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Waterfall");</p><p>      break;</p><p>    case 1: // ทะเล</p><p>      sprite.fillRect(0, 140, 320, 100, TFT_BLUE);</p><p>      sprite.fillRect(0, 220, 320, 20, TFT_YELLOW);</p><p>      sprite.fillTriangle(140, 170, 180, 170, 160, 140, TFT_RED);</p><p>      sprite.drawLine(160, 140, 160, 110, TFT_MAROON);</p><p>      sprite.drawRect(150, 170, 20, 10, TFT_BLACK);</p><p>      for (int x = 0; x &lt; 320; x += 20) {</p><p>        sprite.drawCircle(x, 140, 15, TFT_WHITE);</p><p>        sprite.fillRect(x - 15, 140, 30, 15, TFT_BLUE);</p><p>      }</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Sea");</p><p>      break;</p><p>    case 2: // ภูเขา</p><p>      sprite.fillTriangle(100, 200, 160, 80, 220, 200, TFT_DARKGREY);</p><p>      sprite.fillTriangle(120, 190, 160, 100, 200, 190, TFT_GREEN);</p><p>      sprite.fillTriangle(140, 90, 160, 80, 180, 90, TFT_WHITE);</p><p>      for (int x = 30; x &lt;= 280; x += 50) {</p><p>        sprite.fillTriangle(x, 200, x + 15, 170, x + 30, 200, TFT_GREEN);</p><p>        sprite.fillRect(x + 12, 200, 6, 10, TFT_MAROON);</p><p>      }</p><p>      sprite.setTextColor(TFT_BLACK);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Mountain");</p><p>      break;</p><p>    case 3: // พระอาทิตย์ขึ้น</p><p>      for (int y = 0; y &lt; 240; y++) {</p><p>        uint16_t color = tft.color565(</p><p>          map(y, 0, 239, 255, 255),</p><p>          map(y, 0, 239, 94, 182),</p><p>          map(y, 0, 239, 19, 193)</p><p>        );</p><p>        sprite.drawFastHLine(0, y, 320, color);</p><p>      }</p><p>      sprite.fillCircle(160, 230, 40, TFT_ORANGE);</p><p>      sprite.fillCircle(160, 230, 30, TFT_YELLOW);</p><p>      sprite.fillTriangle(0, 240, 80, 180, 160, 240, TFT_DARKGREY);</p><p>      sprite.fillTriangle(160, 240, 240, 180, 320, 240, TFT_DARKGREY);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Sunrise");</p><p>      break;</p><p>    case 4: // ป่า</p><p>      sprite.fillRect(150, 140, 20, 60, TFT_MAROON);</p><p>      sprite.fillCircle(160, 120, 40, TFT_GREEN);</p><p>      sprite.fillTriangle(90, 180, 110, 130, 130, 180, TFT_GREEN);</p><p>      sprite.fillRect(105, 180, 10, 20, TFT_MAROON);</p><p>      sprite.fillTriangle(210, 180, 230, 130, 250, 180, TFT_GREEN);</p><p>      sprite.fillRect(225, 180, 10, 20, TFT_MAROON);</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Forest");</p><p>      break;</p><p>    case 5: // ท้องฟ้ายามค่ำคืน</p><p>      // วาดดาวแบบสุ่มแค่ครั้งเดียวจะสวยกว่า (แก้เองได้ถ้าต้องการ)</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(0, 240);</p><p>        sprite.drawPixel(x, y, TFT_WHITE);</p><p>      }</p><p>      sprite.fillCircle(250, 70, 30, TFT_WHITE);</p><p>      sprite.fillCircle(265, 70, 30, getBackgroundColor(scene));</p><p>      sprite.setTextColor(TFT_WHITE);</p><p>      sprite.setTextSize(2);</p><p>      sprite.setCursor(10, 10);</p><p>      sprite.print("Night Sky");</p><p>      break;</p><p>  }</p><p>}</p><p>uint16_t getBackgroundColor(int scene) {</p><p>  switch (scene) {</p><p>    case 0: return TFT_BLUE;</p><p>    case 1: return TFT_BLUE;</p><p>    case 2: return TFT_LIGHTGREY;</p><p>    case 3: return tft.color565(255, 182, 193);</p><p>    case 4: return TFT_DARKCYAN;</p><p>    case 5: return TFT_BLUE;</p><p>    default: return TFT_BLACK;</p><p>  }</p><p>}</p><p><br></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1OFVUtfxhmcdNv9JDDe0JGHoBOn7wEb29/view?usp=sharing" />
         <pubDate>2025-08-08 08:26:19 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538482560</guid>
      </item>
      <item>
         <title>นาย ธรรมนูญ วิชชาธาร</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538486300</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>#define SCREEN_WIDTH 320</p><p>#define SCREEN_HEIGHT 240</p><p>#define TILE_SIZE 10</p><p>#define MAX_LENGTH 100</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>int snakeX[MAX_LENGTH];</p><p>int snakeY[MAX_LENGTH];</p><p>int snakeLength = 5;</p><p>int dirX = 1, dirY = 0;</p><p>int foodX, foodY;</p><p>int score = 0;</p><p>unsigned long lastMoveTime = 0;</p><p>const unsigned long moveInterval = 150;  // ความเร็วงู</p><p>bool isPaused = false;</p><p>bool isGameOver = false;</p><p>// --- สีพื้นหลัง 6 สี ---</p><p>uint16_t bgColors[6] = {TFT_BLACK, TFT_NAVY, TFT_DARKGREEN, TFT_MAROON, TFT_PURPLE, TFT_ORANGE};</p><p>int bgColorIndex = 0;</p><p>void spawnFood() {</p><p>  foodX = random(0, SCREEN_WIDTH / TILE_SIZE) * TILE_SIZE;</p><p>  foodY = random(2, SCREEN_HEIGHT / TILE_SIZE) * TILE_SIZE;</p><p>}</p><p>void drawGame() {</p><p>  tft.fillScreen(bgColors[bgColorIndex]); // ใช้สีพื้นหลังตาม index</p><p>  // วาดแต้ม</p><p>  tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);</p><p>  tft.setCursor(5, 0);</p><p>  tft.printf("Score: %d", score);</p><p>  // วาดอาหาร</p><p>  tft.fillRect(foodX, foodY, TILE_SIZE, TILE_SIZE, TFT_YELLOW);</p><p>  // วาดงู</p><p>  for (int i = 0; i &lt; snakeLength; i++) {</p><p>    tft.fillRect(snakeX[i], snakeY[i], TILE_SIZE, TILE_SIZE, i == 0 ? TFT_BLUE : TFT_CYAN);</p><p>  }</p><p>}</p><p>void drawGameOver() {</p><p>  tft.fillScreen(bgColors[bgColorIndex]);</p><p>  tft.setTextColor(TFT_RED, bgColors[bgColorIndex]);</p><p>  tft.setTextSize(2);</p><p>  String msg = "Game Over!";</p><p>  int msgWidth = msg.length() * 12;</p><p>  int x = (SCREEN_WIDTH - msgWidth) / 2;</p><p>  int y = SCREEN_HEIGHT / 2 - 16;</p><p>  tft.setCursor(x, y);</p><p>  tft.println(msg);</p><p>  tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);</p><p>  tft.setTextSize(1);</p><p>  String scoreMsg = "Score: " + String(score);</p><p>  int scoreWidth = scoreMsg.length() * 6;</p><p>  int scoreX = (SCREEN_WIDTH - scoreWidth) / 2;</p><p>  tft.setCursor(scoreX, y + 30);</p><p>  tft.println(scoreMsg);</p><p>}</p><p>void resetGame() {</p><p>  snakeLength = 5;</p><p>  for (int i = 0; i &lt; snakeLength; i++) {</p><p>    snakeX[i] = 50 - i * TILE_SIZE;</p><p>    snakeY[i] = 100;</p><p>  }</p><p>  dirX = 1;</p><p>  dirY = 0;</p><p>  score = 0;</p><p>  isPaused = false;</p><p>  isGameOver = false;</p><p>  spawnFood();</p><p>  drawGame();</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);  // เปลี่ยนสีพื้นหลัง</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);  // เริ่มเกมใหม่</p><p>  resetGame();</p><p>}</p><p>void loop() {</p><p>  // ปุ่ม C: เปลี่ยนสีพื้นหลัง</p><p>  static bool prevC = HIGH;</p><p>  bool currC = digitalRead(WIO_KEY_C);</p><p>  if (prevC <mark> HIGH &amp;&amp; currC </mark> LOW) {</p><p>    bgColorIndex = (bgColorIndex + 1) % 6; // วนสี</p><p>    drawGame();</p><p>  }</p><p>  prevC = currC;</p><p>  // ปุ่ม B: เริ่มเกมใหม่หลังเกมจบ</p><p>  static bool prevB = HIGH;</p><p>  bool currB = digitalRead(WIO_KEY_B);</p><p>  if (prevB <mark> HIGH &amp;&amp; currB </mark> LOW) {</p><p>    resetGame();</p><p>  }</p><p>  prevB = currB;</p><p>  if (isPaused || isGameOver) {</p><p>    delay(50);</p><p>    return;</p><p>  }</p><p>  // ควบคุมทิศทางงู</p><p>  if (!digitalRead(WIO_5S_LEFT) &amp;&amp; dirX != 1) {</p><p>    dirX = -1; dirY = 0;</p><p>  } else if (!digitalRead(WIO_5S_RIGHT) &amp;&amp; dirX != -1) {</p><p>    dirX = 1; dirY = 0;</p><p>  } else if (!digitalRead(WIO_5S_UP) &amp;&amp; dirY != 1) {</p><p>    dirX = 0; dirY = -1;</p><p>  } else if (!digitalRead(WIO_5S_DOWN) &amp;&amp; dirY != -1) {</p><p>    dirX = 0; dirY = 1;</p><p>  }</p><p>  unsigned long now = millis();</p><p>  if (now - lastMoveTime &gt; moveInterval) {</p><p>    lastMoveTime = now;</p><p>    // เลื่อนงู</p><p>    for (int i = snakeLength - 1; i &gt; 0; i--) {</p><p>      snakeX[i] = snakeX[i - 1];</p><p>      snakeY[i] = snakeY[i - 1];</p><p>    }</p><p>    snakeX[0] += dirX * TILE_SIZE;</p><p>    snakeY[0] += dirY * TILE_SIZE;</p><p>    // ชนขอบจอ</p><p>    if (snakeX[0] &lt; 0 || snakeX[0] &gt;= SCREEN_WIDTH ||</p><p>        snakeY[0] &lt; 0 || snakeY[0] &gt;= SCREEN_HEIGHT) {</p><p>      isGameOver = true;</p><p>      drawGameOver();</p><p>      return;</p><p>    }</p><p>    // ชนตัวเอง</p><p>    for (int i = 1; i &lt; snakeLength; i++) {</p><p>      if (snakeX[0] <mark> snakeX[i] &amp;&amp; snakeY[0] </mark> snakeY[i]) {</p><p>        isGameOver = true;</p><p>        drawGameOver();</p><p>        return;</p><p>      }</p><p>    }</p><p>    // กินอาหาร</p><p>    if (snakeX[0] <mark> foodX &amp;&amp; snakeY[0] </mark> foodY) {</p><p>      if (snakeLength &lt; MAX_LENGTH) snakeLength++;</p><p>      score++;</p><p>      spawnFood();</p><p>    }</p><p>    drawGame();</p><p>  }</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4203132621/b3514d434d2159b833023050d8c50efb/776334755_376069.mp4" />
         <pubDate>2025-08-08 08:33:49 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538486300</guid>
      </item>
      <item>
         <title>นาย ธรรมนูญ วิชชาธาร</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538486637</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>#define SCREEN_WIDTH 320</p><p>#define SCREEN_HEIGHT 240</p><p>#define TILE_SIZE 10</p><p>#define MAX_LENGTH 100</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>int snakeX[MAX_LENGTH];</p><p>int snakeY[MAX_LENGTH];</p><p>int snakeLength = 5;</p><p>int dirX = 1, dirY = 0;</p><p>int foodX, foodY;</p><p>int score = 0;</p><p>unsigned long lastMoveTime = 0;</p><p>const unsigned long moveInterval = 150;  // ความเร็วงู</p><p>bool isPaused = false;</p><p>bool isGameOver = false;</p><p>// --- สีพื้นหลัง 6 สี ---</p><p>uint16_t bgColors[6] = {TFT_BLACK, TFT_NAVY, TFT_DARKGREEN, TFT_MAROON, TFT_PURPLE, TFT_ORANGE};</p><p>int bgColorIndex = 0;</p><p>void spawnFood() {</p><p>  foodX = random(0, SCREEN_WIDTH / TILE_SIZE) * TILE_SIZE;</p><p>  foodY = random(2, SCREEN_HEIGHT / TILE_SIZE) * TILE_SIZE;</p><p>}</p><p>void drawGame() {</p><p>  tft.fillScreen(bgColors[bgColorIndex]); // ใช้สีพื้นหลังตาม index</p><p>  // วาดแต้ม</p><p>  tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);</p><p>  tft.setCursor(5, 0);</p><p>  tft.printf("Score: %d", score);</p><p>  // วาดอาหาร</p><p>  tft.fillRect(foodX, foodY, TILE_SIZE, TILE_SIZE, TFT_YELLOW);</p><p>  // วาดงู</p><p>  for (int i = 0; i &lt; snakeLength; i++) {</p><p>    tft.fillRect(snakeX[i], snakeY[i], TILE_SIZE, TILE_SIZE, i == 0 ? TFT_BLUE : TFT_CYAN);</p><p>  }</p><p>}</p><p>void drawGameOver() {</p><p>  tft.fillScreen(bgColors[bgColorIndex]);</p><p>  tft.setTextColor(TFT_RED, bgColors[bgColorIndex]);</p><p>  tft.setTextSize(2);</p><p>  String msg = "Game Over!";</p><p>  int msgWidth = msg.length() * 12;</p><p>  int x = (SCREEN_WIDTH - msgWidth) / 2;</p><p>  int y = SCREEN_HEIGHT / 2 - 16;</p><p>  tft.setCursor(x, y);</p><p>  tft.println(msg);</p><p>  tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);</p><p>  tft.setTextSize(1);</p><p>  String scoreMsg = "Score: " + String(score);</p><p>  int scoreWidth = scoreMsg.length() * 6;</p><p>  int scoreX = (SCREEN_WIDTH - scoreWidth) / 2;</p><p>  tft.setCursor(scoreX, y + 30);</p><p>  tft.println(scoreMsg);</p><p>}</p><p>void resetGame() {</p><p>  snakeLength = 5;</p><p>  for (int i = 0; i &lt; snakeLength; i++) {</p><p>    snakeX[i] = 50 - i * TILE_SIZE;</p><p>    snakeY[i] = 100;</p><p>  }</p><p>  dirX = 1;</p><p>  dirY = 0;</p><p>  score = 0;</p><p>  isPaused = false;</p><p>  isGameOver = false;</p><p>  spawnFood();</p><p>  drawGame();</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);  // เปลี่ยนสีพื้นหลัง</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);  // เริ่มเกมใหม่</p><p>  resetGame();</p><p>}</p><p>void loop() {</p><p>  // ปุ่ม C: เปลี่ยนสีพื้นหลัง</p><p>  static bool prevC = HIGH;</p><p>  bool currC = digitalRead(WIO_KEY_C);</p><p>  if (prevC <mark> HIGH &amp;&amp; currC </mark> LOW) {</p><p>    bgColorIndex = (bgColorIndex + 1) % 6; // วนสี</p><p>    drawGame();</p><p>  }</p><p>  prevC = currC;</p><p>  // ปุ่ม B: เริ่มเกมใหม่หลังเกมจบ</p><p>  static bool prevB = HIGH;</p><p>  bool currB = digitalRead(WIO_KEY_B);</p><p>  if (prevB <mark> HIGH &amp;&amp; currB </mark> LOW) {</p><p>    resetGame();</p><p>  }</p><p>  prevB = currB;</p><p>  if (isPaused || isGameOver) {</p><p>    delay(50);</p><p>    return;</p><p>  }</p><p>  // ควบคุมทิศทางงู</p><p>  if (!digitalRead(WIO_5S_LEFT) &amp;&amp; dirX != 1) {</p><p>    dirX = -1; dirY = 0;</p><p>  } else if (!digitalRead(WIO_5S_RIGHT) &amp;&amp; dirX != -1) {</p><p>    dirX = 1; dirY = 0;</p><p>  } else if (!digitalRead(WIO_5S_UP) &amp;&amp; dirY != 1) {</p><p>    dirX = 0; dirY = -1;</p><p>  } else if (!digitalRead(WIO_5S_DOWN) &amp;&amp; dirY != -1) {</p><p>    dirX = 0; dirY = 1;</p><p>  }</p><p>  unsigned long now = millis();</p><p>  if (now - lastMoveTime &gt; moveInterval) {</p><p>    lastMoveTime = now;</p><p>    // เลื่อนงู</p><p>    for (int i = snakeLength - 1; i &gt; 0; i--) {</p><p>      snakeX[i] = snakeX[i - 1];</p><p>      snakeY[i] = snakeY[i - 1];</p><p>    }</p><p>    snakeX[0] += dirX * TILE_SIZE;</p><p>    snakeY[0] += dirY * TILE_SIZE;</p><p>    // ชนขอบจอ</p><p>    if (snakeX[0] &lt; 0 || snakeX[0] &gt;= SCREEN_WIDTH ||</p><p>        snakeY[0] &lt; 0 || snakeY[0] &gt;= SCREEN_HEIGHT) {</p><p>      isGameOver = true;</p><p>      drawGameOver();</p><p>      return;</p><p>    }</p><p>    // ชนตัวเอง</p><p>    for (int i = 1; i &lt; snakeLength; i++) {</p><p>      if (snakeX[0] <mark> snakeX[i] &amp;&amp; snakeY[0] </mark> snakeY[i]) {</p><p>        isGameOver = true;</p><p>        drawGameOver();</p><p>        return;</p><p>      }</p><p>    }</p><p>    // กินอาหาร</p><p>    if (snakeX[0] <mark> foodX &amp;&amp; snakeY[0] </mark> foodY) {</p><p>      if (snakeLength &lt; MAX_LENGTH) snakeLength++;</p><p>      score++;</p><p>      spawnFood();</p><p>    }</p><p>    drawGame();</p><p>  }</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4203132621/ceb22c9e4cc8978ef6074df8b93253cd/776334755_376069.mp4" />
         <pubDate>2025-08-08 08:34:38 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538486637</guid>
      </item>
      <item>
         <title>นาย ธรรมนูญ วิชชาธาร 4.1 4.2 4.3</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538491180</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;DHT.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#define DHTPIN 0</p><p>#define DHTTYPE DHT11</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>DHT dht(DHTPIN, DHTTYPE);</p><p>BH1750 lightMeter;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  dht.begin();</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>  delay(200);</p><p>  </p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  float temp = dht.readTemperature();</p><p>  float humi = dht.readHumidity();</p><p>  float lux = lightMeter.readLightLevel();</p><p>  Serial.print("Lux: ");</p><p>  Serial.println(lux);</p><p>  if (lux &lt; 0 || lux &gt; 65535) {</p><p>    lux = 0;</p><p>  }</p><p>  tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ</p><p>  if (isnan(temp) || isnan(humi) || isnan(lux)) {</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_RED, TFT_BLACK);</p><p>    tft.drawString("Sensor Error!", 80, 110);</p><p>  } else {</p><p>    // -------- ส่วนบน: Temperature &amp; Humidity --------</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>    tft.drawString("Temp", 40, 10);</p><p>    tft.drawString("Humidity", 190, 10);</p><p>    tft.setTextSize(4);</p><p>    tft.setCursor(30, 40);</p><p>    tft.printf("%.0f C", temp);</p><p>    tft.setCursor(180, 40);</p><p>    tft.printf("%.0f %%", humi);</p><p>    // -------- ส่วนล่าง: Light --------</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Light Level", 100, 135);</p><p>    tft.setTextSize(6);</p><p>    tft.setCursor(110, 160);</p><p>    tft.printf("%.0f ", lux);</p><p>  }</p><p>  delay(1000);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4203132621/2b8fe16d2f3b74df038ba0cf836964ad/S__13664259.jpg" />
         <pubDate>2025-08-08 08:43:16 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538491180</guid>
      </item>
      <item>
         <title>ธรรมนูญ วิชชาธาร</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538493083</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft;</p><p>#define SW_A BCM0  // เพิ่มวินาที ต่อเข้า SW6</p><p>#define SW_B BCM1  // เพิ่มนาที ต่อเข้า SW7</p><p>#define SW_C BCM2  // Start / Stop / Reset ต่อเข้า SW5</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>int seconds = 0;</p><p>int minutes = 0;</p><p>bool running = false;</p><p>bool finished = false;</p><p>unsigned long lastMillis = 0;</p><p>void setup() {</p><p>  pinMode(SW_A, INPUT);</p><p>  pinMode(SW_B, INPUT);</p><p>  pinMode(SW_C, INPUT);</p><p>  pinMode(BUZZER_PIN, OUTPUT);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_WHITE);</p><p>  drawUI();</p><p>}</p><p>void loop() {</p><p>  // ตั้งเวลา</p><p>  if (!running &amp;&amp; !finished) {</p><p>    if (digitalRead(SW_A) == LOW) {</p><p>      delay(200);</p><p>      seconds++;</p><p>      if (seconds &gt;= 60) seconds = 0;</p><p>      beep(100);</p><p>      drawUI();</p><p>    }</p><p>    if (digitalRead(SW_B) == LOW) {</p><p>      delay(200);</p><p>      minutes++;</p><p>      if (minutes &gt;= 60) minutes = 0;</p><p>      beep(100);</p><p>      drawUI();</p><p>    }</p><p>  }</p><p>  // ปุ่มเริ่ม / หยุด / รีเซ็ต</p><p>  if (digitalRead(SW_C) == LOW) {</p><p>    delay(300); // debounce</p><p>    if (!running &amp;&amp; !finished &amp;&amp; (minutes &gt; 0 || seconds &gt; 0)) {</p><p>      running = true;</p><p>      lastMillis = millis();</p><p>    } else if (running) {</p><p>      running = false;  // หยุดชั่วคราว</p><p>    } else if (finished) {</p><p>      // ติ๊ด 5 ครั้ง</p><p>      for (int i = 0; i &lt; 5; i++) {</p><p>        beep(200);</p><p>        delay(200);</p><p>      }</p><p>      finished = false;</p><p>      minutes = 0;</p><p>      seconds = 0;</p><p>      drawUI();</p><p>    }</p><p>  }</p><p>  // ทำงานเมื่อ countdown กำลังรัน</p><p>  if (running &amp;&amp; millis() - lastMillis &gt;= 1000) {</p><p>    lastMillis = millis();</p><p>    if (seconds == 0) {</p><p>      if (minutes == 0) {</p><p>        running = false;</p><p>        finished = true;</p><p>        drawUI();</p><p>        // ติ๊ด 3 ครั้ง</p><p>        for (int i = 0; i &lt; 3; i++) {</p><p>          beep(200);</p><p>          delay(200);</p><p>        }</p><p>      } else {</p><p>        minutes--;</p><p>        seconds = 59;</p><p>      }</p><p>    } else {</p><p>      seconds--;</p><p>    }</p><p>    drawUI();</p><p>  }</p><p>}</p><p>void drawUI() {</p><p>  tft.fillScreen(TFT_WHITE);</p><p>  tft.setTextColor(TFT_BLACK);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Count Down", 160, 30);</p><p>  tft.drawString("SW7 TO START/STOP", 160, 60);</p><p>  tft.drawString("SW6 &amp; SW5 TO SET TIME", 160, 85);</p><p>  // แสดงเวลา</p><p>  char timeBuf[10];</p><p>  sprintf(timeBuf, "%02d : %02d", minutes, seconds);</p><p>  tft.setTextSize(4);</p><p>  tft.drawString(timeBuf, 160, 130);</p><p>  // แสดงสถานะ</p><p>  tft.setTextSize(2);</p><p>  if (running) {</p><p>    tft.setTextColor(TFT_RED);</p><p>    tft.drawString("RUNNING", 160, 190);</p><p>  } else if (finished) {</p><p>    tft.setTextColor(TFT_BLUE);</p><p>    tft.drawString("FINISHED", 160, 190);</p><p>  } else {</p><p>    tft.setTextColor(TFT_DARKGREY);</p><p>    tft.drawString("STOP", 160, 190);</p><p>  }</p><p>}</p><p>void beep(int duration) {</p><p>  tone(BUZZER_PIN, 1500); // 1.5kHz</p><p>  delay(duration);</p><p>  noTone(BUZZER_PIN);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4203132621/2dad5edc8dffee577ba7b68bfb165795/776335576_604178.mp4" />
         <pubDate>2025-08-08 08:47:51 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538493083</guid>
      </item>
      <item>
         <title>นายธีรวัฒน์ สิงห์โตงาม</title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538499835</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;Adafruit_MLX90614.h&gt;</p><p>#include &lt;Servo.h&gt;</p><p>#include &lt;wiring_constants.h&gt;</p><p>TFT_eSPI tft;</p><p>Adafruit_MLX90614 mlx = Adafruit_MLX90614();</p><p>Servo myservo;</p><p>#define ANGLE_LEFT    0</p><p>#define ANGLE_CENTER  90</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>bool servoDone = false;  // ตัวแปรสถานะ</p><p>void buzzerBeep(int duration = 500) {</p><p>  tone(BUZZER_PIN, 2000);</p><p>  delay(duration);</p><p>  noTone(BUZZER_PIN);</p><p>  delay(duration);</p><p>  tone(BUZZER_PIN, 2000);</p><p>  delay(duration);</p><p>  noTone(BUZZER_PIN);</p><p>  delay(duration);</p><p>}</p><p>void buzzerBeepG(int duration = 200) {</p><p>  tone(BUZZER_PIN, 2000);</p><p>  delay(duration);</p><p>  noTone(BUZZER_PIN);</p><p>  delay(duration);</p><p>}</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  Wire.begin();</p><p>  mlx.begin();</p><p>  myservo.attach(BCM9);</p><p>  myservo.write(ANGLE_CENTER);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextSize(2);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.drawString("Starting...", 160, 120);</p><p>  delay(1000);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  float temp = mlx.readObjectTempC();</p><p>  if (temp &gt; 35.0) {</p><p>    // แสดงสีแดง และร้องจนกว่าจะเย็นลง</p><p>    tft.fillScreen(TFT_RED);</p><p>    tft.setTextColor(TFT_WHITE, TFT_RED);</p><p>    tft.setTextSize(3);</p><p>    tft.drawString("TEMP HIGH", 160, 80);</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);</p><p>    tft.drawString("Cooling Required", 160, 180);</p><p>    servoDone = false;  // รีเซ็ตสถานะเมื่อร้อน</p><p>    buzzerBeep();</p><p>  } else {</p><p>    // สีเขียว</p><p>    tft.fillScreen(TFT_GREEN);</p><p>    tft.setTextColor(TFT_BLACK, TFT_GREEN);</p><p>    tft.setTextSize(3);</p><p>    tft.drawString("TEMP NORMAL", 160, 80);</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);</p><p>    tft.drawString("Safe", 160, 180);</p><p> buzzerBeepG();</p><p>    // ให้ Servo ทำงานแค่ครั้งเดียว</p><p>    if (!servoDone) {</p><p>      myservo.write(ANGLE_LEFT);</p><p>      delay(2000);</p><p>      myservo.write(ANGLE_CENTER);</p><p>      delay(2000);</p><p>      servoDone = true;  // บันทึกว่าทำงานแล้ว</p><p>    }</p><p>  }</p><p>  delay(1000);  // หน่วงเวลา 1 วินาที</p><p>  </p><p>}</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202983792/fcaa10185e2765f6171f3ec5c71cfae0/3652.jpg" />
         <pubDate>2025-08-08 09:02:38 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538499835</guid>
      </item>
      <item>
         <title>นายธีรวัฒน์ สิงห์โตงาม</title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538500983</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;wiring_constants.h&gt;</p><p>TFT_eSPI tft;</p><p>// ปุ่ม</p><p>#define SW1_PIN BCM4</p><p>#define SW2_PIN BCM5</p><p>#define SW3_PIN BCM6</p><p>// ลำโพง</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>// เวลา</p><p>int minutes = 0;</p><p>int seconds = 0;</p><p>bool running = false;</p><p>bool timeEnded = false;  // บอกว่าเคยนับจบหรือยัง</p><p>unsigned long lastUpdate = 0;</p><p>void setup() {</p><p>  pinMode(SW1_PIN, INPUT_PULLUP);</p><p>  pinMode(SW2_PIN, INPUT_PULLUP);</p><p>  pinMode(SW3_PIN, INPUT_PULLUP);</p><p>  pinMode(BUZZER_PIN, OUTPUT);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  showScreen();</p><p>  showStatus();</p><p>}</p><p>void loop() {</p><p>  // ตั้งเวลาเมื่อยังไม่เริ่มนับ</p><p>  if (!running) {</p><p>    if (digitalRead(SW1_PIN) == LOW) {</p><p>      delay(200);</p><p>      beepOnce();  // ติ๊ดเมื่อกด</p><p>      minutes = (minutes + 1) % 100;</p><p>      showScreen();</p><p>      showStatus();</p><p>    }</p><p>    if (digitalRead(SW2_PIN) == LOW) {</p><p>      delay(200);</p><p>      beepOnce();  // ติ๊ดเมื่อกด</p><p>      seconds = (seconds + 1) % 60;</p><p>      showScreen();</p><p>      showStatus();</p><p>    }</p><p>  }</p><p>  // ปุ่ม START/STOP</p><p>  if (digitalRead(SW3_PIN) == LOW) {</p><p>    delay(200);</p><p>    beepOnce();  // ติ๊ดเมื่อกด</p><p>    // ถ้าเวลาเป็น 00:00 แล้วกด SW3 ให้ดัง 5 ครั้ง</p><p>    if (minutes <mark> 0 &amp;&amp; seconds </mark> 0) {</p><p>      alarmBeep(5);</p><p>    } else {</p><p>      if (minutes &gt; 0 || seconds &gt; 0 || running) {</p><p>        running = !running;</p><p>        timeEnded = false;</p><p>      }</p><p>    }</p><p>    showScreen();</p><p>    showStatus();</p><p>  }</p><p>  // นับถอยหลัง</p><p>  if (running &amp;&amp; millis() - lastUpdate &gt;= 1000) {</p><p>    lastUpdate = millis();</p><p>    if (seconds == 0) {</p><p>      if (minutes == 0) {</p><p>        running = false;</p><p>        timeEnded = true;</p><p>        showScreen();</p><p>        showStatus();</p><p>        alarmBeep(3);  // จบเวลาปกติ ดัง 3 ครั้ง</p><p>      } else {</p><p>        minutes--;</p><p>        seconds = 59;</p><p>      }</p><p>    } else {</p><p>      seconds--;</p><p>    }</p><p>    showScreen();</p><p>    showStatus();</p><p>  }</p><p>}</p><p>void showScreen() {</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.drawString("Count Down", 160, 30);</p><p>  tft.drawString("SW3 TO START OR STOP", 160, 60);</p><p>  tft.drawString("SW2 &amp; SW1 TO SET TIMER", 160, 90);</p><p>  char timeStr[10];</p><p>  tft.setTextColor(TFT_YELLOW);</p><p>  sprintf(timeStr, "%02d : %02d", minutes, seconds);</p><p>  tft.setTextSize(4);</p><p>  tft.drawString(timeStr, 160, 140);}</p><p>  </p><p>  void showStatus(){</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.drawString(running ? "RUNNING" : "STOP", 160, 200);}</p><p>void alarmBeep(int times) {</p><p>  for (int i = 0; i &lt; times; i++) {</p><p>    tone(BUZZER_PIN, 2000);</p><p>    delay(200);</p><p>    noTone(BUZZER_PIN);</p><p>    delay(200);</p><p>  }</p><p>}</p><p>void beepOnce() {</p><p>  tone(BUZZER_PIN, 2500);</p><p>  delay(100);</p><p>  noTone(BUZZER_PIN);</p><p>}</p><p><br></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1dKML3UN53KIIkptHmpFZzo_XU4Rf5e9G/view?usp=sharing" />
         <pubDate>2025-08-08 09:05:00 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538500983</guid>
      </item>
      <item>
         <title>อินทัช สุวรรณวงศ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538510553</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft;</p><p>enum Scene {</p><p>  SCENE_1, SCENE_2, SCENE_3,</p><p>  SCENE_4, SCENE_5, SCENE_6</p><p>};</p><p>Scene currentScene = SCENE_1;</p><p>int playerX = 60;</p><p>int playerY = 100;</p><p>const int playerSize = 16;</p><p>struct FallingObject {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>  bool active;</p><p>};</p><p>const int MAX_OBJECTS = 20;  // เพิ่มจำนวนสูงสุดเก็บวัตถุตกได้มากขึ้น</p><p>FallingObject objects[MAX_OBJECTS];</p><p>int score = 0;</p><p>int fallSpeed = 4;</p><p>unsigned long lastSpawnTime = 0;</p><p>const unsigned long spawnInterval = 500;  // วัตถุตกใหม่ทุก 500 ms</p><p>uint16_t getBgColor(Scene scene) {</p><p>  switch(scene) {</p><p>    case SCENE_1: return TFT_GREEN;</p><p>    case SCENE_2: return TFT_ORANGE;</p><p>    case SCENE_3: return TFT_CYAN;</p><p>    case SCENE_4: return TFT_MAGENTA;</p><p>    case SCENE_5: return TFT_NAVY;</p><p>    case SCENE_6: return TFT_RED;</p><p>    default: return TFT_BLACK;</p><p>  }</p><p>}</p><p>void initFallingObject(FallingObject &amp;obj) {</p><p>  obj.x = random(0, tft.width() - 10);</p><p>  obj.y = 0;</p><p>  obj.size = 10;</p><p>  obj.color = TFT_RED;</p><p>  obj.active = true;</p><p>}</p><p>void drawPlayer(int x, int y, uint16_t color) {</p><p>  tft.fillRect(x, y, playerSize, playerSize, color);</p><p>}</p><p>void drawScene(Scene scene) {</p><p>  tft.fillScreen(getBgColor(scene));</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10, 10);</p><p>  tft.printf("Scene %d", (int)scene + 1);</p><p>  drawPlayer(playerX, playerY, TFT_BLUE);</p><p>  drawScore();</p><p>}</p><p>bool checkCollision(FallingObject &amp;obj) {</p><p>  return !(playerX + playerSize &lt; obj.x || playerX &gt; obj.x + obj.size ||</p><p>           playerY + playerSize &lt; obj.y || playerY &gt; obj.y + obj.size);</p><p>}</p><p>void eraseFallingObject(FallingObject &amp;obj) {</p><p>  tft.fillRect(obj.x, obj.y, obj.size, obj.size, getBgColor(currentScene));</p><p>}</p><p>void updateFallingObject(FallingObject &amp;obj) {</p><p>  if (!obj.active) return;</p><p>  eraseFallingObject(obj);</p><p>  obj.y += fallSpeed;</p><p>  if (checkCollision(obj)) {</p><p>    tft.fillScreen(TFT_BLACK);</p><p>    tft.setTextColor(TFT_RED);</p><p>    tft.setTextSize(3);</p><p>    tft.setCursor(20, 80);</p><p>    tft.println("Game Over");</p><p>    delay(1000);</p><p>    playerX = 60;</p><p>    playerY = 100;</p><p>    score = 0;</p><p>    // ปิดวัตถุตกทั้งหมด</p><p>    for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>      objects[i].active = false;</p><p>    }</p><p>    drawScene(currentScene);</p><p>    return;</p><p>  }</p><p>  if (obj.y &gt; tft.height()) {</p><p>    obj.active = false;  // ปิดการแสดงผลวัตถุตกนี้ เพราะหลุดหน้าจอไปแล้ว</p><p>    score++;</p><p>  } else {</p><p>    tft.fillRect(obj.x, obj.y, obj.size, obj.size, obj.color);</p><p>  }</p><p>}</p><p>void drawScore() {</p><p>  tft.fillRect(0, 0, 100, 24, getBgColor(currentScene));</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(5, 5);</p><p>  tft.printf("Score: %d", score);</p><p>}</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    objects[i].active = false;</p><p>  }</p><p>  drawScene(currentScene);</p><p>}</p><p>void loop() {</p><p>  // ลบตัวละครเก่า</p><p>  tft.fillRect(playerX, playerY, playerSize, playerSize, getBgColor(currentScene));</p><p>  // ลบวัตถุตกเก่าทุกชิ้น</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    if (objects[i].active) {</p><p>      eraseFallingObject(objects[i]);</p><p>    }</p><p>  }</p><p>  // ควบคุมตัวละครด้วยจอยสติ๊ก</p><p>  if (digitalRead(WIO_5S_LEFT) == LOW)  playerX -= 3;</p><p>  if (digitalRead(WIO_5S_RIGHT) == LOW) playerX += 3;</p><p>  if (digitalRead(WIO_5S_UP) == LOW)    playerY -= 3;</p><p>  if (digitalRead(WIO_5S_DOWN) == LOW)  playerY += 3;</p><p>  playerX = constrain(playerX, 0, tft.width() - playerSize);</p><p>  playerY = constrain(playerY, 0, tft.height() - playerSize);</p><p>  drawPlayer(playerX, playerY, TFT_BLUE);</p><p>  // สร้างวัตถุตกใหม่ถ้ามีช่องว่างและเวลาผ่านไปแล้ว</p><p>  if (millis() - lastSpawnTime &gt; spawnInterval) {</p><p>    for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>      if (!objects[i].active) {</p><p>        initFallingObject(objects[i]);</p><p>        break;  // สร้างแค่ 1 ชิ้นในรอบนี้</p><p>      }</p><p>    }</p><p>    lastSpawnTime = millis();</p><p>  }</p><p>  // อัปเดตและวาดวัตถุตกทุกชิ้น</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    updateFallingObject(objects[i]);</p><p>  }</p><p>  drawScore();</p><p>  // เปลี่ยนฉากด้วยปุ่ม A, B, C สำหรับ 3 ฉากแรก</p><p>  if (digitalRead(WIO_KEY_A) == LOW) { currentScene = SCENE_1; drawScene(currentScene); delay(200); }</p><p>  if (digitalRead(WIO_KEY_B) == LOW) { currentScene = SCENE_2; drawScene(currentScene); delay(200); }</p><p>  if (digitalRead(WIO_KEY_C) == LOW) { currentScene = SCENE_3; drawScene(currentScene); delay(200); }</p><p>  // เปลี่ยนฉาก 4-6 โดยกดปุ่มสองปุ่มพร้อมกัน</p><p>  if (digitalRead(WIO_KEY_A) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_B) </mark> LOW) { currentScene = SCENE_4; drawScene(currentScene); delay(300); }</p><p>  if (digitalRead(WIO_KEY_B) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_C) </mark> LOW) { currentScene = SCENE_5; drawScene(currentScene); delay(300); }</p><p>  if (digitalRead(WIO_KEY_A) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_C) </mark> LOW) { currentScene = SCENE_6; drawScene(currentScene); delay(300); }</p><p>  delay(50);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202798939/5eeb1cea4fd1f842838ef44b3f4a07b3/__________________________.jpg" />
         <pubDate>2025-08-08 09:25:06 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538510553</guid>
      </item>
      <item>
         <title>นาย นัทพร สุภี</title>
         <author>nudtapondupee</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538511560</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft;</p><p>enum Scene {</p><p>  SCENE_1, SCENE_2, SCENE_3,</p><p>  SCENE_4, SCENE_5, SCENE_6</p><p>};</p><p>Scene currentScene = SCENE_1;</p><p>int playerX = 60;</p><p>int playerY = 100;</p><p>const int playerSize = 16;</p><p>struct FallingObject {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>  bool active;</p><p>};</p><p>const int MAX_OBJECTS = 20;  // เพิ่มจำนวนสูงสุดเก็บวัตถุตกได้มากขึ้น</p><p>FallingObject objects[MAX_OBJECTS];</p><p>int score = 0;</p><p>int fallSpeed = 4;</p><p>unsigned long lastSpawnTime = 0;</p><p>const unsigned long spawnInterval = 500;  // วัตถุตกใหม่ทุก 500 ms</p><p>uint16_t getBgColor(Scene scene) {</p><p>  switch(scene) {</p><p>    case SCENE_1: return TFT_GREEN;</p><p>    case SCENE_2: return TFT_ORANGE;</p><p>    case SCENE_3: return TFT_CYAN;</p><p>    case SCENE_4: return TFT_MAGENTA;</p><p>    case SCENE_5: return TFT_NAVY;</p><p>    case SCENE_6: return TFT_RED;</p><p>    default: return TFT_BLACK;</p><p>  }</p><p>}</p><p>void initFallingObject(FallingObject &amp;obj) {</p><p>  obj.x = random(0, tft.width() - 10);</p><p>  obj.y = 0;</p><p>  obj.size = 10;</p><p>  obj.color = TFT_RED;</p><p>  obj.active = true;</p><p>}</p><p>void drawPlayer(int x, int y, uint16_t color) {</p><p>  tft.fillRect(x, y, playerSize, playerSize, color);</p><p>}</p><p>void drawScene(Scene scene) {</p><p>  tft.fillScreen(getBgColor(scene));</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10, 10);</p><p>  tft.printf("Scene %d", (int)scene + 1);</p><p>  drawPlayer(playerX, playerY, TFT_BLUE);</p><p>  drawScore();</p><p>}</p><p>bool checkCollision(FallingObject &amp;obj) {</p><p>  return !(playerX + playerSize &lt; obj.x || playerX &gt; obj.x + obj.size ||</p><p>           playerY + playerSize &lt; obj.y || playerY &gt; obj.y + obj.size);</p><p>}</p><p>void eraseFallingObject(FallingObject &amp;obj) {</p><p>  tft.fillRect(obj.x, obj.y, obj.size, obj.size, getBgColor(currentScene));</p><p>}</p><p>void updateFallingObject(FallingObject &amp;obj) {</p><p>  if (!obj.active) return;</p><p>  eraseFallingObject(obj);</p><p>  obj.y += fallSpeed;</p><p>  if (checkCollision(obj)) {</p><p>    tft.fillScreen(TFT_BLACK);</p><p>    tft.setTextColor(TFT_RED);</p><p>    tft.setTextSize(3);</p><p>    tft.setCursor(20, 80);</p><p>    tft.println("Game Over");</p><p>    delay(1000);</p><p>    playerX = 60;</p><p>    playerY = 100;</p><p>    score = 0;</p><p>    // ปิดวัตถุตกทั้งหมด</p><p>    for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>      objects[i].active = false;</p><p>    }</p><p>    drawScene(currentScene);</p><p>    return;</p><p>  }</p><p>  if (obj.y &gt; tft.height()) {</p><p>    obj.active = false;  // ปิดการแสดงผลวัตถุตกนี้ เพราะหลุดหน้าจอไปแล้ว</p><p>    score++;</p><p>  } else {</p><p>    tft.fillRect(obj.x, obj.y, obj.size, obj.size, obj.color);</p><p>  }</p><p>}</p><p>void drawScore() {</p><p>  tft.fillRect(0, 0, 100, 24, getBgColor(currentScene));</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(5, 5);</p><p>  tft.printf("Score: %d", score);</p><p>}</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    objects[i].active = false;</p><p>  }</p><p>  drawScene(currentScene);</p><p>}</p><p>void loop() {</p><p>  // ลบตัวละครเก่า</p><p>  tft.fillRect(playerX, playerY, playerSize, playerSize, getBgColor(currentScene));</p><p>  // ลบวัตถุตกเก่าทุกชิ้น</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    if (objects[i].active) {</p><p>      eraseFallingObject(objects[i]);</p><p>    }</p><p>  }</p><p>  // ควบคุมตัวละครด้วยจอยสติ๊ก</p><p>  if (digitalRead(WIO_5S_LEFT) == LOW)  playerX -= 3;</p><p>  if (digitalRead(WIO_5S_RIGHT) == LOW) playerX += 3;</p><p>  if (digitalRead(WIO_5S_UP) == LOW)    playerY -= 3;</p><p>  if (digitalRead(WIO_5S_DOWN) == LOW)  playerY += 3;</p><p>  playerX = constrain(playerX, 0, tft.width() - playerSize);</p><p>  playerY = constrain(playerY, 0, tft.height() - playerSize);</p><p>  drawPlayer(playerX, playerY, TFT_BLUE);</p><p>  // สร้างวัตถุตกใหม่ถ้ามีช่องว่างและเวลาผ่านไปแล้ว</p><p>  if (millis() - lastSpawnTime &gt; spawnInterval) {</p><p>    for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>      if (!objects[i].active) {</p><p>        initFallingObject(objects[i]);</p><p>        break;  // สร้างแค่ 1 ชิ้นในรอบนี้</p><p>      }</p><p>    }</p><p>    lastSpawnTime = millis();</p><p>  }</p><p>  // อัปเดตและวาดวัตถุตกทุกชิ้น</p><p>  for (int i = 0; i &lt; MAX_OBJECTS; i++) {</p><p>    updateFallingObject(objects[i]);</p><p>  }</p><p>  drawScore();</p><p>  // เปลี่ยนฉากด้วยปุ่ม A, B, C สำหรับ 3 ฉากแรก</p><p>  if (digitalRead(WIO_KEY_A) == LOW) { currentScene = SCENE_1; drawScene(currentScene); delay(200); }</p><p>  if (digitalRead(WIO_KEY_B) == LOW) { currentScene = SCENE_2; drawScene(currentScene); delay(200); }</p><p>  if (digitalRead(WIO_KEY_C) == LOW) { currentScene = SCENE_3; drawScene(currentScene); delay(200); }</p><p>  // เปลี่ยนฉาก 4-6 โดยกดปุ่มสองปุ่มพร้อมกัน</p><p>  if (digitalRead(WIO_KEY_A) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_B) </mark> LOW) { currentScene = SCENE_4; drawScene(currentScene); delay(300); }</p><p>  if (digitalRead(WIO_KEY_B) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_C) </mark> LOW) { currentScene = SCENE_5; drawScene(currentScene); delay(300); }</p><p>  if (digitalRead(WIO_KEY_A) <mark> LOW &amp;&amp; digitalRead(WIO_KEY_C) </mark> LOW) { currentScene = SCENE_6; drawScene(currentScene); delay(300); }</p><p>  delay(50);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202938829/fe9a1ae206a4408f3a1bb7f89c9c73f6/8_8_2568_16_26_59.png" />
         <pubDate>2025-08-08 09:27:42 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3538511560</guid>
      </item>
      <item>
         <title>ธรรมนูญ วิชชาธาร</title>
         <author>seemondamon</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551179139</link>
         <description><![CDATA[<p>#include &lt;Wire.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#include &lt;TFT_eSPI.h&gt;</p><p>BH1750 lightMeter;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define RELAY1_PIN BCM10</p><p>#define RELAY2_PIN BCM9</p><p>void setup() {</p><p>Serial.begin(115200);</p><p>Wire.begin();</p><p>lightMeter.begin();</p><p>pinMode(RELAY1_PIN, OUTPUT);</p><p>pinMode(RELAY2_PIN, OUTPUT);</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>tft.begin();</p><p>tft.setRotation(3);</p><p>tft.fillScreen(TFT_BLACK);</p><p>tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>tft.setTextSize(2);</p><p>}</p><p>void loop() {</p><p>float lux = lightMeter.readLightLevel();</p><p>if (lux &lt; 0) lux = 0;</p><p>Serial.printf("Lux: %.2f\n", lux);</p><p>drawGraph(lux);</p><p>controlRelay(lux);</p><p>delay(500);</p><p>}</p><p>void controlRelay(float lux) {</p><p>if (lux &lt;= 0) {</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>showStatus("OFF");</p><p>} else if (lux &gt; 430) {</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, HIGH);</p><p>showStatus("RELAY 2 ON");</p><p>} else if (lux &gt; 220) {</p><p>digitalWrite(RELAY1_PIN, HIGH);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>showStatus("RELAY 1 ON");</p><p>} else {</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>showStatus("OFF");</p><p>}</p><p>}</p><p>void showStatus(String text) {</p><p>tft.fillRect(0, 200, 320, 40, TFT_BLACK);</p><p>tft.setCursor(10, 210);</p><p>tft.print("PWR: " + text);</p><p>}</p><p>void drawGraph(float lux) {</p><p>int max1 = 220;</p><p>int max2 = 440;</p><p>int widthMax = 280;</p><p>// เคลียร์พื้นที่กราฟ</p><p>tft.fillRect(0, 0, 320, 180, TFT_BLACK);</p><p>// แสดงค่า Lux</p><p>tft.setCursor(10, 10);</p><p>tft.printf("Light: %.0f lx", lux);</p><p>// แถบบน (0 - 220)</p><p>tft.drawRect(20, 40, widthMax, 30, TFT_WHITE);</p><p>int bar1Width = (lux &lt;= max1) ? map(lux, 0, max1, 0, widthMax) : widthMax;</p><p>if (lux &lt;= max1)</p><p>tft.fillRect(20, 40, bar1Width, 30, TFT_BLUE);</p><p>else</p><p>tft.fillRect(20, 40, widthMax, 30, TFT_BLUE);</p><p>// ตัวเลขด้านล่างแถบบน</p><p>tft.setTextSize(2);</p><p>tft.setCursor(20, 75); // ตำแหน่งใต้แถบด้านซ้าย</p><p>tft.print("0");</p><p>tft.setCursor(20 + widthMax - 36, 75); // ตำแหน่งใต้แถบด้านขวา</p><p>tft.print("220");</p><p>// แถบกลาง (221 - 440)</p><p>tft.drawRect(20, 100, widthMax, 30, TFT_WHITE);</p><p>if (lux &gt; max1) {</p><p>int bar2Width = map(lux, max1 + 1, max2, 0, widthMax);</p><p>if (bar2Width &gt; widthMax) bar2Width = widthMax;</p><p>tft.fillRect(20, 100, bar2Width, 30, TFT_GREEN);</p><p>}</p><p>// ตัวเลขด้านล่างแถบกลาง</p><p>tft.setCursor(20, 135); // ด้านซ้าย</p><p>tft.print("221");</p><p>tft.setCursor(20 + widthMax - 36, 135); // ด้านขวา</p><p>tft.print("440");</p><p>tft.setTextSize(2); // คืนค่าขนาดตัวอักษร</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4251631064/966583f90137ffb5420daea11f6d5694/776337702_127033.mp4" />
         <pubDate>2025-08-22 03:20:13 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551179139</guid>
      </item>
      <item>
         <title>อินทัช สุวรรณวงศ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551197064</link>
         <description><![CDATA[<p>// Flappy Wio — Single-file Sketch for Seeed Wio Terminal</p><p>// ควบคุม: กด A/B/C หรือกดกลางของ 5-way เพื่อ "กระพือ"</p><p>// หมายเหตุ: จอ Wio Terminal ไม่ใช่จอสัมผัส ไอคอนบนจอเป็น UI หลอกตาเพื่อบอกปุ่มใช้งาน</p><p>#include &lt;TFT_eSPI.h&gt;   // มาจากไลบรารี Seeed_Arduino_LCD</p><p>TFT_eSPI tft;</p><p>#ifndef WIO_KEY_A</p><p>  // ถ้าเลือกบอร์ดเป็น Wio Terminal แล้ว จะมีมาให้โดยอัตโนมัติ</p><p>  // หากคอมไพล์ไม่ผ่าน ให้ไปที่ Tools &gt; Board &gt; Seeed SAMD &gt; Seeed Wio Terminal</p><p>  #define WIO_KEY_A       0</p><p>  #define WIO_KEY_B       1</p><p>  #define WIO_KEY_C       2</p><p>  #define WIO_5S_UP       3</p><p>  #define WIO_5S_DOWN     4</p><p>  #define WIO_5S_LEFT     5</p><p>  #define WIO_5S_RIGHT    6</p><p>  #define WIO_5S_PRESS    7</p><p>#endif</p><p>// ขนาดจอ</p><p>const int W = 320;</p><p>const int H = 240;</p><p>// ตัวละคร (นก)</p><p>float birdY;</p><p>float birdV;</p><p>const float GRAVITY = 0.35f;</p><p>const float FLAP    = -5.5f;</p><p>const int   BIRD_X  = 60;</p><p>const int   BIRD_R  = 8;</p><p>// ท่อ</p><p>int pipeX;</p><p>int gapY;</p><p>int gapH = 80;       // ความกว้างช่อง (เล็กลง = ยากขึ้น)</p><p>int pipeW = 36;</p><p>int pipeSpeed = 2;</p><p>// สกอร์/สถานะ</p><p>int score = 0;</p><p>bool alive = true;</p><p>unsigned long lastFrame = 0;</p><p>const uint16_t BG = TFT_BLACK;</p><p>bool buttonPressed() {</p><p>  // ปุ่มใดก็ได้ถือเป็น "กระพือ"</p><p>  return digitalRead(WIO_KEY_A) == LOW ||</p><p>         digitalRead(WIO_KEY_B) == LOW ||</p><p>         digitalRead(WIO_KEY_C) == LOW ||</p><p>         digitalRead(WIO_5S_PRESS) == LOW;</p><p>}</p><p>void drawUI() {</p><p>  // แถบปุ่มหลอกตาด้านล่าง (UI ชี้แนะการควบคุม)</p><p>  tft.fillRect(0, H-26, W, 26, TFT_DARKGREY);</p><p>  tft.drawString("Press A / B / C or 5-way center to FLAP", 8, H-22, 2);</p><p>}</p><p>void resetGame() {</p><p>  birdY = H/2;</p><p>  birdV = 0;</p><p>  pipeX = W + 40;</p><p>  gapY  = random(40, H-40-gapH);</p><p>  score = 0;</p><p>  alive = true;</p><p>  tft.fillScreen(BG);</p><p>  drawUI();</p><p>}</p><p>void drawBird(int color) {</p><p>  tft.fillCircle(BIRD_X, (int)birdY, BIRD_R, color);</p><p>  // ตาวงเล็ก</p><p>  tft.fillCircle(BIRD_X+3, (int)birdY-3, 2, TFT_WHITE);</p><p>  tft.drawPixel(BIRD_X+4, (int)birdY-3, TFT_BLACK);</p><p>  // ปาก</p><p>  tft.fillTriangle(BIRD_X+BIRD_R, (int)birdY, BIRD_X+BIRD_R+6, (int)birdY-2, BIRD_X+BIRD_R+6, (int)birdY+2, TFT_YELLOW);</p><p>}</p><p>void drawPipe(int x, int color) {</p><p>  // ท่อบน</p><p>  tft.fillRect(x, 0, pipeW, gapY, color);</p><p>  // ท่อล่าง</p><p>  tft.fillRect(x, gapY+gapH, pipeW, H-(gapY+gapH)-26, color); // -26 เว้นพื้นที่ UI ล่าง</p><p>}</p><p>void drawScore() {</p><p>  char buf[24];</p><p>  sprintf(buf, "Score: %d", score);</p><p>  tft.fillRect(0, 0, 120, 18, BG);</p><p>  tft.drawString(buf, 6, 2, 2);</p><p>}</p><p>void gameOverScreen() {</p><p>  tft.fillRect(0, 40, W, 120, TFT_NAVY);</p><p>  tft.drawCentreString("GAME OVER", W/2, 60, 4);</p><p>  char buf[32];</p><p>  sprintf(buf, "Score: %d", score);</p><p>  tft.drawCentreString(buf, W/2, 92, 4);</p><p>  tft.drawCentreString("Press any key to retry", W/2, 124, 2);</p><p>}</p><p>void setup() {</p><p>  // ปุ่มเป็น INPUT_PULLUP (กดแล้วเป็น LOW)</p><p>  pinMode(WIO_KEY_A,     INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B,     INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C,     INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS,  INPUT_PULLUP);</p><p>  tft.init();</p><p>  tft.setRotation(3); // แนวนอน 320x240</p><p>  tft.fillScreen(BG);</p><p>  tft.setTextColor(TFT_WHITE, BG);</p><p>  tft.setTextDatum(TL_DATUM);</p><p>  randomSeed(analogRead(A0));</p><p>  drawUI();</p><p>  resetGame();</p><p>  lastFrame = millis();</p><p>  drawScore();</p><p>}</p><p>void loop() {</p><p>  // กำหนดเฟรมเรตแบบง่าย ๆ</p><p>  if (millis() - lastFrame &lt; 16) return; // ~60 FPS</p><p>  lastFrame = millis();</p><p>  if (alive) {</p><p>    // ลบภาพเดิม</p><p>    drawBird(BG);</p><p>    drawPipe(pipeX, BG);</p><p>    // อินพุต</p><p>    if (buttonPressed()) {</p><p>      birdV = FLAP;</p><p>    }</p><p>    // ฟิสิกส์</p><p>    birdV += GRAVITY;</p><p>    birdY += birdV;</p><p>    // เลื่อนท่อ</p><p>    pipeX -= pipeSpeed;</p><p>    // วนท่อและเพิ่มสกอร์</p><p>    if (pipeX + pipeW &lt; 0) {</p><p>      pipeX = W + random(20, 80);</p><p>      gapY  = random(30, H-60-gapH);</p><p>      score++;</p><p>      // เพิ่มความยากเล็กน้อย</p><p>      if (score % 3 == 0 &amp;&amp; gapH &gt; 60) gapH -= 4;</p><p>      if (score % 4 == 0 &amp;&amp; pipeSpeed &lt; 4) pipeSpeed++;</p><p>    }</p><p>    // ชนขอบบน/ล่าง (ยกเว้นแถบ UI)</p><p>    if (birdY - BIRD_R &lt; 0 || birdY + BIRD_R &gt; H-26) {</p><p>      alive = false;</p><p>    }</p><p>    // ชนท่อ (ตรวจ AABB + วงกลมอย่างหยาบ)</p><p>    bool withinPipeX = (BIRD_X + BIRD_R &gt; pipeX) &amp;&amp; (BIRD_X - BIRD_R &lt; pipeX + pipeW);</p><p>    bool inGapY = (birdY - BIRD_R &gt; gapY) &amp;&amp; (birdY + BIRD_R &lt; gapY + gapH);</p><p>    if (withinPipeX &amp;&amp; !inGapY) {</p><p>      alive = false;</p><p>    }</p><p>    // วาดใหม่</p><p>    drawPipe(pipeX, TFT_DARKGREEN);</p><p>    drawBird(TFT_CYAN);</p><p>    drawScore();</p><p>  } else {</p><p>    // จบเกม: รอผู้เล่นกดเพื่อเริ่มใหม่</p><p>    gameOverScreen();</p><p>    // กันคีย์ค้าง: รอปล่อยปุ่มก่อน</p><p>    while (buttonPressed()) delay(5);</p><p>    // รอการกดใหม่</p><p>    while (!buttonPressed()) delay(5);</p><p>    // กันเด้ง</p><p>    delay(120);</p><p>    tft.fillScreen(BG);</p><p>    drawUI();</p><p>    resetGame();</p><p>    drawScore();</p><p>  }</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4251627111/2ffbff41af9f8f2538d95fec036456c8/777526323_147777.mp4" />
         <pubDate>2025-08-22 03:35:42 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551197064</guid>
      </item>
      <item>
         <title>นิธิศ นุชทองม่วง</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551220709</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;DHT.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p><br/></p><p>#define DHTPIN 0         // ขา GPIO สำหรับ DHT11</p><p>#define DHTTYPE DHT11</p><p><br/></p><p>DHT dht(DHTPIN, DHTTYPE);</p><p>BH1750 lightMeter;</p><p>TFT_eSPI tft;</p><p><br/></p><p>void setup() {</p><p>  Wire.begin();         </p><p>  dht.begin();</p><p>  lightMeter.begin();</p><p><br/></p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_WHITE);  // พื้นหลังสีขาว</p><p><br/></p><p>  // หัวข้อ</p><p>  tft.setTextColor(TFT_BLACK, TFT_WHITE);</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Temperature", 20, 20);</p><p>  tft.drawString("Humidity", 200, 20);</p><p>  tft.drawString("Light", 130, 210);</p><p>}</p><p><br/></p><p>void loop() {</p><p>  float temp = dht.readTemperature();</p><p>  float humi = dht.readHumidity();</p><p>  int lux = (int)lightMeter.readLightLevel();</p><p><br/></p><p>  // ลบค่าก่อนหน้า (สีขาว)</p><p>  tft.fillRect(30, 60, 100, 40, TFT_WHITE);</p><p>  tft.fillRect(170, 60, 100, 40, TFT_WHITE);</p><p>  tft.fillRect(100, 150, 200, 40, TFT_WHITE);</p><p><br/></p><p>  // แสดงค่าอุณหภูมิ</p><p>  tft.setTextColor(TFT_BLACK, TFT_WHITE);</p><p>  tft.setTextSize(5);  // &lt;== ตัวเลขใหญ่ขึ้น</p><p>  tft.drawString(String((int)temp), 40, 65);</p><p><br/></p><p>  // แสดงค่าความชื้น</p><p>  tft.drawString(String((int)humi), 220, 65);</p><p><br/></p><p>  // แสดงค่าแสง</p><p>  tft.drawString(String(lux), 135, 150);</p><p><br/></p><p>  delay(1000);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252130172/1ed467321573816ada2148e90b6b638f/1755834959385.jpg" />
         <pubDate>2025-08-22 04:00:01 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551220709</guid>
      </item>
      <item>
         <title>นาย นิธิศ นุชทองม่วง</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551257052</link>
         <description><![CDATA[<p>งาน 5/2#include &lt;Adafruit_NeoPixel.h&gt;</p><p>#include &lt;TFT_eSPI.h&gt;</p><p>#define NUMPIXELS 12</p><p>#define LED_PIN   D2</p><p>#define VR_PIN A0</p><p>#define BUTTON_LEFT   WIO_5S_LEFT</p><p>#define BUTTON_RIGHT  WIO_5S_RIGHT</p><p>#define BUTTON_PRESS  WIO_5S_PRESS</p><p>Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);</p><p>TFT_eSPI tft;</p><p>uint8_t brightness = 128;</p><p>int selectedColor = 0;</p><p>bool lightsOn = true;</p><p>int lastSelectedColor = -1;</p><p>uint8_t lastBrightness = 0;</p><p>bool lastLightsOn = true;</p><p>const int colorCount = 5;</p><p>uint32_t colorPalette[colorCount] = {</p><p>  pixels.Color(255, 0, 0),    // แดง</p><p>  pixels.Color(255, 165, 0),  // ส้ม</p><p>  pixels.Color(0, 0, 255),    // น้ำเงิน</p><p>  pixels.Color(255, 0, 255),  // ชมพู</p><p>  pixels.Color(0, 255, 0)     // เขียว</p><p>};</p><p>const char* colorNames[colorCount] = {</p><p>  "Red", "Orange", "Blue", "Pink", "Green"</p><p>};</p><p>void setup() {</p><p>  pixels.begin();</p><p>  pixels.setBrightness(brightness);</p><p>  <a rel="noopener noreferrer nofollow" href="http://pixels.show">pixels.show</a>();</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  pinMode(VR_PIN, INPUT);</p><p>  pinMode(BUTTON_LEFT, INPUT_PULLUP);</p><p>  pinMode(BUTTON_RIGHT, INPUT_PULLUP);</p><p>  pinMode(BUTTON_PRESS, INPUT_PULLUP);</p><p>  drawColorSelector();</p><p>  drawBrightnessBar();</p><p>}</p><p>void loop() {</p><p>  int vrValue = analogRead(VR_PIN);</p><p>  brightness = map(vrValue, 0, 1023, 0, 259);</p><p>  if (brightness != lastBrightness) {</p><p>    pixels.setBrightness(brightness);</p><p>    lastBrightness = brightness;</p><p>  }</p><p>  if (digitalRead(BUTTON_LEFT) == LOW) {</p><p>    selectedColor = (selectedColor - 1 + colorCount) % colorCount;</p><p>    delay(150);</p><p>  }</p><p>  if (digitalRead(BUTTON_RIGHT) == LOW) {</p><p>    selectedColor = (selectedColor + 1) % colorCount;</p><p>    delay(150);</p><p>  }</p><p>  if (digitalRead(BUTTON_PRESS) == LOW) {</p><p>    lightsOn = !lightsOn;</p><p>    delay(300);</p><p>  }</p><p>  if (selectedColor != lastSelectedColor || lightsOn != lastLightsOn) {</p><p>    drawColorSelector();</p><p>    lastSelectedColor = selectedColor;</p><p>    lastLightsOn = lightsOn;</p><p>  }</p><p>  for (int i = 0; i &lt; NUMPIXELS; i++) {</p><p>    pixels.setPixelColor(i, lightsOn ? colorPalette[selectedColor] : 0);</p><p>  }</p><p>  <a rel="noopener noreferrer nofollow" href="http://pixels.show">pixels.show</a>();</p><p>  drawBrightnessBar();</p><p>  delay(50);</p><p>}</p><p>void drawColorSelector() {</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  int radius = 20;</p><p>  int selectedRadius = 25;</p><p>  int spacing = 65;</p><p>  int centerY = 80;</p><p>  int startX = 40;</p><p>  String title = "Select Color";</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(TFT_ORANGE, TFT_BLACK);</p><p>  int16_t titleW = tft.textWidth(title);</p><p>  tft.setCursor((320 - titleW) / 2, 16);</p><p>  tft.print(title);</p><p>  for (int i = 0; i &lt; colorCount; i++) {</p><p>    int x = startX + i * spacing;</p><p>    int r = (i == selectedColor) ? selectedRadius : radius;</p><p>    // วาดวงกลมสีพร้อมแสงเงา</p><p>    for (int j = r; j &gt; 0; j--) {</p><p>      uint32_t c = colorPalette[i];</p><p>      uint8_t factor = map(j, 0, r, 80, 255);</p><p>      uint8_t red = ((c &gt;&gt; 16) &amp; 0xFF) * factor / 255;</p><p>      uint8_t green = ((c &gt;&gt; 8) &amp; 0xFF) * factor / 255;</p><p>      uint8_t blue = (c &amp; 0xFF) * factor / 255;</p><p>      tft.fillCircle(x, centerY, j, color565(pixels.Color(red, green, blue)));</p><p>    }</p><p>    if (i == selectedColor) {</p><p>      tft.drawCircle(x, centerY, r, TFT_WHITE);</p><p>      int arrowY = centerY - r - 12;</p><p>      tft.fillTriangle(x, arrowY, x - 8, arrowY - 10, x + 8, arrowY - 10, TFT_RED);</p><p>    }</p><p>    int16_t textW = tft.textWidth(colorNames[i]);</p><p>    tft.setCursor(x - textW / 2, centerY + r + 15);</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>    tft.print(colorNames[i]);</p><p>  }</p><p>}</p><p>void drawBrightnessBar() {</p><p>  tft.fillRect(0, 130, 320, 60, TFT_BLACK);</p><p>  String brightStr = " VR" + String(brightness);</p><p>  tft.setTextSize(2);</p><p>  int16_t w = tft.textWidth(brightStr);</p><p>  tft.setCursor((320 - w) / 2, 135);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.print(brightStr);</p><p>  int barX = 10, barY = 170, barWidthMax = 300, barHeight = 20;</p><p>  tft.drawRoundRect(barX - 1, barY - 1, barWidthMax + 2, barHeight + 2, 5, TFT_WHITE);</p><p>  int barWidth = map(brightness, 0, 255, 0, barWidthMax);</p><p>  for (int i = 0; i &lt; barWidth; i++) {</p><p>    uint8_t red = map(i, 0, barWidth, 255, 255);</p><p>    uint8_t green = map(i, 0, barWidth, 255, 165);</p><p>    tft.drawFastVLine(barX + i, barY, barHeight, color565(pixels.Color(red, green, 0)));</p><p>  }</p><p>  tft.fillRect(barX + barWidth, barY, barWidthMax - barWidth, barHeight, TFT_DARKGREY);</p><p>}</p><p>uint16_t color565(uint32_t c) {</p><p>  uint8_t r = (uint8_t)(c &gt;&gt; 16);</p><p>  uint8_t g = (uint8_t)(c &gt;&gt; 8);</p><p>  uint8_t b = (uint8_t)c;</p><p>  return tft.color565(r, g, b);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252237803/d154b1790d17f7a9999c606105ebd3ee/fdc115d4_fdab_4e8e_aa53_ef711e299c17.mp4" />
         <pubDate>2025-08-22 04:38:15 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551257052</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส งาน 4.4</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551273711</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Adafruit_NeoPixel.h&gt;</p><p>TFT_eSPI tft;</p><p>// พินมอเตอร์</p><p>#define MOTOR_PWM   BCM27</p><p>#define MOTOR_IN1   BCM6</p><p>#define MOTOR_IN2   BCM4  // *** ห้ามใช้ร่วมกับ LED_PIN ***</p><p>#define SWITCH_TOGGLE BCM5</p><p>#define VR_PIN A1</p><p>#define LED_PIN D3        // &lt;&lt;&lt; เปลี่ยนจาก 4 เป็น 3</p><p>#define NUMPIXELS 12</p><p>Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);</p><p>bool motorRunning = true;</p><p>bool lastSwitchState = HIGH;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  pinMode(MOTOR_PWM, OUTPUT);</p><p>  pinMode(MOTOR_IN1, OUTPUT);</p><p>  pinMode(MOTOR_IN2, OUTPUT);</p><p>  pinMode(SWITCH_TOGGLE, INPUT_PULLUP);  // ใช้ pull-up</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("DC MOTOR (1-CH)", 80, 20);</p><p>  pixels.begin();</p><p>  <a rel="noopener noreferrer nofollow" href="http://pixels.show">pixels.show</a>();</p><p>}</p><p>void loop() {</p><p>  int vrValue = analogRead(VR_PIN);</p><p>  int center = 512;</p><p>  int deadzone = 20;</p><p>  // อ่านสถานะปุ่ม toggle</p><p>  bool currentSwitchState = digitalRead(SWITCH_TOGGLE);</p><p>  if (lastSwitchState <mark> HIGH &amp;&amp; currentSwitchState </mark> LOW) {</p><p>    motorRunning = !motorRunning;</p><p>    Serial.println("Toggle switch pressed");</p><p>    delay(200); // กันเด้งปุ่ม</p><p>  }</p><p>  lastSwitchState = currentSwitchState;</p><p>  // คำนวณ speed</p><p>  int speedPercent = 0;</p><p>  if (vrValue &gt; center + deadzone) {</p><p>    speedPercent = map(vrValue, center + deadzone, 1023, 1, 100);</p><p>  } else if (vrValue &lt; center - deadzone) {</p><p>    speedPercent = map(vrValue, center - deadzone, 0, -1, -100);</p><p>  }</p><p>  // แสดง Speed บนจอ</p><p>  tft.fillRect(0, 50, 320, 30, TFT_BLACK);</p><p>  String displaySpeed = "Speed: " + String(abs(speedPercent)) + "%";</p><p>  tft.drawString(displaySpeed, 90, 50);</p><p>  if (motorRunning) {</p><p>    int pwmValue = map(abs(speedPercent), 0, 100, 0, 255);</p><p>    if (speedPercent &gt; 0) {</p><p>      digitalWrite(MOTOR_IN1, HIGH);</p><p>      digitalWrite(MOTOR_IN2, LOW);</p><p>      analogWrite(MOTOR_PWM, pwmValue);</p><p>      setRGBColor(0, pwmValue);</p><p>      showStatus("Forward");</p><p>      Serial.print("Forward PWM: ");</p><p>      Serial.println(pwmValue);</p><p>    } else if (speedPercent &lt; 0) {</p><p>      digitalWrite(MOTOR_IN1, LOW);</p><p>      digitalWrite(MOTOR_IN2, HIGH);</p><p>      analogWrite(MOTOR_PWM, pwmValue);</p><p>      setRGBColor(pwmValue, 0);</p><p>      showStatus("Reverse");</p><p>      Serial.print("Reverse PWM: ");</p><p>      Serial.println(pwmValue);</p><p>    } else {</p><p>      stopMotor();</p><p>      setRGBColor(0, 0);</p><p>      showStatus("Stop");</p><p>      Serial.println("Stop by VR Center");</p><p>    }</p><p>  } else {</p><p>    stopMotor();</p><p>    setRGBColor(0, 0);</p><p>    showStatus("Stop");</p><p>    Serial.println("Emergency Stop");</p><p>  }</p><p>}</p><p>void stopMotor() {</p><p>  analogWrite(MOTOR_PWM, 0);</p><p>  digitalWrite(MOTOR_IN1, LOW);</p><p>  digitalWrite(MOTOR_IN2, LOW);</p><p>}</p><p>void setRGBColor(uint8_t red, uint8_t green) {</p><p>  for (int i = 0; i &lt; NUMPIXELS; i++) {</p><p>    pixels.setPixelColor(i, pixels.Color(red, green, 0));</p><p>  }</p><p>  <a rel="noopener noreferrer nofollow" href="http://pixels.show">pixels.show</a>();</p><p>}</p><p>void showStatus(String msg) {</p><p>  tft.fillRect(0, 80, 320, 30, TFT_BLACK);</p><p>  tft.drawString(msg, 120, 80);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1SgrH3K90Nq3QmJv0xfrPcuNITvr54Ypp/view?usp=sharing" />
         <pubDate>2025-08-22 04:54:08 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551273711</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส งาน 4.3</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551285661</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#define SW0_PIN BCM0</p><p>#define SW1_PIN BCM1</p><p>#define SW2_PIN BCM2</p><p>#define SW3_PIN BCM3</p><p>#define SW4_PIN BCM4</p><p>#define RELAY1_PIN BCM27</p><p>#define RELAY2_PIN BCM26</p><p>#define RELAY3_PIN BCM25</p><p>#define RELAY4_PIN BCM24</p><p>bool relayState[4] = {false, false, false, false};</p><p>bool prevButtonState[5] = {HIGH, HIGH, HIGH, HIGH, HIGH};</p><p>TFT_eSPI tft;</p><p>void setup() {</p><p>  pinMode(SW0_PIN, INPUT_PULLUP);</p><p>  pinMode(SW1_PIN, INPUT_PULLUP);</p><p>  pinMode(SW2_PIN, INPUT_PULLUP);</p><p>  pinMode(SW3_PIN, INPUT_PULLUP);</p><p>  pinMode(SW4_PIN, INPUT_PULLUP);</p><p>  pinMode(RELAY1_PIN, OUTPUT);</p><p>  pinMode(RELAY2_PIN, OUTPUT);</p><p>  pinMode(RELAY3_PIN, OUTPUT);</p><p>  pinMode(RELAY4_PIN, OUTPUT);</p><p>  for (int i = 0; i &lt; 4; i++) {</p><p>    digitalWrite(getRelayPin(i), LOW);</p><p>  }</p><p>  tft.begin();</p><p>  tft.setRotation(3);  // หมุนจอแนวนอน</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  updateDisplay();</p><p>  Serial.begin(115200);</p><p>}</p><p>void loop() {</p><p>  int buttonPins[5] = {SW0_PIN, SW1_PIN, SW2_PIN, SW3_PIN, SW4_PIN};</p><p>  for (int i = 0; i &lt; 4; i++) {</p><p>    bool currentButton = digitalRead(buttonPins[i]);</p><p>    if (prevButtonState[i] <mark> HIGH &amp;&amp; currentButton </mark> LOW) {</p><p>      relayState[i] = !relayState[i];</p><p>      digitalWrite(getRelayPin(i), relayState[i] ? HIGH : LOW);</p><p>      updateDisplay();</p><p>    }</p><p>    prevButtonState[i] = currentButton;</p><p>  }</p><p>  bool sw4Current = digitalRead(buttonPins[4]);</p><p>  if (prevButtonState[4] <mark> HIGH &amp;&amp; sw4Current </mark> LOW) {</p><p>    bool allOff = true;</p><p>    for (int i = 0; i &lt; 4; i++) {</p><p>      if (relayState[i]) {</p><p>        allOff = false;</p><p>        break;</p><p>      }</p><p>    }</p><p>    for (int i = 0; i &lt; 4; i++) {</p><p>      relayState[i] = allOff ? true : false;</p><p>      digitalWrite(getRelayPin(i), relayState[i] ? HIGH : LOW);</p><p>    }</p><p>    updateDisplay();</p><p>  }</p><p>  prevButtonState[4] = sw4Current;</p><p>  delay(50);</p><p>}</p><p>void updateDisplay() {</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  // Title</p><p>  tft.setTextColor(TFT_YELLOW, TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.drawCentreString("RELAY CONTROL", 160, 5, 2);</p><p>  // Size config</p><p>  int boxWidth = 280;</p><p>  int boxHeight = 40;</p><p>  int startY = 35;</p><p>  int gapY = 10;</p><p>  for (int i = 0; i &lt; 4; i++) {</p><p>    int y = startY + i * (boxHeight + gapY);</p><p>    // Draw box</p><p>    tft.drawRoundRect(20, y, boxWidth, boxHeight, 6, TFT_WHITE);</p><p>    // Label</p><p>    tft.setTextColor(TFT_CYAN, TFT_BLACK);</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Relay " + String(i + 1), 30, y + 10);</p><p>    // Status box</p><p>    if (relayState[i]) {</p><p>      tft.fillRoundRect(190, y + 8, 90, 24, 5, TFT_GREEN);</p><p>      tft.setTextColor(TFT_BLACK);</p><p>      tft.drawCentreString("ON", 235, y + 12, 2);</p><p>    } else {</p><p>      tft.fillRoundRect(190, y + 8, 90, 24, 5, TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE);</p><p>      tft.drawCentreString("OFF", 235, y + 12, 2);</p><p>    }</p><p>  }</p><p>}</p><p>int getRelayPin(int index) {</p><p>  int relayPins[4] = {RELAY1_PIN, RELAY2_PIN, RELAY3_PIN, RELAY4_PIN};</p><p>  return relayPins[index];</p><p>}</p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1YMo7HsXFHQSvsq-LSEGfZq6syDABRlTj/view?usp=sharing" />
         <pubDate>2025-08-22 05:04:10 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551285661</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส งาน 4.1</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551294886</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include "DHT.h"</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#define DHTPIN 0       // GPIO 27</p><p>#define DHTTYPE DHT11  // DHT 11</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>DHT dht(DHTPIN, DHTTYPE);</p><p>BH1750 lightMeter;</p><p>void setup() </p><p>{</p><p>  dht.begin();</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_WHITE); // พื้นหลังสีขาว</p><p>  tft.setTextColor(TFT_BLACK, TFT_WHITE); // สีดำพื้นขาว</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>}</p><p>void loop() </p><p>{</p><p>  float temp = dht.readTemperature(); </p><p>  float humi = dht.readHumidity();</p><p>  float light = lightMeter.readLightLevel();</p><p>  tft.fillScreen(TFT_WHITE); // เคลียร์หน้าจอทุก loop</p><p>  // ข้อความด้านบน</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Temperature", 20, 10); // ซ้ายบน</p><p>  tft.drawString("Humidity", 190, 10);   // ขวาบน</p><p>  // ตัวเลข Temperature และ Humidity ตรงกลาง</p><p>  tft.setTextSize(4);</p><p>  tft.drawString(String((int)temp), 50, 40);  // ค่าความร้อน</p><p>  tft.drawString(String((int)humi), 200, 40); // ค่าความชื้น</p><p>  // ✅ ค่าความสว่าง (Light) แสดงเป็นจำนวนเต็ม</p><p>  tft.drawString(String((int)light), 120, 160); // ไม่มีจุดทศนิยม</p><p>  // ข้อความ Light ใต้ตัวเลข</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Light", 120, 200);</p><p>  delay(1000); // หน่วงเวลา 1 วินาที</p><p>}</p>]]></description>
         <enclosure url="https://drive.google.com/file/d/185x5RMaQZ7opz7dUoHHvvCvX8ehD_v4t/view?usp=sharing" />
         <pubDate>2025-08-22 05:12:05 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551294886</guid>
      </item>
      <item>
         <title>ธีรวัฒน์ สิงห์โตงาม</title>
         <author>sameoneyoulove</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551378454</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>BH1750 lightMeter;</p><p>TFT_eSPI tft;</p><p>#define RELAY1_PIN BCM8</p><p>#define RELAY2_PIN BCM9</p><p>#define SMOOTH_N 5</p><p>float luxArray[SMOOTH_N] = {0};</p><p>void setup() {</p><p>Wire.begin();</p><p>lightMeter.begin();</p><p>pinMode(RELAY1_PIN, OUTPUT);</p><p>pinMode(RELAY2_PIN, OUTPUT);</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>tft.begin();</p><p>tft.setRotation(3);</p><p>tft.fillScreen(TFT_BLACK);</p><p>// หัวข้อด้านบน</p><p>tft.setTextSize(2);</p><p>tft.setTextColor(TFT_CYAN, TFT_BLACK);</p><p>tft.setCursor(60, 0);</p><p>tft.print("Light Monitor");</p><p>tft.drawLine(20, 25, 300, 25, TFT_WHITE); // เส้นแบ่ง</p><p>}</p><p>float getLuxAverage(float newLux) {</p><p>for(int i=SMOOTH_N-1; i&gt;0; i--) luxArray[i] = luxArray[i-1];</p><p>luxArray[0] = newLux;</p><p>float sum = 0;</p><p>for(int i=0;i&lt;SMOOTH_N;i++) sum += luxArray[i];</p><p>return sum / SMOOTH_N;</p><p>}</p><p>uint32_t getBarColor(float lux, float minLux, float maxLux) {</p><p>float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);</p><p>uint8_t r, g, b;</p><p>if(ratio &lt; 0.5) {</p><p>r = 255 <em>(ratio</em>2);</p><p>g = 255;</p><p>} else {</p><p>r = 255;</p><p>g = 255 <em>(1 - (ratio-0.5)</em>2);</p><p>}</p><p>b = 0;</p><p>return tft.color565(r,g,b);</p><p>}</p><p>void drawBars(float lux) {</p><p>int barX = 60;</p><p>int barWidthMax = 180;</p><p>int barHeight = 40;</p><p>int bar1Y = 75;</p><p>int bar2Y = 140;</p><p>// กรอบพื้นหลังบาร์</p><p>tft.fillRect(barX-2, bar1Y-2, barWidthMax+4, barHeight+4, TFT_WHITE);</p><p>tft.fillRect(barX-2, bar2Y-2, barWidthMax+4, barHeight+4, TFT_WHITE);</p><p>// ล้างบาร์เก่า</p><p>tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);</p><p>tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);</p><p>int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);</p><p>int bar2Width = 0;</p><p>if(lux &gt; 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);</p><p>tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux,0,220));</p><p>tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux,220,440));</p><p>// ตัวเลขขอบบาร์</p><p>tft.setTextSize(1);</p><p>tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>tft.setCursor(barX-20, bar1Y+10); tft.print("0");</p><p>tft.setCursor(barX+barWidthMax+5, bar1Y+10); tft.print("220");</p><p>tft.setCursor(barX-25, bar2Y+10); tft.print("220");</p><p>tft.setCursor(barX+barWidthMax+5, bar2Y+10); tft.print("440");</p><p>}</p><p>void displayLux(float lux) {</p><p>// ล้างพื้นที่ค่า Lux</p><p>tft.fillRect(0, 30, 320, 40, TFT_BLACK);</p><p>tft.setTextSize(3);</p><p>tft.setTextColor(TFT_GREEN, TFT_BLACK);</p><p>tft.setCursor(100, 35);</p><p>tft.printf("%d lx", (int)lux);</p><p>}</p><p>void updateRelays(float lux) {</p><p>String status;</p><p>uint32_t color;</p><p>if(lux &lt;= 220) {</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>status = "RELAY 1,2 OFF";</p><p>color = TFT_GREEN;</p><p>} else if(lux &lt; 430) {</p><p>digitalWrite(RELAY1_PIN, HIGH);</p><p>digitalWrite(RELAY2_PIN, LOW);</p><p>status = "RELAY 1 ON";</p><p>color = TFT_YELLOW;</p><p>} else {</p><p>digitalWrite(RELAY1_PIN, LOW);</p><p>digitalWrite(RELAY2_PIN, HIGH);</p><p>status = "RELAY 2 ON";</p><p>color = TFT_RED;</p><p>}</p><p>// ป้ายสถานะรีเลย์</p><p>tft.fillRect(30, 200, 260, 30, TFT_BLACK);</p><p>tft.drawRect(30, 200, 260, 30, color);</p><p>tft.setTextSize(2);</p><p>tft.setTextColor(color, TFT_BLACK);</p><p>tft.setCursor(50, 205);</p><p>tft.print(status);</p><p>}</p><p>void loop() {</p><p>float lux = lightMeter.readLightLevel();</p><p>if(lux &lt; 0) lux = 0;</p><p>float luxAvg = getLuxAverage(lux);</p><p>displayLux(luxAvg);</p><p>drawBars(luxAvg);</p><p>updateRelays(luxAvg);</p><p>delay(500);</p><p>}</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202983792/d428b001e6312fb8084dff8b3a33c7a4/e0ef6bc6_01c4_4d7b_b89c_0789f387d39a__5_3.mp4" />
         <pubDate>2025-08-22 06:39:21 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551378454</guid>
      </item>
      <item>
         <title>นาย นัทพร สุภี</title>
         <author>nudtapondupee</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551421532</link>
         <description><![CDATA[<p>#include &lt; TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;Adafruit_MLX90614.h&gt;</p><p>#include &lt;Servo.h&gt;</p><p>#include &lt;wiring_constants.h&gt;</p><p>TFT_eSPI tft;</p><p>Adafruit_MLX90614 mlx =</p><p>Adafruit_MLX906140;</p><p>Servo myservo;</p><p>#define ANGLE_LEFT 0</p><p>#define ANGLE_CENTER 90</p><p>#define BUZZER_PIN</p><p>WIO BUZZER</p><p>bool servoDone = false; // ตัวแปร</p><p>สถานะ</p><p>void buzzerBeep(int duration =</p><p>500) {</p><p>tone(BUZZER_PIN, 2000);</p><p>delay(duration);</p><p>noTone(BUZZER_PIN);</p><p>delay (duration);</p><p>tone(BUZZER_PIN, 2000);</p><p>delay (duration);</p><p>noTone(BUZZER_PIN);</p><p>delay(duration);</p><p>}</p><p>void buzzerBeepG (int duration = 200) {</p><p>tone(BUZZER_PIN, 2000);</p><p>delay (duration);</p><p>noTone(BUZZER_PIN);</p><p>delay (duration);</p><p>}</p><p>void setup ()</p><p>Serial.begin (115200);</p><p>Wire.begin0; mlx.begin);</p><p>myservo.attach(BCM9);</p><p>myservo.write(ANGLE_CENTER); tft.begin(;</p><p>tft.setRotation (3);</p><p>tft.setTextDatum(MC_DATUM);</p><p>tft.setTextSize(2);</p><p>tft.fillScreen(TFT_BLACK);</p><p>tft.setTextColor(TFT_WHITE,</p><p>TFT_BLACK);</p><p>tft.drawString ("Starting...", 160,</p><p>120);</p><p>delay (1000);</p><p>tft.fillScreen(TFT_BLACK);</p><p>}</p><p>บวก</p><p>void loop i float temp =</p><p>mlx.readObjectTempC0;</p><p>if (temp &gt; 35.0) ‹</p><p>// แสดงสีแดง และร้องจนกว่าจะเย็นลง</p><p>tft.fillScreen(TFT_RED);</p><p>tft.setTextColor(TFT_WHITE,</p><p>TFT_RED);</p><p>tft.setTextSize(3);</p><p>tft.drawString ("TEMP HIGH",</p><p>160, 80);</p><p>tft.setTextSize(2);</p><p>tft.drawString ("Temp: " +</p><p>String(temp, 1) + "C", 160, 130);</p><p>tft.drawString ("Cooling</p><p>Required", 160, 180);</p><p>servoDone = false;</p><p>buzzerBeep);</p><p>} else {</p><p>// สีเขียว</p><p>tft.fillScreen(TFT_GREEN);</p><p>tft.setTextColor(TFT_BLACK,</p><p>TFT_GREEN);</p><p>tft.setTextSize (3);</p><p>tft.drawString ("TEMP NORMAL",</p><p>160, 80);</p><p>tft.setTextSize(2);</p><p>tft.drawString ("Temp: " +</p><p>String(temp, 1) + "C", 160, 130);</p><p>tft.drawString ("Safe", 160, 180); buzzerBeepG0;</p><p>// ให้ Servo ทำงานแค่ครั้งเดียว</p><p>if (!servoDone) ‹</p><p>myservo.write(ANGLE_LEFT);</p><p>delay (2000);</p><p>myservo.write(ANGLE_CENTER);</p><p>delay (2000);</p><p>servoDone = true; // บันทึกว่า</p><p>ทำงานแล้ว</p><p>จางวัน</p><p>  }</p><p>}</p><p>delay (1000); // หน่วงเวลา 1 วินาที</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202938829/9f21cb074fac32e7ee31dfa43f513c37/2222.mp4" />
         <pubDate>2025-08-22 07:25:58 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551421532</guid>
      </item>
      <item>
         <title>นาย นวมินทร์ ผ่องใส งาน 4.2</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551425839</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;Adafruit_MLX90614.h&gt;</p><p>#include &lt;Servo.h&gt;</p><p>#include &lt;wiring_constants.h&gt;  // สำหรับ WIO_BUZZER</p><p>// === อ็อบเจ็กต์ ===</p><p>TFT_eSPI tft;</p><p>Adafruit_MLX90614 mlx = Adafruit_MLX90614();</p><p>Servo myservo;</p><p>// === ปุ่มบน Wio Terminal ===</p><p>#define BUTTON_B  WIO_KEY_B  // ปุ่มเริ่มทำงาน</p><p>// === มุมของ Servo ===</p><p>#define ANGLE_LEFT    0</p><p>#define ANGLE_CENTER  90</p><p>// === Buzzer ===</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>void buzzerBeep(int times, int duration = 200) {</p><p>  for (int i = 0; i &lt; times; i++) {</p><p>    tone(BUZZER_PIN, 2000);  // ความถี่ 2000Hz</p><p>    delay(duration);</p><p>    noTone(BUZZER_PIN);</p><p>    delay(duration);</p><p>  }</p><p>}</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  Wire.begin();</p><p>  mlx.begin();</p><p>  myservo.attach(BCM9);</p><p>  pinMode(BUTTON_B, INPUT_PULLUP);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextSize(2.8);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.drawString("Infrared Thermometer", 160, 60);</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Press B to Start", 160, 120);</p><p>  buzzerBeep(1);  // เสียงตอนเริ่ม</p><p>  myservo.write(ANGLE_CENTER);</p><p>  while (digitalRead(BUTTON_B) == HIGH) delay(10);</p><p>  while (digitalRead(BUTTON_B) == LOW) delay(10);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  float temp = mlx.readObjectTempC();</p><p>  if (temp &gt; 30.0) {</p><p>    // อุณหภูมิสูง (ฝ่ามือ)</p><p>    tft.fillScreen(TFT_RED);</p><p>    tft.setTextColor(TFT_WHITE, TFT_RED);</p><p>    tft.setTextSize(4);</p><p>    tft.drawString("Covid Alert", 160, 80);</p><p>    tft.setTextSize(3);</p><p>    tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);</p><p>    tft.drawString("Get Out", 160, 200);</p><p>    buzzerBeep(2);</p><p>    // อยู่ที่ซ้ายตลอดจนกว่าอุณหภูมิจะปกติ</p><p>    myservo.write(ANGLE_LEFT);</p><p>  } else {</p><p>    // อุณหภูมิปกติ (หลังมือ)</p><p>    tft.fillScreen(TFT_GREEN);</p><p>    tft.setTextColor(TFT_BLACK, TFT_GREEN);</p><p>    tft.setTextSize(4);</p><p>    tft.drawString("NORMAL Alert", 160, 60);</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Temp: " + String(temp, 1) + " C", 160, 110);</p><p>    tft.drawString("Come in", 160, 160);</p><p>    tft.drawString("Please wait 4.5s", 160, 200);</p><p>    buzzerBeep(1);</p><p>    myservo.write(ANGLE_CENTER);  // เปิดประตู</p><p>    delay(4500);  // รอให้เดินผ่าน</p><p>    myservo.write(ANGLE_LEFT);  // ปิดประตู</p><p>  }</p><p>  delay(1000);</p><p>}</p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1wgHhN8PVX8XaUtiqnkXbVyVp_kRuPKku/view?usp=sharing" />
         <pubDate>2025-08-22 07:30:44 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551425839</guid>
      </item>
      <item>
         <title>อาทิตย์ ปานทอง</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551464952</link>
         <description><![CDATA[<p>เปลี่ยนเป็นการ์ตูน</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/d444e867363505b06c7beede16b25e97/Copilot_20250822_152550.png" />
         <pubDate>2025-08-22 08:27:28 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551464952</guid>
      </item>
      <item>
         <title>อินทัช สุวรรณวงศ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551474575</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;wiring_constants.h&gt;</p><p>TFT_eSPI tft;</p><p>// ปุ่ม</p><p>#define SW1_PIN BCM4</p><p>#define SW2_PIN BCM5</p><p>#define SW3_PIN BCM6</p><p>// ลำโพง</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>// เวลา</p><p>int minutes = 0;</p><p>int seconds = 0;</p><p>bool running = false;</p><p>bool timeEnded = false;  // บอกว่าเคยนับจบหรือยัง</p><p>unsigned long lastUpdate = 0;</p><p>void setup() {</p><p>  pinMode(SW1_PIN, INPUT_PULLUP);</p><p>  pinMode(SW2_PIN, INPUT_PULLUP);</p><p>  pinMode(SW3_PIN, INPUT_PULLUP);</p><p>  pinMode(BUZZER_PIN, OUTPUT);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  showScreen();</p><p>  showStatus();</p><p>}</p><p>void loop() {</p><p>  // ตั้งเวลาเมื่อยังไม่เริ่มนับ</p><p>  if (!running) {</p><p>    if (digitalRead(SW1_PIN) == LOW) {</p><p>      delay(200);</p><p>      beepOnce();  // ติ๊ดเมื่อกด</p><p>      minutes = (minutes + 1) % 100;</p><p>      showScreen();</p><p>      showStatus();</p><p>    }</p><p>    if (digitalRead(SW2_PIN) == LOW) {</p><p>      delay(200);</p><p>      beepOnce();  // ติ๊ดเมื่อกด</p><p>      seconds = (seconds + 1) % 60;</p><p>      showScreen();</p><p>      showStatus();</p><p>    }</p><p>  }</p><p>  // ปุ่ม START/STOP</p><p>  if (digitalRead(SW3_PIN) == LOW) {</p><p>    delay(200);</p><p>    beepOnce();  // ติ๊ดเมื่อกด</p><p>    if (minutes <mark> 0 &amp;&amp; seconds </mark> 0) {</p><p>      alarmBeep(5); // ถ้าเวลา 00:00 ดัง 5 ครั้ง</p><p>    } else {</p><p>      running = !running;</p><p>      timeEnded = false;</p><p>    }</p><p>    showScreen();</p><p>    showStatus();</p><p>  }</p><p>  // นับถอยหลัง</p><p>  if (running &amp;&amp; millis() - lastUpdate &gt;= 1000) {</p><p>    lastUpdate = millis();</p><p>    if (seconds == 0) {</p><p>      if (minutes == 0) {</p><p>        running = false;</p><p>        timeEnded = true;</p><p>        showScreen();</p><p>        showStatus();</p><p>        alarmBeep(3);  // จบเวลาปกติ ดัง 3 ครั้ง</p><p>      } else {</p><p>        minutes--;</p><p>        seconds = 59;</p><p>      }</p><p>    } else {</p><p>      seconds--;</p><p>    }</p><p>    showScreen();</p><p>    showStatus();</p><p>  }</p><p>}</p><p>void showScreen() {</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.drawString("Count Down", 160, 30);</p><p>  tft.drawString("SW3 TO START OR STOP", 160, 60);</p><p>  tft.drawString("SW2 &amp; SW1 TO SET TIMER", 160, 90);</p><p>  char timeStr[10];</p><p>  tft.setTextColor(TFT_YELLOW);</p><p>  sprintf(timeStr, "%02d : %02d", minutes, seconds);</p><p>  tft.setTextSize(4);</p><p>  tft.drawString(timeStr, 160, 140);</p><p>}</p><p>void showStatus() {</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(TFT_WHITE);</p><p>  tft.drawString(running ? "RUNNING" : "STOP", 160, 200);</p><p>}</p><p>void alarmBeep(int times) {</p><p>  for (int i = 0; i &lt; times; i++) {</p><p>    tone(BUZZER_PIN, 2000);</p><p>    delay(200);</p><p>    noTone(BUZZER_PIN);</p><p>    delay(200);</p><p>  }</p><p>}</p><p>void beepOnce() {</p><p>  tone(BUZZER_PIN, 2500);</p><p>  delay(100);</p><p>  noTone(BUZZER_PIN);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4251627111/ce7fd70868770cb20af8f86dde8ef33f/1.mp4" />
         <pubDate>2025-08-22 08:41:08 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551474575</guid>
      </item>
      <item>
         <title>อาทิตย์ ปานทอง</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551475173</link>
         <description><![CDATA[<p>งานที่1</p><p>#include &lt;TFT_eSPI.h&gt;  // ไลบรารีควบคุมจอ LCD</p><p>TFT_eSPI tft;</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_WHITE); // พื้นหลังขาว</p><p>  // --- ใบหน้า ---</p><p>  tft.drawCircle(160, 120, 101, TFT_BLACK);   // ขอบนอก</p><p>  tft.fillCircle(160, 120, 100, TFT_BLUE);    // หน้าโดเรม่อนสีฟ้า</p><p>  // --- ปากยิ้ม (ครึ่งวงกลม) ---</p><p>  tft.fillCircle(160, 150, 60, TFT_RED);      // วาดวงกลมสีแดง</p><p>  tft.fillRect(100, 90, 120, 60, TFT_BLUE);   // ลบครึ่งบนให้เหลือโค้งยิ้ม</p><p>  tft.drawCircle(160, 150, 60, TFT_BLACK);    // ขอบปากสีดำ</p><p>  // --- ตา ---</p><p>  // ตาขาว</p><p>  tft.drawCircle(120, 95, 36, TFT_BLACK);</p><p>  tft.fillCircle(120, 95, 34, TFT_WHITE);</p><p>  tft.drawCircle(200, 95, 36, TFT_BLACK);</p><p>  tft.fillCircle(200, 95, 34, TFT_WHITE);</p><p>  // ลูกตาดำ (ขยับเข้ามาให้จ้องตรงกลาง)</p><p>  tft.fillCircle(130, 95, 12, TFT_BLACK);</p><p>  tft.fillCircle(190, 95, 12, TFT_BLACK);</p><p>  // --- คิ้ว ---</p><p>  tft.drawLine(90, 65, 140, 75, TFT_BLACK);</p><p>  tft.drawLine(180, 75, 230, 65, TFT_BLACK);</p><p>  // --- จมูก ---</p><p>  tft.fillCircle(160, 120, 10, TFT_RED);</p><p>  // --- เส้นปากตรงกลาง ---</p><p>  tft.drawLine(160, 120, 160, 180, TFT_BLACK);</p><p>  // --- หนวด ---</p><p>  // ขวา</p><p>  tft.drawLine(200, 155, 250, 145, TFT_BLACK);</p><p>  tft.drawLine(200, 170, 250, 170, TFT_BLACK);</p><p>  tft.drawLine(200, 185, 250, 195, TFT_BLACK);</p><p>  // ซ้าย</p><p>  tft.drawLine(70, 145, 120, 155, TFT_BLACK);</p><p>  tft.drawLine(70, 170, 120, 170, TFT_BLACK);</p><p>  tft.drawLine(70, 195, 120, 185, TFT_BLACK);</p><p>  // --- กระดิ่ง ---</p><p>  tft.fillCircle(160, 220, 15, TFT_YELLOW);</p><p>  tft.drawCircle(160, 220, 15, TFT_BLACK);</p><p>  tft.drawLine(160, 220, 160, 235, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  // ไม่มีการทำงานซ้ำ</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/4aa9c80eb4bf6b84ce48323428b1c93d/81.jpg" />
         <pubDate>2025-08-22 08:42:07 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551475173</guid>
      </item>
      <item>
         <title>นัทพร สุภี</title>
         <author>nudtapondupee</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551483373</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>BH1750 lightMeter;</p><p>TFT_eSPI tft;</p><p>#define RELAY1_PIN BCM8</p><p>#define RELAY2_PIN BCM9</p><p>#define SMOOTH_N 5</p><p>float luxArray[SMOOTH_N] = {0};</p><p>void setup() {</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>  pinMode(RELAY1_PIN, OUTPUT);</p><p>  pinMode(RELAY2_PIN, OUTPUT);</p><p>  digitalWrite(RELAY1_PIN, LOW);</p><p>  digitalWrite(RELAY2_PIN, LOW);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  // หัวข้อด้านบน</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(TFT_CYAN, TFT_BLACK);</p><p>  tft.setCursor(60, 0);</p><p>  tft.print("Light Monitor");</p><p>  tft.drawLine(20, 25, 300, 25, TFT_WHITE); // เส้นแบ่ง</p><p>}</p><p>float getLuxAverage(float newLux) {</p><p>  for (int i = SMOOTH_N - 1; i &gt; 0; i--) luxArray[i] = luxArray[i - 1];</p><p>  luxArray[0] = newLux;</p><p>  float sum = 0;</p><p>  for (int i = 0; i &lt; SMOOTH_N; i++) sum += luxArray[i];</p><p>  return sum / SMOOTH_N;</p><p>}</p><p>uint32_t getBarColor(float lux, float minLux, float maxLux) {</p><p>  float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);</p><p>  uint8_t r, g, b;</p><p>  if (ratio &lt; 0.5) { </p><p>    r = 255 <em> (ratio </em> 2);   // ค่อย ๆ เพิ่มแดง</p><p>    g = 255;                 // เขียวเต็ม</p><p>  } else { </p><p>    r = 255;                 </p><p>    g = 255 <em> (1 - (ratio - 0.5) </em> 2); // ค่อย ๆ ลดเขียว</p><p>  }</p><p>  b = 0;</p><p>  return tft.color565(r, g, b);</p><p>}</p><p>void drawBars(float lux) {</p><p>  int barX = 60;</p><p>  int barWidthMax = 180;</p><p>  int barHeight = 40;</p><p>  int bar1Y = 75;</p><p>  int bar2Y = 140;</p><p>  // กรอบพื้นหลังบาร์</p><p>  tft.fillRect(barX - 2, bar1Y - 2, barWidthMax + 4, barHeight + 4, TFT_WHITE);</p><p>  tft.fillRect(barX - 2, bar2Y - 2, barWidthMax + 4, barHeight + 4, TFT_WHITE);</p><p>  // ล้างบาร์เก่า</p><p>  tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);</p><p>  tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);</p><p>  int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);</p><p>  int bar2Width = 0;</p><p>  if (lux &gt; 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);</p><p>  tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux, 0, 220));</p><p>  tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux, 220, 440));</p><p>  // ตัวเลขขอบบาร์</p><p>  tft.setTextSize(1);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setCursor(barX - 20, bar1Y + 10); tft.print("0");</p><p>  tft.setCursor(barX + barWidthMax + 5, bar1Y + 10); tft.print("220");</p><p>  tft.setCursor(barX - 25, bar2Y + 10); tft.print("220");</p><p>  tft.setCursor(barX + barWidthMax + 5, bar2Y + 10); tft.print("440");</p><p>}</p><p>void displayLux(float lux) {</p><p>  // ล้างพื้นที่ค่า Lux</p><p>  tft.fillRect(0, 30, 320, 40, TFT_BLACK);</p><p>  tft.setTextSize(3);</p><p>  tft.setTextColor(TFT_GREEN, TFT_BLACK);</p><p>  tft.setCursor(100, 35);</p><p>  tft.printf("%d lx", (int)lux);</p><p>}</p><p>void updateRelays(float lux) {</p><p>  String status;</p><p>  uint32_t color;</p><p>  if (lux &lt;= 220) {</p><p>    digitalWrite(RELAY1_PIN, LOW);</p><p>    digitalWrite(RELAY2_PIN, LOW);</p><p>    status = "RELAY 1,2 OFF";</p><p>    color = TFT_GREEN;</p><p>  } else if (lux &lt; 430) {</p><p>    digitalWrite(RELAY1_PIN, HIGH);</p><p>    digitalWrite(RELAY2_PIN, LOW);</p><p>    status = "RELAY 1 ON";</p><p>    color = TFT_YELLOW;</p><p>  } else {</p><p>    digitalWrite(RELAY1_PIN, LOW);</p><p>    digitalWrite(RELAY2_PIN, HIGH);</p><p>    status = "RELAY 2 ON";</p><p>    color = TFT_RED;</p><p>  }</p><p>  // ป้ายสถานะรีเลย์</p><p>  tft.fillRect(30, 200, 260, 30, TFT_BLACK);</p><p>  tft.drawRect(30, 200, 260, 30, color);</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(color, TFT_BLACK);</p><p>  tft.setCursor(50, 205);</p><p>  tft.print(status);</p><p>}</p><p>void loop() {</p><p>  float lux = lightMeter.readLightLevel();</p><p>  if (lux &lt; 0) lux = 0;</p><p>  float luxAvg = getLuxAverage(lux);</p><p>  displayLux(luxAvg);</p><p>  drawBars(luxAvg);</p><p>  updateRelays(luxAvg);</p><p>  delay(500);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202938829/fb642dbc64daac086d52982726192163/777541852_943696.mp4" />
         <pubDate>2025-08-22 08:53:10 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551483373</guid>
      </item>
      <item>
         <title>อาทิตย์ ปานทอง</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551487473</link>
         <description><![CDATA[<p>งานที่2</p><p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define TFT_BROWN 0xA145</p><p>int backgroundMode = 0;</p><p>unsigned long lastButtonPress = 0;</p><p>#define DEBOUNCE_DELAY 300</p><p>void drawBackground(int mode) {</p><p>  switch (mode) {</p><p>    case 0: { // 🌅 ท้องฟ้ายามเช้า</p><p>      tft.fillScreen(tft.color565(135, 206, 235)); // ฟ้าอ่อน</p><p>      // ดวงอาทิตย์</p><p>      tft.fillCircle(60, 60, 30, TFT_YELLOW);</p><p>      // ก้อนเมฆ</p><p>      for (int i = 0; i &lt; 3; i++) {</p><p>        int x = 100 + i * 70;</p><p>        int y = 50 + (i % 2) * 20;</p><p>        tft.fillCircle(x, y, 20, TFT_WHITE);</p><p>        tft.fillCircle(x + 20, y + 10, 20, TFT_WHITE);</p><p>        tft.fillCircle(x - 20, y + 10, 20, TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 1: { // 🌻 ทุ่งหญ้าสีเหลือง + ผีเสื้อ</p><p>      tft.fillScreen(TFT_YELLOW);</p><p>      // หญ้า</p><p>      for (int i = 0; i &lt; 200; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(150, 240);</p><p>        tft.drawLine(x, y, x, y - random(5, 15), TFT_GREEN);</p><p>      }</p><p>      // ผีเสื้อ</p><p>      for (int i = 0; i &lt; 10; i++) {</p><p>        int x = random(50, 300);</p><p>        int y = random(60, 160);</p><p>        tft.fillCircle(x, y, 5, TFT_RED);</p><p>        tft.fillCircle(x + 8, y, 5, TFT_BLUE);</p><p>        tft.fillCircle(x, y + 8, 5, TFT_PURPLE);</p><p>        tft.fillCircle(x + 8, y + 8, 5, TFT_ORANGE);</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 2: { // 🏔️ ภูเขาหิมะ + แม่น้ำ</p><p>      tft.fillScreen(TFT_CYAN);</p><p>      // ภูเขา</p><p>      for (int x = 0; x &lt; 320; x += 80) {</p><p>        int peakHeight = random(60, 100);</p><p>        tft.fillTriangle(x, 180, x + 40, 180 - peakHeight, x + 80, 180, TFT_DARKGREY);</p><p>        tft.fillTriangle(x + 20, 180 - peakHeight / 2, x + 40, 180 - peakHeight, x + 60, 180 - peakHeight / 2, TFT_WHITE);</p><p>      }</p><p>      // แม่น้ำ</p><p>      tft.fillRect(0, 200, 320, 40, TFT_BLUE);</p><p>      break;</p><p>    }</p><p>    case 3: { // 🌇 เมืองตอนกลางวัน</p><p>      tft.fillScreen(tft.color565(135, 206, 250));</p><p>      // ถนน</p><p>      tft.fillRect(0, 200, 320, 40, TFT_DARKGREY);</p><p>      for (int i = 0; i &lt; 320; i += 20) {</p><p>        tft.fillRect(i, 218, 10, 4, TFT_WHITE);</p><p>      }</p><p>      // ตึก</p><p>      for (int x = 0; x &lt; 320; x += 40) {</p><p>        int h = random(60, 120);</p><p>        tft.fillRect(x, 200 - h, 30, h, TFT_LIGHTGREY);</p><p>      }</p><p>      // รถ</p><p>      for (int i = 0; i &lt; 3; i++) {</p><p>        int x = random(0, 280);</p><p>        tft.fillRect(x, 210, 40, 20, (i % 2) ? TFT_RED : TFT_BLUE);</p><p>        tft.fillCircle(x + 10, 230, 5, TFT_BLACK);</p><p>        tft.fillCircle(x + 30, 230, 5, TFT_BLACK);</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 4: { // 🏖️ ชายหาด + ทะเล</p><p>      uint16_t sand = tft.color565(237, 201, 175);</p><p>      tft.fillScreen(TFT_CYAN);</p><p>      // ทะเล</p><p>      tft.fillRect(0, 120, 320, 60, TFT_BLUE);</p><p>      // ชายหาด</p><p>      tft.fillRect(0, 180, 320, 60, sand);</p><p>      // ต้นมะพร้าว</p><p>      for (int i = 0; i &lt; 3; i++) {</p><p>        int x = 50 + i * 100;</p><p>        tft.fillRect(x, 140, 10, 40, TFT_BROWN);</p><p>        tft.fillCircle(x + 5, 130, 20, TFT_GREEN);</p><p>      }</p><p>      break;</p><p>    }</p><p>    case 5: { // 🌌 ป่ามืด + หิ่งห้อย</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      // ต้นไม้</p><p>      for (int i = 0; i &lt; 10; i++) {</p><p>        int x = i * 30 + 10;</p><p>        tft.fillRect(x, 180, 15, 60, TFT_BROWN);</p><p>        tft.fillCircle(x + 7, 170, 25, TFT_DARKGREEN);</p><p>      }</p><p>      // หิ่งห้อย</p><p>      for (int i = 0; i &lt; 30; i++) {</p><p>        int x = random(0, 320);</p><p>        int y = random(60, 200);</p><p>        tft.fillCircle(x, y, 2, TFT_YELLOW);</p><p>      }</p><p>      break;</p><p>    }</p><p>  }</p><p>}</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  drawBackground(backgroundMode);</p><p>}</p><p>void loop() {</p><p>  if (!digitalRead(WIO_KEY_A)) {</p><p>    unsigned long now = millis();</p><p>    if (now - lastButtonPress &gt; DEBOUNCE_DELAY) {</p><p>      backgroundMode = (backgroundMode + 1) % 6;</p><p>      drawBackground(backgroundMode);</p><p>      lastButtonPress = now;</p><p>    }</p><p>  }</p><p>  delay(50);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/67a2d849bd3151eb64e3c22ab897b567/2.mp4" />
         <pubDate>2025-08-22 09:00:23 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551487473</guid>
      </item>
      <item>
         <title>อาทิตย์ ปานทอง</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551494530</link>
         <description><![CDATA[<p>งานที่3</p><p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>// ===== สีพิเศษ =====</p><p>#define MY_ORANGE tft.color565(255,165,0)</p><p>#define TFT_BROWN  tft.color565(161,69,69)  // สีน้ำตาล</p><p>// ===== ขนาดยาน =====</p><p>#define SHIP_WIDTH 30</p><p>#define SHIP_HEIGHT 20</p><p>#define MOVE_STEP 20</p><p>const int METEOR_SPEED = 10;  // &lt;-- เติม ; ให้เรียบร้อย</p><p>#define SHIP_COLOR TFT_CYAN</p><p>uint16_t meteorColors[] = {TFT_RED, MY_ORANGE, TFT_YELLOW};</p><p>const int meteorColorCount = 3;</p><p>int shipX = 160;</p><p>int shipY = 200;</p><p>int backgroundMode = 0;</p><p>unsigned long startTime = 0;</p><p>struct Meteor {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>};</p><p>#define MAX_METEOR_COUNT 5</p><p>Meteor meteors[MAX_METEOR_COUNT];</p><p>int currentMeteorCount = 3;</p><p>// ===== พื้นหลัง =====</p><p>void drawBackground() {</p><p>  switch (backgroundMode) {</p><p>    case 0:</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i=0;i&lt;50;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(0,240);</p><p>        tft.drawPixel(x,y,TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 1:</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i=0;i&lt;30;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(0,240);</p><p>        tft.drawPixel(x,y,TFT_PURPLE);</p><p>      }</p><p>      for (int i=0;i&lt;30;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(0,240);</p><p>        tft.drawPixel(x,y,TFT_BLUE);</p><p>      }</p><p>      break;</p><p>    case 2:</p><p>      tft.fillScreen(TFT_DARKGREY);</p><p>      for (int i=0;i&lt;40;i++){</p><p>        int r=random(2,6);</p><p>        int x=random(r,320-r);</p><p>        int y=random(r,240-r);</p><p>        uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ</p><p>        tft.drawCircle(x,y,r,circleColor);</p><p>      }</p><p>      break;</p><p>    case 3:</p><p>      tft.fillScreen(TFT_NAVY);</p><p>      for (int i=0;i&lt;40;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(0,240);</p><p>        tft.drawPixel(x,y,TFT_YELLOW);</p><p>        if(random(0,2)==0){</p><p>          tft.drawPixel(x+1,y,TFT_ORANGE);</p><p>          tft.drawPixel(x,y+1,TFT_ORANGE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 4:</p><p>      tft.fillScreen(TFT_PURPLE);</p><p>      for(int i=0;i&lt;50;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(0,240);</p><p>        uint16_t c=meteorColors[random(0,meteorColorCount)];</p><p>        tft.drawPixel(x,y,c);</p><p>        if(random(0,3)==0){</p><p>          tft.drawPixel(x+1,y,TFT_WHITE);</p><p>          tft.drawPixel(x,y+1,TFT_WHITE);</p><p>        }</p><p>      }</p><p>      break;</p><p>    case 5:</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for(int i=0;i&lt;25;i++){</p><p>        int r=random(3,12);</p><p>        int x=random(r,320-r);</p><p>        int y=random(r,240-r);</p><p>        tft.fillCircle(x,y,r,TFT_GREEN);</p><p>      }</p><p>      break;</p><p>  }</p><p>}</p><p>void drawShip(int x,int y){</p><p>  tft.fillTriangle(x,y,x+SHIP_WIDTH/2,y-SHIP_HEIGHT,x+SHIP_WIDTH,y,SHIP_COLOR);</p><p>  tft.fillRect(x+SHIP_WIDTH/2-2,y,4,8,TFT_WHITE);</p><p>}</p><p>void drawMeteor(Meteor m){</p><p>  tft.fillCircle(m.x+m.size,m.y+m.size,m.size,m.color);</p><p>}</p><p>bool checkCollision(int sx,int sy,Meteor m){</p><p>  int mx=m.x+m.size;</p><p>  int my=m.y+m.size;</p><p>  int dx=max(sx,min(mx,sx+SHIP_WIDTH));</p><p>  int dy=max(sy-SHIP_HEIGHT,min(my,sy));</p><p>  int distSq=(mx-dx)*(mx-dx)+(my-dy)*(my-dy);</p><p>  return distSq&lt;m.size*m.size;</p><p>}</p><p>void drawScore(){</p><p>  unsigned long elapsed=(millis()-startTime)/1000;</p><p>  tft.setTextColor(TFT_WHITE,TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10,10);</p><p>  tft.printf("Time: %lus",elapsed);</p><p>}</p><p>void resetGame(){</p><p>  shipX=160;</p><p>  shipY=220;</p><p>  currentMeteorCount=3;</p><p>  startTime=millis();</p><p>  for(int i=0;i&lt;MAX_METEOR_COUNT;i++){</p><p>    meteors[i].x=random(0,320);</p><p>    meteors[i].y=random(-240,-20);</p><p>    meteors[i].size=random(8,16);</p><p>    meteors[i].color=meteorColors[random(0,meteorColorCount)];</p><p>  }</p><p>  drawBackground();</p><p>}</p><p>void setup(){</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  resetGame();</p><p>  pinMode(WIO_5S_UP,INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN,INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT,INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT,INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS,INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_A,INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B,INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C,INPUT_PULLUP);</p><p>}</p><p>void loop(){</p><p>  // เปลี่ยนพื้นหลัง</p><p>  if(!digitalRead(WIO_KEY_A)){</p><p>    backgroundMode=(backgroundMode+1)%6;</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if(!digitalRead(WIO_KEY_B)){</p><p>    backgroundMode=(backgroundMode+5)%6;</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  if(!digitalRead(WIO_KEY_C)){</p><p>    backgroundMode=0;</p><p>    drawBackground();</p><p>    delay(300);</p><p>  }</p><p>  // Move ship</p><p>  if(!digitalRead(WIO_5S_LEFT)) shipX-=MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_RIGHT)) shipX+=MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_UP)) shipY-=MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_DOWN)) shipY+=MOVE_STEP;</p><p>  shipX=constrain(shipX,0,320-SHIP_WIDTH);</p><p>  shipY=constrain(shipY,SHIP_HEIGHT,240);</p><p>  drawBackground();</p><p>  drawScore();</p><p>  drawShip(shipX,shipY);</p><p>  for(int i=0;i&lt;currentMeteorCount;i++){</p><p>    meteors[i].y+=METEOR_SPEED;</p><p>    if(meteors[i].y&gt;240){</p><p>      meteors[i].x=random(0,320);</p><p>      meteors[i].y=random(-100,-20);</p><p>      meteors[i].size=random(8,16);</p><p>      meteors[i].color=meteorColors[random(0,meteorColorCount)];</p><p>      if(currentMeteorCount&lt;MAX_METEOR_COUNT) currentMeteorCount++;</p><p>    }</p><p>    if(checkCollision(shipX,shipY,meteors[i])){</p><p>      tft.fillScreen(TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE,TFT_RED);</p><p>      tft.setTextSize(3);</p><p>      tft.setCursor(100,110);</p><p>      tft.print("BOOM!");</p><p>      delay(1000);</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      tft.setTextColor(TFT_WHITE);</p><p>      tft.setTextSize(2);</p><p>      tft.setCursor(80,120);</p><p>      tft.print("Press to Restart");</p><p>      while(digitalRead(WIO_5S_PRESS)==HIGH) delay(10);</p><p>      while(digitalRead(WIO_5S_PRESS)==LOW) delay(10);</p><p>      resetGame();</p><p>      break;</p><p>    }</p><p>    drawMeteor(meteors[i]);</p><p>  }</p><p>  delay(30);</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/ef3867f5560638582218a2f8cf90a243/3.mp4" />
         <pubDate>2025-08-22 09:11:38 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551494530</guid>
      </item>
      <item>
         <title>ธัญชนก เทียมประสิทธิ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551503331</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4253073706/69a752e85416d810317bed88c38a3d41/1000013426.jpg" />
         <pubDate>2025-08-22 09:27:42 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551503331</guid>
      </item>
      <item>
         <title>อาทิตย์ ปานทอง 4.1 4.2 4.3 4.4</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551514704</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;DHT.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#define DHTPIN 0</p><p>#define DHTTYPE DHT11</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>DHT dht(DHTPIN, DHTTYPE);</p><p>BH1750 lightMeter;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  dht.begin();</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>  delay(200);</p><p>  </p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  float temp = dht.readTemperature();</p><p>  float humi = dht.readHumidity();</p><p>  float lux = lightMeter.readLightLevel();</p><p>  Serial.print("Lux: ");</p><p>  Serial.println(lux);</p><p>  if (lux &lt; 0 || lux &gt; 65535) {</p><p>    lux = 0;</p><p>  }</p><p>  tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ</p><p>  if (isnan(temp) || isnan(humi) || isnan(lux)) {</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_RED, TFT_BLACK);</p><p>    tft.drawString("Sensor Error!", 80, 110);</p><p>  } else {</p><p>    // -------- ส่วนบน: Temperature &amp; Humidity --------</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>    tft.drawString("Temp", 40, 10);</p><p>    tft.drawString("Humidity", 190, 10);</p><p>    tft.setTextSize(4);</p><p>    tft.setCursor(30, 40);</p><p>    tft.printf("%.0f C", temp);</p><p>    tft.setCursor(180, 40);</p><p>    tft.printf("%.0f %%", humi);</p><p>    // -------- ส่วนล่าง: Light --------</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Light Level", 100, 135);</p><p>    tft.setTextSize(6);</p><p>    tft.setCursor(110, 160);</p><p>    tft.printf("%.0f ", lux);</p><p>  }</p><p>  delay(1000);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/634df42ff3e98be72fba8ecc4435e87c/4_1.mp4" />
         <pubDate>2025-08-22 09:48:28 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551514704</guid>
      </item>
      <item>
         <title>นายชุมพล นุชาญรัมย์</title>
         <author>chunphon2549</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551518911</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>TFT_eSPI tft;</p><p>int faceMode = 0;  // ตัวแปรเก็บหน้าปัจจุบัน</p><p>unsigned long lastChange = 0;</p><p>const unsigned long interval = 1000; // เปลี่ยนหน้าทุก 1 วินาที</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>}</p><p>void drawFace(int mode) {</p><p>  tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า</p><p>  // --- ใบหน้า ---</p><p>  tft.drawCircle(160, 120, 101, TFT_BLACK);</p><p>  tft.fillCircle(160, 120, 100, (mode==1)?TFT_YELLOW:TFT_BLUE);</p><p>  // --- ปาก ---</p><p>  switch(mode){</p><p>    case 0: // ปกติ</p><p>      tft.drawCircle(160, 135, 82, TFT_BLACK);</p><p>      tft.fillCircle(160, 135, 80, TFT_WHITE);</p><p>      break;</p><p>    case 1: // ยิ้ม</p><p>      tft.fillRect(120,140,80,20,TFT_RED);</p><p>      break;</p><p>    case 2: // ปากโอ</p><p>      tft.fillCircle(160,140,20,TFT_RED);</p><p>      break;</p><p>    case 3: // ตกใจ</p><p>      tft.drawRect(140,130,40,20,TFT_RED);</p><p>      break;</p><p>  }</p><p>  // --- ตา ---</p><p>  int eyeColor = (mode==3)?TFT_RED:TFT_BLACK; // หน้าตกใจลูกตาแดง</p><p>  tft.drawCircle(120,100,36,TFT_BLACK); tft.fillCircle(120,100,34,TFT_WHITE);</p><p>  tft.drawCircle(200,100,36,TFT_BLACK); tft.fillCircle(200,100,34,TFT_WHITE);</p><p>  tft.fillCircle(120,100,(mode==2)?10:15,eyeColor);</p><p>  tft.fillCircle(200,100,(mode==2)?10:15,eyeColor);</p><p>  // --- จมูก ---</p><p>  tft.fillCircle(160,129,12,TFT_RED);</p><p>  // --- ลิ้น ---</p><p>  if(mode==0) tft.fillTriangle(135,175,185,175,160,195,TFT_PINK);</p><p>  // --- หนวด ---</p><p>  tft.drawLine(200,165,250,150,TFT_BLACK);</p><p>  tft.drawLine(200,170,250,170,TFT_BLACK);</p><p>  tft.drawLine(200,175,250,190,TFT_BLACK);</p><p>  tft.drawLine(70,150,120,160,TFT_BLACK);</p><p>  tft.drawLine(70,170,120,170,TFT_BLACK);</p><p>  tft.drawLine(70,190,120,180,TFT_BLACK);</p><p>  // --- กระดิ่ง ---</p><p>  tft.fillCircle(160,220,15,TFT_YELLOW);</p><p>  tft.drawCircle(160,220,15,TFT_BLACK);</p><p>  tft.drawLine(160,220,160,235,TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  if(millis() - lastChange &gt; interval){</p><p>    lastChange = millis();</p><p>    drawFace(faceMode);</p><p>    faceMode++;</p><p>    if(faceMode&gt;3) faceMode=0;</p><p>  }</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202799904/8f6f0ab16854a73c82168df4ebec854a/IMG_4545.MOV.mov" />
         <pubDate>2025-08-22 09:54:40 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551518911</guid>
      </item>
      <item>
         <title>ชุมพล นุชาญรัมย์</title>
         <author>chunphon2549</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551521131</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>#define MAX_METEOR_COUNT 5</p><p>#define SHIP_WIDTH 30</p><p>#define SHIP_HEIGHT 20</p><p>#define MOVE_STEP 5</p><p>int METEOR_SPEED = 6;  // เพิ่มความเร็วอุกกาบาต</p><p>#define SHIP_COLOR TFT_CYAN</p><p>uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};</p><p>const int meteorColorCount = 3;</p><p>int shipX = 160;</p><p>int shipY = 200;</p><p>unsigned long startTime = 0;  </p><p>struct Meteor {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>  int prevX;</p><p>  int prevY;</p><p>};</p><p>Meteor meteors[MAX_METEOR_COUNT];</p><p>int currentMeteorCount = 3;</p><p>// ================= Background =================</p><p>void drawBackgroundSky() {</p><p>  tft.fillScreen(TFT_BLUE);</p><p>  // เมฆ</p><p>  for (int i = 0; i &lt; 10; i++) {</p><p>    int x = random(0, 320);</p><p>    int y = random(20, 100);</p><p>    int w = random(20, 50);</p><p>    int h = random(10, 20);</p><p>    tft.fillEllipse(x, y, w, h, TFT_WHITE);</p><p>  }</p><p>  // ดาวเล็ก</p><p>  for (int i = 0; i &lt; 20; i++) {</p><p>    int x = random(0, 320);</p><p>    int y = random(0, 50);</p><p>    tft.drawPixel(x, y, TFT_YELLOW);</p><p>  }</p><p>}</p><p>// ================= Ship =================</p><p>void drawShip(int x, int y, bool erase=false) {</p><p>  uint16_t color = erase ? TFT_BLUE : SHIP_COLOR;</p><p>  tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, color);</p><p>  tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, erase ? TFT_BLUE : TFT_WHITE);</p><p>}</p><p>// ================= Meteor =================</p><p>void drawMeteor(Meteor &amp;m, bool erase=false) {</p><p>  uint16_t color = erase ? TFT_BLUE : m.color;</p><p>  tft.fillCircle(m.prevX, m.prevY, m.size, TFT_BLUE); // ลบตำแหน่งเก่า</p><p>  tft.fillCircle(m.x + m.size, m.y + m.size, m.size, color);</p><p>  m.prevX = m.x + m.size;</p><p>  m.prevY = m.y + m.size;</p><p>}</p><p>bool checkCollision(int sx, int sy, Meteor m) {</p><p>  int mx = m.x + m.size;</p><p>  int my = m.y + m.size;</p><p>  int dx = max(sx, min(mx, sx + SHIP_WIDTH));</p><p>  int dy = max(sy - SHIP_HEIGHT, min(my, sy));</p><p>  int distSq = (mx - dx) <em> (mx - dx) + (my - dy) </em> (my - dy);</p><p>  return distSq &lt; m.size * m.size;</p><p>}</p><p>// ================= Score =================</p><p>void drawScore() {</p><p>  unsigned long elapsed = (millis() - startTime) / 1000;  </p><p>  tft.setTextColor(TFT_BLACK, TFT_BLUE);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10, 10);</p><p>  tft.printf("Time: %lus", elapsed);</p><p>}</p><p>// ================= Reset =================</p><p>void resetGame() {</p><p>  shipX = 160;</p><p>  shipY = 220;</p><p>  currentMeteorCount = 3;</p><p>  startTime = millis();  </p><p>  for (int i = 0; i &lt; MAX_METEOR_COUNT; i++) {</p><p>    meteors[i].x = random(0, 320);</p><p>    meteors[i].y = random(-240, -20);</p><p>    meteors[i].size = random(8, 16);</p><p>    meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>    meteors[i].prevX = meteors[i].x + meteors[i].size;</p><p>    meteors[i].prevY = meteors[i].y + meteors[i].size;</p><p>  }</p><p>  drawBackgroundSky();</p><p>}</p><p>// ================= Setup =================</p><p>void setup() {</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  resetGame();</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS, INPUT_PULLUP);</p><p>}</p><p>// ================= Loop =================</p><p>void loop() {</p><p>  // ลบเรือเก่า</p><p>  drawShip(shipX, shipY, true);</p><p>  // Move ship</p><p>  if (!digitalRead(WIO_5S_LEFT))  shipX -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_UP))    shipY -= MOVE_STEP;</p><p>  if (!digitalRead(WIO_5S_DOWN))  shipY += MOVE_STEP;</p><p>  shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);</p><p>  shipY = constrain(shipY, SHIP_HEIGHT, 240);</p><p>  // วาดเรือใหม่</p><p>  drawShip(shipX, shipY);</p><p>  // วาด Score</p><p>  drawScore();</p><p>  // อัปเดต meteors</p><p>  for (int i = 0; i &lt; currentMeteorCount; i++) {</p><p>    meteors[i].y += METEOR_SPEED;</p><p>    if (meteors[i].y &gt; 240) {</p><p>      meteors[i].x = random(0, 320);</p><p>      meteors[i].y = random(-100, -20);</p><p>      meteors[i].size = random(8, 16);</p><p>      meteors[i].color = meteorColors[random(0, meteorColorCount)];</p><p>    }</p><p>    if (checkCollision(shipX, shipY, meteors[i])) {</p><p>      tft.fillScreen(TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE, TFT_RED);</p><p>      tft.setTextSize(3);</p><p>      tft.setCursor(100, 110);</p><p>      tft.print("BOOM!");</p><p>      delay(1000);</p><p>      resetGame();</p><p>      break;</p><p>    }</p><p>    drawMeteor(meteors[i]);</p><p>  }</p><p>  delay(20);  // เพิ่ม FPS เล็กน้อยเพื่อสมูท</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202799904/154ea5710350d7a6e4250306f43f5262/IMG_4546.MOV.mov" />
         <pubDate>2025-08-22 09:58:55 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551521131</guid>
      </item>
      <item>
         <title>นายชุมพล นุชาญรัมย์</title>
         <author>chunphon2549</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551521506</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>// ===== ค่าตัวแปรเกม =====</p><p>#define MAX_METEOR_COUNT 5</p><p>#define SHIP_WIDTH 30</p><p>#define SHIP_HEIGHT 20</p><p>#define MOVE_STEP 10           // ยานเคลื่อนสมูท</p><p>const int METEOR_SPEED = 15;   // อุกกาบาตเร็วขึ้น</p><p>#define SHIP_COLOR TFT_CYAN</p><p>uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};</p><p>const int meteorColorCount = 3;</p><p>int shipX = 160;</p><p>int shipY = 200;</p><p>int backgroundMode = 0;</p><p>unsigned long startTime = 0;</p><p>// ===== โครงสร้างอุกกาบาต =====</p><p>struct Meteor {</p><p>  int x;</p><p>  int y;</p><p>  int size;</p><p>  uint16_t color;</p><p>};</p><p>Meteor meteors[MAX_METEOR_COUNT];</p><p>int currentMeteorCount = 3;</p><p>// ===== พื้นหลัง 6 แบบ =====</p><p>void drawBackground() {</p><p>  switch (backgroundMode) {</p><p>    case 0: // ท้องฟ้ายามเช้า</p><p>      tft.fillScreen(tft.color565(135,206,235));</p><p>      for (int i=0;i&lt;10;i++){</p><p>        int x=random(0,320);</p><p>        int y=random(20,100);</p><p>        int w=random(20,50);</p><p>        int h=random(10,20);</p><p>        tft.fillEllipse(x,y,w,h,TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 1: // ท้องฟ้าเย็น</p><p>      tft.fillScreen(TFT_NAVY);</p><p>      for (int i=0;i&lt;50;i++){</p><p>        tft.drawPixel(random(0,320), random(0,240), TFT_YELLOW);</p><p>      }</p><p>      break;</p><p>    case 2: // อวกาศ</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      for (int i=0;i&lt;40;i++){</p><p>        int c=meteorColors[random(0,meteorColorCount)];</p><p>        tft.drawPixel(random(0,320), random(0,240), c);</p><p>      }</p><p>      break;</p><p>    case 3: // ทะเลหมอก</p><p>      tft.fillScreen(TFT_DARKGREY);</p><p>      for (int i=0;i&lt;30;i++){</p><p>        int r=random(3,8);</p><p>        tft.drawCircle(random(r,320-r), random(r,240-r), r, TFT_WHITE);</p><p>      }</p><p>      break;</p><p>    case 4: // พระอาทิตย์ตก</p><p>      tft.fillScreen(TFT_PURPLE);</p><p>      for (int i=0;i&lt;50;i++){</p><p>        int c = (i%2==0)? TFT_ORANGE : TFT_YELLOW;</p><p>        tft.drawPixel(random(0,320), random(0,240), c);</p><p>      }</p><p>      break;</p><p>    case 5: // ป่าลึกลับ</p><p>      tft.fillScreen(TFT_GREEN);</p><p>      for (int i=0;i&lt;25;i++){</p><p>        int r=random(3,12);</p><p>        tft.fillCircle(random(r,320-r), random(r,240-r), r, TFT_CYAN);</p><p>      }</p><p>      break;</p><p>  }</p><p>}</p><p>// ===== วาดยาน =====</p><p>void drawShip(int x, int y){</p><p>  tft.fillTriangle(x, y, x + SHIP_WIDTH/2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);</p><p>  tft.fillRect(x + SHIP_WIDTH/2 -2, y, 4, 8, TFT_WHITE);</p><p>}</p><p>// ===== วาดอุกกาบาต =====</p><p>void drawMeteor(Meteor m){</p><p>  tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);</p><p>}</p><p>// ===== ตรวจสอบการชน =====</p><p>bool checkCollision(int sx,int sy,Meteor m){</p><p>  int mx = m.x + m.size;</p><p>  int my = m.y + m.size;</p><p>  int dx = max(sx, min(mx, sx + SHIP_WIDTH));</p><p>  int dy = max(sy - SHIP_HEIGHT, min(my, sy));</p><p>  int distSq = (mx - dx)*(mx - dx) + (my - dy)*(my - dy);</p><p>  return distSq &lt; m.size*m.size;</p><p>}</p><p>// ===== แสดงเวลา =====</p><p>void drawScore(){</p><p>  unsigned long elapsed = (millis()-startTime)/1000;</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setTextSize(2);</p><p>  tft.setCursor(10,10);</p><p>  tft.printf("Time: %lus", elapsed);</p><p>}</p><p>// ===== รีเซ็ตเกม =====</p><p>void resetGame(){</p><p>  shipX = 160;</p><p>  shipY = 220;</p><p>  currentMeteorCount = 3;</p><p>  startTime = millis();</p><p>  for(int i=0;i&lt;MAX_METEOR_COUNT;i++){</p><p>    meteors[i].x = random(0,320);</p><p>    meteors[i].y = random(-240,-20);</p><p>    meteors[i].size = random(8,16);</p><p>    meteors[i].color = meteorColors[random(0,meteorColorCount)];</p><p>  }</p><p>  drawBackground();</p><p>}</p><p>// ===== setup =====</p><p>void setup(){</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  randomSeed(analogRead(0));</p><p>  resetGame();</p><p>  pinMode(WIO_5S_UP, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_DOWN, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_LEFT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_RIGHT, INPUT_PULLUP);</p><p>  pinMode(WIO_5S_PRESS, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_A, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_B, INPUT_PULLUP);</p><p>  pinMode(WIO_KEY_C, INPUT_PULLUP);</p><p>}</p><p>// ===== loop =====</p><p>void loop(){</p><p>  // เปลี่ยนพื้นหลัง</p><p>  if(!digitalRead(WIO_KEY_A)){ backgroundMode = (backgroundMode+1)%6; drawBackground(); delay(200);}</p><p>  if(!digitalRead(WIO_KEY_B)){ backgroundMode = (backgroundMode+5)%6; drawBackground(); delay(200);}</p><p>  if(!digitalRead(WIO_KEY_C)){ backgroundMode=0; drawBackground(); delay(200);}</p><p>  // ขยับยาน</p><p>  if(!digitalRead(WIO_5S_LEFT)) shipX -= MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_UP)) shipY -= MOVE_STEP;</p><p>  if(!digitalRead(WIO_5S_DOWN)) shipY += MOVE_STEP;</p><p>  shipX = constrain(shipX,0,320-SHIP_WIDTH);</p><p>  shipY = constrain(shipY,SHIP_HEIGHT,240);</p><p>  // วาดพื้นหลังและยาน</p><p>  drawBackground();</p><p>  drawScore();</p><p>  drawShip(shipX,shipY);</p><p>  // อุกกาบาต</p><p>  for(int i=0;i&lt;currentMeteorCount;i++){</p><p>    meteors[i].y += METEOR_SPEED;</p><p>    if(meteors[i].y &gt; 240){</p><p>      meteors[i].x = random(0,320);</p><p>      meteors[i].y = random(-100,-20);</p><p>      meteors[i].size = random(8,16);</p><p>      meteors[i].color = meteorColors[random(0,meteorColorCount)];</p><p>      if(currentMeteorCount&lt;MAX_METEOR_COUNT) currentMeteorCount++;</p><p>    }</p><p>    if(checkCollision(shipX,shipY,meteors[i])){</p><p>      tft.fillScreen(TFT_RED);</p><p>      tft.setTextColor(TFT_WHITE,TFT_RED);</p><p>      tft.setTextSize(3);</p><p>      tft.setCursor(100,110);</p><p>      tft.print("BOOM!");</p><p>      delay(1000);</p><p>      tft.fillScreen(TFT_BLACK);</p><p>      tft.setTextColor(TFT_WHITE);</p><p>      tft.setTextSize(2);</p><p>      tft.setCursor(80,120);</p><p>      tft.print("Press to Restart");</p><p>      while(digitalRead(WIO_5S_PRESS)==HIGH) delay(10);</p><p>      while(digitalRead(WIO_5S_PRESS)==LOW) delay(10);</p><p>      resetGame();</p><p>      break;</p><p>    }</p><p>    drawMeteor(meteors[i]);</p><p>  }</p><p>  delay(20); // ลดเวลา delay เพื่อเฟรมสมูทขึ้น</p><p>}</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4202799904/dac6ee49c2ebd99df35b4e1de6ec7c8c/IMG_4547.MOV.mov" />
         <pubDate>2025-08-22 09:59:50 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551521506</guid>
      </item>
      <item>
         <title>ชุมพล นุชาญรัมย์ 4.</title>
         <author>chunphon2549</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551522804</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>#include &lt;DHT.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#define DHTPIN A0</p><p>#define DHTTYPE DHT11</p><p>TFT_eSPI tft = TFT_eSPI();</p><p>DHT dht(DHTPIN, DHTTYPE);</p><p>BH1750 lightMeter;</p><p>void setup() {</p><p>  Serial.begin(115200);</p><p>  dht.begin();</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>  delay(200);</p><p>  </p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>}</p><p>void loop() {</p><p>  float temp = dht.readTemperature();</p><p>  float humi = dht.readHumidity();</p><p>  float lux = lightMeter.readLightLevel();</p><p>  Serial.print("Lux: ");</p><p>  Serial.println(lux);</p><p>  if (lux &lt; 0 || lux &gt; 65535) {</p><p>    lux = 0;</p><p>  }</p><p>  tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ</p><p>  if (isnan(temp) || isnan(humi) || isnan(lux)) {</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_RED, TFT_BLACK);</p><p>    tft.drawString("Sensor Error!", 80, 110);</p><p>  } else {</p><p>    // -------- ส่วนบน: Temperature &amp; Humidity --------</p><p>    tft.setTextSize(2);</p><p>    tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>    tft.drawString("Temp", 40, 10);</p><p>    tft.drawString("Humidity", 190, 10);</p><p>    tft.setTextSize(4);</p><p>    tft.setCursor(30, 40);</p><p>    tft.printf("%.0f C", temp);</p><p>    tft.setCursor(180, 40);</p><p>    tft.printf("%.0f %%", humi);</p><p>    // -------- ส่วนล่าง: Light --------</p><p>    tft.setTextSize(2);</p><p>    tft.drawString("Light Level", 100, 135);</p><p>    tft.setTextSize(6);</p><p>    tft.setCursor(110, 160);</p><p>    tft.printf("%.0f ", lux);</p><p>  }</p><p>  delay(1000);</p><p>} `แสงอุณหภูมิ</p>]]></description>
         <enclosure url="https://drive.google.com/file/d/1Ehw-C2WJPErFWT9vkeuaftCY6wRTLD02/view?usp=drivesdk" />
         <pubDate>2025-08-22 10:02:23 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3551522804</guid>
      </item>
      <item>
         <title>ธัญชนก เทียมประสิทธิ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554943294</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;  </p><p><br/></p><p>#include &lt;Arduino.h&gt;</p><p><br/></p><p>TFT_eSPI tft = TFT_eSPI();  </p><p><br/></p><p>// สีที่กำหนดเอง</p><p><br/></p><p>#define MY_BROWN     0xA145</p><p><br/></p><p>#define MY_DARKGREY  0x7BEF</p><p><br/></p><p>// ปุ่ม 5-way switch ของ Wio Terminal</p><p><br/></p><p>#define BTN_LEFT   WIO_5S_LEFT</p><p><br/></p><p>#define BTN_RIGHT  WIO_5S_RIGHT</p><p><br/></p><p>#define BTN_UP     WIO_5S_UP</p><p><br/></p><p>#define BTN_DOWN   WIO_5S_DOWN</p><p><br/></p><p>int catX = 40;</p><p><br/></p><p>int catY = 100;</p><p><br/></p><p>int step = 10;</p><p><br/></p><p>int moveX = 0;  // -1 ซ้าย, 1 ขวา</p><p><br/></p><p>int moveY = 0;  // -1 ขึ้น, 1 ลง</p><p><br/></p><p>unsigned long lastMoveTime = 0;</p><p><br/></p><p>void setup() {</p><p><br/></p><p>  Serial.begin(115200);</p><p><br/></p><p>  delay(100);</p><p><br/></p><p>  tft.begin();</p><p><br/></p><p>  tft.setRotation(3);</p><p><br/></p><p>  pinMode(BTN_LEFT, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_RIGHT, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_UP, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_DOWN, INPUT_PULLUP);</p><p><br/></p><p>  drawBackground();</p><p><br/></p><p>  drawCat(catX, catY);</p><p><br/></p><p>}</p><p><br/></p><p>void loop() {</p><p><br/></p><p>  // อ่านปุ่มทิศทาง</p><p><br/></p><p>  moveX = 0;</p><p><br/></p><p>  moveY = 0;</p><p><br/></p><p>  if (digitalRead(BTN_RIGHT) == LOW) moveX = 1;</p><p><br/></p><p>  else if (digitalRead(BTN_LEFT) == LOW) moveX = -1;</p><p><br/></p><p>  if (digitalRead(BTN_DOWN) == LOW) moveY = 1;</p><p><br/></p><p>  else if (digitalRead(BTN_UP) == LOW) moveY = -1;</p><p><br/></p><p>  if (millis() - lastMoveTime &gt; 200) {</p><p><br/></p><p>    if (moveX != 0 || moveY != 0) {</p><p><br/></p><p>      drawPawPrint(catX + 10, catY + 40, MY_DARKGREY);</p><p><br/></p><p>      catX += step * moveX;</p><p><br/></p><p>      catY += step * moveY;</p><p><br/></p><p>      // ขอบจอ</p><p><br/></p><p>      if (catX &gt; tft.width() - 30) catX = tft.width() - 30;</p><p><br/></p><p>      if (catX &lt; 30) catX = 30;</p><p><br/></p><p>      if (catY &gt; tft.height() - 40) catY = tft.height() - 40;</p><p><br/></p><p>      if (catY &lt; 30) catY = 30;</p><p><br/></p><p>      drawBackground();</p><p><br/></p><p>      drawCat(catX, catY);</p><p><br/></p><p>    }</p><p><br/></p><p>    lastMoveTime = millis();</p><p><br/></p><p>  }</p><p><br/></p><p>}</p><p><br/></p><p>// ===== วาดฉาก =====</p><p><br/></p><p>void drawBackground() {</p><p><br/></p><p>  tft.fillScreen(TFT_CYAN);</p><p><br/></p><p>  int groundY = tft.height() / 2;</p><p><br/></p><p>  tft.fillRect(0, groundY, tft.width(), tft.height() - groundY, TFT_GREEN);</p><p><br/></p><p>  drawSun();</p><p><br/></p><p>  drawCloud(40, 40);</p><p><br/></p><p>  drawCloud(120, 60);</p><p><br/></p><p>  drawTree(60, groundY);</p><p><br/></p><p>  drawTree(180, groundY);</p><p><br/></p><p>  drawText();</p><p><br/></p><p>}</p><p><br/></p><p>void drawSun() {</p><p><br/></p><p>  int sunRadius = 30;</p><p><br/></p><p>  tft.fillCircle(tft.width() - sunRadius - 10, sunRadius + 10, sunRadius, TFT_YELLOW);</p><p><br/></p><p>}</p><p><br/></p><p>void drawCloud(int x, int y) {</p><p><br/></p><p>  tft.fillCircle(x, y, 12, TFT_WHITE);</p><p><br/></p><p>  tft.fillCircle(x + 15, y - 5, 15, TFT_WHITE);</p><p><br/></p><p>  tft.fillCircle(x + 30, y, 12, TFT_WHITE);</p><p><br/></p><p>  tft.fillRect(x - 2, y, 34, 12, TFT_WHITE);</p><p><br/></p><p>}</p><p><br/></p><p>void drawTree(int x, int groundY) {</p><p><br/></p><p>  int trunkWidth = 10;</p><p><br/></p><p>  int trunkHeight = 20;</p><p><br/></p><p>  int foliageRadius = 20;</p><p><br/></p><p>  tft.fillRect(x, groundY - trunkHeight, trunkWidth, trunkHeight, MY_BROWN);</p><p><br/></p><p>  tft.fillCircle(x + trunkWidth / 2, groundY - trunkHeight - foliageRadius / 2, foliageRadius, TFT_DARKGREEN);</p><p><br/></p><p>}</p><p><br/></p><p>void drawText() {</p><p><br/></p><p>  tft.setTextColor(TFT_BLACK);</p><p><br/></p><p>  tft.setTextSize(2);</p><p><br/></p><p>  tft.setCursor(20, 20);</p><p><br/></p><p>  tft.println("Wio Terminal");</p><p><br/></p><p>}</p><p><br/></p><p>void drawCat(int x, int y) {</p><p><br/></p><p>  tft.fillCircle(x, y, 15, TFT_ORANGE);</p><p><br/></p><p>  tft.fillTriangle(x - 10, y - 10, x - 5, y - 20, x, y - 10, TFT_ORANGE);</p><p><br/></p><p>  tft.fillTriangle(x + 10, y - 10, x + 5, y - 20, x, y - 10, TFT_ORANGE);</p><p><br/></p><p>  tft.fillCircle(x - 5, y - 2, 3, TFT_BLACK);</p><p><br/></p><p>  tft.fillCircle(x + 5, y - 2, 3, TFT_BLACK);</p><p><br/></p><p>  tft.fillCircle(x, y + 4, 2, TFT_PINK);</p><p><br/></p><p>  tft.drawLine(x - 3, y + 7, x + 3, y + 7, TFT_BLACK);</p><p><br/></p><p>  tft.fillRect(x - 12, y + 15, 24, 20, TFT_ORANGE);</p><p><br/></p><p>  tft.fillRect(x - 12, y + 35, 6, 10, TFT_ORANGE);</p><p><br/></p><p>  tft.fillRect(x + 6, y + 35, 6, 10, TFT_ORANGE);</p><p><br/></p><p>  tft.fillRect(x + 14, y + 20, 5, 15, TFT_ORANGE);</p><p><br/></p><p>}</p><p><br/></p><p>void drawPawPrint(int x, int y, uint16_t color) {</p><p><br/></p><p>  tft.fillCircle(x - 6, y - 6, 2, color);</p><p><br/></p><p>  tft.fillCircle(x + 6, y - 6, 2, color);</p><p><br/></p><p>  tft.fillCircle(x - 4, y + 0, 2, color);</p><p><br/></p><p>  tft.fillCircle(x + 4, y + 0, 2, color);</p><p><br/></p><p>  tft.fillRoundRect(x - 4, y + 2, 8, 10, 3, color);</p><p><br/></p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4266612815/4a0a0f61edf26916d8813583aff7c3f1/20250822_154323.mp4" />
         <pubDate>2025-08-26 04:51:26 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554943294</guid>
      </item>
      <item>
         <title>ธัญชนก เทียมประสิทธิ์</title>
         <author></author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554955671</link>
         <description><![CDATA[<p><br/></p><p>#include &lt;TFT_eSPI.h&gt;</p><p><br/></p><p>#include &lt;Arduino.h&gt;</p><p><br/></p><p>TFT_eSPI tft = TFT_eSPI();</p><p><br/></p><p>// ปุ่มทิศทาง (D-Pad) ของ Wio Terminal</p><p><br/></p><p>#define BTN_LEFT   WIO_5S_LEFT</p><p><br/></p><p>#define BTN_RIGHT  WIO_5S_RIGHT</p><p><br/></p><p>#define BTN_UP     WIO_5S_UP</p><p><br/></p><p>#define BTN_DOWN   WIO_5S_DOWN</p><p><br/></p><p>// ปุ่มเปลี่ยนฉาก</p><p><br/></p><p>#define BTN_C WIO_KEY_C</p><p><br/></p><p>// ตัวแปรผู้เล่น</p><p><br/></p><p>int playerX = 120;</p><p><br/></p><p>int playerY = 200;</p><p><br/></p><p>const int playerSize = 20;</p><p><br/></p><p>// ตัวแปรสิ่งกีดขวาง</p><p><br/></p><p>int obstacleX = 0;</p><p><br/></p><p>int obstacleY = 0;</p><p><br/></p><p>const int obstacleSize = 20;</p><p><br/></p><p>int obstacleSpeed = 3;</p><p><br/></p><p>// พื้นหลัง</p><p><br/></p><p>int bgIndex = 0;</p><p><br/></p><p>const int bgCount = 6;</p><p><br/></p><p>// คะแนน</p><p><br/></p><p>int score = 0;</p><p><br/></p><p>// ควบคุมเฟรม</p><p><br/></p><p>unsigned long lastFrame = 0;</p><p><br/></p><p>const int frameDelay = 30;</p><p><br/></p><p>void setup() {</p><p><br/></p><p>  Serial.begin(115200);</p><p><br/></p><p>  tft.begin();</p><p><br/></p><p>  tft.setRotation(3);</p><p><br/></p><p>  pinMode(BTN_LEFT, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_RIGHT, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_UP, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_DOWN, INPUT_PULLUP);</p><p><br/></p><p>  pinMode(BTN_C, INPUT_PULLUP);</p><p><br/></p><p>  randomSeed(analogRead(0));</p><p><br/></p><p>  drawBackground(bgIndex);</p><p><br/></p><p>  resetObstacle();</p><p><br/></p><p>}</p><p><br/></p><p>void loop() {</p><p><br/></p><p>  if (millis() - lastFrame &gt; frameDelay) {</p><p><br/></p><p>    updateInput();</p><p><br/></p><p>    updateGame();</p><p><br/></p><p>    drawGame();</p><p><br/></p><p>    lastFrame = millis();</p><p><br/></p><p>  }</p><p><br/></p><p>}</p><p><br/></p><p>// อ่านปุ่มควบคุม</p><p><br/></p><p>void updateInput() {</p><p><br/></p><p>  // ซ้าย</p><p><br/></p><p>  if (digitalRead(BTN_LEFT) == LOW) {</p><p><br/></p><p>    playerX -= 5;</p><p><br/></p><p>    if (playerX &lt; 0) playerX = 0;</p><p><br/></p><p>  }</p><p><br/></p><p>  // ขวา</p><p><br/></p><p>  if (digitalRead(BTN_RIGHT) == LOW) {</p><p><br/></p><p>    playerX += 5;</p><p><br/></p><p>    if (playerX &gt; tft.width() - playerSize) playerX = tft.width() - playerSize;</p><p><br/></p><p>  }</p><p><br/></p><p>  // ขึ้น</p><p><br/></p><p>  if (digitalRead(BTN_UP) == LOW) {</p><p><br/></p><p>    playerY -= 5;</p><p><br/></p><p>    if (playerY &lt; 0) playerY = 0;</p><p><br/></p><p>  }</p><p><br/></p><p>  // ลง</p><p><br/></p><p>  if (digitalRead(BTN_DOWN) == LOW) {</p><p><br/></p><p>    playerY += 5;</p><p><br/></p><p>    if (playerY &gt; tft.height() - playerSize) playerY = tft.height() - playerSize;</p><p><br/></p><p>  }</p><p><br/></p><p>  // เปลี่ยนฉาก</p><p><br/></p><p>  if (digitalRead(BTN_C) == LOW) {</p><p><br/></p><p>    bgIndex = (bgIndex + 1) % bgCount;</p><p><br/></p><p>    drawBackground(bgIndex);</p><p><br/></p><p>    delay(300); // ป้องกันกดค้าง</p><p><br/></p><p>  }</p><p><br/></p><p>}</p><p><br/></p><p>// อัปเดตเกม</p><p><br/></p><p>void updateGame() {</p><p><br/></p><p>  obstacleY += obstacleSpeed;</p><p><br/></p><p>  if (obstacleY &gt; tft.height()) {</p><p><br/></p><p>    resetObstacle();</p><p><br/></p><p>  }</p><p><br/></p><p>  // ตรวจสอบการชน</p><p><br/></p><p>  if (playerX &lt; obstacleX + obstacleSize &amp;&amp;</p><p><br/></p><p>      playerX + playerSize &gt; obstacleX &amp;&amp;</p><p><br/></p><p>      playerY &lt; obstacleY + obstacleSize &amp;&amp;</p><p><br/></p><p>      playerY + playerSize &gt; obstacleY) {</p><p><br/></p><p>    score++;</p><p><br/></p><p>    resetObstacle();</p><p><br/></p><p>  }</p><p><br/></p><p>}</p><p><br/></p><p>// วาดเกม</p><p><br/></p><p>void drawGame() {</p><p><br/></p><p>  drawBackground(bgIndex);</p><p><br/></p><p>  // ผู้เล่น</p><p><br/></p><p>  tft.fillRect(playerX, playerY, playerSize, playerSize, TFT_BLUE);</p><p><br/></p><p>  // สิ่งกีดขวาง</p><p><br/></p><p>  tft.fillRect(obstacleX, obstacleY, obstacleSize, obstacleSize, TFT_BLACK);</p><p><br/></p><p>  // คะแนน</p><p><br/></p><p>  tft.setTextColor(TFT_WHITE, tft.color565(0, 0, 0));</p><p><br/></p><p>  tft.setTextSize(2);</p><p><br/></p><p>  tft.setCursor(5, 5);</p><p><br/></p><p>  tft.printf("Score: %d", score);</p><p><br/></p><p>}</p><p><br/></p><p>// รีเซ็ตสิ่งกีดขวาง</p><p><br/></p><p>void resetObstacle() {</p><p><br/></p><p>  obstacleX = random(0, tft.width() - obstacleSize);</p><p><br/></p><p>  obstacleY = 0;</p><p><br/></p><p>}</p><p><br/></p><p>// วาดพื้นหลัง</p><p><br/></p><p>void drawBackground(int index) {</p><p><br/></p><p>  switch (index) {</p><p><br/></p><p>    case 0: tft.fillScreen(TFT_CYAN); break;</p><p><br/></p><p>    case 1: tft.fillScreen(TFT_YELLOW); break;</p><p><br/></p><p>    case 2: tft.fillScreen(TFT_GREEN); break;</p><p><br/></p><p>    case 3: tft.fillScreen(TFT_ORANGE); break;</p><p><br/></p><p>    case 4: tft.fillScreen(TFT_MAGENTA); break;</p><p><br/></p><p>    case 5: tft.fillScreen(TFT_DARKGREY); break;</p><p><br/></p><p>  }</p><p><br/></p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4266612815/1155d4d772e1860b3eb0cf7b6026d8d1/20250822_154617.mp4" />
         <pubDate>2025-08-26 04:59:56 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554955671</guid>
      </item>
      <item>
         <title>นายอาทิตย์ ปานทอง 5.1 5.2 5.3 5.4</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554974229</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;Arduino.h&gt;</p><p>TFT_eSPI tft;</p><p>#define SW_A BCM0  // เพิ่มวินาที ต่อเข้า SW6</p><p>#define SW_B BCM1  // เพิ่มนาที ต่อเข้า SW7</p><p>#define SW_C BCM2  // Start / Stop / Reset ต่อเข้า SW5</p><p>#define BUZZER_PIN WIO_BUZZER</p><p>int seconds = 0;</p><p>int minutes = 0;</p><p>bool running = false;</p><p>bool finished = false;</p><p>unsigned long lastMillis = 0;</p><p>void setup() {</p><p>  pinMode(SW_A, INPUT);</p><p>  pinMode(SW_B, INPUT);</p><p>  pinMode(SW_C, INPUT);</p><p>  pinMode(BUZZER_PIN, OUTPUT);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_WHITE);</p><p>  drawUI();</p><p>}</p><p>void loop() {</p><p>  // ตั้งเวลา</p><p>  if (!running &amp;&amp; !finished) {</p><p>    if (digitalRead(SW_A) == LOW) {</p><p>      delay(200);</p><p>      seconds++;</p><p>      if (seconds &gt;= 60) seconds = 0;</p><p>      beep(100);</p><p>      drawUI();</p><p>    }</p><p>    if (digitalRead(SW_B) == LOW) {</p><p>      delay(200);</p><p>      minutes++;</p><p>      if (minutes &gt;= 60) minutes = 0;</p><p>      beep(100);</p><p>      drawUI();</p><p>    }</p><p>  }</p><p>  // ปุ่มเริ่ม / หยุด / รีเซ็ต</p><p>  if (digitalRead(SW_C) == LOW) {</p><p>    delay(300); // debounce</p><p>    if (!running &amp;&amp; !finished &amp;&amp; (minutes &gt; 0 || seconds &gt; 0)) {</p><p>      running = true;</p><p>      lastMillis = millis();</p><p>    } else if (running) {</p><p>      running = false;  // หยุดชั่วคราว</p><p>    } else if (finished) {</p><p>      // ติ๊ด 5 ครั้ง</p><p>      for (int i = 0; i &lt; 5; i++) {</p><p>        beep(200);</p><p>        delay(200);</p><p>      }</p><p>      finished = false;</p><p>      minutes = 0;</p><p>      seconds = 0;</p><p>      drawUI();</p><p>    }</p><p>  }</p><p>  // ทำงานเมื่อ countdown กำลังรัน</p><p>  if (running &amp;&amp; millis() - lastMillis &gt;= 1000) {</p><p>    lastMillis = millis();</p><p>    if (seconds == 0) {</p><p>      if (minutes == 0) {</p><p>        running = false;</p><p>        finished = true;</p><p>        drawUI();</p><p>        // ติ๊ด 3 ครั้ง</p><p>        for (int i = 0; i &lt; 3; i++) {</p><p>          beep(200);</p><p>          delay(200);</p><p>        }</p><p>      } else {</p><p>        minutes--;</p><p>        seconds = 59;</p><p>      }</p><p>    } else {</p><p>      seconds--;</p><p>    }</p><p>    drawUI();</p><p>  }</p><p>}</p><p>void drawUI() {</p><p>  tft.fillScreen(TFT_WHITE);</p><p>  tft.setTextColor(TFT_BLACK);</p><p>  tft.setTextDatum(MC_DATUM);</p><p>  tft.setTextSize(2);</p><p>  tft.drawString("Count Down", 160, 30);</p><p>  tft.drawString("SW7 TO START/STOP", 160, 60);</p><p>  tft.drawString("SW6 &amp; SW5 TO SET TIME", 160, 85);</p><p>  // แสดงเวลา</p><p>  char timeBuf[10];</p><p>  sprintf(timeBuf, "%02d : %02d", minutes, seconds);</p><p>  tft.setTextSize(4);</p><p>  tft.drawString(timeBuf, 160, 130);</p><p>  // แสดงสถานะ</p><p>  tft.setTextSize(2);</p><p>  if (running) {</p><p>    tft.setTextColor(TFT_RED);</p><p>    tft.drawString("RUNNING", 160, 190);</p><p>  } else if (finished) {</p><p>    tft.setTextColor(TFT_BLUE);</p><p>    tft.drawString("FINISHED", 160, 190);</p><p>  } else {</p><p>    tft.setTextColor(TFT_DARKGREY);</p><p>    tft.drawString("STOP", 160, 190);</p><p>  }</p><p>}</p><p>void beep(int duration) {</p><p>  tone(BUZZER_PIN, 1500); // 1.5kHz</p><p>  delay(duration);</p><p>  noTone(BUZZER_PIN);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/c14d6af5a200e1e16e369dcdf6d0cd58/Athit5_1.mp4" />
         <pubDate>2025-08-26 05:12:46 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3554974229</guid>
      </item>
      <item>
         <title>นายอาทิตย์ ปานทอง 6.1 6.2 6.3 6.4</title>
         <author>yxdtayxy</author>
         <link>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3555026374</link>
         <description><![CDATA[<p>#include &lt;TFT_eSPI.h&gt;</p><p>#include &lt;BH1750.h&gt;</p><p>#include &lt;Wire.h&gt;</p><p>BH1750 lightMeter;</p><p>TFT_eSPI tft;</p><p>#define RELAY1_PIN BCM8</p><p>#define RELAY2_PIN BCM9</p><p>#define SMOOTH_N 5</p><p>float luxArray[SMOOTH_N] = {0};</p><p>void setup() {</p><p>  Wire.begin();</p><p>  lightMeter.begin();</p><p>  pinMode(RELAY1_PIN, OUTPUT);</p><p>  pinMode(RELAY2_PIN, OUTPUT);</p><p>  digitalWrite(RELAY1_PIN, LOW);</p><p>  digitalWrite(RELAY2_PIN, LOW);</p><p>  tft.begin();</p><p>  tft.setRotation(3);</p><p>  tft.fillScreen(TFT_BLACK);</p><p>  // หัวข้อด้านบน</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(TFT_CYAN, TFT_BLACK);</p><p>  tft.setCursor(70, 0);</p><p>  tft.print("Light Monitor");</p><p>  // เส้นแบ่งหัวข้อ</p><p>  tft.drawLine(20, 25, 300, 25, TFT_DARKGREY);</p><p>}</p><p>float getLuxAverage(float newLux) {</p><p>  for (int i = SMOOTH_N - 1; i &gt; 0; i--) luxArray[i] = luxArray[i - 1];</p><p>  luxArray[0] = newLux;</p><p>  float sum = 0;</p><p>  for (int i = 0; i &lt; SMOOTH_N; i++) sum += luxArray[i];</p><p>  return sum / SMOOTH_N;</p><p>}</p><p>uint32_t getBarColor(float lux, float minLux, float maxLux) {</p><p>  float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);</p><p>  uint8_t r, g, b;</p><p>  if (ratio &lt; 0.5) {</p><p>    r = ratio <em> 2 </em> 255;  // ไล่จาก 0 → 255</p><p>    g = 255;</p><p>  } else {</p><p>    r = 255;</p><p>    g = (1 - (ratio - 0.5) <em> 2) </em> 255; // ไล่จาก 255 → 0</p><p>  }</p><p>  b = 0;</p><p>  return tft.color565(r, g, b);</p><p>}</p><p>void drawBars(float lux) {</p><p>  int barX = 60;</p><p>  int barWidthMax = 180;</p><p>  int barHeight = 40;</p><p>  int bar1Y = 75;</p><p>  int bar2Y = 140;</p><p>  // เส้นกริดพื้นหลัง</p><p>  for (int i = 0; i &lt;= barWidthMax; i += 45) {</p><p>    tft.drawLine(barX + i, bar1Y - 2, barX + i, bar1Y + barHeight + 2, TFT_DARKGREY);</p><p>    tft.drawLine(barX + i, bar2Y - 2, barX + i, bar2Y + barHeight + 2, TFT_DARKGREY);</p><p>  }</p><p>  // กรอบบาร์</p><p>  tft.drawRoundRect(barX-3, bar1Y-3, barWidthMax+6, barHeight+6, 4, TFT_WHITE);</p><p>  tft.drawRoundRect(barX-3, bar2Y-3, barWidthMax+6, barHeight+6, 4, TFT_WHITE);</p><p>  // ล้างบาร์เก่า</p><p>  tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);</p><p>  tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);</p><p>  // ความยาวบาร์</p><p>  int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);</p><p>  int bar2Width = 0;</p><p>  if (lux &gt; 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);</p><p>  // วาดบาร์ด้วยสี</p><p>  tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux, 0, 220));</p><p>  tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux, 220, 440));</p><p>  // ตัวเลขขอบบาร์</p><p>  tft.setTextSize(1);</p><p>  tft.setTextColor(TFT_WHITE, TFT_BLACK);</p><p>  tft.setCursor(barX-25, bar1Y+12); tft.print("0");</p><p>  tft.setCursor(barX+barWidthMax+5, bar1Y+12); tft.print("220");</p><p>  tft.setCursor(barX-25, bar2Y+12); tft.print("220");</p><p>  tft.setCursor(barX+barWidthMax+5, bar2Y+12); tft.print("440");</p><p>}</p><p>void displayLux(float lux) {</p><p>  // ล้างพื้นที่ค่า Lux</p><p>  tft.fillRect(0, 30, 320, 40, TFT_BLACK);</p><p>  tft.setTextSize(3);</p><p>  tft.setTextColor(TFT_GREEN, TFT_BLACK);</p><p>  tft.setCursor(80, 35);</p><p>  tft.printf("%4d lx", (int)lux);</p><p>}</p><p>void updateRelays(float lux) {</p><p>  String status;</p><p>  uint32_t color;</p><p>  if (lux &lt;= 220) {</p><p>    digitalWrite(RELAY1_PIN, LOW);</p><p>    digitalWrite(RELAY2_PIN, LOW);</p><p>    status = "RELAY 1,2 OFF";</p><p>    color = TFT_GREEN;</p><p>  } else if (lux &lt; 430) {</p><p>    digitalWrite(RELAY1_PIN, HIGH);</p><p>    digitalWrite(RELAY2_PIN, LOW);</p><p>    status = "RELAY 1 ON";</p><p>    color = TFT_YELLOW;</p><p>  } else {</p><p>    digitalWrite(RELAY1_PIN, LOW);</p><p>    digitalWrite(RELAY2_PIN, HIGH);</p><p>    status = "RELAY 2 ON";</p><p>    color = TFT_RED;</p><p>  }</p><p>  // ป้ายสถานะรีเลย์</p><p>  tft.fillRect(25, 200, 270, 35, TFT_BLACK);</p><p>  tft.drawRoundRect(25, 200, 270, 35, 6, color);</p><p>  tft.setTextSize(2);</p><p>  tft.setTextColor(color, TFT_BLACK);</p><p>  tft.setCursor(50, 208);</p><p>  tft.print(status);</p><p>}</p><p>void loop() {</p><p>  float lux = lightMeter.readLightLevel();</p><p>  if (lux &lt; 0) lux = 0;</p><p>  float luxAvg = getLuxAverage(lux);</p><p>  displayLux(luxAvg);</p><p>  drawBars(luxAvg);</p><p>  updateRelays(luxAvg);</p><p>  delay(500);</p><p>}</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4252930298/6a64b3ecbe898b494aaacefbeb80c18c/Athit6_1.mp4" />
         <pubDate>2025-08-26 05:51:19 UTC</pubDate>
         <guid>https://padlet.com/anont989/779fm6iczk6j5z9i/wish/3555026374</guid>
      </item>
   </channel>
</rss>
