ผู้เริ่มต้น
สร้างลูกเต๋าอิเล็กทรอนิกส์ ส่วนประกอบ เกม พื้นฐาน
กดปุ่มแล้วได้ผลลัพธ์แบบสุ่ม—เป็นโปรเจกต์เล็ก ๆ ที่น่าพึงพอใจซึ่งสอนเรื่องความสุ่มที่แท้จริงและรูปแบบ LED ไปพร้อมกัน
รวมชิ้นส่วนจริง 7 รายการ
ราคารวมชุดนี้: 2,090.00 ฿
เพิ่มอุปกรณ์ทั้งหมดลงตะกร้า ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน
สิ่งที่คุณต้องใช้
เป้าหมายของโครงการ โครงการนี้สร้างลูกเต๋าอิเล็กทรอนิกส์หกด้านขนาดเล็ก: กดปุ่มหนึ่งครั้งแล้วจะได้ค่าสุ่มที่แสดงทันทีด้วยรูปแบบหน้าลูกเต๋าที่คุ้นเคยจาก LED ที่สว่างขึ้น เป็นโครงการที่กะทัดรัด แต่บรรจุแนวคิดสำหรับผู้เริ่มต้นที่มีประโยชน์สองอย่างพร้อมกัน — การสร้างค่าสุ่มที่ทำงานแบบสุ่มจริง ๆ และการขับเคลื่อน LED หลายดวงในรูปแบบต่าง ๆ แทนที่จะทีละดวง
คอนโทรลเลอร์ทำอะไร ESP32-C3 จะรอการกดปุ่ม และเมื่อตรวจพบการกดปุ่ม จะสร้างตัวเลขสุ่มใหม่ตั้งแต่ 1 ถึง 6 และส่องสว่างชุด LED ที่ตรงกับรูปแบบหน้าลูกเต๋าของตัวเลขนั้น การตัดสินใจทั้งหมด — การรับรู้การกดปุ่ม การสร้างตัวเลข และการเลือก LED ที่จะเปิด — เกิดขึ้นในโค้ดของคอนโทรลเลอร์
LED ทำอะไร LED เจ็ดดวงที่จัดเรียงในรูปแบบหน้าลูกเต๋าแบบคลาสสิกสามารถแสดงตัวเลขใดก็ได้ตั้งแต่ 1 ถึง 6 โดยการส่องสว่างชุดค่าผสมที่แตกต่างกัน เช่นเดียวกับลูกเต๋าจริงที่แสดงการจัดเรียงจุดที่แตกต่างกันสำหรับแต่ละหน้า LED แต่ละดวงต้องการตัวต้านทานจำกัดกระแสของตัวเอง ซึ่งนำมาจากชุดตัวต้านทาน ต่ออนุกรมระหว่างพินของคอนโทรลเลอร์กับ LED — หากไม่มี ตัวต้านทาน LED จะพยายามดึงกระแสมากกว่าที่พินสามารถจ่ายได้อย่างปลอดภัย ซึ่งจะทำให้อายุการใช้งานของ LED สั้นลงหรือสร้างความเสียหายให้กับพินเมื่อเวลาผ่านไป
ปุ่มกดทำอะไร ปุ่มกดจะเรียกให้เกิด "การทอย" ใหม่ การกดปุ่มจะเป็นการบอกให้คอนโทรลเลอร์สร้างตัวเลขสุ่มใหม่และส่องสว่างรูปแบบ LED ที่ตรงกัน แทนที่สิ่งที่ส่องสว่างอยู่ก่อนหน้านี้
การดีบาวซ์ปุ่มกด ปุ่มกลไกไม่ได้สลับอย่างสะอาด — หน้าสัมผัสโลหะจะดีดตัวทางกายภาพเป็นเวลาไม่กี่มิลลิวินาทีเมื่อกด ซึ่งคอนโทรลเลอร์ที่รวดเร็วสามารถลงทะเบียนเป็นการกดหลายครั้งอย่างรวดเร็วแทนที่จะเป็นครั้งเดียว หากไม่ได้รับการจัดการ สิ่งนี้หมายถึงการกดเพียงครั้งเดียวสามารถเรียกให้เกิดการทอยหลายครั้งติดต่อกัน และ LED อาจกระพริบผ่านหลายรูปแบบก่อนที่จะหยุดนิ่ง การแก้ไขมาตรฐานที่เรียกว่า debouncing คือการละเว้นสัญญาณกดเพิ่มเติมในช่วงเวลาสั้น ๆ (โดยทั่วไปคือ 10-50 มิลลิวินาที) หลังจากตรวจพบครั้งแรก ไม่ว่าจะในโค้ดหรือด้วยตัวเก็บประจุขนาดเล็กในวงจร นี่เป็นรายละเอียดเล็ก ๆ แต่เป็นหนึ่งในปัญหาการกำหนดเวลาในโลกจริงครั้งแรกที่คนส่วนใหญ่ประสบกับปุ่มทางกายภาพ
แนวคิดซอฟต์แวร์และไลบรารี เทคนิคสำหรับผู้เริ่มต้นที่มีประโยชน์จริง ๆ ในที่นี้คือการกำหนด seed ให้กับตัวสร้างตัวเลขสุ่มโดยการอ่านพินแอนะล็อกที่ไม่ได้เชื่อมต่อ (floating) เมื่อเริ่มต้นทำงาน พิน floating จะรับสัญญาณรบกวนทางไฟฟ้าจากสภาพแวดล้อมเพียงเล็กน้อย ดังนั้นการอ่านค่าจากพินดังกล่าวจะให้ค่าเริ่มต้นที่แตกต่างกันเกือบทุกครั้งที่บอร์ดเปิดเครื่อง การข้ามขั้นตอนนี้เป็นข้อผิดพลาดที่พบบ่อยและเป็นปัญหาจริงสำหรับผู้เริ่มต้น: หากไม่มี seed ที่สุ่ม ตัวสร้างตัวเลขสุ่มส่วนใหญ่จะสร้างลำดับเดิมซ้ำ ๆ ทุกครั้งที่บอร์ดรีเซ็ต ดังนั้น "การทอย" แบบสุ่มจะดูเหมือนเดิมทุกครั้งที่เปิดเครื่อง นอกเหนือจากการกำหนด seed แล้ว ส่วนที่เหลือของตรรกะคือตารางค้นหาที่จับคู่ตัวเลขแต่ละตัวตั้งแต่ 1-6 กับชุดของพิน LED ที่ควรจะสว่างสำหรับหน้านั้น
การทดสอบและแก้ไขปัญหา LED ไม่สว่างในรูปแบบลูกเต๋าที่ถูกต้องเลย — ตรวจสอบตารางการจับคู่ในโค้ดระหว่างตัวเลขแต่ละตัวและพิน LED ที่ควรจะเปิด "การทอย" แบบสุ่มแสดงตัวเลขเดิมซ้ำ ๆ ทุกครั้งที่บอร์ดรีเซ็ต — random seed ไม่ได้ถูกสุ่มจริง ๆ; ทบทวนวิธีการสร้าง seed โดยเฉพาะอย่างยิ่งจากการอ่านพินแอนะล็อกแบบลอยเมื่อเริ่มต้นทำงาน LED บางดวงไม่สว่างเลยแม้ว่ารูปแบบควรจะรวมอยู่ด้วย — ตรวจสอบขั้วและความต้านทานของ LED นั้น ๆ แยกกัน; LED ที่กลับขั้วจะไม่สว่างเลย การกดปุ่มเพียงครั้งเดียวเรียกให้เกิดการทอยหลายครั้งอย่างรวดเร็ว — นี่คือการเด้งของสวิตช์; เพิ่มหรือยืดระยะเวลาหน่วงการดีบาวซ์หลังจากตรวจพบการกดครั้งแรก การอัปเกรดเสริมในอนาคต: เพิ่มเสียงเอฟเฟกต์การทอย ลำโพงเปียโซขนาดเล็กที่ขับเคลื่อนจากพินคอนโทรลเลอร์สำรองในขณะที่ LED อัปเดต สามารถเล่นเสียงบี๊บหรือคลิกสั้น ๆ ในทุกการทอย เป็นการเพิ่มเติมเล็ก ๆ น้อย ๆ ที่ทำให้ลูกเต๋ารู้สึกเหมือนเป็นวัตถุที่สมบูรณ์มากขึ้น และแนะนำแนวคิดของการกระตุ้นอุปกรณ์เอาต์พุตมากกว่าหนึ่งตัวจากเหตุการณ์เดียวโดยไม่ต้องเพิ่มความซับซ้อนให้กับโค้ดที่มีอยู่มากนัก
การเดินสาย แอโนด LED "TL" (จุดบนซ้าย) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO0 — ขาหนึ่งของอาร์เรย์ลูกเต๋า 6 LED; แคโทดต่อ GND แอโนด LED "TR" (จุดบนขวา) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO1 แอโนด LED "ML" (จุดกลางซ้าย, ใช้เป็นจุดกลางด้วย) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO2 แอโนด LED "MR" (จุดกลางขวา, สว่างเฉพาะสำหรับรูปแบบเลขหก) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO3 แอโนด LED "BL" (จุดล่างซ้าย) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO4 แอโนด LED "BR" (จุดล่างขวา) → ตัวต้านทาน 220–330Ω → ESP32-C3 GPIO5 แคโทด LED ทั้ง 6 ตัว → ราง GND ของเบรดบอร์ด → ESP32-C3 GND ปุ่ม Roll, ขา 1 → ESP32-C3 GPIO6 (ใช้ `INPUT_PULLUP`, อ่านค่า LOW เมื่อกด) ปุ่ม Roll, ขา 2 → GND ESP32-C3 SuperMini → สาย USB-C → คอมพิวเตอร์/พาวเวอร์แบงค์ (จ่ายไฟ + การตั้งโปรแกรม) หมายเลขพินด้านบน (GPIO0–GPIO6) เป็นวัตถุประสงค์ทั่วไปและปลอดภัยบน ESP32-C3 SuperMini แต่ควรตรวจสอบกับ silkscreen ของบอร์ดเฉพาะของคุณก่อนการเดินสาย — ปรับ `#define`s หากการติดฉลากของคุณแตกต่างกัน ลูกเต๋า 6 ด้านที่แท้จริงต้องการตำแหน่งจุด 7 ตำแหน่ง (มีจุดศูนย์กลางจริง) แต่ด้วย LED เพียง 6 ดวง โค้ดจะถือว่า LED กลางซ้ายเป็นจุด "ศูนย์กลาง" ที่ใช้ร่วมกันสำหรับ 1/3/5 และจะส่องสว่าง LED กลางขวาเฉพาะสำหรับ 6 — เป็นการลดความซับซ้อนที่พบได้ทั่วไปและตรงไปตรงมาสำหรับการสร้างลูกเต๋าอิเล็กทรอนิกส์ 6 LED สร้างและทดสอบ LED ทีละดวงบนเบรดบอร์ดก่อนที่จะเดินสายทั้งหมดหกดวง เนื่องจาก LED ที่กลับขั้วเป็นความล้มเหลวที่พบบ่อยที่สุดในการเริ่มต้นระบบ
แผนภาพการต่อสาย
anode
GPIO0
anode
GPIO1
anode
GPIO2
anode
GPIO3
anode
GPIO4
anode
GPIO5
GND
leg 1 → GPIO6
leg 2
ESP32-C3
220–330Ω resistor
220–330Ω resistor
220–330Ω resistor
220–330Ω resistor
220–330Ω resistor
220–330Ω resistor
breadboard GND rail
Roll button
USB-C cable
LED "TL"
LED "TR"
LED "ML"
LED "MR"
LED "BL"
LED "BR"
All 6 LED cathodes
GND
โค้ดเริ่มต้น
// Electronic Dice — ESP32-C3 SuperMini
// 6 LEDs arranged in a simplified dice pip pattern, rolled with a button.
// --- Pin assignments — adjust to match your board's silkscreen if different ---
#define LED_TL 0 // top-left pip
#define LED_TR 1 // top-right pip
#define LED_ML 2 // middle-left pip (also used as the "center" pip for 1/3/5)
#define LED_MR 3 // middle-right pip (only lit for 6)
#define LED_BL 4 // bottom-left pip
#define LED_BR 5 // bottom-right pip
#define BUTTON_PIN 6
const uint8_t ledPins[6] = { LED_TL, LED_TR, LED_ML, LED_MR, LED_BL, LED_BR };
// Which of the 6 LEDs (in ledPins order) are lit for each face 1-6
const bool dicePatterns[6][6] = {
{ false, false, true, false, false, false }, // 1: center only
{ true, false, false, false, false, true }, // 2: diagonal
{ true, false, true, false, false, true }, // 3: diagonal + center
{ true, true, false, false, true, true }, // 4: four corners
{ true, true, true, false, true, true }, // 5: four corners + center
{ true, true, true, true, true, true } // 6: all six
};
void showFace(uint8_t face) {
// face is 1-6
for (uint8_t i = 0; i < 6; i++) {
digitalWrite(ledPins[i], dicePatterns[face - 1][i] ? HIGH : LOW);
}
}
void allOff() {
for (uint8_t i = 0; i < 6; i++) digitalWrite(ledPins[i], LOW);
}
void rollAnimation() {
// Quick flicker through random faces before settling, like a physical roll
for (int i = 0; i < 15; i++) {
showFace(random(1, 7));
delay(40 + i * 4); // gradually slow down
}
}
void setup() {
Serial.begin(115200);
for (uint8_t i = 0; i < 6; i++) {
pinMode(ledPins[i], OUTPUT);
}
pinMode(BUTTON_PIN, INPUT_PULLUP);
randomSeed(esp_random()); // ESP32 hardware RNG, seeds Arduino's random()
allOff();
}
void loop() {
static bool lastPressed = false;
bool pressed = (digitalRead(BUTTON_PIN) == LOW);
if (pressed && !lastPressed) {
rollAnimation();
uint8_t result = random(1, 7);
showFace(result);
Serial.print("Rolled: ");
Serial.println(result);
delay(200); // simple debounce after handling the press
}
lastPressed = pressed;
}
ไม่แน่ใจขั้นตอนไหน?
ถามเรา