# data[].attributes.headline
ธรรมนูญ วิชชาธาร

# data[].attributes.subject
ธรรมนูญ วิชชาธาร

# data[].attributes.body
ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพ 3D ช่วยสร้างรูปภาพ 3Dสไตล์ Cute 16:9

# data[].attributes.body
ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพน่ารักๆสไตล์การ์ตูน3D Chibi Style ให้สร้างรูปภาพขนาด 16:9"

# data[].attributes.headline
ในฐานะที่คุณเป็นผู้เชี

# data[].attributes.body
ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านเทคโนโลยีการสร้างภาพช่วยสร้างรูปภาพ3d

Studio Ghibli ขนาด16:9

# data[].attributes.headline
ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.subject
ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.body
ในฐานะที่คุณเป็น ผู้เชี่ยวชาญด้านการสร้างภาพ เป็นรุปภาพ pastel style 3D ให้สร้างขนาด 16:9

# data[].attributes.headline
นาย นวิมนทร์ ผ่องใส

# data[].attributes.subject
นาย นวิมนทร์ ผ่องใส

# data[].attributes.body
ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างภาพ 3D ช่วยสร้างภาพ style chibi น่ารักๆ

# data[].attributes.attachment_caption
ในฐานะที่คุณเป็นผู้เชี่ยวชาญทางด้านการสร้างภาพ เป็นรูปภาพ chibi 3D ขนาด 16:9

# data[].attributes.headline
อินทัช สุวรรณวงศ์

# data[].attributes.subject
อินทัช สุวรรณวงศ์

# data[].attributes.body
นัทพร สุภี

# data[].attributes.headline
นาย กฤติกร คงจรูญ

# data[].attributes.subject
นาย กฤติกร คงจรูญ

# data[].attributes.body
ในฐานนะที่คุณเป็นผู้เชี่ยวชาญด้านการสร้างรูปภาพ3D เปลี่ยนเป็นภาพ สไตล์ Vector Cute Styleให้สร้างรุปขนาด 16:9

# data[].attributes.headline
ในธานะคุณเป็นผู้เชียวชาญในการสร้างรูปภาพ สไต pixza ขนาด16×9

# data[].attributes.subject
ในธานะคุณเป็นผู้เชียวชาญในการสร้างรูปภาพ สไต pixza ขนาด16×9

# data[].attributes.headline
นิธิศ นุชทองม่วง

# data[].attributes.subject
นิธิศ นุชทองม่วง

# data[].attributes.body
ในฐานะที่คุณเป็นผู้เชี่ยวชาญด้านการ สร้างรูปภาพ 3D ช่วยสร้างรูปภาพ 3Dสไตล์ Cute 16:9

# data[].attributes.headline
นางสาวธัญชนก เทียมประสิทธิ์

# data[].attributes.subject
นางสาวธัญชนก เทียมประสิทธิ์

# data[].attributes.body
ใบงาน Wio Terminal

# data[].attributes.body
ข้อสอบแข่งทักษะไมโครคอนโทรลเลอร์ ระดับภาค ปี 2567 (2)

# data[].attributes.headline
นาย ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.subject
นาย ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.body
#include <TFT_eSPI.h> // ไลบรารีควบคุมจอ LCD

TFT_eSPI tft;

void setup() {

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า

// --- ใบหน้า ---

tft.drawCircle(160, 120, 101, TFT_BLACK); // ขอบนอก

tft.fillCircle(160, 120, 100, TFT_BLUE); // หน้าเหลือง

// --- ปาก ---

tft.drawCircle(160, 135, 82, TFT_BLACK);

tft.fillCircle(160, 135, 80, TFT_WHITE);

// --- ตา ---

// ตาขาว

tft.drawCircle(120, 100, 36, TFT_BLACK);

tft.fillCircle(120, 100, 34, TFT_WHITE);

tft.drawCircle(200, 100, 36, TFT_BLACK);

tft.fillCircle(200, 100, 34, TFT_WHITE);

// ลูกตาดำ

tft.fillCircle(120, 100, 15, TFT_BLACK);

tft.fillCircle(200, 100, 15, TFT_BLACK);

// --- จมูก ---

tft.fillCircle(160, 129, 12, TFT_RED);

// --- ลิ้น ---

tft.fillTriangle(135, 175, 185, 175, 160, 195, TFT_PINK);

tft.drawTriangle(135, 175, 185, 175, 160, 195, TFT_BLACK);

// --- หนวด ---

// ขวา

tft.drawLine(200, 165, 250, 150, TFT_BLACK);

tft.drawLine(200, 170, 250, 170, TFT_BLACK);

tft.drawLine(200, 175, 250, 190, TFT_BLACK);

// ซ้าย

tft.drawLine(70, 150, 120, 160, TFT_BLACK);

tft.drawLine(70, 170, 120, 170, TFT_BLACK);

tft.drawLine(70, 190, 120, 180, TFT_BLACK);

// --- กระดิ่ง ---

tft.fillCircle(160, 220, 15, TFT_YELLOW);

tft.drawCircle(160, 220, 15, TFT_BLACK);

tft.drawLine(160, 220, 160, 235, TFT_BLACK);

}

void loop() {

}

# data[].attributes.headline
นาย กฤติกร คงจรูญ

# data[].attributes.subject
นาย กฤติกร คงจรูญ

# data[].attributes.body
#include <TFT_eSPI.h> // ไลบรารีควบคุมจอ LCD

TFT_eSPI tft;

void setup() {

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า

// --- ใบหน้า ---

tft.drawCircle(160, 120, 101, TFT_BLACK); // ขอบนอก

tft.fillCircle(160, 120, 100, TFT_BLUE); // หน้าเหลือง

// --- ปาก ---

tft.drawCircle(160, 135, 82, TFT_BLACK);

tft.fillCircle(160, 135, 80, TFT_WHITE);

// --- ตา ---

// ตาขาว

tft.drawCircle(120, 100, 36, TFT_BLACK);

tft.fillCircle(120, 100, 34, TFT_WHITE);

tft.drawCircle(200, 100, 36, TFT_BLACK);

tft.fillCircle(200, 100, 34, TFT_WHITE);

// ลูกตาดำ

tft.fillCircle(120, 100, 15, TFT_BLACK);

tft.fillCircle(200, 100, 15, TFT_BLACK);

// --- จมูก ---

tft.fillCircle(160, 129, 12, TFT_RED);

// --- ลิ้น ---

tft.fillTriangle(135, 175, 185, 175, 160, 195, TFT_PINK);

tft.drawTriangle(135, 175, 185, 175, 160, 195, TFT_BLACK);

// --- หนวด ---

// ขวา

tft.drawLine(200, 165, 250, 150, TFT_BLACK);

tft.drawLine(200, 170, 250, 170, TFT_BLACK);

tft.drawLine(200, 175, 250, 190, TFT_BLACK);

// ซ้าย

tft.drawLine(70, 150, 120, 160, TFT_BLACK);

tft.drawLine(70, 170, 120, 170, TFT_BLACK);

tft.drawLine(70, 190, 120, 180, TFT_BLACK);

// --- กระดิ่ง ---

tft.fillCircle(160, 220, 15, TFT_YELLOW);

tft.drawCircle(160, 220, 15, TFT_BLACK);

tft.drawLine(160, 220, 160, 235, TFT_BLACK);

}

void loop() {

// ไม่มีการอัปเดต

}

# data[].attributes.headline
นิธิศ นุชทองม่วง

# data[].attributes.subject
นิธิศ นุชทองม่วง

# data[].attributes.body
งานที่1

#include"TFT_eSPI.h" // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD

TFT_eSPI tft; // สร้างออบเจ็กต์ชื่อ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD

void setup()

{

}

void loop()

{

tft.fillScreen(TFT_BLUE);

delay(500);

tft.fillScreen(TFT_RED);

delay(500);

tft.fillScreen(TFT_BLACK);

delay(500);

tft.fillScreen(TFT_ORANGE);

delay(500);

tft.fillScreen(TFT_GREEN);

delay(500);

tft.fillScreen(TFT_PURPLE);

delay(500);

tft.fillScreen(TFT_WHITE);

delay(500);

tft.fillScreen(TFT_YELLOW);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,120,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,80,25,TFT_RED);

tft.fillCircle(160,160,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,50,25,TFT_RED);

tft.fillCircle(160,120,25,TFT_RED);

tft.fillCircle(160,190,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,75,25,TFT_RED);

tft.fillCircle(200,75,25,TFT_RED);

tft.fillCircle(120,170,25,TFT_RED);

tft.fillCircle(200,170,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,75,25,TFT_RED);

tft.fillCircle(200,75,25,TFT_RED);

tft.fillCircle(120,170,25,TFT_RED);

tft.fillCircle(200,170,25,TFT_RED);

tft.fillCircle(160,120,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,60,25,TFT_RED);

tft.fillCircle(200,60,25,TFT_RED);

tft.fillCircle(120,120,25,TFT_RED);

tft.fillCircle(200,120,25,TFT_RED);

tft.fillCircle(120,180,25,TFT_RED);

tft.fillCircle(200,180,25,TFT_RED);

delay(500);

tft.begin(); // เริ่มต้นการทำงานของจอแสดงผล LCD

tft.setRotation(3); // หมุนตำแหน่งการแสดงผลเป็นโหมด 3

tft.fillScreen(TFT_WHITE); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

tft.fillCircle(160,120,110,TFT_BLUE); //หัวสีน้ำเงิน

tft.fillCircle(160,150,85,TFT_WHITE); //หัวสีขาว

tft.drawCircle(130,90,30,TFT_BLACK); // ตาซ้าย

tft.fillCircle(130,90,29,TFT_WHITE); // ตาซ้าย

tft.fillCircle(140,100,7,TFT_BLACK); // ตาในซ้าย

tft.drawCircle(190,90,30,TFT_BLACK); // ตาขวา

tft.fillCircle(190,90,29,TFT_WHITE); // ตาขวา

tft.fillCircle(180,100,7,TFT_BLACK); // ตาในขวา

tft.fillCircle(160,120,10,TFT_RED); // จมุก

tft.drawCircle(160,120,11,TFT_BLACK); // เส้นจมุก

tft.fillTriangle(160,200,110,170,210,170,TFT_RED);// ปาก

tft.fillTriangle(160,200,142,190,176,190,TFT_ORANGE);// ลิ้น

tft.drawLine(80,120,120,140,TFT_BLACK);

tft.drawLine(80,140,120,140,TFT_BLACK);

tft.drawLine(80,160,120,140,TFT_BLACK);

tft.drawLine(240,120,200,140,TFT_BLACK);

tft.drawLine(240,140,200,140,TFT_BLACK);

tft.drawLine(240,160,200,140,TFT_BLACK);

delay(5000);

}

# data[].attributes.headline
นาย ธีรวัฒน์ สิงห์โตงาม 

# data[].attributes.subject
นาย ธีรวัฒน์ สิงห์โตงาม 

# data[].attributes.body
#include"TFT_eSPI.h" // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD

TFT_eSPI tft; // สร้างออบเจ็กต์ชื่อ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD

void setup()

{

}

void loop()

{

tft.fillScreen(TFT_BLUE);

delay(500);

tft.fillScreen(TFT_RED);

delay(500);

tft.fillScreen(TFT_BLACK);

delay(500);

tft.fillScreen(TFT_ORANGE);

delay(500);

tft.fillScreen(TFT_GREEN);

delay(500);

tft.fillScreen(TFT_PURPLE);

delay(500);

tft.fillScreen(TFT_WHITE);

delay(500);

tft.fillScreen(TFT_YELLOW);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,120,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,80,25,TFT_RED);

tft.fillCircle(160,160,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(160,50,25,TFT_RED);

tft.fillCircle(160,120,25,TFT_RED);

tft.fillCircle(160,190,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,75,25,TFT_RED);

tft.fillCircle(200,75,25,TFT_RED);

tft.fillCircle(120,170,25,TFT_RED);

tft.fillCircle(200,170,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,75,25,TFT_RED);

tft.fillCircle(200,75,25,TFT_RED);

tft.fillCircle(120,170,25,TFT_RED);

tft.fillCircle(200,170,25,TFT_RED);

tft.fillCircle(160,120,25,TFT_RED);

delay(500);

tft.begin(); //

tft.setRotation(3); //

tft.fillScreen(TFT_WHITE); //

tft.fillCircle(120,60,25,TFT_RED);

tft.fillCircle(200,60,25,TFT_RED);

tft.fillCircle(120,120,25,TFT_RED);

tft.fillCircle(200,120,25,TFT_RED);

tft.fillCircle(120,180,25,TFT_RED);

tft.fillCircle(200,180,25,TFT_RED);

delay(500);

tft.begin(); // เริ่มต้นการทำงานของจอแสดงผล LCD

tft.setRotation(3); // หมุนตำแหน่งการแสดงผลเป็นโหมด 3

tft.fillScreen(TFT_WHITE); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

tft.fillCircle(160,120,110,TFT_BLUE); //หัวสีน้ำเงิน

tft.fillCircle(160,150,85,TFT_WHITE); //หัวสีขาว

tft.drawCircle(130,90,30,TFT_BLACK); // ตาซ้าย

tft.fillCircle(130,90,29,TFT_WHITE); // ตาซ้าย

tft.fillCircle(140,100,7,TFT_BLACK); // ตาในซ้าย

tft.drawCircle(190,90,30,TFT_BLACK); // ตาขวา

tft.fillCircle(190,90,29,TFT_WHITE); // ตาขวา

tft.fillCircle(180,100,7,TFT_BLACK); // ตาในขวา

tft.fillCircle(160,120,10,TFT_RED); // จมุก

tft.drawCircle(160,120,11,TFT_BLACK); // เส้นจมุก

tft.fillTriangle(160,200,110,170,210,170,TFT_RED);// ปาก

tft.fillTriangle(160,200,142,190,176,190,TFT_ORANGE);// ลิ้น

tft.drawLine(80,120,120,140,TFT_BLACK);

tft.drawLine(80,140,120,140,TFT_BLACK);

tft.drawLine(80,160,120,140,TFT_BLACK);

tft.drawLine(240,120,200,140,TFT_BLACK);

tft.drawLine(240,140,200,140,TFT_BLACK);

tft.drawLine(240,160,200,140,TFT_BLACK);

delay(5000);

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส

# data[].attributes.body
#include"TFT_eSPI.h" // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCD

TFT_eSPI tft;

#define LCD_BACKLIGHT (72Ul) // สร้างออปเจ็กต์ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCD

void setup()

{

tft.begin(); // เริ่มต้นการทำงานของจอแสดงผล LCD

tft.fillScreen(TFT_BLUE); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_RED); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_BLACK); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_MAROON); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_GREEN); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_PURPLE); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_WHITE); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen

(TFT_YELLOW); // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(120,160,30,TFT_RED);

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(70,160,30,TFT_BLACK);

tft.fillCircle(150,160,30,TFT_BLACK);

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(40, 40, 30, TFT_BLACK); // ลูกที่ 1 - มุมบนซ้าย

tft.fillCircle(130, 150, 30, TFT_BLACK); // ลูกที่ 2 - ขยับเฉียงลงขวา

tft.fillCircle(200, 280, 30, TFT_BLACK); // ลูกที่ 3 - ขยับต่อไปในแนวทะแยง

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(60, 90, 30, TFT_RED); // ลูกซ้ายบน

tft.fillCircle(170, 90, 30, TFT_RED); // ลูกขวาบน

tft.fillCircle(60, 230, 30, TFT_RED); // ลูกซ้ายล่าง

tft.fillCircle(170, 230, 30, TFT_RED); // ลูกขวาล่าง

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(60, 90, 30, TFT_BLACK); // ลูกซ้ายบน

tft.fillCircle(170, 90, 30, TFT_BLACK); // ลูกขวาบน

tft.fillCircle(120, 160, 30, TFT_BLACK); // ลูกตรงกลาง

tft.fillCircle(60, 230, 30, TFT_BLACK); // ลูกซ้ายล่าง

tft.fillCircle(170, 230, 30, TFT_BLACK); // ลูกขวาล่าง

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.fillCircle(50, 100, 30, TFT_BLACK); // แถวซ้าย บน

tft.fillCircle(120, 100, 30, TFT_BLACK); // แถวกลาง บน

tft.fillCircle(190, 100, 30, TFT_BLACK); // แถวขวา บน

tft.fillCircle(50, 210, 30, TFT_BLACK); // แถวซ้าย ล่าง

tft.fillCircle(120, 210, 30, TFT_BLACK); // แถวกลาง ล่าง

tft.fillCircle(190, 210, 30, TFT_BLACK); // แถวขวา ล่าง

delay(500);

tft.fillScreen(TFT_WHITE); //รุป1

tft.drawCircle(120,160,101,TFT_BLACK);

tft.fillCircle(120,160,100,TFT_BLUE);

tft.drawCircle(135,160,82,TFT_BLACK);

tft.fillCircle(135,160,80,TFT_WHITE); // พื้นหน้า

tft.drawCircle(100,120,36,TFT_BLACK);

tft.drawCircle(100,200,36,TFT_BLACK); // ตา

tft.fillCircle(100,120,34,TFT_WHITE);

tft.fillCircle(100,200,34,TFT_WHITE); // ตาขาว

tft.fillCircle(105,140,20,TFT_BLACK); // ลูกตาซ้าย

tft.fillCircle(105,180,20,TFT_BLACK); // ลูกตาขวา

tft.fillCircle(129,160,15,TFT_RED); // จมูก

tft.fillTriangle(170,130,170,190,190,160,TFT_PINK); // ปากสามเหลี่ยมกลับหัวในแนว X

// หนวดขวา (แนวนอน)

tft.drawLine(165,200,150,250,TFT_BLACK);

tft.drawLine(170,200,170,250,TFT_BLACK);

tft.drawLine(176,200,190,250,TFT_BLACK);

// หนวดซ้าย (แนวนอน)

tft.drawLine(150,70,160,120,TFT_BLACK);

tft.drawLine(170,70,170,120,TFT_BLACK);

tft.drawLine(190,70,176,120,TFT_BLACK);

// กระดิ่ง

tft.fillCircle(220,160,15,TFT_YELLOW);

tft.drawLine(220,160,240,160,TFT_BLACK);

}

void loop()

{

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// สีที่กำหนดเอง

#define MY_BROWN 0xA145

#define MY_DARKGREY 0x7BEF

// ปุ่ม 5-way switch ของ Wio Terminal

#define BTN_LEFT WIO_5S_LEFT

#define BTN_RIGHT WIO_5S_RIGHT

#define BTN_UP WIO_5S_UP

#define BTN_DOWN WIO_5S_DOWN

int catX = 40;

int catY = 100;

int step = 10;

int moveX = 0; // -1 ซ้าย, 1 ขวา

int moveY = 0; // -1 ขึ้น, 1 ลง

unsigned long lastMoveTime = 0;

void setup() {

Serial.begin(115200);

delay(100);

tft.begin();

tft.setRotation(3);

pinMode(BTN_LEFT, INPUT_PULLUP);

pinMode(BTN_RIGHT, INPUT_PULLUP);

pinMode(BTN_UP, INPUT_PULLUP);

pinMode(BTN_DOWN, INPUT_PULLUP);

drawBackground();

drawCat(catX, catY);

}

void loop() {

// อ่านปุ่มทิศทาง

moveX = 0;

moveY = 0;

if (digitalRead(BTN_RIGHT) == LOW) moveX = 1;

else if (digitalRead(BTN_LEFT) == LOW) moveX = -1;

if (digitalRead(BTN_DOWN) == LOW) moveY = 1;

else if (digitalRead(BTN_UP) == LOW) moveY = -1;

if (millis() - lastMoveTime > 200) {

if (moveX != 0 || moveY != 0) {

drawPawPrint(catX + 10, catY + 40, MY_DARKGREY);

catX += step * moveX;

catY += step * moveY;

// ขอบจอ

if (catX > tft.width() - 30) catX = tft.width() - 30;

if (catX < 30) catX = 30;

if (catY > tft.height() - 40) catY = tft.height() - 40;

if (catY < 30) catY = 30;

drawBackground();

drawCat(catX, catY);

}

lastMoveTime = millis();

}

}

// ===== วาดฉาก =====

void drawBackground() {

tft.fillScreen(TFT_CYAN);

int groundY = tft.height() / 2;

tft.fillRect(0, groundY, tft.width(), tft.height() - groundY, TFT_GREEN);

drawSun();

drawCloud(40, 40);

drawCloud(120, 60);

drawTree(60, groundY);

drawTree(180, groundY);

drawText();

}

void drawSun() {

int sunRadius = 30;

tft.fillCircle(tft.width() - sunRadius - 10, sunRadius + 10, sunRadius, TFT_YELLOW);

}

void drawCloud(int x, int y) {

tft.fillCircle(x, y, 12, TFT_WHITE);

tft.fillCircle(x + 15, y - 5, 15, TFT_WHITE);

tft.fillCircle(x + 30, y, 12, TFT_WHITE);

tft.fillRect(x - 2, y, 34, 12, TFT_WHITE);

}

void drawTree(int x, int groundY) {

int trunkWidth = 10;

int trunkHeight = 20;

int foliageRadius = 20;

tft.fillRect(x, groundY - trunkHeight, trunkWidth, trunkHeight, MY_BROWN);

tft.fillCircle(x + trunkWidth / 2, groundY - trunkHeight - foliageRadius / 2, foliageRadius, TFT_DARKGREEN);

}

void drawText() {

tft.setTextColor(TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(20, 20);

tft.println("Wio Terminal");

}

void drawCat(int x, int y) {

tft.fillCircle(x, y, 15, TFT_ORANGE);

tft.fillTriangle(x - 10, y - 10, x - 5, y - 20, x, y - 10, TFT_ORANGE);

tft.fillTriangle(x + 10, y - 10, x + 5, y - 20, x, y - 10, TFT_ORANGE);

tft.fillCircle(x - 5, y - 2, 3, TFT_BLACK);

tft.fillCircle(x + 5, y - 2, 3, TFT_BLACK);

tft.fillCircle(x, y + 4, 2, TFT_PINK);

tft.drawLine(x - 3, y + 7, x + 3, y + 7, TFT_BLACK);

tft.fillRect(x - 12, y + 15, 24, 20, TFT_ORANGE);

tft.fillRect(x - 12, y + 35, 6, 10, TFT_ORANGE);

tft.fillRect(x + 6, y + 35, 6, 10, TFT_ORANGE);

tft.fillRect(x + 14, y + 20, 5, 15, TFT_ORANGE);

}

void drawPawPrint(int x, int y, uint16_t color) {

tft.fillCircle(x - 6, y - 6, 2, color);

tft.fillCircle(x + 6, y - 6, 2, color);

tft.fillCircle(x - 4, y + 0, 2, color);

tft.fillCircle(x + 4, y + 0, 2, color);

tft.fillRoundRect(x - 4, y + 2, 8, 10, 3, color);

}

# data[].attributes.headline
นาย กฤติกร คงจรูญ

# data[].attributes.subject
นาย กฤติกร คงจรูญ

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft;

int scene = 0;

int trainX = 0; // ตำแหน่งรถไฟ

int trainSpeed = 7; // ความเร็ว (บวก = ขวา, ลบ = ซ้าย)

void setup() {

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

// ตั้งค่า Pin ของปุ่ม

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

}

void loop() {

// กดปุ่มเปลี่ยนทิศทาง

if (!digitalRead(WIO_5S_RIGHT)) {

trainSpeed = abs(trainSpeed); // วิ่งขวา

}

if (!digitalRead(WIO_5S_LEFT)) {

trainSpeed = -abs(trainSpeed); // วิ่งซ้าย

}

// ปุ่มเปลี่ยนฉาก

if (!digitalRead(WIO_KEY_A)) {

scene = (scene + 1) % 6;

delay(200);

}

if (!digitalRead(WIO_KEY_B)) {

scene = (scene + 5) % 6; // ย้อนกลับ

delay(200);

}

// อัปเดตตำแหน่งรถไฟ

trainX += trainSpeed;

if (trainX > 320) trainX = -120; // ออกขวาแล้ววนไปซ้าย

if (trainX < -120) trainX = 320; // ออกซ้ายแล้ววนไปขวา

// วาดหน้าจอ

tft.fillScreen(backgroundColor(scene));

drawSceneDetails(scene);

drawRail();

drawTrain(trainX);

delay(30);

}

// ---------------- ฟังก์ชันเดิม ----------------

uint16_t backgroundColor(int s) {

switch (s) {

case 0: return TFT_BLUE;

case 1: return TFT_LIGHTGREY;

case 2: return TFT_GREEN;

case 3: return TFT_DARKGREY;

case 4: return TFT_NAVY;

case 5: return TFT_PURPLE;

default: return TFT_BLACK;

}

}

void drawRail() {

tft.drawLine(0, 140, tft.width(), 140, TFT_MAROON);

tft.drawLine(0, 160, tft.width(), 160, TFT_MAROON);

for (int i = 0; i < tft.width(); i += 20) {

tft.drawLine(i, 140, i, 160, TFT_WHITE);

}

}

void drawTrain(int x) {

tft.fillRect(x, 100, 40, 30, TFT_RED);

tft.fillRect(x + 30, 90, 10, 10, TFT_ORANGE);

tft.fillCircle(x + 10, 135, 5, TFT_BLACK);

tft.fillCircle(x + 30, 135, 5, TFT_BLACK);

for (int i = 0; i < 3; i++) {

int bx = x + 50 + i * 50;

tft.fillRect(bx, 105, 40, 25, TFT_YELLOW);

tft.fillCircle(bx + 10, 135, 5, TFT_BLACK);

tft.fillCircle(bx + 30, 135, 5, TFT_BLACK);

}

}

void drawSceneDetails(int s) {

switch (s) {

case 0:

tft.fillCircle(270, 40, 20, TFT_YELLOW);

drawCloud(50, 30);

drawCloud(120, 40);

break;

case 1:

drawBuilding(20, 60, 30, 60);

drawBuilding(60, 50, 25, 70);

drawBuilding(100, 65, 35, 55);

break;

case 2:

drawTree(30, 100);

drawTree(80, 100);

drawTree(200, 100);

break;

case 3:

for (int i = 0; i < 10; i++) {

int rx = random(0, 320);

int ry = random(0, 120);

tft.drawLine(rx, ry, rx, ry + 5, TFT_CYAN);

}

break;

case 4:

for (int i = 0; i < 10; i++) {

int sx = random(0, 320);

int sy = random(0, 80);

tft.drawPixel(sx, sy, TFT_WHITE);

}

break;

case 5:

tft.setTextColor(TFT_WHITE, TFT_PURPLE);

tft.setTextSize(2);

tft.setCursor(100, 50);

tft.print("STATION");

break;

}

}

void drawTree(int x, int y) {

tft.fillRect(x + 5, y, 5, 20, TFT_MAROON);

tft.fillCircle(x + 7, y, 12, TFT_DARKGREEN);

}

void drawCloud(int x, int y) {

tft.fillCircle(x, y, 10, TFT_WHITE);

tft.fillCircle(x + 10, y - 5, 10, TFT_WHITE);

tft.fillCircle(x + 20, y, 10, TFT_WHITE);

}

void drawBuilding(int x, int y, int w, int h) {

tft.fillRect(x, y, w, h, TFT_DARKGREY);

for (int i = 0; i < h; i += 10) {

for (int j = 0; j < w; j += 8) {

tft.fillRect(x + j + 2, y + i + 2, 4, 4, TFT_WHITE);

}

}

}

# data[].attributes.attachment_link.title
สีดำ สีฟ้า น่ารัก แผนผังความคิด ระดมสมอง Mind Map

# data[].attributes.headline
นาย นัทพร สุภี

# data[].attributes.subject
นาย นัทพร สุภี

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

uint16_t rgb(uint8_t r, uint8_t g, uint8_t b){

return tft.color565(r,g,b);

}

void drawDoraemonHead(int cx, int cy, int scale){

// Colors

uint16_t blue = rgb(0,102,204);

uint16_t white = rgb(255,255,255);

uint16_t black = rgb(0,0,0);

uint16_t red = rgb(220,20,60);

uint16_t yellow = rgb(255,200,0);

// หัว (วงกลมสีน้ำเงิน)

int headR = 100 * scale;

tft.fillCircle(cx, cy, headR, blue);

tft.drawCircle(cx, cy, headR, black);

// หน้า (วงรีสีขาว)

for(int dy = -80*scale; dy <= 80*scale; dy++){

float yy = (float)dy / (80.0f*scale);

int halfw = (int)(headR 0.85 sqrt(1 - yy*yy));

for(int x = cx - halfw; x <= cx + halfw; x++){

tft.drawPixel(x, cy + dy + 10*scale, white);

}

}

// ตา

int eyeR = 20 * scale;

int eyeOffsetX = 25 * scale;

int eyeOffsetY = -40 * scale;

tft.fillCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, white);

tft.fillCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, white);

tft.drawCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, black);

tft.drawCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, black);

// รูม่านตา

tft.fillCircle(cx - eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);

tft.fillCircle(cx + eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);

// จมูก

int noseR = 12 * scale;

tft.fillCircle(cx, cy - 10*scale, noseR, red);

tft.drawCircle(cx, cy - 10*scale, noseR, black);

// เส้นหนวดซ้าย-ขวา

for(int i=0;i<3;i++){

int y = cy - 5*scale + (i-1)*15*scale;

tft.drawLine(cx - 15*scale, y, cx - 70*scale, y - 5*scale, black);

tft.drawLine(cx + 15*scale, y, cx + 70*scale, y - 5*scale, black);

}

// ปาก

tft.drawLine(cx, cy - 10*scale, cx, cy + 50*scale, black); // เส้นตรงกลาง

for(int dy = 0; dy <= 50*scale; dy++){

float yy = (float)dy / (50.0f*scale);

int halfw = (int)(60*scale sqrt(1 - yyyy));

tft.drawPixel(cx - halfw, cy + dy, black);

tft.drawPixel(cx + halfw, cy + dy, black);

}

// กระดิ่ง

int bellR = 18 * scale;

int bellCx = cx;

int bellCy = cy + 110*scale;

tft.fillCircle(bellCx, bellCy, bellR, yellow);

tft.drawCircle(bellCx, bellCy, bellR, black);

// เส้นคาดกระดิ่ง

tft.drawFastHLine(bellCx - 12*scale, bellCy - 4*scale, 24*scale, black);

// รูตรงกลาง

tft.fillCircle(bellCx, bellCy + 4*scale, 5*scale, black);

tft.drawLine(bellCx, bellCy + 4*scale, bellCx, bellCy + 12*scale, black);

}

void setup(){

tft.init();

tft.setRotation(1); // จอแนวนอน

tft.fillScreen(rgb(255,255,255)); // พื้นหลังขาว

// วาดหัวโดเรม่อนตรงกลางจอ

drawDoraemonHead(160, 100, 1);

}

void loop(){}

# data[].attributes.headline
นายธนพัฒน์ แก้วประเสริฐ

# data[].attributes.subject
นายธนพัฒน์ แก้วประเสริฐ

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

#define MAX_METEOR_COUNT 5

#define SHIP_WIDTH 30

#define SHIP_HEIGHT 20

#define MOVE_STEP 20

const int METEOR_SPEED = 10;

#define SHIP_COLOR TFT_CYAN

uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};

const int meteorColorCount = 3;

int shipX = 160;

int shipY = 200;

int backgroundMode = 0;

unsigned long startTime = 0; // ใช้เก็บเวลาที่เริ่มเล่น

struct Meteor {

int x;

int y;

int size;

uint16_t color;

};

Meteor meteors[MAX_METEOR_COUNT];

int currentMeteorCount = 3;

// ===== พื้นหลังแบบต่าง ๆ =====

void drawBackground() {

switch (backgroundMode) {

case 0: // ดำ + จุดขาว (เริ่มต้น)

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 50; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_WHITE);

}

break;

case 1: // ดำ + จุดม่วง + น้ำเงิน

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_PURPLE);

}

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_BLUE);

}

break;

case 2: // เทาเข้ม + จุดวงกลมสีอ่อน ๆ แตกต่างจากเมเทียร์

tft.fillScreen(TFT_DARKGREY);

for (int i = 0; i < 40; i++) {

int r = random(2, 6);

int x = random(r, 320 - r);

int y = random(r, 240 - r);

uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ หรือเทาอ่อน

tft.drawCircle(x, y, r, circleColor);

}

break;

case 3: // น้ำเงินเข้ม + ดาวสีเหลือง

tft.fillScreen(TFT_NAVY);

for (int i = 0; i < 40; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_YELLOW);

if (random(0, 2) == 0) {

tft.drawPixel(x + 1, y, TFT_ORANGE);

tft.drawPixel(x, y + 1, TFT_ORANGE);

}

}

break;

case 4: // สีม่วงเข้ม + ดาวหลากสี (ธีม Honkai)

tft.fillScreen(TFT_PURPLE);

for (int i = 0; i < 50; i++) {

int x = random(0, 320);

int y = random(0, 240);

uint16_t c = meteorColors[random(0, meteorColorCount)];

tft.drawPixel(x, y, c);

if (random(0, 3) == 0) {

tft.drawPixel(x + 1, y, TFT_WHITE);

tft.drawPixel(x, y + 1, TFT_WHITE);

}

}

break;

case 5: // สีดำ + วงกลมฟ้าสว่าง (ธีมอวกาศ)

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 25; i++) {

int r = random(3, 12);

int x = random(r, 320 - r);

int y = random(r, 240 - r);

tft.fillCircle(x, y, r, TFT_GREEN);

}

break;

}

}

void drawShip(int x, int y) {

tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);

tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, TFT_WHITE);

}

void drawMeteor(Meteor m) {

tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);

}

bool checkCollision(int sx, int sy, Meteor m) {

int mx = m.x + m.size;

int my = m.y + m.size;

int dx = max(sx, min(mx, sx + SHIP_WIDTH));

int dy = max(sy - SHIP_HEIGHT, min(my, sy));

int distSq = (mx - dx) (mx - dx) + (my - dy) (my - dy);

return distSq < m.size * m.size;

}

void drawScore() {

unsigned long elapsed = (millis() - startTime) / 1000; // วินาทีที่เล่น

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(10, 10);

tft.printf("Time: %lus", elapsed);

}

void resetGame() {

shipX = 160;

shipY = 220;

currentMeteorCount = 3;

startTime = millis(); // เริ่มนับเวลาใหม่

for (int i = 0; i < MAX_METEOR_COUNT; i++) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-240, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

}

drawBackground();

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

resetGame();

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_PRESS, INPUT_PULLUP);

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

}

void loop() {

// เปลี่ยนพื้นหลังเมื่อกดปุ่ม A/B/C

if (!digitalRead(WIO_KEY_A)) {

backgroundMode = (backgroundMode + 1) % 6; // กด A เปลี่ยนฉาก +1

drawBackground();

delay(300);

}

if (!digitalRead(WIO_KEY_B)) {

backgroundMode = (backgroundMode + 5) % 6; // กด B เปลี่ยนฉาก -1 (วนรอบ)

drawBackground();

delay(300);

}

if (!digitalRead(WIO_KEY_C)) {

backgroundMode = 0; // กด C กลับฉากเริ่มต้น (ดำ+จุดขาว)

drawBackground();

delay(300);

}

// Move ship

if (!digitalRead(WIO_5S_LEFT)) shipX -= MOVE_STEP;

if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;

if (!digitalRead(WIO_5S_UP)) shipY -= MOVE_STEP;

if (!digitalRead(WIO_5S_DOWN)) shipY += MOVE_STEP;

// Keep ship on screen

shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);

shipY = constrain(shipY, SHIP_HEIGHT, 240);

drawBackground();

drawScore();

drawShip(shipX, shipY);

for (int i = 0; i < currentMeteorCount; i++) {

meteors[i].y += METEOR_SPEED;

if (meteors[i].y > 240) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-100, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

if (currentMeteorCount < MAX_METEOR_COUNT) currentMeteorCount++;

}

if (checkCollision(shipX, shipY, meteors[i])) {

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE, TFT_RED);

tft.setTextSize(3);

tft.setCursor(100, 110);

tft.print("BOOM!");

delay(1000);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(80, 120);

tft.print("Press to Restart");

while (digitalRead(WIO_5S_PRESS) == HIGH) delay(10);

while (digitalRead(WIO_5S_PRESS) == LOW) delay(10);

resetGame();

break;

}

drawMeteor(meteors[i]);

}

delay(30);

}

# data[].attributes.headline
อินทัช สุวรรณวงศ์

# data[].attributes.subject
อินทัช สุวรรณวงศ์

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft = TFT_eSPI();

uint16_t rgb(uint8_t r, uint8_t g, uint8_t b){

return tft.color565(r,g,b);

}

void drawDoraemonHead(int cx, int cy, int scale){

// Colors

uint16_t blue = rgb(0,102,204);

uint16_t white = rgb(255,255,255);

uint16_t black = rgb(0,0,0);

uint16_t red = rgb(220,20,60);

uint16_t yellow = rgb(255,200,0);

// หัว (วงกลมสีน้ำเงิน)

int headR = 100 * scale;

tft.fillCircle(cx, cy, headR, blue);

tft.drawCircle(cx, cy, headR, black);

// หน้า (วงรีสีขาว)

for(int dy = -80*scale; dy <= 80*scale; dy++){

float yy = (float)dy / (80.0f*scale);

int halfw = (int)(headR 0.85 sqrt(1 - yy*yy));

for(int x = cx - halfw; x <= cx + halfw; x++){

tft.drawPixel(x, cy + dy + 10*scale, white);

}

}

// ตา

int eyeR = 20 * scale;

int eyeOffsetX = 25 * scale;

int eyeOffsetY = -40 * scale;

tft.fillCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, white);

tft.fillCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, white);

tft.drawCircle(cx - eyeOffsetX, cy + eyeOffsetY, eyeR, black);

tft.drawCircle(cx + eyeOffsetX, cy + eyeOffsetY, eyeR, black);

// รูม่านตา

tft.fillCircle(cx - eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);

tft.fillCircle(cx + eyeOffsetX - 3*scale, cy + eyeOffsetY, 6*scale, black);

// จมูก

int noseR = 12 * scale;

tft.fillCircle(cx, cy - 10*scale, noseR, red);

tft.drawCircle(cx, cy - 10*scale, noseR, black);

// เส้นหนวดซ้าย-ขวา

for(int i=0;i<3;i++){

int y = cy - 5*scale + (i-1)*15*scale;

tft.drawLine(cx - 15*scale, y, cx - 70*scale, y - 5*scale, black);

tft.drawLine(cx + 15*scale, y, cx + 70*scale, y - 5*scale, black);

}

// ปาก

tft.drawLine(cx, cy - 10*scale, cx, cy + 50*scale, black); // เส้นตรงกลาง

for(int dy = 0; dy <= 50*scale; dy++){

float yy = (float)dy / (50.0f*scale);

int halfw = (int)(60*scale sqrt(1 - yyyy));

tft.drawPixel(cx - halfw, cy + dy, black);

tft.drawPixel(cx + halfw, cy + dy, black);

}

// กระดิ่ง

int bellR = 18 * scale;

int bellCx = cx;

int bellCy = cy + 110*scale;

tft.fillCircle(bellCx, bellCy, bellR, yellow);

tft.drawCircle(bellCx, bellCy, bellR, black);

// เส้นคาดกระดิ่ง

tft.drawFastHLine(bellCx - 12*scale, bellCy - 4*scale, 24*scale, black);

// รูตรงกลาง

tft.fillCircle(bellCx, bellCy + 4*scale, 5*scale, black);

tft.drawLine(bellCx, bellCy + 4*scale, bellCx, bellCy + 12*scale, black);

}

void setup(){

tft.init();

tft.setRotation(1); // จอแนวนอน

tft.fillScreen(rgb(255,255,255)); // พื้นหลังขาว

// วาดหัวโดเรม่อนตรงกลางจอ

drawDoraemonHead(160, 100, 1);

}

void loop(){}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// ปุ่มทิศทาง (D-Pad) ของ Wio Terminal

#define BTN_LEFT WIO_5S_LEFT

#define BTN_RIGHT WIO_5S_RIGHT

#define BTN_UP WIO_5S_UP

#define BTN_DOWN WIO_5S_DOWN

// ปุ่มเปลี่ยนฉาก

#define BTN_C WIO_KEY_C

// ตัวแปรผู้เล่น

int playerX = 120;

int playerY = 200;

const int playerSize = 20;

// ตัวแปรสิ่งกีดขวาง

int obstacleX = 0;

int obstacleY = 0;

const int obstacleSize = 20;

int obstacleSpeed = 3;

// พื้นหลัง

int bgIndex = 0;

const int bgCount = 6;

// คะแนน

int score = 0;

// ควบคุมเฟรม

unsigned long lastFrame = 0;

const int frameDelay = 30;

void setup() {

Serial.begin(115200);

tft.begin();

tft.setRotation(3);

pinMode(BTN_LEFT, INPUT_PULLUP);

pinMode(BTN_RIGHT, INPUT_PULLUP);

pinMode(BTN_UP, INPUT_PULLUP);

pinMode(BTN_DOWN, INPUT_PULLUP);

pinMode(BTN_C, INPUT_PULLUP);

randomSeed(analogRead(0));

drawBackground(bgIndex);

resetObstacle();

}

void loop() {

if (millis() - lastFrame > frameDelay) {

updateInput();

updateGame();

drawGame();

lastFrame = millis();

}

}

// อ่านปุ่มควบคุม

void updateInput() {

// ซ้าย

if (digitalRead(BTN_LEFT) == LOW) {

playerX -= 5;

if (playerX < 0) playerX = 0;

}

// ขวา

if (digitalRead(BTN_RIGHT) == LOW) {

playerX += 5;

if (playerX > tft.width() - playerSize) playerX = tft.width() - playerSize;

}

// ขึ้น

if (digitalRead(BTN_UP) == LOW) {

playerY -= 5;

if (playerY < 0) playerY = 0;

}

// ลง

if (digitalRead(BTN_DOWN) == LOW) {

playerY += 5;

if (playerY > tft.height() - playerSize) playerY = tft.height() - playerSize;

}

// เปลี่ยนฉาก

if (digitalRead(BTN_C) == LOW) {

bgIndex = (bgIndex + 1) % bgCount;

drawBackground(bgIndex);

delay(300); // ป้องกันกดค้าง

}

}

// อัปเดตเกม

void updateGame() {

obstacleY += obstacleSpeed;

if (obstacleY > tft.height()) {

resetObstacle();

}

// ตรวจสอบการชน

if (playerX < obstacleX + obstacleSize &&

playerX + playerSize > obstacleX &&

playerY < obstacleY + obstacleSize &&

playerY + playerSize > obstacleY) {

score++;

resetObstacle();

}

}

// วาดเกม

void drawGame() {

drawBackground(bgIndex);

// ผู้เล่น

tft.fillRect(playerX, playerY, playerSize, playerSize, TFT_BLUE);

// สิ่งกีดขวาง

tft.fillRect(obstacleX, obstacleY, obstacleSize, obstacleSize, TFT_BLACK);

// คะแนน

tft.setTextColor(TFT_WHITE, tft.color565(0, 0, 0));

tft.setTextSize(2);

tft.setCursor(5, 5);

tft.printf("Score: %d", score);

}

// รีเซ็ตสิ่งกีดขวาง

void resetObstacle() {

obstacleX = random(0, tft.width() - obstacleSize);

obstacleY = 0;

}

// วาดพื้นหลัง

void drawBackground(int index) {

switch (index) {

case 0: tft.fillScreen(TFT_CYAN); break;

case 1: tft.fillScreen(TFT_YELLOW); break;

case 2: tft.fillScreen(TFT_GREEN); break;

case 3: tft.fillScreen(TFT_ORANGE); break;

case 4: tft.fillScreen(TFT_MAGENTA); break;

case 5: tft.fillScreen(TFT_DARKGREY); break;

}

}

# data[].attributes.headline
นาย กฤติกร คงจรูญ

# data[].attributes.subject
นาย กฤติกร คงจรูญ

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

#define MAX_METEOR_COUNT 5

#define SHIP_WIDTH 30

#define SHIP_HEIGHT 20

#define MOVE_STEP 20

const int METEOR_SPEED = 10;

#define SHIP_COLOR TFT_CYAN

uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};

const int meteorColorCount = 3;

int shipX = 160;

int shipY = 200;

int backgroundMode = 0;

unsigned long startTime = 0; // ใช้เก็บเวลาที่เริ่มเล่น

struct Meteor {

int x;

int y;

int size;

uint16_t color;

};

Meteor meteors[MAX_METEOR_COUNT];

int currentMeteorCount = 3;

// ===== พื้นหลังแบบต่าง ๆ =====

void drawBackground() {

switch (backgroundMode) {

case 0: // ดำ + จุดขาว (เริ่มต้น)

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 50; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_WHITE);

}

break;

case 1: // ดำ + จุดม่วง + น้ำเงิน

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_PURPLE);

}

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_BLUE);

}

break;

case 2: // เทาเข้ม + จุดวงกลมสีอ่อน ๆ แตกต่างจากเมเทียร์

tft.fillScreen(TFT_DARKGREY);

for (int i = 0; i < 40; i++) {

int r = random(2, 6);

int x = random(r, 320 - r);

int y = random(r, 240 - r);

uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ หรือเทาอ่อน

tft.drawCircle(x, y, r, circleColor);

}

break;

case 3: // น้ำเงินเข้ม + ดาวสีเหลือง

tft.fillScreen(TFT_NAVY);

for (int i = 0; i < 40; i++) {

int x = random(0, 320);

int y = random(0, 240);

tft.drawPixel(x, y, TFT_YELLOW);

if (random(0, 2) == 0) {

tft.drawPixel(x + 1, y, TFT_ORANGE);

tft.drawPixel(x, y + 1, TFT_ORANGE);

}

}

break;

case 4: // สีม่วงเข้ม + ดาวหลากสี (ธีม Honkai)

tft.fillScreen(TFT_PURPLE);

for (int i = 0; i < 50; i++) {

int x = random(0, 320);

int y = random(0, 240);

uint16_t c = meteorColors[random(0, meteorColorCount)];

tft.drawPixel(x, y, c);

if (random(0, 3) == 0) {

tft.drawPixel(x + 1, y, TFT_WHITE);

tft.drawPixel(x, y + 1, TFT_WHITE);

}

}

break;

case 5: // สีดำ + วงกลมฟ้าสว่าง (ธีมอวกาศ)

tft.fillScreen(TFT_BLACK);

for (int i = 0; i < 25; i++) {

int r = random(3, 8);

int x = random(r, 320 - r);

int y = random(r, 240 - r);

tft.fillCircle(x, y, r, TFT_GREEN);

}

break;

}

}

void drawShip(int x, int y) {

tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);

tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, TFT_WHITE);

}

void drawMeteor(Meteor m) {

tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);

}

bool checkCollision(int sx, int sy, Meteor m) {

int mx = m.x + m.size;

int my = m.y + m.size;

int dx = max(sx, min(mx, sx + SHIP_WIDTH));

int dy = max(sy - SHIP_HEIGHT, min(my, sy));

int distSq = (mx - dx) (mx - dx) + (my - dy) (my - dy);

return distSq < m.size * m.size;

}

void drawScore() {

unsigned long elapsed = (millis() - startTime) / 1000; // วินาทีที่เล่น

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(10, 10);

tft.printf("Time: %lus", elapsed);

}

void resetGame() {

shipX = 160;

shipY = 220;

currentMeteorCount = 3;

startTime = millis(); // เริ่มนับเวลาใหม่

for (int i = 0; i < MAX_METEOR_COUNT; i++) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-240, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

}

drawBackground();

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

resetGame();

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_PRESS, INPUT_PULLUP);

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

}

void loop() {

// เปลี่ยนพื้นหลังเมื่อกดปุ่ม A/B/C

if (!digitalRead(WIO_KEY_A)) {

backgroundMode = (backgroundMode + 1) % 6; // กด A เปลี่ยนฉาก +1

drawBackground();

delay(300);

}

if (!digitalRead(WIO_KEY_B)) {

backgroundMode = (backgroundMode + 5) % 6; // กด B เปลี่ยนฉาก -1 (วนรอบ)

drawBackground();

delay(300);

}

if (!digitalRead(WIO_KEY_C)) {

backgroundMode = 0; // กด C กลับฉากเริ่มต้น (ดำ+จุดขาว)

drawBackground();

delay(300);

}

// Move ship

if (!digitalRead(WIO_5S_LEFT)) shipX -= MOVE_STEP;

if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;

if (!digitalRead(WIO_5S_UP)) shipY -= MOVE_STEP;

if (!digitalRead(WIO_5S_DOWN)) shipY += MOVE_STEP;

// Keep ship on screen

shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);

shipY = constrain(shipY, SHIP_HEIGHT, 240);

drawBackground();

drawScore();

drawShip(shipX, shipY);

for (int i = 0; i < currentMeteorCount; i++) {

meteors[i].y += METEOR_SPEED;

if (meteors[i].y > 240) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-100, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

if (currentMeteorCount < MAX_METEOR_COUNT) currentMeteorCount++;

}

if (checkCollision(shipX, shipY, meteors[i])) {

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE, TFT_RED);

tft.setTextSize(3);

tft.setCursor(100, 110);

tft.print("BOOM!");

delay(1000);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(80, 120);

tft.print("Press to Restart");

while (digitalRead(WIO_5S_PRESS) == HIGH) delay(10);

while (digitalRead(WIO_5S_PRESS) == LOW) delay(10);

resetGame();

break;

}

drawMeteor(meteors[i]);

}

delay(30);

}

# data[].attributes.headline
นาย ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.subject
นาย ธนพัฒน์ แก้วประเสริฐ

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

#define TFT_BROWN 0xA145 // กำหนดสีน้ำตาลเอง

int backgroundMode = 0;

unsigned long lastButtonPress = 0;

#define DEBOUNCE_DELAY 300

void drawBackground(int mode) {

switch (mode) {

case 0: { // ฉากท้องฟ้ากลางคืนดาวกระจาย

tft.fillScreen(TFT_NAVY);

for (int i = 0; i < 80; i++) {

int x = random(0, 320);

int y = random(0, 240);

uint16_t starColor = (random(0, 10) < 3) ? TFT_YELLOW : TFT_WHITE;

tft.drawPixel(x, y, starColor);

}

// วาดพระจันทร์ครึ่งเสี้ยว

tft.fillCircle(250, 50, 40, TFT_YELLOW);

tft.fillCircle(265, 50, 40, TFT_NAVY);

break;

}

case 1: { // ฉากทุ่งหญ้าสีเขียวและดอกไม้สีสดใส

tft.fillScreen(TFT_DARKGREEN);

// หญ้า

for (int i = 0; i < 250; i++) {

int x = random(0, 320);

int y = random(180, 240);

tft.drawLine(x, y, x, y - random(4, 10), TFT_GREEN);

}

// ดอกไม้กลมๆ สีแดงและเหลือง

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(180, 240);

uint16_t color = (random(0, 2) == 0) ? TFT_RED : TFT_YELLOW;

tft.fillCircle(x, y, 5, color);

}

break;

}

case 2: { // ฉากทะเลสาบและภูเขา

tft.fillScreen(TFT_BLUE);

// ภูเขาสีเทา

for (int x = 0; x < 320; x += 40) {

int peakHeight = random(80, 120);

tft.fillTriangle(x, 180, x + 20, 180 - peakHeight, x + 40, 180, TFT_DARKGREY);

}

// น้ำทะเลสาบสีน้ำเงินเข้ม

tft.fillRect(0, 180, 320, 60, TFT_BLUE);

// ลบโค้ด drawArc เพราะไม่รองรับ

// ถ้าต้องการใส่คลื่นน้ำง่าย ๆ ให้วาดเส้นขอบโค้งด้วย drawLine หรือ drawPixel แทน (ตรงนี้ขอข้าม)

break;

}

case 3: { // ฉากเมืองตอนกลางคืน มีตึกและแสงไฟ

tft.fillScreen(TFT_BLACK);

// ตึก

for (int x = 0; x < 320; x += 30) {

int buildingHeight = random(50, 150);

tft.fillRect(x, 240 - buildingHeight, 25, buildingHeight, TFT_DARKGREY);

// หน้าต่างแสงไฟ

for (int y = 240 - buildingHeight + 10; y < 240; y += 20) {

for (int wx = x + 5; wx < x + 20; wx += 10) {

if (random(0, 2)) {

tft.fillRect(wx, y, 5, 10, TFT_YELLOW);

}

}

}

}

break;

}

case 4: { // ฉากทะเลทรายและตะวันตกดิน

uint16_t sandColor = tft.color565(237, 201, 175);

uint16_t skyColor = tft.color565(252, 156, 84);

tft.fillScreen(skyColor);

// ทะเลทราย

tft.fillRect(0, 180, 320, 60, sandColor);

// เนินทรายเป็นลูกคลื่น

for (int i = 0; i < 10; i++) {

int x = i * 32;

int y = 180 + ((i % 2) ? 20 : 10);

tft.fillCircle(x, y, 30, sandColor);

}

// ดวงอาทิตย์ตก

tft.fillCircle(280, 160, 40, TFT_ORANGE);

break;

}

case 5: { // ฉากป่าไม้ยามเช้า

tft.fillScreen(tft.color565(180, 230, 180)); // ฟ้าสีเขียวอมฟ้าอ่อน

// ต้นไม้หลายต้น

for (int i = 0; i < 12; i++) {

int x = i * 27 + 10;

int trunkHeight = 40;

int trunkY = 200;

tft.fillRect(x + 10, trunkY - trunkHeight, 10, trunkHeight, TFT_BROWN);

tft.fillCircle(x + 15, trunkY - trunkHeight, 25, TFT_GREEN);

}

// แสงแดดลอดผ่านใบไม้

for (int i = 0; i < 6; i++) {

int x = i * 53 + 20;

int y = 180;

tft.fillCircle(x, y, 10, TFT_YELLOW);

}

break;

}

}

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_KEY_A, INPUT_PULLUP);

drawBackground(backgroundMode);

}

void loop() {

if (!digitalRead(WIO_KEY_A)) {

unsigned long now = millis();

if (now - lastButtonPress > DEBOUNCE_DELAY) {

backgroundMode = (backgroundMode + 1) % 6;

drawBackground(backgroundMode);

lastButtonPress = now;

}

}

delay(50);

}

# data[].attributes.body
#include <TFT_eSPI.h>

#include <SPI.h>

TFT_eSPI tft = TFT_eSPI();

TFT_eSprite sprite = TFT_eSprite(&tft); // สร้าง sprite สำหรับลูกบอล

#define TOTAL_SCENES 6

int currentScene = 0;

bool lastCState = HIGH;

// ลูกบอลหลายลูก

#define BALL_COUNT 5

int ballX[BALL_COUNT];

int ballY[BALL_COUNT];

int ballRadius = 10;

int ballSpeed = 3;

// ผู้เล่น

int playerX = 160;

const int playerY = 220;

const int playerWidth = 30;

const int playerHeight = 10;

const int playerSpeed = 5;

// ปุ่ม

#define BTN_LEFT WIO_5S_LEFT

#define BTN_RIGHT WIO_5S_RIGHT

#define BTN_SCENE WIO_KEY_C

void setup() {

tft.begin();

tft.setRotation(3);

pinMode(BTN_SCENE, INPUT_PULLUP);

pinMode(BTN_LEFT, INPUT_PULLUP);

pinMode(BTN_RIGHT, INPUT_PULLUP);

sprite.createSprite(320, 240); // ขนาดเท่าหน้าจอ

// เริ่มต้นตำแหน่งลูกบอลแบบสุ่ม

for (int i = 0; i < BALL_COUNT; i++) {

ballX[i] = random(ballRadius, 320 - ballRadius);

ballY[i] = random(-200, 0);

}

drawScene(currentScene);

}

void loop() {

bool cPressed = (digitalRead(BTN_SCENE) == LOW);

if (cPressed && lastCState == HIGH) {

currentScene = (currentScene + 1) % TOTAL_SCENES;

drawScene(currentScene);

// รีเซ็ตลูกบอลและผู้เล่น

for (int i = 0; i < BALL_COUNT; i++) {

ballX[i] = random(ballRadius, 320 - ballRadius);

ballY[i] = random(-200, 0);

}

playerX = 160;

delay(200);

}

lastCState = !cPressed ? HIGH : LOW;

// วาดฉากลง sprite

drawSceneToSprite(currentScene);

// อัปเดตตำแหน่งผู้เล่น

if (digitalRead(BTN_LEFT) == LOW) {

playerX -= playerSpeed;

if (playerX < 0) playerX = 0;

}

if (digitalRead(BTN_RIGHT) == LOW) {

playerX += playerSpeed;

if (playerX > 320 - playerWidth) playerX = 320 - playerWidth;

}

// เคลื่อนที่ลูกบอลหลายลูกและตรวจสอบชน

for (int i = 0; i < BALL_COUNT; i++) {

ballY[i] += ballSpeed;

if (ballY[i] > 240 - ballRadius) {

ballY[i] = random(-100, 0);

ballX[i] = random(ballRadius, 320 - ballRadius);

}

// ตรวจสอบการชนกับผู้เล่น

if (ballY[i] + ballRadius >= playerY &&

ballX[i] + ballRadius >= playerX &&

ballX[i] - ballRadius <= playerX + playerWidth) {

gameOver();

return;

}

// วาดลูกบอล

sprite.fillCircle(ballX[i], ballY[i], ballRadius, TFT_WHITE);

}

// วาดผู้เล่น

sprite.fillRect(playerX, playerY, playerWidth, playerHeight, TFT_RED);

// แสดง sprite บนหน้าจอจริง

sprite.pushSprite(0, 0);

delay(30);

}

void gameOver() {

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_RED);

tft.setTextSize(3);

tft.setCursor(60, 100);

tft.println("GAME OVER");

tft.setTextSize(2);

tft.setCursor(40, 150);

tft.println("Press C to Restart");

while (true) {

if (digitalRead(BTN_SCENE) == LOW) {

delay(200);

// รีเซ็ตลูกบอลและผู้เล่น

for (int i = 0; i < BALL_COUNT; i++) {

ballX[i] = random(ballRadius, 320 - ballRadius);

ballY[i] = random(-200, 0);

}

playerX = 160;

drawScene(currentScene);

break;

}

}

}

// วาดฉากพื้นหลังลง sprite (ไม่วาดบนหน้าจอโดยตรง)

void drawSceneToSprite(int scene) {

sprite.fillSprite(getBackgroundColor(scene));

switch (scene) {

case 0: // น้ำตก

sprite.fillTriangle(50, 180, 120, 80, 190, 180, TFT_DARKGREEN);

sprite.fillTriangle(60, 180, 130, 90, 200, 180, TFT_GREEN);

sprite.fillRect(110, 80, 20, 100, TFT_CYAN);

for (int y = 80; y < 180; y += 10)

sprite.drawLine(110, y, 130, y + 5, TFT_WHITE);

sprite.fillCircle(40, 160, 15, TFT_DARKGREEN);

sprite.fillCircle(210, 160, 15, TFT_DARKGREEN);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Waterfall");

break;

case 1: // ทะเล

sprite.fillRect(0, 140, 320, 100, TFT_BLUE);

sprite.fillRect(0, 220, 320, 20, TFT_YELLOW);

sprite.fillTriangle(140, 170, 180, 170, 160, 140, TFT_RED);

sprite.drawLine(160, 140, 160, 110, TFT_MAROON);

sprite.drawRect(150, 170, 20, 10, TFT_BLACK);

for (int x = 0; x < 320; x += 20) {

sprite.drawCircle(x, 140, 15, TFT_WHITE);

sprite.fillRect(x - 15, 140, 30, 15, TFT_BLUE);

}

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Sea");

break;

case 2: // ภูเขา

sprite.fillTriangle(100, 200, 160, 80, 220, 200, TFT_DARKGREY);

sprite.fillTriangle(120, 190, 160, 100, 200, 190, TFT_GREEN);

sprite.fillTriangle(140, 90, 160, 80, 180, 90, TFT_WHITE);

for (int x = 30; x <= 280; x += 50) {

sprite.fillTriangle(x, 200, x + 15, 170, x + 30, 200, TFT_GREEN);

sprite.fillRect(x + 12, 200, 6, 10, TFT_MAROON);

}

sprite.setTextColor(TFT_BLACK);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Mountain");

break;

case 3: // พระอาทิตย์ขึ้น

for (int y = 0; y < 240; y++) {

uint16_t color = tft.color565(

map(y, 0, 239, 255, 255),

map(y, 0, 239, 94, 182),

map(y, 0, 239, 19, 193)

);

sprite.drawFastHLine(0, y, 320, color);

}

sprite.fillCircle(160, 230, 40, TFT_ORANGE);

sprite.fillCircle(160, 230, 30, TFT_YELLOW);

sprite.fillTriangle(0, 240, 80, 180, 160, 240, TFT_DARKGREY);

sprite.fillTriangle(160, 240, 240, 180, 320, 240, TFT_DARKGREY);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Sunrise");

break;

case 4: // ป่า

sprite.fillRect(150, 140, 20, 60, TFT_MAROON);

sprite.fillCircle(160, 120, 40, TFT_GREEN);

sprite.fillTriangle(90, 180, 110, 130, 130, 180, TFT_GREEN);

sprite.fillRect(105, 180, 10, 20, TFT_MAROON);

sprite.fillTriangle(210, 180, 230, 130, 250, 180, TFT_GREEN);

sprite.fillRect(225, 180, 10, 20, TFT_MAROON);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Forest");

break;

case 5: // ท้องฟ้ายามค่ำคืน

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

sprite.drawPixel(x, y, TFT_WHITE);

}

sprite.fillCircle(250, 70, 30, TFT_WHITE);

sprite.fillCircle(265, 70, 30, getBackgroundColor(scene));

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Night Sky");

break;

}

}

uint16_t getBackgroundColor(int scene) {

switch (scene) {

case 0: return TFT_BLUE;

case 1: return TFT_BLUE;

case 2: return TFT_LIGHTGREY;

case 3: return tft.color565(255, 182, 193);

case 4: return TFT_DARKCYAN;

case 5: return TFT_BLUE;

default: return TFT_BLACK;

}

}

void drawScene(int scene) {

drawSceneToSprite(scene);

sprite.pushSprite(0, 0);

}

# data[].attributes.headline
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.subject
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.body
#include <TFT_eSPI.h> // ไลบรารีควบคุมจอ LCD

TFT_eSPI tft;

void setup() {

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า

// --- ใบหน้าฟ้า ---

tft.fillCircle(160, 120, 100, TFT_BLUE); // วงกลมฟ้าใหญ่

// --- แก้มขาว ---

tft.fillCircle(160, 140, 80, TFT_WHITE); // วงกลมขาวใหญ่ด้านล่าง

// --- ปากแดง ---

tft.fillCircle(160, 180, 40, TFT_RED); // ปากสีแดง

// เส้นแบ่งปาก

tft.drawLine(160, 140, 160, 200, TFT_BLACK);

// --- จมูกแดง ---

tft.fillCircle(160, 100, 12, TFT_RED);

tft.drawCircle(160, 100, 12, TFT_BLACK);

// เส้นตั้งจากจมูกลงปาก

tft.drawLine(160, 112, 160, 140, TFT_BLACK);

// --- ตา ---

// ตาขาวซ้าย

tft.fillCircle(140, 60, 25, TFT_WHITE);

tft.drawCircle(140, 60, 25, TFT_BLACK);

// ตาขาวขวา

tft.fillCircle(180, 60, 25, TFT_WHITE);

tft.drawCircle(180, 60, 25, TFT_BLACK);

// ลูกตาดำ

tft.fillCircle(140, 60, 8, TFT_BLACK);

tft.fillCircle(180, 60, 8, TFT_BLACK);

// --- หนวด ---

// ซ้าย

tft.drawLine(80, 100, 130, 90, TFT_BLACK);

tft.drawLine(80, 115, 130, 110, TFT_BLACK);

tft.drawLine(80, 130, 130, 130, TFT_BLACK);

// ขวา

tft.drawLine(190, 90, 240, 100, TFT_BLACK);

tft.drawLine(190, 110, 240, 115, TFT_BLACK);

tft.drawLine(190, 130, 240, 130, TFT_BLACK);

// --- กระดิ่ง ---

tft.fillCircle(160, 220, 15, TFT_YELLOW);

tft.drawCircle(160, 220, 15, TFT_BLACK);

tft.drawLine(150, 220, 170, 220, TFT_BLACK);

tft.fillCircle(160, 225, 4, TFT_BLACK);

}

void loop() {

// ไม่มีการเคลื่อนไหว

}

# data[].attributes.headline
นาย ธีรวัฒน์ สิงห์โตงาม

# data[].attributes.subject
นาย ธีรวัฒน์ สิงห์โตงาม

# data[].attributes.body
#include <TFT_eSPI.h>

#include <SPI.h>

TFT_eSPI tft = TFT_eSPI();

TFT_eSprite sprite = TFT_eSprite(&tft);

#define TOTAL_SCENES 6

int currentScene = 0;

bool lastCState = HIGH;

#define BTN_SCENE WIO_KEY_C

void setup() {

tft.begin();

tft.setRotation(3);

pinMode(BTN_SCENE, INPUT_PULLUP);

sprite.createSprite(320, 240);

drawScene(currentScene);

}

void loop() {

bool cPressed = (digitalRead(BTN_SCENE) == LOW);

if (cPressed && lastCState == HIGH) {

currentScene = (currentScene + 1) % TOTAL_SCENES;

drawScene(currentScene);

delay(200); // ดีเลย์เพื่อไม่ให้เลื่อนเร็วเกิน

}

lastCState = !cPressed ? HIGH : LOW;

}

// วาดฉากพื้นหลังลง sprite แล้วแสดงบนหน้าจอ

void drawScene(int scene) {

drawSceneToSprite(scene);

sprite.pushSprite(0, 0);

}

void drawSceneToSprite(int scene) {

sprite.fillSprite(getBackgroundColor(scene));

switch (scene) {

case 0: // น้ำตก

sprite.fillTriangle(50, 180, 120, 80, 190, 180, TFT_DARKGREEN);

sprite.fillTriangle(60, 180, 130, 90, 200, 180, TFT_GREEN);

sprite.fillRect(110, 80, 20, 100, TFT_CYAN);

for (int y = 80; y < 180; y += 10)

sprite.drawLine(110, y, 130, y + 5, TFT_WHITE);

sprite.fillCircle(40, 160, 15, TFT_DARKGREEN);

sprite.fillCircle(210, 160, 15, TFT_DARKGREEN);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Waterfall");

break;

case 1: // ทะเล

sprite.fillRect(0, 140, 320, 100, TFT_BLUE);

sprite.fillRect(0, 220, 320, 20, TFT_YELLOW);

sprite.fillTriangle(140, 170, 180, 170, 160, 140, TFT_RED);

sprite.drawLine(160, 140, 160, 110, TFT_MAROON);

sprite.drawRect(150, 170, 20, 10, TFT_BLACK);

for (int x = 0; x < 320; x += 20) {

sprite.drawCircle(x, 140, 15, TFT_WHITE);

sprite.fillRect(x - 15, 140, 30, 15, TFT_BLUE);

}

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Sea");

break;

case 2: // ภูเขา

sprite.fillTriangle(100, 200, 160, 80, 220, 200, TFT_DARKGREY);

sprite.fillTriangle(120, 190, 160, 100, 200, 190, TFT_GREEN);

sprite.fillTriangle(140, 90, 160, 80, 180, 90, TFT_WHITE);

for (int x = 30; x <= 280; x += 50) {

sprite.fillTriangle(x, 200, x + 15, 170, x + 30, 200, TFT_GREEN);

sprite.fillRect(x + 12, 200, 6, 10, TFT_MAROON);

}

sprite.setTextColor(TFT_BLACK);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Mountain");

break;

case 3: // พระอาทิตย์ขึ้น

for (int y = 0; y < 240; y++) {

uint16_t color = tft.color565(

map(y, 0, 239, 255, 255),

map(y, 0, 239, 94, 182),

map(y, 0, 239, 19, 193)

);

sprite.drawFastHLine(0, y, 320, color);

}

sprite.fillCircle(160, 230, 40, TFT_ORANGE);

sprite.fillCircle(160, 230, 30, TFT_YELLOW);

sprite.fillTriangle(0, 240, 80, 180, 160, 240, TFT_DARKGREY);

sprite.fillTriangle(160, 240, 240, 180, 320, 240, TFT_DARKGREY);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Sunrise");

break;

case 4: // ป่า

sprite.fillRect(150, 140, 20, 60, TFT_MAROON);

sprite.fillCircle(160, 120, 40, TFT_GREEN);

sprite.fillTriangle(90, 180, 110, 130, 130, 180, TFT_GREEN);

sprite.fillRect(105, 180, 10, 20, TFT_MAROON);

sprite.fillTriangle(210, 180, 230, 130, 250, 180, TFT_GREEN);

sprite.fillRect(225, 180, 10, 20, TFT_MAROON);

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Forest");

break;

case 5: // ท้องฟ้ายามค่ำคืน

// วาดดาวแบบสุ่มแค่ครั้งเดียวจะสวยกว่า (แก้เองได้ถ้าต้องการ)

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(0, 240);

sprite.drawPixel(x, y, TFT_WHITE);

}

sprite.fillCircle(250, 70, 30, TFT_WHITE);

sprite.fillCircle(265, 70, 30, getBackgroundColor(scene));

sprite.setTextColor(TFT_WHITE);

sprite.setTextSize(2);

sprite.setCursor(10, 10);

sprite.print("Night Sky");

break;

}

}

uint16_t getBackgroundColor(int scene) {

switch (scene) {

case 0: return TFT_BLUE;

case 1: return TFT_BLUE;

case 2: return TFT_LIGHTGREY;

case 3: return tft.color565(255, 182, 193);

case 4: return TFT_DARKCYAN;

case 5: return TFT_BLUE;

default: return TFT_BLACK;

}

}

# data[].attributes.headline
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.subject
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

#define SCREEN_WIDTH 320

#define SCREEN_HEIGHT 240

#define TILE_SIZE 10

#define MAX_LENGTH 100

TFT_eSPI tft = TFT_eSPI();

int snakeX[MAX_LENGTH];

int snakeY[MAX_LENGTH];

int snakeLength = 5;

int dirX = 1, dirY = 0;

int foodX, foodY;

int score = 0;

unsigned long lastMoveTime = 0;

const unsigned long moveInterval = 150; // ความเร็วงู

bool isPaused = false;

bool isGameOver = false;

// --- สีพื้นหลัง 6 สี ---

uint16_t bgColors[6] = {TFT_BLACK, TFT_NAVY, TFT_DARKGREEN, TFT_MAROON, TFT_PURPLE, TFT_ORANGE};

int bgColorIndex = 0;

void spawnFood() {

foodX = random(0, SCREEN_WIDTH / TILE_SIZE) * TILE_SIZE;

foodY = random(2, SCREEN_HEIGHT / TILE_SIZE) * TILE_SIZE;

}

void drawGame() {

tft.fillScreen(bgColors[bgColorIndex]); // ใช้สีพื้นหลังตาม index

// วาดแต้ม

tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);

tft.setCursor(5, 0);

tft.printf("Score: %d", score);

// วาดอาหาร

tft.fillRect(foodX, foodY, TILE_SIZE, TILE_SIZE, TFT_YELLOW);

// วาดงู

for (int i = 0; i < snakeLength; i++) {

tft.fillRect(snakeX[i], snakeY[i], TILE_SIZE, TILE_SIZE, i == 0 ? TFT_BLUE : TFT_CYAN);

}

}

void drawGameOver() {

tft.fillScreen(bgColors[bgColorIndex]);

tft.setTextColor(TFT_RED, bgColors[bgColorIndex]);

tft.setTextSize(2);

String msg = "Game Over!";

int msgWidth = msg.length() * 12;

int x = (SCREEN_WIDTH - msgWidth) / 2;

int y = SCREEN_HEIGHT / 2 - 16;

tft.setCursor(x, y);

tft.println(msg);

tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);

tft.setTextSize(1);

String scoreMsg = "Score: " + String(score);

int scoreWidth = scoreMsg.length() * 6;

int scoreX = (SCREEN_WIDTH - scoreWidth) / 2;

tft.setCursor(scoreX, y + 30);

tft.println(scoreMsg);

}

void resetGame() {

snakeLength = 5;

for (int i = 0; i < snakeLength; i++) {

snakeX[i] = 50 - i * TILE_SIZE;

snakeY[i] = 100;

}

dirX = 1;

dirY = 0;

score = 0;

isPaused = false;

isGameOver = false;

spawnFood();

drawGame();

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP); // เปลี่ยนสีพื้นหลัง

pinMode(WIO_KEY_B, INPUT_PULLUP); // เริ่มเกมใหม่

resetGame();

}

void loop() {

// ปุ่ม C: เปลี่ยนสีพื้นหลัง

static bool prevC = HIGH;

bool currC = digitalRead(WIO_KEY_C);

if (prevC HIGH && currC LOW) {

bgColorIndex = (bgColorIndex + 1) % 6; // วนสี

drawGame();

}

prevC = currC;

// ปุ่ม B: เริ่มเกมใหม่หลังเกมจบ

static bool prevB = HIGH;

bool currB = digitalRead(WIO_KEY_B);

if (prevB HIGH && currB LOW) {

resetGame();

}

prevB = currB;

if (isPaused || isGameOver) {

delay(50);

return;

}

// ควบคุมทิศทางงู

if (!digitalRead(WIO_5S_LEFT) && dirX != 1) {

dirX = -1; dirY = 0;

} else if (!digitalRead(WIO_5S_RIGHT) && dirX != -1) {

dirX = 1; dirY = 0;

} else if (!digitalRead(WIO_5S_UP) && dirY != 1) {

dirX = 0; dirY = -1;

} else if (!digitalRead(WIO_5S_DOWN) && dirY != -1) {

dirX = 0; dirY = 1;

}

unsigned long now = millis();

if (now - lastMoveTime > moveInterval) {

lastMoveTime = now;

// เลื่อนงู

for (int i = snakeLength - 1; i > 0; i--) {

snakeX[i] = snakeX[i - 1];

snakeY[i] = snakeY[i - 1];

}

snakeX[0] += dirX * TILE_SIZE;

snakeY[0] += dirY * TILE_SIZE;

// ชนขอบจอ

if (snakeX[0] < 0 || snakeX[0] >= SCREEN_WIDTH ||

snakeY[0] < 0 || snakeY[0] >= SCREEN_HEIGHT) {

isGameOver = true;

drawGameOver();

return;

}

// ชนตัวเอง

for (int i = 1; i < snakeLength; i++) {

if (snakeX[0] snakeX[i] && snakeY[0] snakeY[i]) {

isGameOver = true;

drawGameOver();

return;

}

}

// กินอาหาร

if (snakeX[0] foodX && snakeY[0] foodY) {

if (snakeLength < MAX_LENGTH) snakeLength++;

score++;

spawnFood();

}

drawGame();

}

}

# data[].attributes.headline
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.subject
นาย ธรรมนูญ วิชชาธาร

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

#define SCREEN_WIDTH 320

#define SCREEN_HEIGHT 240

#define TILE_SIZE 10

#define MAX_LENGTH 100

TFT_eSPI tft = TFT_eSPI();

int snakeX[MAX_LENGTH];

int snakeY[MAX_LENGTH];

int snakeLength = 5;

int dirX = 1, dirY = 0;

int foodX, foodY;

int score = 0;

unsigned long lastMoveTime = 0;

const unsigned long moveInterval = 150; // ความเร็วงู

bool isPaused = false;

bool isGameOver = false;

// --- สีพื้นหลัง 6 สี ---

uint16_t bgColors[6] = {TFT_BLACK, TFT_NAVY, TFT_DARKGREEN, TFT_MAROON, TFT_PURPLE, TFT_ORANGE};

int bgColorIndex = 0;

void spawnFood() {

foodX = random(0, SCREEN_WIDTH / TILE_SIZE) * TILE_SIZE;

foodY = random(2, SCREEN_HEIGHT / TILE_SIZE) * TILE_SIZE;

}

void drawGame() {

tft.fillScreen(bgColors[bgColorIndex]); // ใช้สีพื้นหลังตาม index

// วาดแต้ม

tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);

tft.setCursor(5, 0);

tft.printf("Score: %d", score);

// วาดอาหาร

tft.fillRect(foodX, foodY, TILE_SIZE, TILE_SIZE, TFT_YELLOW);

// วาดงู

for (int i = 0; i < snakeLength; i++) {

tft.fillRect(snakeX[i], snakeY[i], TILE_SIZE, TILE_SIZE, i == 0 ? TFT_BLUE : TFT_CYAN);

}

}

void drawGameOver() {

tft.fillScreen(bgColors[bgColorIndex]);

tft.setTextColor(TFT_RED, bgColors[bgColorIndex]);

tft.setTextSize(2);

String msg = "Game Over!";

int msgWidth = msg.length() * 12;

int x = (SCREEN_WIDTH - msgWidth) / 2;

int y = SCREEN_HEIGHT / 2 - 16;

tft.setCursor(x, y);

tft.println(msg);

tft.setTextColor(TFT_WHITE, bgColors[bgColorIndex]);

tft.setTextSize(1);

String scoreMsg = "Score: " + String(score);

int scoreWidth = scoreMsg.length() * 6;

int scoreX = (SCREEN_WIDTH - scoreWidth) / 2;

tft.setCursor(scoreX, y + 30);

tft.println(scoreMsg);

}

void resetGame() {

snakeLength = 5;

for (int i = 0; i < snakeLength; i++) {

snakeX[i] = 50 - i * TILE_SIZE;

snakeY[i] = 100;

}

dirX = 1;

dirY = 0;

score = 0;

isPaused = false;

isGameOver = false;

spawnFood();

drawGame();

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP); // เปลี่ยนสีพื้นหลัง

pinMode(WIO_KEY_B, INPUT_PULLUP); // เริ่มเกมใหม่

resetGame();

}

void loop() {

// ปุ่ม C: เปลี่ยนสีพื้นหลัง

static bool prevC = HIGH;

bool currC = digitalRead(WIO_KEY_C);

if (prevC HIGH && currC LOW) {

bgColorIndex = (bgColorIndex + 1) % 6; // วนสี

drawGame();

}

prevC = currC;

// ปุ่ม B: เริ่มเกมใหม่หลังเกมจบ

static bool prevB = HIGH;

bool currB = digitalRead(WIO_KEY_B);

if (prevB HIGH && currB LOW) {

resetGame();

}

prevB = currB;

if (isPaused || isGameOver) {

delay(50);

return;

}

// ควบคุมทิศทางงู

if (!digitalRead(WIO_5S_LEFT) && dirX != 1) {

dirX = -1; dirY = 0;

} else if (!digitalRead(WIO_5S_RIGHT) && dirX != -1) {

dirX = 1; dirY = 0;

} else if (!digitalRead(WIO_5S_UP) && dirY != 1) {

dirX = 0; dirY = -1;

} else if (!digitalRead(WIO_5S_DOWN) && dirY != -1) {

dirX = 0; dirY = 1;

}

unsigned long now = millis();

if (now - lastMoveTime > moveInterval) {

lastMoveTime = now;

// เลื่อนงู

for (int i = snakeLength - 1; i > 0; i--) {

snakeX[i] = snakeX[i - 1];

snakeY[i] = snakeY[i - 1];

}

snakeX[0] += dirX * TILE_SIZE;

snakeY[0] += dirY * TILE_SIZE;

// ชนขอบจอ

if (snakeX[0] < 0 || snakeX[0] >= SCREEN_WIDTH ||

snakeY[0] < 0 || snakeY[0] >= SCREEN_HEIGHT) {

isGameOver = true;

drawGameOver();

return;

}

// ชนตัวเอง

for (int i = 1; i < snakeLength; i++) {

if (snakeX[0] snakeX[i] && snakeY[0] snakeY[i]) {

isGameOver = true;

drawGameOver();

return;

}

}

// กินอาหาร

if (snakeX[0] foodX && snakeY[0] foodY) {

if (snakeLength < MAX_LENGTH) snakeLength++;

score++;

spawnFood();

}

drawGame();

}

}

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <DHT.h>

#include <BH1750.h>

#define DHTPIN 0

#define DHTTYPE DHT11

TFT_eSPI tft = TFT_eSPI();

DHT dht(DHTPIN, DHTTYPE);

BH1750 lightMeter;

void setup() {

Serial.begin(115200);

dht.begin();

Wire.begin();

lightMeter.begin();

delay(200);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

}

void loop() {

float temp = dht.readTemperature();

float humi = dht.readHumidity();

float lux = lightMeter.readLightLevel();

Serial.print("Lux: ");

Serial.println(lux);

if (lux < 0 || lux > 65535) {

lux = 0;

}

tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ

if (isnan(temp) || isnan(humi) || isnan(lux)) {

tft.setTextSize(2);

tft.setTextColor(TFT_RED, TFT_BLACK);

tft.drawString("Sensor Error!", 80, 110);

} else {

// -------- ส่วนบน: Temperature & Humidity --------

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.drawString("Temp", 40, 10);

tft.drawString("Humidity", 190, 10);

tft.setTextSize(4);

tft.setCursor(30, 40);

tft.printf("%.0f C", temp);

tft.setCursor(180, 40);

tft.printf("%.0f %%", humi);

// -------- ส่วนล่าง: Light --------

tft.setTextSize(2);

tft.drawString("Light Level", 100, 135);

tft.setTextSize(6);

tft.setCursor(110, 160);

tft.printf("%.0f ", lux);

}

delay(1000);

}

# data[].attributes.headline
ธรรมนูญ วิชชาธาร

# data[].attributes.subject
ธรรมนูญ วิชชาธาร

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft;

#define SW_A BCM0 // เพิ่มวินาที ต่อเข้า SW6

#define SW_B BCM1 // เพิ่มนาที ต่อเข้า SW7

#define SW_C BCM2 // Start / Stop / Reset ต่อเข้า SW5

#define BUZZER_PIN WIO_BUZZER

int seconds = 0;

int minutes = 0;

bool running = false;

bool finished = false;

unsigned long lastMillis = 0;

void setup() {

pinMode(SW_A, INPUT);

pinMode(SW_B, INPUT);

pinMode(SW_C, INPUT);

pinMode(BUZZER_PIN, OUTPUT);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_WHITE);

drawUI();

}

void loop() {

// ตั้งเวลา

if (!running && !finished) {

if (digitalRead(SW_A) == LOW) {

delay(200);

seconds++;

if (seconds >= 60) seconds = 0;

beep(100);

drawUI();

}

if (digitalRead(SW_B) == LOW) {

delay(200);

minutes++;

if (minutes >= 60) minutes = 0;

beep(100);

drawUI();

}

}

// ปุ่มเริ่ม / หยุด / รีเซ็ต

if (digitalRead(SW_C) == LOW) {

delay(300); // debounce

if (!running && !finished && (minutes > 0 || seconds > 0)) {

running = true;

lastMillis = millis();

} else if (running) {

running = false; // หยุดชั่วคราว

} else if (finished) {

// ติ๊ด 5 ครั้ง

for (int i = 0; i < 5; i++) {

beep(200);

delay(200);

}

finished = false;

minutes = 0;

seconds = 0;

drawUI();

}

}

// ทำงานเมื่อ countdown กำลังรัน

if (running && millis() - lastMillis >= 1000) {

lastMillis = millis();

if (seconds == 0) {

if (minutes == 0) {

running = false;

finished = true;

drawUI();

// ติ๊ด 3 ครั้ง

for (int i = 0; i < 3; i++) {

beep(200);

delay(200);

}

} else {

minutes--;

seconds = 59;

}

} else {

seconds--;

}

drawUI();

}

}

void drawUI() {

tft.fillScreen(TFT_WHITE);

tft.setTextColor(TFT_BLACK);

tft.setTextDatum(MC_DATUM);

tft.setTextSize(2);

tft.drawString("Count Down", 160, 30);

tft.drawString("SW7 TO START/STOP", 160, 60);

tft.drawString("SW6 & SW5 TO SET TIME", 160, 85);

// แสดงเวลา

char timeBuf[10];

sprintf(timeBuf, "%02d : %02d", minutes, seconds);

tft.setTextSize(4);

tft.drawString(timeBuf, 160, 130);

// แสดงสถานะ

tft.setTextSize(2);

if (running) {

tft.setTextColor(TFT_RED);

tft.drawString("RUNNING", 160, 190);

} else if (finished) {

tft.setTextColor(TFT_BLUE);

tft.drawString("FINISHED", 160, 190);

} else {

tft.setTextColor(TFT_DARKGREY);

tft.drawString("STOP", 160, 190);

}

}

void beep(int duration) {

tone(BUZZER_PIN, 1500); // 1.5kHz

delay(duration);

noTone(BUZZER_PIN);

}

# data[].attributes.headline
นายธีรวัฒน์ สิงห์โตงาม

# data[].attributes.subject
นายธีรวัฒน์ สิงห์โตงาม

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <Adafruit_MLX90614.h>

#include <Servo.h>

#include <wiring_constants.h>

TFT_eSPI tft;

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

Servo myservo;

#define ANGLE_LEFT 0

#define ANGLE_CENTER 90

#define BUZZER_PIN WIO_BUZZER

bool servoDone = false; // ตัวแปรสถานะ

void buzzerBeep(int duration = 500) {

tone(BUZZER_PIN, 2000);

delay(duration);

noTone(BUZZER_PIN);

delay(duration);

tone(BUZZER_PIN, 2000);

delay(duration);

noTone(BUZZER_PIN);

delay(duration);

}

void buzzerBeepG(int duration = 200) {

tone(BUZZER_PIN, 2000);

delay(duration);

noTone(BUZZER_PIN);

delay(duration);

}

void setup() {

Serial.begin(115200);

Wire.begin();

mlx.begin();

myservo.attach(BCM9);

myservo.write(ANGLE_CENTER);

tft.begin();

tft.setRotation(3);

tft.setTextDatum(MC_DATUM);

tft.setTextSize(2);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.drawString("Starting...", 160, 120);

delay(1000);

tft.fillScreen(TFT_BLACK);

}

void loop() {

float temp = mlx.readObjectTempC();

if (temp > 35.0) {

// แสดงสีแดง และร้องจนกว่าจะเย็นลง

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE, TFT_RED);

tft.setTextSize(3);

tft.drawString("TEMP HIGH", 160, 80);

tft.setTextSize(2);

tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);

tft.drawString("Cooling Required", 160, 180);

servoDone = false; // รีเซ็ตสถานะเมื่อร้อน

buzzerBeep();

} else {

// สีเขียว

tft.fillScreen(TFT_GREEN);

tft.setTextColor(TFT_BLACK, TFT_GREEN);

tft.setTextSize(3);

tft.drawString("TEMP NORMAL", 160, 80);

tft.setTextSize(2);

tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);

tft.drawString("Safe", 160, 180);

buzzerBeepG();

// ให้ Servo ทำงานแค่ครั้งเดียว

if (!servoDone) {

myservo.write(ANGLE_LEFT);

delay(2000);

myservo.write(ANGLE_CENTER);

delay(2000);

servoDone = true; // บันทึกว่าทำงานแล้ว

}

}

delay(1000); // หน่วงเวลา 1 วินาที

}

# data[].attributes.headline
นายธีรวัฒน์ สิงห์โตงาม

# data[].attributes.subject
นายธีรวัฒน์ สิงห์โตงาม

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <wiring_constants.h>

TFT_eSPI tft;

// ปุ่ม

#define SW1_PIN BCM4

#define SW2_PIN BCM5

#define SW3_PIN BCM6

// ลำโพง

#define BUZZER_PIN WIO_BUZZER

// เวลา

int minutes = 0;

int seconds = 0;

bool running = false;

bool timeEnded = false; // บอกว่าเคยนับจบหรือยัง

unsigned long lastUpdate = 0;

void setup() {

pinMode(SW1_PIN, INPUT_PULLUP);

pinMode(SW2_PIN, INPUT_PULLUP);

pinMode(SW3_PIN, INPUT_PULLUP);

pinMode(BUZZER_PIN, OUTPUT);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextSize(2);

tft.setTextDatum(MC_DATUM);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

showScreen();

showStatus();

}

void loop() {

// ตั้งเวลาเมื่อยังไม่เริ่มนับ

if (!running) {

if (digitalRead(SW1_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

minutes = (minutes + 1) % 100;

showScreen();

showStatus();

}

if (digitalRead(SW2_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

seconds = (seconds + 1) % 60;

showScreen();

showStatus();

}

}

// ปุ่ม START/STOP

if (digitalRead(SW3_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

// ถ้าเวลาเป็น 00:00 แล้วกด SW3 ให้ดัง 5 ครั้ง

if (minutes 0 && seconds 0) {

alarmBeep(5);

} else {

if (minutes > 0 || seconds > 0 || running) {

running = !running;

timeEnded = false;

}

}

showScreen();

showStatus();

}

// นับถอยหลัง

if (running && millis() - lastUpdate >= 1000) {

lastUpdate = millis();

if (seconds == 0) {

if (minutes == 0) {

running = false;

timeEnded = true;

showScreen();

showStatus();

alarmBeep(3); // จบเวลาปกติ ดัง 3 ครั้ง

} else {

minutes--;

seconds = 59;

}

} else {

seconds--;

}

showScreen();

showStatus();

}

}

void showScreen() {

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.drawString("Count Down", 160, 30);

tft.drawString("SW3 TO START OR STOP", 160, 60);

tft.drawString("SW2 & SW1 TO SET TIMER", 160, 90);

char timeStr[10];

tft.setTextColor(TFT_YELLOW);

sprintf(timeStr, "%02d : %02d", minutes, seconds);

tft.setTextSize(4);

tft.drawString(timeStr, 160, 140);}

void showStatus(){

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE);

tft.drawString(running ? "RUNNING" : "STOP", 160, 200);}

void alarmBeep(int times) {

for (int i = 0; i < times; i++) {

tone(BUZZER_PIN, 2000);

delay(200);

noTone(BUZZER_PIN);

delay(200);

}

}

void beepOnce() {

tone(BUZZER_PIN, 2500);

delay(100);

noTone(BUZZER_PIN);

}

# data[].attributes.headline
อินทัช สุวรรณวงศ์

# data[].attributes.subject
อินทัช สุวรรณวงศ์

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft;

enum Scene {

SCENE_1, SCENE_2, SCENE_3,

SCENE_4, SCENE_5, SCENE_6

};

Scene currentScene = SCENE_1;

int playerX = 60;

int playerY = 100;

const int playerSize = 16;

struct FallingObject {

int x;

int y;

int size;

uint16_t color;

bool active;

};

const int MAX_OBJECTS = 20; // เพิ่มจำนวนสูงสุดเก็บวัตถุตกได้มากขึ้น

FallingObject objects[MAX_OBJECTS];

int score = 0;

int fallSpeed = 4;

unsigned long lastSpawnTime = 0;

const unsigned long spawnInterval = 500; // วัตถุตกใหม่ทุก 500 ms

uint16_t getBgColor(Scene scene) {

switch(scene) {

case SCENE_1: return TFT_GREEN;

case SCENE_2: return TFT_ORANGE;

case SCENE_3: return TFT_CYAN;

case SCENE_4: return TFT_MAGENTA;

case SCENE_5: return TFT_NAVY;

case SCENE_6: return TFT_RED;

default: return TFT_BLACK;

}

}

void initFallingObject(FallingObject &obj) {

obj.x = random(0, tft.width() - 10);

obj.y = 0;

obj.size = 10;

obj.color = TFT_RED;

obj.active = true;

}

void drawPlayer(int x, int y, uint16_t color) {

tft.fillRect(x, y, playerSize, playerSize, color);

}

void drawScene(Scene scene) {

tft.fillScreen(getBgColor(scene));

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(10, 10);

tft.printf("Scene %d", (int)scene + 1);

drawPlayer(playerX, playerY, TFT_BLUE);

drawScore();

}

bool checkCollision(FallingObject &obj) {

return !(playerX + playerSize < obj.x || playerX > obj.x + obj.size ||

playerY + playerSize < obj.y || playerY > obj.y + obj.size);

}

void eraseFallingObject(FallingObject &obj) {

tft.fillRect(obj.x, obj.y, obj.size, obj.size, getBgColor(currentScene));

}

void updateFallingObject(FallingObject &obj) {

if (!obj.active) return;

eraseFallingObject(obj);

obj.y += fallSpeed;

if (checkCollision(obj)) {

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_RED);

tft.setTextSize(3);

tft.setCursor(20, 80);

tft.println("Game Over");

delay(1000);

playerX = 60;

playerY = 100;

score = 0;

// ปิดวัตถุตกทั้งหมด

for (int i = 0; i < MAX_OBJECTS; i++) {

objects[i].active = false;

}

drawScene(currentScene);

return;

}

if (obj.y > tft.height()) {

obj.active = false; // ปิดการแสดงผลวัตถุตกนี้ เพราะหลุดหน้าจอไปแล้ว

score++;

} else {

tft.fillRect(obj.x, obj.y, obj.size, obj.size, obj.color);

}

}

void drawScore() {

tft.fillRect(0, 0, 100, 24, getBgColor(currentScene));

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(5, 5);

tft.printf("Score: %d", score);

}

void setup() {

Serial.begin(115200);

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

for (int i = 0; i < MAX_OBJECTS; i++) {

objects[i].active = false;

}

drawScene(currentScene);

}

void loop() {

// ลบตัวละครเก่า

tft.fillRect(playerX, playerY, playerSize, playerSize, getBgColor(currentScene));

// ลบวัตถุตกเก่าทุกชิ้น

for (int i = 0; i < MAX_OBJECTS; i++) {

if (objects[i].active) {

eraseFallingObject(objects[i]);

}

}

// ควบคุมตัวละครด้วยจอยสติ๊ก

if (digitalRead(WIO_5S_LEFT) == LOW) playerX -= 3;

if (digitalRead(WIO_5S_RIGHT) == LOW) playerX += 3;

if (digitalRead(WIO_5S_UP) == LOW) playerY -= 3;

if (digitalRead(WIO_5S_DOWN) == LOW) playerY += 3;

playerX = constrain(playerX, 0, tft.width() - playerSize);

playerY = constrain(playerY, 0, tft.height() - playerSize);

drawPlayer(playerX, playerY, TFT_BLUE);

// สร้างวัตถุตกใหม่ถ้ามีช่องว่างและเวลาผ่านไปแล้ว

if (millis() - lastSpawnTime > spawnInterval) {

for (int i = 0; i < MAX_OBJECTS; i++) {

if (!objects[i].active) {

initFallingObject(objects[i]);

break; // สร้างแค่ 1 ชิ้นในรอบนี้

}

}

lastSpawnTime = millis();

}

// อัปเดตและวาดวัตถุตกทุกชิ้น

for (int i = 0; i < MAX_OBJECTS; i++) {

updateFallingObject(objects[i]);

}

drawScore();

// เปลี่ยนฉากด้วยปุ่ม A, B, C สำหรับ 3 ฉากแรก

if (digitalRead(WIO_KEY_A) == LOW) { currentScene = SCENE_1; drawScene(currentScene); delay(200); }

if (digitalRead(WIO_KEY_B) == LOW) { currentScene = SCENE_2; drawScene(currentScene); delay(200); }

if (digitalRead(WIO_KEY_C) == LOW) { currentScene = SCENE_3; drawScene(currentScene); delay(200); }

// เปลี่ยนฉาก 4-6 โดยกดปุ่มสองปุ่มพร้อมกัน

if (digitalRead(WIO_KEY_A) LOW && digitalRead(WIO_KEY_B) LOW) { currentScene = SCENE_4; drawScene(currentScene); delay(300); }

if (digitalRead(WIO_KEY_B) LOW && digitalRead(WIO_KEY_C) LOW) { currentScene = SCENE_5; drawScene(currentScene); delay(300); }

if (digitalRead(WIO_KEY_A) LOW && digitalRead(WIO_KEY_C) LOW) { currentScene = SCENE_6; drawScene(currentScene); delay(300); }

delay(50);

}

# data[].attributes.headline
นาย นัทพร สุภี

# data[].attributes.subject
นาย นัทพร สุภี

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft;

enum Scene {

SCENE_1, SCENE_2, SCENE_3,

SCENE_4, SCENE_5, SCENE_6

};

Scene currentScene = SCENE_1;

int playerX = 60;

int playerY = 100;

const int playerSize = 16;

struct FallingObject {

int x;

int y;

int size;

uint16_t color;

bool active;

};

const int MAX_OBJECTS = 20; // เพิ่มจำนวนสูงสุดเก็บวัตถุตกได้มากขึ้น

FallingObject objects[MAX_OBJECTS];

int score = 0;

int fallSpeed = 4;

unsigned long lastSpawnTime = 0;

const unsigned long spawnInterval = 500; // วัตถุตกใหม่ทุก 500 ms

uint16_t getBgColor(Scene scene) {

switch(scene) {

case SCENE_1: return TFT_GREEN;

case SCENE_2: return TFT_ORANGE;

case SCENE_3: return TFT_CYAN;

case SCENE_4: return TFT_MAGENTA;

case SCENE_5: return TFT_NAVY;

case SCENE_6: return TFT_RED;

default: return TFT_BLACK;

}

}

void initFallingObject(FallingObject &obj) {

obj.x = random(0, tft.width() - 10);

obj.y = 0;

obj.size = 10;

obj.color = TFT_RED;

obj.active = true;

}

void drawPlayer(int x, int y, uint16_t color) {

tft.fillRect(x, y, playerSize, playerSize, color);

}

void drawScene(Scene scene) {

tft.fillScreen(getBgColor(scene));

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(10, 10);

tft.printf("Scene %d", (int)scene + 1);

drawPlayer(playerX, playerY, TFT_BLUE);

drawScore();

}

bool checkCollision(FallingObject &obj) {

return !(playerX + playerSize < obj.x || playerX > obj.x + obj.size ||

playerY + playerSize < obj.y || playerY > obj.y + obj.size);

}

void eraseFallingObject(FallingObject &obj) {

tft.fillRect(obj.x, obj.y, obj.size, obj.size, getBgColor(currentScene));

}

void updateFallingObject(FallingObject &obj) {

if (!obj.active) return;

eraseFallingObject(obj);

obj.y += fallSpeed;

if (checkCollision(obj)) {

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_RED);

tft.setTextSize(3);

tft.setCursor(20, 80);

tft.println("Game Over");

delay(1000);

playerX = 60;

playerY = 100;

score = 0;

// ปิดวัตถุตกทั้งหมด

for (int i = 0; i < MAX_OBJECTS; i++) {

objects[i].active = false;

}

drawScene(currentScene);

return;

}

if (obj.y > tft.height()) {

obj.active = false; // ปิดการแสดงผลวัตถุตกนี้ เพราะหลุดหน้าจอไปแล้ว

score++;

} else {

tft.fillRect(obj.x, obj.y, obj.size, obj.size, obj.color);

}

}

void drawScore() {

tft.fillRect(0, 0, 100, 24, getBgColor(currentScene));

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(5, 5);

tft.printf("Score: %d", score);

}

void setup() {

Serial.begin(115200);

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

for (int i = 0; i < MAX_OBJECTS; i++) {

objects[i].active = false;

}

drawScene(currentScene);

}

void loop() {

// ลบตัวละครเก่า

tft.fillRect(playerX, playerY, playerSize, playerSize, getBgColor(currentScene));

// ลบวัตถุตกเก่าทุกชิ้น

for (int i = 0; i < MAX_OBJECTS; i++) {

if (objects[i].active) {

eraseFallingObject(objects[i]);

}

}

// ควบคุมตัวละครด้วยจอยสติ๊ก

if (digitalRead(WIO_5S_LEFT) == LOW) playerX -= 3;

if (digitalRead(WIO_5S_RIGHT) == LOW) playerX += 3;

if (digitalRead(WIO_5S_UP) == LOW) playerY -= 3;

if (digitalRead(WIO_5S_DOWN) == LOW) playerY += 3;

playerX = constrain(playerX, 0, tft.width() - playerSize);

playerY = constrain(playerY, 0, tft.height() - playerSize);

drawPlayer(playerX, playerY, TFT_BLUE);

// สร้างวัตถุตกใหม่ถ้ามีช่องว่างและเวลาผ่านไปแล้ว

if (millis() - lastSpawnTime > spawnInterval) {

for (int i = 0; i < MAX_OBJECTS; i++) {

if (!objects[i].active) {

initFallingObject(objects[i]);

break; // สร้างแค่ 1 ชิ้นในรอบนี้

}

}

lastSpawnTime = millis();

}

// อัปเดตและวาดวัตถุตกทุกชิ้น

for (int i = 0; i < MAX_OBJECTS; i++) {

updateFallingObject(objects[i]);

}

drawScore();

// เปลี่ยนฉากด้วยปุ่ม A, B, C สำหรับ 3 ฉากแรก

if (digitalRead(WIO_KEY_A) == LOW) { currentScene = SCENE_1; drawScene(currentScene); delay(200); }

if (digitalRead(WIO_KEY_B) == LOW) { currentScene = SCENE_2; drawScene(currentScene); delay(200); }

if (digitalRead(WIO_KEY_C) == LOW) { currentScene = SCENE_3; drawScene(currentScene); delay(200); }

// เปลี่ยนฉาก 4-6 โดยกดปุ่มสองปุ่มพร้อมกัน

if (digitalRead(WIO_KEY_A) LOW && digitalRead(WIO_KEY_B) LOW) { currentScene = SCENE_4; drawScene(currentScene); delay(300); }

if (digitalRead(WIO_KEY_B) LOW && digitalRead(WIO_KEY_C) LOW) { currentScene = SCENE_5; drawScene(currentScene); delay(300); }

if (digitalRead(WIO_KEY_A) LOW && digitalRead(WIO_KEY_C) LOW) { currentScene = SCENE_6; drawScene(currentScene); delay(300); }

delay(50);

}

# data[].attributes.headline
ธรรมนูญ วิชชาธาร

# data[].attributes.subject
ธรรมนูญ วิชชาธาร

# data[].attributes.body
#include <Wire.h>

#include <BH1750.h>

#include <TFT_eSPI.h>

BH1750 lightMeter;

TFT_eSPI tft = TFT_eSPI();

#define RELAY1_PIN BCM10

#define RELAY2_PIN BCM9

void setup() {

Serial.begin(115200);

Wire.begin();

lightMeter.begin();

pinMode(RELAY1_PIN, OUTPUT);

pinMode(RELAY2_PIN, OUTPUT);

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setTextSize(2);

}

void loop() {

float lux = lightMeter.readLightLevel();

if (lux < 0) lux = 0;

Serial.printf("Lux: %.2f\n", lux);

drawGraph(lux);

controlRelay(lux);

delay(500);

}

void controlRelay(float lux) {

if (lux <= 0) {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

showStatus("OFF");

} else if (lux > 430) {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, HIGH);

showStatus("RELAY 2 ON");

} else if (lux > 220) {

digitalWrite(RELAY1_PIN, HIGH);

digitalWrite(RELAY2_PIN, LOW);

showStatus("RELAY 1 ON");

} else {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

showStatus("OFF");

}

}

void showStatus(String text) {

tft.fillRect(0, 200, 320, 40, TFT_BLACK);

tft.setCursor(10, 210);

tft.print("PWR: " + text);

}

void drawGraph(float lux) {

int max1 = 220;

int max2 = 440;

int widthMax = 280;

// เคลียร์พื้นที่กราฟ

tft.fillRect(0, 0, 320, 180, TFT_BLACK);

// แสดงค่า Lux

tft.setCursor(10, 10);

tft.printf("Light: %.0f lx", lux);

// แถบบน (0 - 220)

tft.drawRect(20, 40, widthMax, 30, TFT_WHITE);

int bar1Width = (lux <= max1) ? map(lux, 0, max1, 0, widthMax) : widthMax;

if (lux <= max1)

tft.fillRect(20, 40, bar1Width, 30, TFT_BLUE);

else

tft.fillRect(20, 40, widthMax, 30, TFT_BLUE);

// ตัวเลขด้านล่างแถบบน

tft.setTextSize(2);

tft.setCursor(20, 75); // ตำแหน่งใต้แถบด้านซ้าย

tft.print("0");

tft.setCursor(20 + widthMax - 36, 75); // ตำแหน่งใต้แถบด้านขวา

tft.print("220");

// แถบกลาง (221 - 440)

tft.drawRect(20, 100, widthMax, 30, TFT_WHITE);

if (lux > max1) {

int bar2Width = map(lux, max1 + 1, max2, 0, widthMax);

if (bar2Width > widthMax) bar2Width = widthMax;

tft.fillRect(20, 100, bar2Width, 30, TFT_GREEN);

}

// ตัวเลขด้านล่างแถบกลาง

tft.setCursor(20, 135); // ด้านซ้าย

tft.print("221");

tft.setCursor(20 + widthMax - 36, 135); // ด้านขวา

tft.print("440");

tft.setTextSize(2); // คืนค่าขนาดตัวอักษร

}

# data[].attributes.headline
อินทัช สุวรรณวงศ์

# data[].attributes.subject
อินทัช สุวรรณวงศ์

# data[].attributes.body
// Flappy Wio — Single-file Sketch for Seeed Wio Terminal

// ควบคุม: กด A/B/C หรือกดกลางของ 5-way เพื่อ "กระพือ"

// หมายเหตุ: จอ Wio Terminal ไม่ใช่จอสัมผัส ไอคอนบนจอเป็น UI หลอกตาเพื่อบอกปุ่มใช้งาน

#include <TFT_eSPI.h> // มาจากไลบรารี Seeed_Arduino_LCD

TFT_eSPI tft;

#ifndef WIO_KEY_A

// ถ้าเลือกบอร์ดเป็น Wio Terminal แล้ว จะมีมาให้โดยอัตโนมัติ

// หากคอมไพล์ไม่ผ่าน ให้ไปที่ Tools > Board > Seeed SAMD > Seeed Wio Terminal

#define WIO_KEY_A 0

#define WIO_KEY_B 1

#define WIO_KEY_C 2

#define WIO_5S_UP 3

#define WIO_5S_DOWN 4

#define WIO_5S_LEFT 5

#define WIO_5S_RIGHT 6

#define WIO_5S_PRESS 7

#endif

// ขนาดจอ

const int W = 320;

const int H = 240;

// ตัวละคร (นก)

float birdY;

float birdV;

const float GRAVITY = 0.35f;

const float FLAP = -5.5f;

const int BIRD_X = 60;

const int BIRD_R = 8;

// ท่อ

int pipeX;

int gapY;

int gapH = 80; // ความกว้างช่อง (เล็กลง = ยากขึ้น)

int pipeW = 36;

int pipeSpeed = 2;

// สกอร์/สถานะ

int score = 0;

bool alive = true;

unsigned long lastFrame = 0;

const uint16_t BG = TFT_BLACK;

bool buttonPressed() {

// ปุ่มใดก็ได้ถือเป็น "กระพือ"

return digitalRead(WIO_KEY_A) == LOW ||

digitalRead(WIO_KEY_B) == LOW ||

digitalRead(WIO_KEY_C) == LOW ||

digitalRead(WIO_5S_PRESS) == LOW;

}

void drawUI() {

// แถบปุ่มหลอกตาด้านล่าง (UI ชี้แนะการควบคุม)

tft.fillRect(0, H-26, W, 26, TFT_DARKGREY);

tft.drawString("Press A / B / C or 5-way center to FLAP", 8, H-22, 2);

}

void resetGame() {

birdY = H/2;

birdV = 0;

pipeX = W + 40;

gapY = random(40, H-40-gapH);

score = 0;

alive = true;

tft.fillScreen(BG);

drawUI();

}

void drawBird(int color) {

tft.fillCircle(BIRD_X, (int)birdY, BIRD_R, color);

// ตาวงเล็ก

tft.fillCircle(BIRD_X+3, (int)birdY-3, 2, TFT_WHITE);

tft.drawPixel(BIRD_X+4, (int)birdY-3, TFT_BLACK);

// ปาก

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);

}

void drawPipe(int x, int color) {

// ท่อบน

tft.fillRect(x, 0, pipeW, gapY, color);

// ท่อล่าง

tft.fillRect(x, gapY+gapH, pipeW, H-(gapY+gapH)-26, color); // -26 เว้นพื้นที่ UI ล่าง

}

void drawScore() {

char buf[24];

sprintf(buf, "Score: %d", score);

tft.fillRect(0, 0, 120, 18, BG);

tft.drawString(buf, 6, 2, 2);

}

void gameOverScreen() {

tft.fillRect(0, 40, W, 120, TFT_NAVY);

tft.drawCentreString("GAME OVER", W/2, 60, 4);

char buf[32];

sprintf(buf, "Score: %d", score);

tft.drawCentreString(buf, W/2, 92, 4);

tft.drawCentreString("Press any key to retry", W/2, 124, 2);

}

void setup() {

// ปุ่มเป็น INPUT_PULLUP (กดแล้วเป็น LOW)

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

pinMode(WIO_5S_PRESS, INPUT_PULLUP);

tft.init();

tft.setRotation(3); // แนวนอน 320x240

tft.fillScreen(BG);

tft.setTextColor(TFT_WHITE, BG);

tft.setTextDatum(TL_DATUM);

randomSeed(analogRead(A0));

drawUI();

resetGame();

lastFrame = millis();

drawScore();

}

void loop() {

// กำหนดเฟรมเรตแบบง่าย ๆ

if (millis() - lastFrame < 16) return; // ~60 FPS

lastFrame = millis();

if (alive) {

// ลบภาพเดิม

drawBird(BG);

drawPipe(pipeX, BG);

// อินพุต

if (buttonPressed()) {

birdV = FLAP;

}

// ฟิสิกส์

birdV += GRAVITY;

birdY += birdV;

// เลื่อนท่อ

pipeX -= pipeSpeed;

// วนท่อและเพิ่มสกอร์

if (pipeX + pipeW < 0) {

pipeX = W + random(20, 80);

gapY = random(30, H-60-gapH);

score++;

// เพิ่มความยากเล็กน้อย

if (score % 3 == 0 && gapH > 60) gapH -= 4;

if (score % 4 == 0 && pipeSpeed < 4) pipeSpeed++;

}

// ชนขอบบน/ล่าง (ยกเว้นแถบ UI)

if (birdY - BIRD_R < 0 || birdY + BIRD_R > H-26) {

alive = false;

}

// ชนท่อ (ตรวจ AABB + วงกลมอย่างหยาบ)

bool withinPipeX = (BIRD_X + BIRD_R > pipeX) && (BIRD_X - BIRD_R < pipeX + pipeW);

bool inGapY = (birdY - BIRD_R > gapY) && (birdY + BIRD_R < gapY + gapH);

if (withinPipeX && !inGapY) {

alive = false;

}

// วาดใหม่

drawPipe(pipeX, TFT_DARKGREEN);

drawBird(TFT_CYAN);

drawScore();

} else {

// จบเกม: รอผู้เล่นกดเพื่อเริ่มใหม่

gameOverScreen();

// กันคีย์ค้าง: รอปล่อยปุ่มก่อน

while (buttonPressed()) delay(5);

// รอการกดใหม่

while (!buttonPressed()) delay(5);

// กันเด้ง

delay(120);

tft.fillScreen(BG);

drawUI();

resetGame();

drawScore();

}

}

# data[].attributes.headline
นิธิศ นุชทองม่วง

# data[].attributes.subject
นิธิศ นุชทองม่วง

# data[].attributes.body
#include <TFT_eSPI.h>

#include <DHT.h>

#include <BH1750.h>

#include <Wire.h>

#define DHTPIN 0 // ขา GPIO สำหรับ DHT11

#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

BH1750 lightMeter;

TFT_eSPI tft;

void setup() {

Wire.begin();

dht.begin();

lightMeter.begin();

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_WHITE); // พื้นหลังสีขาว

// หัวข้อ

tft.setTextColor(TFT_BLACK, TFT_WHITE);

tft.setTextSize(2);

tft.drawString("Temperature", 20, 20);

tft.drawString("Humidity", 200, 20);

tft.drawString("Light", 130, 210);

}

void loop() {

float temp = dht.readTemperature();

float humi = dht.readHumidity();

int lux = (int)lightMeter.readLightLevel();

// ลบค่าก่อนหน้า (สีขาว)

tft.fillRect(30, 60, 100, 40, TFT_WHITE);

tft.fillRect(170, 60, 100, 40, TFT_WHITE);

tft.fillRect(100, 150, 200, 40, TFT_WHITE);

// แสดงค่าอุณหภูมิ

tft.setTextColor(TFT_BLACK, TFT_WHITE);

tft.setTextSize(5); // <== ตัวเลขใหญ่ขึ้น

tft.drawString(String((int)temp), 40, 65);

// แสดงค่าความชื้น

tft.drawString(String((int)humi), 220, 65);

// แสดงค่าแสง

tft.drawString(String(lux), 135, 150);

delay(1000);

}

# data[].attributes.headline
นาย นิธิศ นุชทองม่วง

# data[].attributes.subject
นาย นิธิศ นุชทองม่วง

# data[].attributes.body
งาน 5/2#include <Adafruit_NeoPixel.h>

#include <TFT_eSPI.h>

#define NUMPIXELS 12

#define LED_PIN D2

#define VR_PIN A0

#define BUTTON_LEFT WIO_5S_LEFT

#define BUTTON_RIGHT WIO_5S_RIGHT

#define BUTTON_PRESS WIO_5S_PRESS

Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

TFT_eSPI tft;

uint8_t brightness = 128;

int selectedColor = 0;

bool lightsOn = true;

int lastSelectedColor = -1;

uint8_t lastBrightness = 0;

bool lastLightsOn = true;

const int colorCount = 5;

uint32_t colorPalette[colorCount] = {

pixels.Color(255, 0, 0), // แดง

pixels.Color(255, 165, 0), // ส้ม

pixels.Color(0, 0, 255), // น้ำเงิน

pixels.Color(255, 0, 255), // ชมพู

pixels.Color(0, 255, 0) // เขียว

};

const char* colorNames[colorCount] = {

"Red", "Orange", "Blue", "Pink", "Green"

};

void setup() {

pixels.begin();

pixels.setBrightness(brightness);

pixels.show();

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

pinMode(VR_PIN, INPUT);

pinMode(BUTTON_LEFT, INPUT_PULLUP);

pinMode(BUTTON_RIGHT, INPUT_PULLUP);

pinMode(BUTTON_PRESS, INPUT_PULLUP);

drawColorSelector();

drawBrightnessBar();

}

void loop() {

int vrValue = analogRead(VR_PIN);

brightness = map(vrValue, 0, 1023, 0, 259);

if (brightness != lastBrightness) {

pixels.setBrightness(brightness);

lastBrightness = brightness;

}

if (digitalRead(BUTTON_LEFT) == LOW) {

selectedColor = (selectedColor - 1 + colorCount) % colorCount;

delay(150);

}

if (digitalRead(BUTTON_RIGHT) == LOW) {

selectedColor = (selectedColor + 1) % colorCount;

delay(150);

}

if (digitalRead(BUTTON_PRESS) == LOW) {

lightsOn = !lightsOn;

delay(300);

}

if (selectedColor != lastSelectedColor || lightsOn != lastLightsOn) {

drawColorSelector();

lastSelectedColor = selectedColor;

lastLightsOn = lightsOn;

}

for (int i = 0; i < NUMPIXELS; i++) {

pixels.setPixelColor(i, lightsOn ? colorPalette[selectedColor] : 0);

}

pixels.show();

drawBrightnessBar();

delay(50);

}

void drawColorSelector() {

tft.fillScreen(TFT_BLACK);

int radius = 20;

int selectedRadius = 25;

int spacing = 65;

int centerY = 80;

int startX = 40;

String title = "Select Color";

tft.setTextSize(2);

tft.setTextColor(TFT_ORANGE, TFT_BLACK);

int16_t titleW = tft.textWidth(title);

tft.setCursor((320 - titleW) / 2, 16);

tft.print(title);

for (int i = 0; i < colorCount; i++) {

int x = startX + i * spacing;

int r = (i == selectedColor) ? selectedRadius : radius;

// วาดวงกลมสีพร้อมแสงเงา

for (int j = r; j > 0; j--) {

uint32_t c = colorPalette[i];

uint8_t factor = map(j, 0, r, 80, 255);

uint8_t red = ((c >> 16) & 0xFF) * factor / 255;

uint8_t green = ((c >> 8) & 0xFF) * factor / 255;

uint8_t blue = (c & 0xFF) * factor / 255;

tft.fillCircle(x, centerY, j, color565(pixels.Color(red, green, blue)));

}

if (i == selectedColor) {

tft.drawCircle(x, centerY, r, TFT_WHITE);

int arrowY = centerY - r - 12;

tft.fillTriangle(x, arrowY, x - 8, arrowY - 10, x + 8, arrowY - 10, TFT_RED);

}

int16_t textW = tft.textWidth(colorNames[i]);

tft.setCursor(x - textW / 2, centerY + r + 15);

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.print(colorNames[i]);

}

}

void drawBrightnessBar() {

tft.fillRect(0, 130, 320, 60, TFT_BLACK);

String brightStr = " VR" + String(brightness);

tft.setTextSize(2);

int16_t w = tft.textWidth(brightStr);

tft.setCursor((320 - w) / 2, 135);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.print(brightStr);

int barX = 10, barY = 170, barWidthMax = 300, barHeight = 20;

tft.drawRoundRect(barX - 1, barY - 1, barWidthMax + 2, barHeight + 2, 5, TFT_WHITE);

int barWidth = map(brightness, 0, 255, 0, barWidthMax);

for (int i = 0; i < barWidth; i++) {

uint8_t red = map(i, 0, barWidth, 255, 255);

uint8_t green = map(i, 0, barWidth, 255, 165);

tft.drawFastVLine(barX + i, barY, barHeight, color565(pixels.Color(red, green, 0)));

}

tft.fillRect(barX + barWidth, barY, barWidthMax - barWidth, barHeight, TFT_DARKGREY);

}

uint16_t color565(uint32_t c) {

uint8_t r = (uint8_t)(c >> 16);

uint8_t g = (uint8_t)(c >> 8);

uint8_t b = (uint8_t)c;

return tft.color565(r, g, b);

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส งาน 4.4

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส งาน 4.4

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Adafruit_NeoPixel.h>

TFT_eSPI tft;

// พินมอเตอร์

#define MOTOR_PWM BCM27

#define MOTOR_IN1 BCM6

#define MOTOR_IN2 BCM4 // *** ห้ามใช้ร่วมกับ LED_PIN ***

#define SWITCH_TOGGLE BCM5

#define VR_PIN A1

#define LED_PIN D3 // <<< เปลี่ยนจาก 4 เป็น 3

#define NUMPIXELS 12

Adafruit_NeoPixel pixels(NUMPIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);

bool motorRunning = true;

bool lastSwitchState = HIGH;

void setup() {

Serial.begin(115200);

pinMode(MOTOR_PWM, OUTPUT);

pinMode(MOTOR_IN1, OUTPUT);

pinMode(MOTOR_IN2, OUTPUT);

pinMode(SWITCH_TOGGLE, INPUT_PULLUP); // ใช้ pull-up

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setTextSize(2);

tft.drawString("DC MOTOR (1-CH)", 80, 20);

pixels.begin();

pixels.show();

}

void loop() {

int vrValue = analogRead(VR_PIN);

int center = 512;

int deadzone = 20;

// อ่านสถานะปุ่ม toggle

bool currentSwitchState = digitalRead(SWITCH_TOGGLE);

if (lastSwitchState HIGH && currentSwitchState LOW) {

motorRunning = !motorRunning;

Serial.println("Toggle switch pressed");

delay(200); // กันเด้งปุ่ม

}

lastSwitchState = currentSwitchState;

// คำนวณ speed

int speedPercent = 0;

if (vrValue > center + deadzone) {

speedPercent = map(vrValue, center + deadzone, 1023, 1, 100);

} else if (vrValue < center - deadzone) {

speedPercent = map(vrValue, center - deadzone, 0, -1, -100);

}

// แสดง Speed บนจอ

tft.fillRect(0, 50, 320, 30, TFT_BLACK);

String displaySpeed = "Speed: " + String(abs(speedPercent)) + "%";

tft.drawString(displaySpeed, 90, 50);

if (motorRunning) {

int pwmValue = map(abs(speedPercent), 0, 100, 0, 255);

if (speedPercent > 0) {

digitalWrite(MOTOR_IN1, HIGH);

digitalWrite(MOTOR_IN2, LOW);

analogWrite(MOTOR_PWM, pwmValue);

setRGBColor(0, pwmValue);

showStatus("Forward");

Serial.print("Forward PWM: ");

Serial.println(pwmValue);

} else if (speedPercent < 0) {

digitalWrite(MOTOR_IN1, LOW);

digitalWrite(MOTOR_IN2, HIGH);

analogWrite(MOTOR_PWM, pwmValue);

setRGBColor(pwmValue, 0);

showStatus("Reverse");

Serial.print("Reverse PWM: ");

Serial.println(pwmValue);

} else {

stopMotor();

setRGBColor(0, 0);

showStatus("Stop");

Serial.println("Stop by VR Center");

}

} else {

stopMotor();

setRGBColor(0, 0);

showStatus("Stop");

Serial.println("Emergency Stop");

}

}

void stopMotor() {

analogWrite(MOTOR_PWM, 0);

digitalWrite(MOTOR_IN1, LOW);

digitalWrite(MOTOR_IN2, LOW);

}

void setRGBColor(uint8_t red, uint8_t green) {

for (int i = 0; i < NUMPIXELS; i++) {

pixels.setPixelColor(i, pixels.Color(red, green, 0));

}

pixels.show();

}

void showStatus(String msg) {

tft.fillRect(0, 80, 320, 30, TFT_BLACK);

tft.drawString(msg, 120, 80);

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส งาน 4.3

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส งาน 4.3

# data[].attributes.body
#include <TFT_eSPI.h>

#define SW0_PIN BCM0

#define SW1_PIN BCM1

#define SW2_PIN BCM2

#define SW3_PIN BCM3

#define SW4_PIN BCM4

#define RELAY1_PIN BCM27

#define RELAY2_PIN BCM26

#define RELAY3_PIN BCM25

#define RELAY4_PIN BCM24

bool relayState[4] = {false, false, false, false};

bool prevButtonState[5] = {HIGH, HIGH, HIGH, HIGH, HIGH};

TFT_eSPI tft;

void setup() {

pinMode(SW0_PIN, INPUT_PULLUP);

pinMode(SW1_PIN, INPUT_PULLUP);

pinMode(SW2_PIN, INPUT_PULLUP);

pinMode(SW3_PIN, INPUT_PULLUP);

pinMode(SW4_PIN, INPUT_PULLUP);

pinMode(RELAY1_PIN, OUTPUT);

pinMode(RELAY2_PIN, OUTPUT);

pinMode(RELAY3_PIN, OUTPUT);

pinMode(RELAY4_PIN, OUTPUT);

for (int i = 0; i < 4; i++) {

digitalWrite(getRelayPin(i), LOW);

}

tft.begin();

tft.setRotation(3); // หมุนจอแนวนอน

tft.fillScreen(TFT_BLACK);

updateDisplay();

Serial.begin(115200);

}

void loop() {

int buttonPins[5] = {SW0_PIN, SW1_PIN, SW2_PIN, SW3_PIN, SW4_PIN};

for (int i = 0; i < 4; i++) {

bool currentButton = digitalRead(buttonPins[i]);

if (prevButtonState[i] HIGH && currentButton LOW) {

relayState[i] = !relayState[i];

digitalWrite(getRelayPin(i), relayState[i] ? HIGH : LOW);

updateDisplay();

}

prevButtonState[i] = currentButton;

}

bool sw4Current = digitalRead(buttonPins[4]);

if (prevButtonState[4] HIGH && sw4Current LOW) {

bool allOff = true;

for (int i = 0; i < 4; i++) {

if (relayState[i]) {

allOff = false;

break;

}

}

for (int i = 0; i < 4; i++) {

relayState[i] = allOff ? true : false;

digitalWrite(getRelayPin(i), relayState[i] ? HIGH : LOW);

}

updateDisplay();

}

prevButtonState[4] = sw4Current;

delay(50);

}

void updateDisplay() {

tft.fillScreen(TFT_BLACK);

// Title

tft.setTextColor(TFT_YELLOW, TFT_BLACK);

tft.setTextSize(2);

tft.drawCentreString("RELAY CONTROL", 160, 5, 2);

// Size config

int boxWidth = 280;

int boxHeight = 40;

int startY = 35;

int gapY = 10;

for (int i = 0; i < 4; i++) {

int y = startY + i * (boxHeight + gapY);

// Draw box

tft.drawRoundRect(20, y, boxWidth, boxHeight, 6, TFT_WHITE);

// Label

tft.setTextColor(TFT_CYAN, TFT_BLACK);

tft.setTextSize(2);

tft.drawString("Relay " + String(i + 1), 30, y + 10);

// Status box

if (relayState[i]) {

tft.fillRoundRect(190, y + 8, 90, 24, 5, TFT_GREEN);

tft.setTextColor(TFT_BLACK);

tft.drawCentreString("ON", 235, y + 12, 2);

} else {

tft.fillRoundRect(190, y + 8, 90, 24, 5, TFT_RED);

tft.setTextColor(TFT_WHITE);

tft.drawCentreString("OFF", 235, y + 12, 2);

}

}

}

int getRelayPin(int index) {

int relayPins[4] = {RELAY1_PIN, RELAY2_PIN, RELAY3_PIN, RELAY4_PIN};

return relayPins[index];

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส งาน 4.1

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส งาน 4.1

# data[].attributes.body
#include <TFT_eSPI.h>

#include "DHT.h"

#include <Wire.h>

#include <BH1750.h>

#define DHTPIN 0 // GPIO 27

#define DHTTYPE DHT11 // DHT 11

TFT_eSPI tft = TFT_eSPI();

DHT dht(DHTPIN, DHTTYPE);

BH1750 lightMeter;

void setup()

{

dht.begin();

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_WHITE); // พื้นหลังสีขาว

tft.setTextColor(TFT_BLACK, TFT_WHITE); // สีดำพื้นขาว

Wire.begin();

lightMeter.begin();

}

void loop()

{

float temp = dht.readTemperature();

float humi = dht.readHumidity();

float light = lightMeter.readLightLevel();

tft.fillScreen(TFT_WHITE); // เคลียร์หน้าจอทุก loop

// ข้อความด้านบน

tft.setTextSize(2);

tft.drawString("Temperature", 20, 10); // ซ้ายบน

tft.drawString("Humidity", 190, 10); // ขวาบน

// ตัวเลข Temperature และ Humidity ตรงกลาง

tft.setTextSize(4);

tft.drawString(String((int)temp), 50, 40); // ค่าความร้อน

tft.drawString(String((int)humi), 200, 40); // ค่าความชื้น

// ✅ ค่าความสว่าง (Light) แสดงเป็นจำนวนเต็ม

tft.drawString(String((int)light), 120, 160); // ไม่มีจุดทศนิยม

// ข้อความ Light ใต้ตัวเลข

tft.setTextSize(2);

tft.drawString("Light", 120, 200);

delay(1000); // หน่วงเวลา 1 วินาที

}

# data[].attributes.headline
ธีรวัฒน์ สิงห์โตงาม

# data[].attributes.subject
ธีรวัฒน์ สิงห์โตงาม

# data[].attributes.body
#include <TFT_eSPI.h>

#include <BH1750.h>

#include <Wire.h>

BH1750 lightMeter;

TFT_eSPI tft;

#define RELAY1_PIN BCM8

#define RELAY2_PIN BCM9

#define SMOOTH_N 5

float luxArray[SMOOTH_N] = {0};

void setup() {

Wire.begin();

lightMeter.begin();

pinMode(RELAY1_PIN, OUTPUT);

pinMode(RELAY2_PIN, OUTPUT);

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

// หัวข้อด้านบน

tft.setTextSize(2);

tft.setTextColor(TFT_CYAN, TFT_BLACK);

tft.setCursor(60, 0);

tft.print("Light Monitor");

tft.drawLine(20, 25, 300, 25, TFT_WHITE); // เส้นแบ่ง

}

float getLuxAverage(float newLux) {

for(int i=SMOOTH_N-1; i>0; i--) luxArray[i] = luxArray[i-1];

luxArray[0] = newLux;

float sum = 0;

for(int i=0;i<SMOOTH_N;i++) sum += luxArray[i];

return sum / SMOOTH_N;

}

uint32_t getBarColor(float lux, float minLux, float maxLux) {

float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);

uint8_t r, g, b;

if(ratio < 0.5) {

r = 255 (ratio2);

g = 255;

} else {

r = 255;

g = 255 (1 - (ratio-0.5)2);

}

b = 0;

return tft.color565(r,g,b);

}

void drawBars(float lux) {

int barX = 60;

int barWidthMax = 180;

int barHeight = 40;

int bar1Y = 75;

int bar2Y = 140;

// กรอบพื้นหลังบาร์

tft.fillRect(barX-2, bar1Y-2, barWidthMax+4, barHeight+4, TFT_WHITE);

tft.fillRect(barX-2, bar2Y-2, barWidthMax+4, barHeight+4, TFT_WHITE);

// ล้างบาร์เก่า

tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);

tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);

int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);

int bar2Width = 0;

if(lux > 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);

tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux,0,220));

tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux,220,440));

// ตัวเลขขอบบาร์

tft.setTextSize(1);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setCursor(barX-20, bar1Y+10); tft.print("0");

tft.setCursor(barX+barWidthMax+5, bar1Y+10); tft.print("220");

tft.setCursor(barX-25, bar2Y+10); tft.print("220");

tft.setCursor(barX+barWidthMax+5, bar2Y+10); tft.print("440");

}

void displayLux(float lux) {

// ล้างพื้นที่ค่า Lux

tft.fillRect(0, 30, 320, 40, TFT_BLACK);

tft.setTextSize(3);

tft.setTextColor(TFT_GREEN, TFT_BLACK);

tft.setCursor(100, 35);

tft.printf("%d lx", (int)lux);

}

void updateRelays(float lux) {

String status;

uint32_t color;

if(lux <= 220) {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1,2 OFF";

color = TFT_GREEN;

} else if(lux < 430) {

digitalWrite(RELAY1_PIN, HIGH);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1 ON";

color = TFT_YELLOW;

} else {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, HIGH);

status = "RELAY 2 ON";

color = TFT_RED;

}

// ป้ายสถานะรีเลย์

tft.fillRect(30, 200, 260, 30, TFT_BLACK);

tft.drawRect(30, 200, 260, 30, color);

tft.setTextSize(2);

tft.setTextColor(color, TFT_BLACK);

tft.setCursor(50, 205);

tft.print(status);

}

void loop() {

float lux = lightMeter.readLightLevel();

if(lux < 0) lux = 0;

float luxAvg = getLuxAverage(lux);

displayLux(luxAvg);

drawBars(luxAvg);

updateRelays(luxAvg);

delay(500);

}

# data[].attributes.headline
นาย นัทพร สุภี

# data[].attributes.subject
นาย นัทพร สุภี

# data[].attributes.body
#include < TFT_eSPI.h>

#include <Wire.h>

#include <Adafruit_MLX90614.h>

#include <Servo.h>

#include <wiring_constants.h>

TFT_eSPI tft;

Adafruit_MLX90614 mlx =

Adafruit_MLX906140;

Servo myservo;

#define ANGLE_LEFT 0

#define ANGLE_CENTER 90

#define BUZZER_PIN

WIO BUZZER

bool servoDone = false; // ตัวแปร

สถานะ

void buzzerBeep(int duration =

500) {

tone(BUZZER_PIN, 2000);

delay(duration);

noTone(BUZZER_PIN);

delay (duration);

tone(BUZZER_PIN, 2000);

delay (duration);

noTone(BUZZER_PIN);

delay(duration);

}

void buzzerBeepG (int duration = 200) {

tone(BUZZER_PIN, 2000);

delay (duration);

noTone(BUZZER_PIN);

delay (duration);

}

void setup ()

Serial.begin (115200);

Wire.begin0; mlx.begin);

myservo.attach(BCM9);

myservo.write(ANGLE_CENTER); tft.begin(;

tft.setRotation (3);

tft.setTextDatum(MC_DATUM);

tft.setTextSize(2);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE,

TFT_BLACK);

tft.drawString ("Starting...", 160,

120);

delay (1000);

tft.fillScreen(TFT_BLACK);

}

บวก

void loop i float temp =

mlx.readObjectTempC0;

if (temp > 35.0) ‹

// แสดงสีแดง และร้องจนกว่าจะเย็นลง

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE,

TFT_RED);

tft.setTextSize(3);

tft.drawString ("TEMP HIGH",

160, 80);

tft.setTextSize(2);

tft.drawString ("Temp: " +

String(temp, 1) + "C", 160, 130);

tft.drawString ("Cooling

Required", 160, 180);

servoDone = false;

buzzerBeep);

} else {

// สีเขียว

tft.fillScreen(TFT_GREEN);

tft.setTextColor(TFT_BLACK,

TFT_GREEN);

tft.setTextSize (3);

tft.drawString ("TEMP NORMAL",

160, 80);

tft.setTextSize(2);

tft.drawString ("Temp: " +

String(temp, 1) + "C", 160, 130);

tft.drawString ("Safe", 160, 180); buzzerBeepG0;

// ให้ Servo ทำงานแค่ครั้งเดียว

if (!servoDone) ‹

myservo.write(ANGLE_LEFT);

delay (2000);

myservo.write(ANGLE_CENTER);

delay (2000);

servoDone = true; // บันทึกว่า

ทำงานแล้ว

จางวัน

}

}

delay (1000); // หน่วงเวลา 1 วินาที

}

# data[].attributes.headline
นาย นวมินทร์ ผ่องใส งาน 4.2

# data[].attributes.subject
นาย นวมินทร์ ผ่องใส งาน 4.2

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <Adafruit_MLX90614.h>

#include <Servo.h>

#include <wiring_constants.h> // สำหรับ WIO_BUZZER

// === อ็อบเจ็กต์ ===

TFT_eSPI tft;

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

Servo myservo;

// === ปุ่มบน Wio Terminal ===

#define BUTTON_B WIO_KEY_B // ปุ่มเริ่มทำงาน

// === มุมของ Servo ===

#define ANGLE_LEFT 0

#define ANGLE_CENTER 90

// === Buzzer ===

#define BUZZER_PIN WIO_BUZZER

void buzzerBeep(int times, int duration = 200) {

for (int i = 0; i < times; i++) {

tone(BUZZER_PIN, 2000); // ความถี่ 2000Hz

delay(duration);

noTone(BUZZER_PIN);

delay(duration);

}

}

void setup() {

Serial.begin(115200);

Wire.begin();

mlx.begin();

myservo.attach(BCM9);

pinMode(BUTTON_B, INPUT_PULLUP);

tft.begin();

tft.setRotation(3);

tft.setTextDatum(MC_DATUM);

tft.setTextSize(2.8);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.drawString("Infrared Thermometer", 160, 60);

tft.setTextSize(2);

tft.drawString("Press B to Start", 160, 120);

buzzerBeep(1); // เสียงตอนเริ่ม

myservo.write(ANGLE_CENTER);

while (digitalRead(BUTTON_B) == HIGH) delay(10);

while (digitalRead(BUTTON_B) == LOW) delay(10);

tft.fillScreen(TFT_BLACK);

}

void loop() {

float temp = mlx.readObjectTempC();

if (temp > 30.0) {

// อุณหภูมิสูง (ฝ่ามือ)

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE, TFT_RED);

tft.setTextSize(4);

tft.drawString("Covid Alert", 160, 80);

tft.setTextSize(3);

tft.drawString("Temp: " + String(temp, 1) + " C", 160, 130);

tft.drawString("Get Out", 160, 200);

buzzerBeep(2);

// อยู่ที่ซ้ายตลอดจนกว่าอุณหภูมิจะปกติ

myservo.write(ANGLE_LEFT);

} else {

// อุณหภูมิปกติ (หลังมือ)

tft.fillScreen(TFT_GREEN);

tft.setTextColor(TFT_BLACK, TFT_GREEN);

tft.setTextSize(4);

tft.drawString("NORMAL Alert", 160, 60);

tft.setTextSize(2);

tft.drawString("Temp: " + String(temp, 1) + " C", 160, 110);

tft.drawString("Come in", 160, 160);

tft.drawString("Please wait 4.5s", 160, 200);

buzzerBeep(1);

myservo.write(ANGLE_CENTER); // เปิดประตู

delay(4500); // รอให้เดินผ่าน

myservo.write(ANGLE_LEFT); // ปิดประตู

}

delay(1000);

}

# data[].attributes.headline
อาทิตย์ ปานทอง

# data[].attributes.subject
อาทิตย์ ปานทอง

# data[].attributes.body
เปลี่ยนเป็นการ์ตูน

# data[].attributes.headline
อินทัช สุวรรณวงศ์

# data[].attributes.subject
อินทัช สุวรรณวงศ์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <wiring_constants.h>

TFT_eSPI tft;

// ปุ่ม

#define SW1_PIN BCM4

#define SW2_PIN BCM5

#define SW3_PIN BCM6

// ลำโพง

#define BUZZER_PIN WIO_BUZZER

// เวลา

int minutes = 0;

int seconds = 0;

bool running = false;

bool timeEnded = false; // บอกว่าเคยนับจบหรือยัง

unsigned long lastUpdate = 0;

void setup() {

pinMode(SW1_PIN, INPUT_PULLUP);

pinMode(SW2_PIN, INPUT_PULLUP);

pinMode(SW3_PIN, INPUT_PULLUP);

pinMode(BUZZER_PIN, OUTPUT);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextSize(2);

tft.setTextDatum(MC_DATUM);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

showScreen();

showStatus();

}

void loop() {

// ตั้งเวลาเมื่อยังไม่เริ่มนับ

if (!running) {

if (digitalRead(SW1_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

minutes = (minutes + 1) % 100;

showScreen();

showStatus();

}

if (digitalRead(SW2_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

seconds = (seconds + 1) % 60;

showScreen();

showStatus();

}

}

// ปุ่ม START/STOP

if (digitalRead(SW3_PIN) == LOW) {

delay(200);

beepOnce(); // ติ๊ดเมื่อกด

if (minutes 0 && seconds 0) {

alarmBeep(5); // ถ้าเวลา 00:00 ดัง 5 ครั้ง

} else {

running = !running;

timeEnded = false;

}

showScreen();

showStatus();

}

// นับถอยหลัง

if (running && millis() - lastUpdate >= 1000) {

lastUpdate = millis();

if (seconds == 0) {

if (minutes == 0) {

running = false;

timeEnded = true;

showScreen();

showStatus();

alarmBeep(3); // จบเวลาปกติ ดัง 3 ครั้ง

} else {

minutes--;

seconds = 59;

}

} else {

seconds--;

}

showScreen();

showStatus();

}

}

void showScreen() {

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.drawString("Count Down", 160, 30);

tft.drawString("SW3 TO START OR STOP", 160, 60);

tft.drawString("SW2 & SW1 TO SET TIMER", 160, 90);

char timeStr[10];

tft.setTextColor(TFT_YELLOW);

sprintf(timeStr, "%02d : %02d", minutes, seconds);

tft.setTextSize(4);

tft.drawString(timeStr, 160, 140);

}

void showStatus() {

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE);

tft.drawString(running ? "RUNNING" : "STOP", 160, 200);

}

void alarmBeep(int times) {

for (int i = 0; i < times; i++) {

tone(BUZZER_PIN, 2000);

delay(200);

noTone(BUZZER_PIN);

delay(200);

}

}

void beepOnce() {

tone(BUZZER_PIN, 2500);

delay(100);

noTone(BUZZER_PIN);

}

# data[].attributes.headline
อาทิตย์ ปานทอง

# data[].attributes.subject
อาทิตย์ ปานทอง

# data[].attributes.body
งานที่1

#include <TFT_eSPI.h> // ไลบรารีควบคุมจอ LCD

TFT_eSPI tft;

void setup() {

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_WHITE); // พื้นหลังขาว

// --- ใบหน้า ---

tft.drawCircle(160, 120, 101, TFT_BLACK); // ขอบนอก

tft.fillCircle(160, 120, 100, TFT_BLUE); // หน้าโดเรม่อนสีฟ้า

// --- ปากยิ้ม (ครึ่งวงกลม) ---

tft.fillCircle(160, 150, 60, TFT_RED); // วาดวงกลมสีแดง

tft.fillRect(100, 90, 120, 60, TFT_BLUE); // ลบครึ่งบนให้เหลือโค้งยิ้ม

tft.drawCircle(160, 150, 60, TFT_BLACK); // ขอบปากสีดำ

// --- ตา ---

// ตาขาว

tft.drawCircle(120, 95, 36, TFT_BLACK);

tft.fillCircle(120, 95, 34, TFT_WHITE);

tft.drawCircle(200, 95, 36, TFT_BLACK);

tft.fillCircle(200, 95, 34, TFT_WHITE);

// ลูกตาดำ (ขยับเข้ามาให้จ้องตรงกลาง)

tft.fillCircle(130, 95, 12, TFT_BLACK);

tft.fillCircle(190, 95, 12, TFT_BLACK);

// --- คิ้ว ---

tft.drawLine(90, 65, 140, 75, TFT_BLACK);

tft.drawLine(180, 75, 230, 65, TFT_BLACK);

// --- จมูก ---

tft.fillCircle(160, 120, 10, TFT_RED);

// --- เส้นปากตรงกลาง ---

tft.drawLine(160, 120, 160, 180, TFT_BLACK);

// --- หนวด ---

// ขวา

tft.drawLine(200, 155, 250, 145, TFT_BLACK);

tft.drawLine(200, 170, 250, 170, TFT_BLACK);

tft.drawLine(200, 185, 250, 195, TFT_BLACK);

// ซ้าย

tft.drawLine(70, 145, 120, 155, TFT_BLACK);

tft.drawLine(70, 170, 120, 170, TFT_BLACK);

tft.drawLine(70, 195, 120, 185, TFT_BLACK);

// --- กระดิ่ง ---

tft.fillCircle(160, 220, 15, TFT_YELLOW);

tft.drawCircle(160, 220, 15, TFT_BLACK);

tft.drawLine(160, 220, 160, 235, TFT_BLACK);

}

void loop() {

// ไม่มีการทำงานซ้ำ

}

# data[].attributes.body
#include <TFT_eSPI.h>

#include <BH1750.h>

#include <Wire.h>

BH1750 lightMeter;

TFT_eSPI tft;

#define RELAY1_PIN BCM8

#define RELAY2_PIN BCM9

#define SMOOTH_N 5

float luxArray[SMOOTH_N] = {0};

void setup() {

Wire.begin();

lightMeter.begin();

pinMode(RELAY1_PIN, OUTPUT);

pinMode(RELAY2_PIN, OUTPUT);

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

// หัวข้อด้านบน

tft.setTextSize(2);

tft.setTextColor(TFT_CYAN, TFT_BLACK);

tft.setCursor(60, 0);

tft.print("Light Monitor");

tft.drawLine(20, 25, 300, 25, TFT_WHITE); // เส้นแบ่ง

}

float getLuxAverage(float newLux) {

for (int i = SMOOTH_N - 1; i > 0; i--) luxArray[i] = luxArray[i - 1];

luxArray[0] = newLux;

float sum = 0;

for (int i = 0; i < SMOOTH_N; i++) sum += luxArray[i];

return sum / SMOOTH_N;

}

uint32_t getBarColor(float lux, float minLux, float maxLux) {

float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);

uint8_t r, g, b;

if (ratio < 0.5) {

r = 255 (ratio 2); // ค่อย ๆ เพิ่มแดง

g = 255; // เขียวเต็ม

} else {

r = 255;

g = 255 (1 - (ratio - 0.5) 2); // ค่อย ๆ ลดเขียว

}

b = 0;

return tft.color565(r, g, b);

}

void drawBars(float lux) {

int barX = 60;

int barWidthMax = 180;

int barHeight = 40;

int bar1Y = 75;

int bar2Y = 140;

// กรอบพื้นหลังบาร์

tft.fillRect(barX - 2, bar1Y - 2, barWidthMax + 4, barHeight + 4, TFT_WHITE);

tft.fillRect(barX - 2, bar2Y - 2, barWidthMax + 4, barHeight + 4, TFT_WHITE);

// ล้างบาร์เก่า

tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);

tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);

int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);

int bar2Width = 0;

if (lux > 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);

tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux, 0, 220));

tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux, 220, 440));

// ตัวเลขขอบบาร์

tft.setTextSize(1);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setCursor(barX - 20, bar1Y + 10); tft.print("0");

tft.setCursor(barX + barWidthMax + 5, bar1Y + 10); tft.print("220");

tft.setCursor(barX - 25, bar2Y + 10); tft.print("220");

tft.setCursor(barX + barWidthMax + 5, bar2Y + 10); tft.print("440");

}

void displayLux(float lux) {

// ล้างพื้นที่ค่า Lux

tft.fillRect(0, 30, 320, 40, TFT_BLACK);

tft.setTextSize(3);

tft.setTextColor(TFT_GREEN, TFT_BLACK);

tft.setCursor(100, 35);

tft.printf("%d lx", (int)lux);

}

void updateRelays(float lux) {

String status;

uint32_t color;

if (lux <= 220) {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1,2 OFF";

color = TFT_GREEN;

} else if (lux < 430) {

digitalWrite(RELAY1_PIN, HIGH);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1 ON";

color = TFT_YELLOW;

} else {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, HIGH);

status = "RELAY 2 ON";

color = TFT_RED;

}

// ป้ายสถานะรีเลย์

tft.fillRect(30, 200, 260, 30, TFT_BLACK);

tft.drawRect(30, 200, 260, 30, color);

tft.setTextSize(2);

tft.setTextColor(color, TFT_BLACK);

tft.setCursor(50, 205);

tft.print(status);

}

void loop() {

float lux = lightMeter.readLightLevel();

if (lux < 0) lux = 0;

float luxAvg = getLuxAverage(lux);

displayLux(luxAvg);

drawBars(luxAvg);

updateRelays(luxAvg);

delay(500);

}

# data[].attributes.headline
อาทิตย์ ปานทอง

# data[].attributes.subject
อาทิตย์ ปานทอง

# data[].attributes.body
งานที่2

#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

#define TFT_BROWN 0xA145

int backgroundMode = 0;

unsigned long lastButtonPress = 0;

#define DEBOUNCE_DELAY 300

void drawBackground(int mode) {

switch (mode) {

case 0: { // 🌅 ท้องฟ้ายามเช้า

tft.fillScreen(tft.color565(135, 206, 235)); // ฟ้าอ่อน

// ดวงอาทิตย์

tft.fillCircle(60, 60, 30, TFT_YELLOW);

// ก้อนเมฆ

for (int i = 0; i < 3; i++) {

int x = 100 + i * 70;

int y = 50 + (i % 2) * 20;

tft.fillCircle(x, y, 20, TFT_WHITE);

tft.fillCircle(x + 20, y + 10, 20, TFT_WHITE);

tft.fillCircle(x - 20, y + 10, 20, TFT_WHITE);

}

break;

}

case 1: { // 🌻 ทุ่งหญ้าสีเหลือง + ผีเสื้อ

tft.fillScreen(TFT_YELLOW);

// หญ้า

for (int i = 0; i < 200; i++) {

int x = random(0, 320);

int y = random(150, 240);

tft.drawLine(x, y, x, y - random(5, 15), TFT_GREEN);

}

// ผีเสื้อ

for (int i = 0; i < 10; i++) {

int x = random(50, 300);

int y = random(60, 160);

tft.fillCircle(x, y, 5, TFT_RED);

tft.fillCircle(x + 8, y, 5, TFT_BLUE);

tft.fillCircle(x, y + 8, 5, TFT_PURPLE);

tft.fillCircle(x + 8, y + 8, 5, TFT_ORANGE);

}

break;

}

case 2: { // 🏔️ ภูเขาหิมะ + แม่น้ำ

tft.fillScreen(TFT_CYAN);

// ภูเขา

for (int x = 0; x < 320; x += 80) {

int peakHeight = random(60, 100);

tft.fillTriangle(x, 180, x + 40, 180 - peakHeight, x + 80, 180, TFT_DARKGREY);

tft.fillTriangle(x + 20, 180 - peakHeight / 2, x + 40, 180 - peakHeight, x + 60, 180 - peakHeight / 2, TFT_WHITE);

}

// แม่น้ำ

tft.fillRect(0, 200, 320, 40, TFT_BLUE);

break;

}

case 3: { // 🌇 เมืองตอนกลางวัน

tft.fillScreen(tft.color565(135, 206, 250));

// ถนน

tft.fillRect(0, 200, 320, 40, TFT_DARKGREY);

for (int i = 0; i < 320; i += 20) {

tft.fillRect(i, 218, 10, 4, TFT_WHITE);

}

// ตึก

for (int x = 0; x < 320; x += 40) {

int h = random(60, 120);

tft.fillRect(x, 200 - h, 30, h, TFT_LIGHTGREY);

}

// รถ

for (int i = 0; i < 3; i++) {

int x = random(0, 280);

tft.fillRect(x, 210, 40, 20, (i % 2) ? TFT_RED : TFT_BLUE);

tft.fillCircle(x + 10, 230, 5, TFT_BLACK);

tft.fillCircle(x + 30, 230, 5, TFT_BLACK);

}

break;

}

case 4: { // 🏖️ ชายหาด + ทะเล

uint16_t sand = tft.color565(237, 201, 175);

tft.fillScreen(TFT_CYAN);

// ทะเล

tft.fillRect(0, 120, 320, 60, TFT_BLUE);

// ชายหาด

tft.fillRect(0, 180, 320, 60, sand);

// ต้นมะพร้าว

for (int i = 0; i < 3; i++) {

int x = 50 + i * 100;

tft.fillRect(x, 140, 10, 40, TFT_BROWN);

tft.fillCircle(x + 5, 130, 20, TFT_GREEN);

}

break;

}

case 5: { // 🌌 ป่ามืด + หิ่งห้อย

tft.fillScreen(TFT_BLACK);

// ต้นไม้

for (int i = 0; i < 10; i++) {

int x = i * 30 + 10;

tft.fillRect(x, 180, 15, 60, TFT_BROWN);

tft.fillCircle(x + 7, 170, 25, TFT_DARKGREEN);

}

// หิ่งห้อย

for (int i = 0; i < 30; i++) {

int x = random(0, 320);

int y = random(60, 200);

tft.fillCircle(x, y, 2, TFT_YELLOW);

}

break;

}

}

}

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

pinMode(WIO_KEY_A, INPUT_PULLUP);

drawBackground(backgroundMode);

}

void loop() {

if (!digitalRead(WIO_KEY_A)) {

unsigned long now = millis();

if (now - lastButtonPress > DEBOUNCE_DELAY) {

backgroundMode = (backgroundMode + 1) % 6;

drawBackground(backgroundMode);

lastButtonPress = now;

}

}

delay(50);

}

# data[].attributes.headline
อาทิตย์ ปานทอง

# data[].attributes.subject
อาทิตย์ ปานทอง

# data[].attributes.body
งานที่3

#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// ===== สีพิเศษ =====

#define MY_ORANGE tft.color565(255,165,0)

#define TFT_BROWN tft.color565(161,69,69) // สีน้ำตาล

// ===== ขนาดยาน =====

#define SHIP_WIDTH 30

#define SHIP_HEIGHT 20

#define MOVE_STEP 20

const int METEOR_SPEED = 10; // <-- เติม ; ให้เรียบร้อย

#define SHIP_COLOR TFT_CYAN

uint16_t meteorColors[] = {TFT_RED, MY_ORANGE, TFT_YELLOW};

const int meteorColorCount = 3;

int shipX = 160;

int shipY = 200;

int backgroundMode = 0;

unsigned long startTime = 0;

struct Meteor {

int x;

int y;

int size;

uint16_t color;

};

#define MAX_METEOR_COUNT 5

Meteor meteors[MAX_METEOR_COUNT];

int currentMeteorCount = 3;

// ===== พื้นหลัง =====

void drawBackground() {

switch (backgroundMode) {

case 0:

tft.fillScreen(TFT_BLACK);

for (int i=0;i<50;i++){

int x=random(0,320);

int y=random(0,240);

tft.drawPixel(x,y,TFT_WHITE);

}

break;

case 1:

tft.fillScreen(TFT_BLACK);

for (int i=0;i<30;i++){

int x=random(0,320);

int y=random(0,240);

tft.drawPixel(x,y,TFT_PURPLE);

}

for (int i=0;i<30;i++){

int x=random(0,320);

int y=random(0,240);

tft.drawPixel(x,y,TFT_BLUE);

}

break;

case 2:

tft.fillScreen(TFT_DARKGREY);

for (int i=0;i<40;i++){

int r=random(2,6);

int x=random(r,320-r);

int y=random(r,240-r);

uint16_t circleColor = 0xBDF7; // สีฟ้าอ่อนๆ

tft.drawCircle(x,y,r,circleColor);

}

break;

case 3:

tft.fillScreen(TFT_NAVY);

for (int i=0;i<40;i++){

int x=random(0,320);

int y=random(0,240);

tft.drawPixel(x,y,TFT_YELLOW);

if(random(0,2)==0){

tft.drawPixel(x+1,y,TFT_ORANGE);

tft.drawPixel(x,y+1,TFT_ORANGE);

}

}

break;

case 4:

tft.fillScreen(TFT_PURPLE);

for(int i=0;i<50;i++){

int x=random(0,320);

int y=random(0,240);

uint16_t c=meteorColors[random(0,meteorColorCount)];

tft.drawPixel(x,y,c);

if(random(0,3)==0){

tft.drawPixel(x+1,y,TFT_WHITE);

tft.drawPixel(x,y+1,TFT_WHITE);

}

}

break;

case 5:

tft.fillScreen(TFT_BLACK);

for(int i=0;i<25;i++){

int r=random(3,12);

int x=random(r,320-r);

int y=random(r,240-r);

tft.fillCircle(x,y,r,TFT_GREEN);

}

break;

}

}

void drawShip(int x,int y){

tft.fillTriangle(x,y,x+SHIP_WIDTH/2,y-SHIP_HEIGHT,x+SHIP_WIDTH,y,SHIP_COLOR);

tft.fillRect(x+SHIP_WIDTH/2-2,y,4,8,TFT_WHITE);

}

void drawMeteor(Meteor m){

tft.fillCircle(m.x+m.size,m.y+m.size,m.size,m.color);

}

bool checkCollision(int sx,int sy,Meteor m){

int mx=m.x+m.size;

int my=m.y+m.size;

int dx=max(sx,min(mx,sx+SHIP_WIDTH));

int dy=max(sy-SHIP_HEIGHT,min(my,sy));

int distSq=(mx-dx)*(mx-dx)+(my-dy)*(my-dy);

return distSq<m.size*m.size;

}

void drawScore(){

unsigned long elapsed=(millis()-startTime)/1000;

tft.setTextColor(TFT_WHITE,TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(10,10);

tft.printf("Time: %lus",elapsed);

}

void resetGame(){

shipX=160;

shipY=220;

currentMeteorCount=3;

startTime=millis();

for(int i=0;i<MAX_METEOR_COUNT;i++){

meteors[i].x=random(0,320);

meteors[i].y=random(-240,-20);

meteors[i].size=random(8,16);

meteors[i].color=meteorColors[random(0,meteorColorCount)];

}

drawBackground();

}

void setup(){

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

resetGame();

pinMode(WIO_5S_UP,INPUT_PULLUP);

pinMode(WIO_5S_DOWN,INPUT_PULLUP);

pinMode(WIO_5S_LEFT,INPUT_PULLUP);

pinMode(WIO_5S_RIGHT,INPUT_PULLUP);

pinMode(WIO_5S_PRESS,INPUT_PULLUP);

pinMode(WIO_KEY_A,INPUT_PULLUP);

pinMode(WIO_KEY_B,INPUT_PULLUP);

pinMode(WIO_KEY_C,INPUT_PULLUP);

}

void loop(){

// เปลี่ยนพื้นหลัง

if(!digitalRead(WIO_KEY_A)){

backgroundMode=(backgroundMode+1)%6;

drawBackground();

delay(300);

}

if(!digitalRead(WIO_KEY_B)){

backgroundMode=(backgroundMode+5)%6;

drawBackground();

delay(300);

}

if(!digitalRead(WIO_KEY_C)){

backgroundMode=0;

drawBackground();

delay(300);

}

// Move ship

if(!digitalRead(WIO_5S_LEFT)) shipX-=MOVE_STEP;

if(!digitalRead(WIO_5S_RIGHT)) shipX+=MOVE_STEP;

if(!digitalRead(WIO_5S_UP)) shipY-=MOVE_STEP;

if(!digitalRead(WIO_5S_DOWN)) shipY+=MOVE_STEP;

shipX=constrain(shipX,0,320-SHIP_WIDTH);

shipY=constrain(shipY,SHIP_HEIGHT,240);

drawBackground();

drawScore();

drawShip(shipX,shipY);

for(int i=0;i<currentMeteorCount;i++){

meteors[i].y+=METEOR_SPEED;

if(meteors[i].y>240){

meteors[i].x=random(0,320);

meteors[i].y=random(-100,-20);

meteors[i].size=random(8,16);

meteors[i].color=meteorColors[random(0,meteorColorCount)];

if(currentMeteorCount<MAX_METEOR_COUNT) currentMeteorCount++;

}

if(checkCollision(shipX,shipY,meteors[i])){

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE,TFT_RED);

tft.setTextSize(3);

tft.setCursor(100,110);

tft.print("BOOM!");

delay(1000);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(80,120);

tft.print("Press to Restart");

while(digitalRead(WIO_5S_PRESS)==HIGH) delay(10);

while(digitalRead(WIO_5S_PRESS)==LOW) delay(10);

resetGame();

break;

}

drawMeteor(meteors[i]);

}

delay(30);

}

# data[].attributes.attachment_caption
#include"TFT_eSPI.h"        // ผนวกไลบรารีของชิปควบคุมจอแสดงผล LCDTFT_eSPI tft; #define LCD_BACKLIGHT (72Ul)  // สร้างออปเจ็กต์ tft จากคลาส TFT_eSPI สำหรับควบคุมการแสดงผล LCDvoid setup() {  tft.begin();              // เริ่มต้นการทำงานของจอแสดงผล LCD  tft.fillScreen(TFT_BLUE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);     tft.fillScreen(TFT_RED);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);    tft.fillScreen(TFT_BLACK);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);    tft.fillScreen(TFT_MAROON);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);  tft.fillScreen(TFT_GREEN);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);    tft.fillScreen(TFT_PURPLE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);  tft.fillScreen(TFT_WHITE);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);    tft.fillScreen  (TFT_YELLOW);  // กำหนดให้แสดงสีแดงเต็มหน้าจอแสดงผล  delay(500);           tft.fillScreen(TFT_WHITE); //รุป1   tft.fillCircle(120,160,30,TFT_RED);     delay(500);     tft.fillScreen(TFT_WHITE); //รุป1   tft.fillCircle(70,160,30,TFT_BLACK);      tft.fillCircle(150,160,30,TFT_BLACK);     delay(500);    tft.fillScreen(TFT_WHITE); //รุป1   tft.fillCircle(40, 40, 30, TFT_BLACK);   // ลูกที่ 1 - มุมบนซ้ายtft.fillCircle(130, 150, 30, TFT_BLACK);   // ลูกที่ 2 - ขยับเฉียงลงขวาtft.fillCircle(200, 280, 30, TFT_BLACK); // ลูกที่ 3 - ขยับต่อไปในแนวทะแยง   delay(500);        tft.fillScreen(TFT_WHITE); //รุป1   tft.fillCircle(60, 90, 30, TFT_RED);   // ลูกซ้ายบนtft.fillCircle(170, 90, 30, TFT_RED);  // ลูกขวาบนtft.fillCircle(60, 230, 30, TFT_RED);  // ลูกซ้ายล่างtft.fillCircle(170, 230, 30, TFT_RED); // ลูกขวาล่าง   delay(500);       tft.fillScreen(TFT_WHITE); //รุป1      tft.fillCircle(60, 90, 30, TFT_BLACK);    // ลูกซ้ายบนtft.fillCircle(170, 90, 30, TFT_BLACK);   // ลูกขวาบนtft.fillCircle(120, 160, 30, TFT_BLACK);  // ลูกตรงกลางtft.fillCircle(60, 230, 30, TFT_BLACK);   // ลูกซ้ายล่างtft.fillCircle(170, 230, 30, TFT_BLACK);  // ลูกขวาล่าง      delay(500);       tft.fillScreen(TFT_WHITE); //รุป1    tft.fillCircle(50, 100, 30, TFT_BLACK);   // แถวซ้าย บนtft.fillCircle(120, 100, 30, TFT_BLACK);  // แถวกลาง บนtft.fillCircle(190, 100, 30, TFT_BLACK);  // แถวขวา บนtft.fillCircle(50, 210, 30, TFT_BLACK);  // แถวซ้าย ล่างtft.fillCircle(120, 210, 30, TFT_BLACK); // แถวกลาง ล่างtft.fillCircle(190, 210, 30, TFT_BLACK); // แถวขวา ล่างdelay(500); tft.fillScreen(TFT_WHITE); //รุป1tft.drawCircle(120,160,101,TFT_BLACK);tft.fillCircle(120,160,100,TFT_BLUE);tft.drawCircle(135,160,82,TFT_BLACK);tft.fillCircle(135,160,80,TFT_WHITE); // พื้นหน้าtft.drawCircle(100,120,36,TFT_BLACK);  tft.drawCircle(100,200,36,TFT_BLACK);  // ตาtft.fillCircle(100,120,34,TFT_WHITE);  tft.fillCircle(100,200,34,TFT_WHITE);  // ตาขาวtft.fillCircle(105,140,20,TFT_BLACK);  // ลูกตาซ้ายtft.fillCircle(105,180,20,TFT_BLACK);  // ลูกตาขวาtft.fillCircle(129,160,15,TFT_RED);    // จมูกtft.fillTriangle(170,130,170,190,190,160,TFT_PINK); // ปากสามเหลี่ยมกลับหัวในแนว X// หนวดขวา (แนวนอน)tft.drawLine(165,200,150,250,TFT_BLACK);tft.drawLine(170,200,170,250,TFT_BLACK);tft.drawLine(176,200,190,250,TFT_BLACK);// หนวดซ้าย (แนวนอน)tft.drawLine(150,70,160,120,TFT_BLACK);tft.drawLine(170,70,170,120,TFT_BLACK);tft.drawLine(190,70,176,120,TFT_BLACK);// กระดิ่งtft.fillCircle(220,160,15,TFT_YELLOW);tft.drawLine(220,160,240,160,TFT_BLACK);                        

# data[].attributes.headline
ธัญชนก เทียมประสิทธิ์

# data[].attributes.subject
ธัญชนก เทียมประสิทธิ์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <DHT.h>

#include <BH1750.h>

#define DHTPIN 0

#define DHTTYPE DHT11

TFT_eSPI tft = TFT_eSPI();

DHT dht(DHTPIN, DHTTYPE);

BH1750 lightMeter;

void setup() {

Serial.begin(115200);

dht.begin();

Wire.begin();

lightMeter.begin();

delay(200);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

}

void loop() {

float temp = dht.readTemperature();

float humi = dht.readHumidity();

float lux = lightMeter.readLightLevel();

Serial.print("Lux: ");

Serial.println(lux);

if (lux < 0 || lux > 65535) {

lux = 0;

}

tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ

if (isnan(temp) || isnan(humi) || isnan(lux)) {

tft.setTextSize(2);

tft.setTextColor(TFT_RED, TFT_BLACK);

tft.drawString("Sensor Error!", 80, 110);

} else {

// -------- ส่วนบน: Temperature & Humidity --------

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.drawString("Temp", 40, 10);

tft.drawString("Humidity", 190, 10);

tft.setTextSize(4);

tft.setCursor(30, 40);

tft.printf("%.0f C", temp);

tft.setCursor(180, 40);

tft.printf("%.0f %%", humi);

// -------- ส่วนล่าง: Light --------

tft.setTextSize(2);

tft.drawString("Light Level", 100, 135);

tft.setTextSize(6);

tft.setCursor(110, 160);

tft.printf("%.0f ", lux);

}

delay(1000);

}

# data[].attributes.headline
นายชุมพล นุชาญรัมย์

# data[].attributes.subject
นายชุมพล นุชาญรัมย์

# data[].attributes.body
#include <TFT_eSPI.h>

TFT_eSPI tft;

int faceMode = 0; // ตัวแปรเก็บหน้าปัจจุบัน

unsigned long lastChange = 0;

const unsigned long interval = 1000; // เปลี่ยนหน้าทุก 1 วินาที

void setup() {

tft.begin();

tft.setRotation(3);

}

void drawFace(int mode) {

tft.fillScreen(TFT_CYAN); // พื้นหลังฟ้า

// --- ใบหน้า ---

tft.drawCircle(160, 120, 101, TFT_BLACK);

tft.fillCircle(160, 120, 100, (mode==1)?TFT_YELLOW:TFT_BLUE);

// --- ปาก ---

switch(mode){

case 0: // ปกติ

tft.drawCircle(160, 135, 82, TFT_BLACK);

tft.fillCircle(160, 135, 80, TFT_WHITE);

break;

case 1: // ยิ้ม

tft.fillRect(120,140,80,20,TFT_RED);

break;

case 2: // ปากโอ

tft.fillCircle(160,140,20,TFT_RED);

break;

case 3: // ตกใจ

tft.drawRect(140,130,40,20,TFT_RED);

break;

}

// --- ตา ---

int eyeColor = (mode==3)?TFT_RED:TFT_BLACK; // หน้าตกใจลูกตาแดง

tft.drawCircle(120,100,36,TFT_BLACK); tft.fillCircle(120,100,34,TFT_WHITE);

tft.drawCircle(200,100,36,TFT_BLACK); tft.fillCircle(200,100,34,TFT_WHITE);

tft.fillCircle(120,100,(mode==2)?10:15,eyeColor);

tft.fillCircle(200,100,(mode==2)?10:15,eyeColor);

// --- จมูก ---

tft.fillCircle(160,129,12,TFT_RED);

// --- ลิ้น ---

if(mode==0) tft.fillTriangle(135,175,185,175,160,195,TFT_PINK);

// --- หนวด ---

tft.drawLine(200,165,250,150,TFT_BLACK);

tft.drawLine(200,170,250,170,TFT_BLACK);

tft.drawLine(200,175,250,190,TFT_BLACK);

tft.drawLine(70,150,120,160,TFT_BLACK);

tft.drawLine(70,170,120,170,TFT_BLACK);

tft.drawLine(70,190,120,180,TFT_BLACK);

// --- กระดิ่ง ---

tft.fillCircle(160,220,15,TFT_YELLOW);

tft.drawCircle(160,220,15,TFT_BLACK);

tft.drawLine(160,220,160,235,TFT_BLACK);

}

void loop() {

if(millis() - lastChange > interval){

lastChange = millis();

drawFace(faceMode);

faceMode++;

if(faceMode>3) faceMode=0;

}

}

# data[].attributes.headline
ชุมพล นุชาญรัมย์

# data[].attributes.subject
ชุมพล นุชาญรัมย์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

#define MAX_METEOR_COUNT 5

#define SHIP_WIDTH 30

#define SHIP_HEIGHT 20

#define MOVE_STEP 5

int METEOR_SPEED = 6; // เพิ่มความเร็วอุกกาบาต

#define SHIP_COLOR TFT_CYAN

uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};

const int meteorColorCount = 3;

int shipX = 160;

int shipY = 200;

unsigned long startTime = 0;

struct Meteor {

int x;

int y;

int size;

uint16_t color;

int prevX;

int prevY;

};

Meteor meteors[MAX_METEOR_COUNT];

int currentMeteorCount = 3;

// ================= Background =================

void drawBackgroundSky() {

tft.fillScreen(TFT_BLUE);

// เมฆ

for (int i = 0; i < 10; i++) {

int x = random(0, 320);

int y = random(20, 100);

int w = random(20, 50);

int h = random(10, 20);

tft.fillEllipse(x, y, w, h, TFT_WHITE);

}

// ดาวเล็ก

for (int i = 0; i < 20; i++) {

int x = random(0, 320);

int y = random(0, 50);

tft.drawPixel(x, y, TFT_YELLOW);

}

}

// ================= Ship =================

void drawShip(int x, int y, bool erase=false) {

uint16_t color = erase ? TFT_BLUE : SHIP_COLOR;

tft.fillTriangle(x, y, x + SHIP_WIDTH / 2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, color);

tft.fillRect(x + SHIP_WIDTH / 2 - 2, y, 4, 8, erase ? TFT_BLUE : TFT_WHITE);

}

// ================= Meteor =================

void drawMeteor(Meteor &m, bool erase=false) {

uint16_t color = erase ? TFT_BLUE : m.color;

tft.fillCircle(m.prevX, m.prevY, m.size, TFT_BLUE); // ลบตำแหน่งเก่า

tft.fillCircle(m.x + m.size, m.y + m.size, m.size, color);

m.prevX = m.x + m.size;

m.prevY = m.y + m.size;

}

bool checkCollision(int sx, int sy, Meteor m) {

int mx = m.x + m.size;

int my = m.y + m.size;

int dx = max(sx, min(mx, sx + SHIP_WIDTH));

int dy = max(sy - SHIP_HEIGHT, min(my, sy));

int distSq = (mx - dx) (mx - dx) + (my - dy) (my - dy);

return distSq < m.size * m.size;

}

// ================= Score =================

void drawScore() {

unsigned long elapsed = (millis() - startTime) / 1000;

tft.setTextColor(TFT_BLACK, TFT_BLUE);

tft.setTextSize(2);

tft.setCursor(10, 10);

tft.printf("Time: %lus", elapsed);

}

// ================= Reset =================

void resetGame() {

shipX = 160;

shipY = 220;

currentMeteorCount = 3;

startTime = millis();

for (int i = 0; i < MAX_METEOR_COUNT; i++) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-240, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

meteors[i].prevX = meteors[i].x + meteors[i].size;

meteors[i].prevY = meteors[i].y + meteors[i].size;

}

drawBackgroundSky();

}

// ================= Setup =================

void setup() {

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

resetGame();

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_PRESS, INPUT_PULLUP);

}

// ================= Loop =================

void loop() {

// ลบเรือเก่า

drawShip(shipX, shipY, true);

// Move ship

if (!digitalRead(WIO_5S_LEFT)) shipX -= MOVE_STEP;

if (!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;

if (!digitalRead(WIO_5S_UP)) shipY -= MOVE_STEP;

if (!digitalRead(WIO_5S_DOWN)) shipY += MOVE_STEP;

shipX = constrain(shipX, 0, 320 - SHIP_WIDTH);

shipY = constrain(shipY, SHIP_HEIGHT, 240);

// วาดเรือใหม่

drawShip(shipX, shipY);

// วาด Score

drawScore();

// อัปเดต meteors

for (int i = 0; i < currentMeteorCount; i++) {

meteors[i].y += METEOR_SPEED;

if (meteors[i].y > 240) {

meteors[i].x = random(0, 320);

meteors[i].y = random(-100, -20);

meteors[i].size = random(8, 16);

meteors[i].color = meteorColors[random(0, meteorColorCount)];

}

if (checkCollision(shipX, shipY, meteors[i])) {

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE, TFT_RED);

tft.setTextSize(3);

tft.setCursor(100, 110);

tft.print("BOOM!");

delay(1000);

resetGame();

break;

}

drawMeteor(meteors[i]);

}

delay(20); // เพิ่ม FPS เล็กน้อยเพื่อสมูท

}

# data[].attributes.headline
นายชุมพล นุชาญรัมย์

# data[].attributes.subject
นายชุมพล นุชาญรัมย์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// ===== ค่าตัวแปรเกม =====

#define MAX_METEOR_COUNT 5

#define SHIP_WIDTH 30

#define SHIP_HEIGHT 20

#define MOVE_STEP 10 // ยานเคลื่อนสมูท

const int METEOR_SPEED = 15; // อุกกาบาตเร็วขึ้น

#define SHIP_COLOR TFT_CYAN

uint16_t meteorColors[] = {TFT_RED, TFT_ORANGE, TFT_YELLOW};

const int meteorColorCount = 3;

int shipX = 160;

int shipY = 200;

int backgroundMode = 0;

unsigned long startTime = 0;

// ===== โครงสร้างอุกกาบาต =====

struct Meteor {

int x;

int y;

int size;

uint16_t color;

};

Meteor meteors[MAX_METEOR_COUNT];

int currentMeteorCount = 3;

// ===== พื้นหลัง 6 แบบ =====

void drawBackground() {

switch (backgroundMode) {

case 0: // ท้องฟ้ายามเช้า

tft.fillScreen(tft.color565(135,206,235));

for (int i=0;i<10;i++){

int x=random(0,320);

int y=random(20,100);

int w=random(20,50);

int h=random(10,20);

tft.fillEllipse(x,y,w,h,TFT_WHITE);

}

break;

case 1: // ท้องฟ้าเย็น

tft.fillScreen(TFT_NAVY);

for (int i=0;i<50;i++){

tft.drawPixel(random(0,320), random(0,240), TFT_YELLOW);

}

break;

case 2: // อวกาศ

tft.fillScreen(TFT_BLACK);

for (int i=0;i<40;i++){

int c=meteorColors[random(0,meteorColorCount)];

tft.drawPixel(random(0,320), random(0,240), c);

}

break;

case 3: // ทะเลหมอก

tft.fillScreen(TFT_DARKGREY);

for (int i=0;i<30;i++){

int r=random(3,8);

tft.drawCircle(random(r,320-r), random(r,240-r), r, TFT_WHITE);

}

break;

case 4: // พระอาทิตย์ตก

tft.fillScreen(TFT_PURPLE);

for (int i=0;i<50;i++){

int c = (i%2==0)? TFT_ORANGE : TFT_YELLOW;

tft.drawPixel(random(0,320), random(0,240), c);

}

break;

case 5: // ป่าลึกลับ

tft.fillScreen(TFT_GREEN);

for (int i=0;i<25;i++){

int r=random(3,12);

tft.fillCircle(random(r,320-r), random(r,240-r), r, TFT_CYAN);

}

break;

}

}

// ===== วาดยาน =====

void drawShip(int x, int y){

tft.fillTriangle(x, y, x + SHIP_WIDTH/2, y - SHIP_HEIGHT, x + SHIP_WIDTH, y, SHIP_COLOR);

tft.fillRect(x + SHIP_WIDTH/2 -2, y, 4, 8, TFT_WHITE);

}

// ===== วาดอุกกาบาต =====

void drawMeteor(Meteor m){

tft.fillCircle(m.x + m.size, m.y + m.size, m.size, m.color);

}

// ===== ตรวจสอบการชน =====

bool checkCollision(int sx,int sy,Meteor m){

int mx = m.x + m.size;

int my = m.y + m.size;

int dx = max(sx, min(mx, sx + SHIP_WIDTH));

int dy = max(sy - SHIP_HEIGHT, min(my, sy));

int distSq = (mx - dx)*(mx - dx) + (my - dy)*(my - dy);

return distSq < m.size*m.size;

}

// ===== แสดงเวลา =====

void drawScore(){

unsigned long elapsed = (millis()-startTime)/1000;

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(10,10);

tft.printf("Time: %lus", elapsed);

}

// ===== รีเซ็ตเกม =====

void resetGame(){

shipX = 160;

shipY = 220;

currentMeteorCount = 3;

startTime = millis();

for(int i=0;i<MAX_METEOR_COUNT;i++){

meteors[i].x = random(0,320);

meteors[i].y = random(-240,-20);

meteors[i].size = random(8,16);

meteors[i].color = meteorColors[random(0,meteorColorCount)];

}

drawBackground();

}

// ===== setup =====

void setup(){

tft.begin();

tft.setRotation(3);

randomSeed(analogRead(0));

resetGame();

pinMode(WIO_5S_UP, INPUT_PULLUP);

pinMode(WIO_5S_DOWN, INPUT_PULLUP);

pinMode(WIO_5S_LEFT, INPUT_PULLUP);

pinMode(WIO_5S_RIGHT, INPUT_PULLUP);

pinMode(WIO_5S_PRESS, INPUT_PULLUP);

pinMode(WIO_KEY_A, INPUT_PULLUP);

pinMode(WIO_KEY_B, INPUT_PULLUP);

pinMode(WIO_KEY_C, INPUT_PULLUP);

}

// ===== loop =====

void loop(){

// เปลี่ยนพื้นหลัง

if(!digitalRead(WIO_KEY_A)){ backgroundMode = (backgroundMode+1)%6; drawBackground(); delay(200);}

if(!digitalRead(WIO_KEY_B)){ backgroundMode = (backgroundMode+5)%6; drawBackground(); delay(200);}

if(!digitalRead(WIO_KEY_C)){ backgroundMode=0; drawBackground(); delay(200);}

// ขยับยาน

if(!digitalRead(WIO_5S_LEFT)) shipX -= MOVE_STEP;

if(!digitalRead(WIO_5S_RIGHT)) shipX += MOVE_STEP;

if(!digitalRead(WIO_5S_UP)) shipY -= MOVE_STEP;

if(!digitalRead(WIO_5S_DOWN)) shipY += MOVE_STEP;

shipX = constrain(shipX,0,320-SHIP_WIDTH);

shipY = constrain(shipY,SHIP_HEIGHT,240);

// วาดพื้นหลังและยาน

drawBackground();

drawScore();

drawShip(shipX,shipY);

// อุกกาบาต

for(int i=0;i<currentMeteorCount;i++){

meteors[i].y += METEOR_SPEED;

if(meteors[i].y > 240){

meteors[i].x = random(0,320);

meteors[i].y = random(-100,-20);

meteors[i].size = random(8,16);

meteors[i].color = meteorColors[random(0,meteorColorCount)];

if(currentMeteorCount<MAX_METEOR_COUNT) currentMeteorCount++;

}

if(checkCollision(shipX,shipY,meteors[i])){

tft.fillScreen(TFT_RED);

tft.setTextColor(TFT_WHITE,TFT_RED);

tft.setTextSize(3);

tft.setCursor(100,110);

tft.print("BOOM!");

delay(1000);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE);

tft.setTextSize(2);

tft.setCursor(80,120);

tft.print("Press to Restart");

while(digitalRead(WIO_5S_PRESS)==HIGH) delay(10);

while(digitalRead(WIO_5S_PRESS)==LOW) delay(10);

resetGame();

break;

}

drawMeteor(meteors[i]);

}

delay(20); // ลดเวลา delay เพื่อเฟรมสมูทขึ้น

}

# data[].attributes.headline
ชุมพล นุชาญรัมย์ 4.

# data[].attributes.subject
ชุมพล นุชาญรัมย์ 4.

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Wire.h>

#include <DHT.h>

#include <BH1750.h>

#define DHTPIN A0

#define DHTTYPE DHT11

TFT_eSPI tft = TFT_eSPI();

DHT dht(DHTPIN, DHTTYPE);

BH1750 lightMeter;

void setup() {

Serial.begin(115200);

dht.begin();

Wire.begin();

lightMeter.begin();

delay(200);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

}

void loop() {

float temp = dht.readTemperature();

float humi = dht.readHumidity();

float lux = lightMeter.readLightLevel();

Serial.print("Lux: ");

Serial.println(lux);

if (lux < 0 || lux > 65535) {

lux = 0;

}

tft.fillScreen(TFT_BLACK); // พื้นหลังสีดำทั้งจอ

if (isnan(temp) || isnan(humi) || isnan(lux)) {

tft.setTextSize(2);

tft.setTextColor(TFT_RED, TFT_BLACK);

tft.drawString("Sensor Error!", 80, 110);

} else {

// -------- ส่วนบน: Temperature & Humidity --------

tft.setTextSize(2);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.drawString("Temp", 40, 10);

tft.drawString("Humidity", 190, 10);

tft.setTextSize(4);

tft.setCursor(30, 40);

tft.printf("%.0f C", temp);

tft.setCursor(180, 40);

tft.printf("%.0f %%", humi);

// -------- ส่วนล่าง: Light --------

tft.setTextSize(2);

tft.drawString("Light Level", 100, 135);

tft.setTextSize(6);

tft.setCursor(110, 160);

tft.printf("%.0f ", lux);

}

delay(1000);

} `แสงอุณหภูมิ

# data[].attributes.headline
ธัญชนก เทียมประสิทธิ์

# data[].attributes.subject
ธัญชนก เทียมประสิทธิ์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// สีที่กำหนดเอง

#define MY_BROWN 0xA145

#define MY_DARKGREY 0x7BEF

// ปุ่ม 5-way switch ของ Wio Terminal

#define BTN_LEFT WIO_5S_LEFT

#define BTN_RIGHT WIO_5S_RIGHT

#define BTN_UP WIO_5S_UP

#define BTN_DOWN WIO_5S_DOWN

int catX = 40;

int catY = 100;

int step = 10;

int moveX = 0; // -1 ซ้าย, 1 ขวา

int moveY = 0; // -1 ขึ้น, 1 ลง

unsigned long lastMoveTime = 0;

void setup() {

Serial.begin(115200);

delay(100);

tft.begin();

tft.setRotation(3);

pinMode(BTN_LEFT, INPUT_PULLUP);

pinMode(BTN_RIGHT, INPUT_PULLUP);

pinMode(BTN_UP, INPUT_PULLUP);

pinMode(BTN_DOWN, INPUT_PULLUP);

drawBackground();

drawCat(catX, catY);

}

void loop() {

// อ่านปุ่มทิศทาง

moveX = 0;

moveY = 0;

if (digitalRead(BTN_RIGHT) == LOW) moveX = 1;

else if (digitalRead(BTN_LEFT) == LOW) moveX = -1;

if (digitalRead(BTN_DOWN) == LOW) moveY = 1;

else if (digitalRead(BTN_UP) == LOW) moveY = -1;

if (millis() - lastMoveTime > 200) {

if (moveX != 0 || moveY != 0) {

drawPawPrint(catX + 10, catY + 40, MY_DARKGREY);

catX += step * moveX;

catY += step * moveY;

// ขอบจอ

if (catX > tft.width() - 30) catX = tft.width() - 30;

if (catX < 30) catX = 30;

if (catY > tft.height() - 40) catY = tft.height() - 40;

if (catY < 30) catY = 30;

drawBackground();

drawCat(catX, catY);

}

lastMoveTime = millis();

}

}

// ===== วาดฉาก =====

void drawBackground() {

tft.fillScreen(TFT_CYAN);

int groundY = tft.height() / 2;

tft.fillRect(0, groundY, tft.width(), tft.height() - groundY, TFT_GREEN);

drawSun();

drawCloud(40, 40);

drawCloud(120, 60);

drawTree(60, groundY);

drawTree(180, groundY);

drawText();

}

void drawSun() {

int sunRadius = 30;

tft.fillCircle(tft.width() - sunRadius - 10, sunRadius + 10, sunRadius, TFT_YELLOW);

}

void drawCloud(int x, int y) {

tft.fillCircle(x, y, 12, TFT_WHITE);

tft.fillCircle(x + 15, y - 5, 15, TFT_WHITE);

tft.fillCircle(x + 30, y, 12, TFT_WHITE);

tft.fillRect(x - 2, y, 34, 12, TFT_WHITE);

}

void drawTree(int x, int groundY) {

int trunkWidth = 10;

int trunkHeight = 20;

int foliageRadius = 20;

tft.fillRect(x, groundY - trunkHeight, trunkWidth, trunkHeight, MY_BROWN);

tft.fillCircle(x + trunkWidth / 2, groundY - trunkHeight - foliageRadius / 2, foliageRadius, TFT_DARKGREEN);

}

void drawText() {

tft.setTextColor(TFT_BLACK);

tft.setTextSize(2);

tft.setCursor(20, 20);

tft.println("Wio Terminal");

}

void drawCat(int x, int y) {

tft.fillCircle(x, y, 15, TFT_ORANGE);

tft.fillTriangle(x - 10, y - 10, x - 5, y - 20, x, y - 10, TFT_ORANGE);

tft.fillTriangle(x + 10, y - 10, x + 5, y - 20, x, y - 10, TFT_ORANGE);

tft.fillCircle(x - 5, y - 2, 3, TFT_BLACK);

tft.fillCircle(x + 5, y - 2, 3, TFT_BLACK);

tft.fillCircle(x, y + 4, 2, TFT_PINK);

tft.drawLine(x - 3, y + 7, x + 3, y + 7, TFT_BLACK);

tft.fillRect(x - 12, y + 15, 24, 20, TFT_ORANGE);

tft.fillRect(x - 12, y + 35, 6, 10, TFT_ORANGE);

tft.fillRect(x + 6, y + 35, 6, 10, TFT_ORANGE);

tft.fillRect(x + 14, y + 20, 5, 15, TFT_ORANGE);

}

void drawPawPrint(int x, int y, uint16_t color) {

tft.fillCircle(x - 6, y - 6, 2, color);

tft.fillCircle(x + 6, y - 6, 2, color);

tft.fillCircle(x - 4, y + 0, 2, color);

tft.fillCircle(x + 4, y + 0, 2, color);

tft.fillRoundRect(x - 4, y + 2, 8, 10, 3, color);

}

# data[].attributes.headline
ธัญชนก เทียมประสิทธิ์

# data[].attributes.subject
ธัญชนก เทียมประสิทธิ์

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft = TFT_eSPI();

// ปุ่มทิศทาง (D-Pad) ของ Wio Terminal

#define BTN_LEFT WIO_5S_LEFT

#define BTN_RIGHT WIO_5S_RIGHT

#define BTN_UP WIO_5S_UP

#define BTN_DOWN WIO_5S_DOWN

// ปุ่มเปลี่ยนฉาก

#define BTN_C WIO_KEY_C

// ตัวแปรผู้เล่น

int playerX = 120;

int playerY = 200;

const int playerSize = 20;

// ตัวแปรสิ่งกีดขวาง

int obstacleX = 0;

int obstacleY = 0;

const int obstacleSize = 20;

int obstacleSpeed = 3;

// พื้นหลัง

int bgIndex = 0;

const int bgCount = 6;

// คะแนน

int score = 0;

// ควบคุมเฟรม

unsigned long lastFrame = 0;

const int frameDelay = 30;

void setup() {

Serial.begin(115200);

tft.begin();

tft.setRotation(3);

pinMode(BTN_LEFT, INPUT_PULLUP);

pinMode(BTN_RIGHT, INPUT_PULLUP);

pinMode(BTN_UP, INPUT_PULLUP);

pinMode(BTN_DOWN, INPUT_PULLUP);

pinMode(BTN_C, INPUT_PULLUP);

randomSeed(analogRead(0));

drawBackground(bgIndex);

resetObstacle();

}

void loop() {

if (millis() - lastFrame > frameDelay) {

updateInput();

updateGame();

drawGame();

lastFrame = millis();

}

}

// อ่านปุ่มควบคุม

void updateInput() {

// ซ้าย

if (digitalRead(BTN_LEFT) == LOW) {

playerX -= 5;

if (playerX < 0) playerX = 0;

}

// ขวา

if (digitalRead(BTN_RIGHT) == LOW) {

playerX += 5;

if (playerX > tft.width() - playerSize) playerX = tft.width() - playerSize;

}

// ขึ้น

if (digitalRead(BTN_UP) == LOW) {

playerY -= 5;

if (playerY < 0) playerY = 0;

}

// ลง

if (digitalRead(BTN_DOWN) == LOW) {

playerY += 5;

if (playerY > tft.height() - playerSize) playerY = tft.height() - playerSize;

}

// เปลี่ยนฉาก

if (digitalRead(BTN_C) == LOW) {

bgIndex = (bgIndex + 1) % bgCount;

drawBackground(bgIndex);

delay(300); // ป้องกันกดค้าง

}

}

// อัปเดตเกม

void updateGame() {

obstacleY += obstacleSpeed;

if (obstacleY > tft.height()) {

resetObstacle();

}

// ตรวจสอบการชน

if (playerX < obstacleX + obstacleSize &&

playerX + playerSize > obstacleX &&

playerY < obstacleY + obstacleSize &&

playerY + playerSize > obstacleY) {

score++;

resetObstacle();

}

}

// วาดเกม

void drawGame() {

drawBackground(bgIndex);

// ผู้เล่น

tft.fillRect(playerX, playerY, playerSize, playerSize, TFT_BLUE);

// สิ่งกีดขวาง

tft.fillRect(obstacleX, obstacleY, obstacleSize, obstacleSize, TFT_BLACK);

// คะแนน

tft.setTextColor(TFT_WHITE, tft.color565(0, 0, 0));

tft.setTextSize(2);

tft.setCursor(5, 5);

tft.printf("Score: %d", score);

}

// รีเซ็ตสิ่งกีดขวาง

void resetObstacle() {

obstacleX = random(0, tft.width() - obstacleSize);

obstacleY = 0;

}

// วาดพื้นหลัง

void drawBackground(int index) {

switch (index) {

case 0: tft.fillScreen(TFT_CYAN); break;

case 1: tft.fillScreen(TFT_YELLOW); break;

case 2: tft.fillScreen(TFT_GREEN); break;

case 3: tft.fillScreen(TFT_ORANGE); break;

case 4: tft.fillScreen(TFT_MAGENTA); break;

case 5: tft.fillScreen(TFT_DARKGREY); break;

}

}

# data[].attributes.body
#include <TFT_eSPI.h>

#include <Arduino.h>

TFT_eSPI tft;

#define SW_A BCM0 // เพิ่มวินาที ต่อเข้า SW6

#define SW_B BCM1 // เพิ่มนาที ต่อเข้า SW7

#define SW_C BCM2 // Start / Stop / Reset ต่อเข้า SW5

#define BUZZER_PIN WIO_BUZZER

int seconds = 0;

int minutes = 0;

bool running = false;

bool finished = false;

unsigned long lastMillis = 0;

void setup() {

pinMode(SW_A, INPUT);

pinMode(SW_B, INPUT);

pinMode(SW_C, INPUT);

pinMode(BUZZER_PIN, OUTPUT);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_WHITE);

drawUI();

}

void loop() {

// ตั้งเวลา

if (!running && !finished) {

if (digitalRead(SW_A) == LOW) {

delay(200);

seconds++;

if (seconds >= 60) seconds = 0;

beep(100);

drawUI();

}

if (digitalRead(SW_B) == LOW) {

delay(200);

minutes++;

if (minutes >= 60) minutes = 0;

beep(100);

drawUI();

}

}

// ปุ่มเริ่ม / หยุด / รีเซ็ต

if (digitalRead(SW_C) == LOW) {

delay(300); // debounce

if (!running && !finished && (minutes > 0 || seconds > 0)) {

running = true;

lastMillis = millis();

} else if (running) {

running = false; // หยุดชั่วคราว

} else if (finished) {

// ติ๊ด 5 ครั้ง

for (int i = 0; i < 5; i++) {

beep(200);

delay(200);

}

finished = false;

minutes = 0;

seconds = 0;

drawUI();

}

}

// ทำงานเมื่อ countdown กำลังรัน

if (running && millis() - lastMillis >= 1000) {

lastMillis = millis();

if (seconds == 0) {

if (minutes == 0) {

running = false;

finished = true;

drawUI();

// ติ๊ด 3 ครั้ง

for (int i = 0; i < 3; i++) {

beep(200);

delay(200);

}

} else {

minutes--;

seconds = 59;

}

} else {

seconds--;

}

drawUI();

}

}

void drawUI() {

tft.fillScreen(TFT_WHITE);

tft.setTextColor(TFT_BLACK);

tft.setTextDatum(MC_DATUM);

tft.setTextSize(2);

tft.drawString("Count Down", 160, 30);

tft.drawString("SW7 TO START/STOP", 160, 60);

tft.drawString("SW6 & SW5 TO SET TIME", 160, 85);

// แสดงเวลา

char timeBuf[10];

sprintf(timeBuf, "%02d : %02d", minutes, seconds);

tft.setTextSize(4);

tft.drawString(timeBuf, 160, 130);

// แสดงสถานะ

tft.setTextSize(2);

if (running) {

tft.setTextColor(TFT_RED);

tft.drawString("RUNNING", 160, 190);

} else if (finished) {

tft.setTextColor(TFT_BLUE);

tft.drawString("FINISHED", 160, 190);

} else {

tft.setTextColor(TFT_DARKGREY);

tft.drawString("STOP", 160, 190);

}

}

void beep(int duration) {

tone(BUZZER_PIN, 1500); // 1.5kHz

delay(duration);

noTone(BUZZER_PIN);

}

# data[].attributes.body
#include <TFT_eSPI.h>

#include <BH1750.h>

#include <Wire.h>

BH1750 lightMeter;

TFT_eSPI tft;

#define RELAY1_PIN BCM8

#define RELAY2_PIN BCM9

#define SMOOTH_N 5

float luxArray[SMOOTH_N] = {0};

void setup() {

Wire.begin();

lightMeter.begin();

pinMode(RELAY1_PIN, OUTPUT);

pinMode(RELAY2_PIN, OUTPUT);

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

tft.begin();

tft.setRotation(3);

tft.fillScreen(TFT_BLACK);

// หัวข้อด้านบน

tft.setTextSize(2);

tft.setTextColor(TFT_CYAN, TFT_BLACK);

tft.setCursor(70, 0);

tft.print("Light Monitor");

// เส้นแบ่งหัวข้อ

tft.drawLine(20, 25, 300, 25, TFT_DARKGREY);

}

float getLuxAverage(float newLux) {

for (int i = SMOOTH_N - 1; i > 0; i--) luxArray[i] = luxArray[i - 1];

luxArray[0] = newLux;

float sum = 0;

for (int i = 0; i < SMOOTH_N; i++) sum += luxArray[i];

return sum / SMOOTH_N;

}

uint32_t getBarColor(float lux, float minLux, float maxLux) {

float ratio = constrain((lux - minLux) / (maxLux - minLux), 0, 1);

uint8_t r, g, b;

if (ratio < 0.5) {

r = ratio 2 255; // ไล่จาก 0 → 255

g = 255;

} else {

r = 255;

g = (1 - (ratio - 0.5) 2) 255; // ไล่จาก 255 → 0

}

b = 0;

return tft.color565(r, g, b);

}

void drawBars(float lux) {

int barX = 60;

int barWidthMax = 180;

int barHeight = 40;

int bar1Y = 75;

int bar2Y = 140;

// เส้นกริดพื้นหลัง

for (int i = 0; i <= barWidthMax; i += 45) {

tft.drawLine(barX + i, bar1Y - 2, barX + i, bar1Y + barHeight + 2, TFT_DARKGREY);

tft.drawLine(barX + i, bar2Y - 2, barX + i, bar2Y + barHeight + 2, TFT_DARKGREY);

}

// กรอบบาร์

tft.drawRoundRect(barX-3, bar1Y-3, barWidthMax+6, barHeight+6, 4, TFT_WHITE);

tft.drawRoundRect(barX-3, bar2Y-3, barWidthMax+6, barHeight+6, 4, TFT_WHITE);

// ล้างบาร์เก่า

tft.fillRect(barX, bar1Y, barWidthMax, barHeight, TFT_BLACK);

tft.fillRect(barX, bar2Y, barWidthMax, barHeight, TFT_BLACK);

// ความยาวบาร์

int bar1Width = constrain(map((int)lux, 0, 220, 0, barWidthMax), 0, barWidthMax);

int bar2Width = 0;

if (lux > 220) bar2Width = constrain(map((int)lux, 220, 440, 0, barWidthMax), 0, barWidthMax);

// วาดบาร์ด้วยสี

tft.fillRect(barX, bar1Y, bar1Width, barHeight, getBarColor(lux, 0, 220));

tft.fillRect(barX, bar2Y, bar2Width, barHeight, getBarColor(lux, 220, 440));

// ตัวเลขขอบบาร์

tft.setTextSize(1);

tft.setTextColor(TFT_WHITE, TFT_BLACK);

tft.setCursor(barX-25, bar1Y+12); tft.print("0");

tft.setCursor(barX+barWidthMax+5, bar1Y+12); tft.print("220");

tft.setCursor(barX-25, bar2Y+12); tft.print("220");

tft.setCursor(barX+barWidthMax+5, bar2Y+12); tft.print("440");

}

void displayLux(float lux) {

// ล้างพื้นที่ค่า Lux

tft.fillRect(0, 30, 320, 40, TFT_BLACK);

tft.setTextSize(3);

tft.setTextColor(TFT_GREEN, TFT_BLACK);

tft.setCursor(80, 35);

tft.printf("%4d lx", (int)lux);

}

void updateRelays(float lux) {

String status;

uint32_t color;

if (lux <= 220) {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1,2 OFF";

color = TFT_GREEN;

} else if (lux < 430) {

digitalWrite(RELAY1_PIN, HIGH);

digitalWrite(RELAY2_PIN, LOW);

status = "RELAY 1 ON";

color = TFT_YELLOW;

} else {

digitalWrite(RELAY1_PIN, LOW);

digitalWrite(RELAY2_PIN, HIGH);

status = "RELAY 2 ON";

color = TFT_RED;

}

// ป้ายสถานะรีเลย์

tft.fillRect(25, 200, 270, 35, TFT_BLACK);

tft.drawRoundRect(25, 200, 270, 35, 6, color);

tft.setTextSize(2);

tft.setTextColor(color, TFT_BLACK);

tft.setCursor(50, 208);

tft.print(status);

}

void loop() {

float lux = lightMeter.readLightLevel();

if (lux < 0) lux = 0;

float luxAvg = getLuxAverage(lux);

displayLux(luxAvg);

drawBars(luxAvg);

updateRelays(luxAvg);

delay(500);

}