ม้วนอย่างมีสไตล์ด้วย DIY Electronic D20 Die

ม้วนอย่างมีสไตล์ด้วย DIY Electronic D20 Die

ต้องการอะไรที่ไม่เหมือนใครสำหรับเกมสวมบทบาทบนโต๊ะเกมถัดไปของคุณหรือไม่? แล้ว D20 แบบอิเล็กทรอนิกส์ที่มีกราฟิกแบบกำหนดเองสำหรับการโจมตีที่สำคัญและพลาดไม่ได้ล่ะ วันนี้ผมจะแสดงวิธีสร้าง Arduino ของคุณเองและส่วนประกอบง่ายๆ สองสามอย่าง





ไม่ต้องกังวลหากคุณไม่เคยใช้ Arduino มาก่อน เรามี คู่มือเริ่มต้นใช้งาน .





แผนการสร้าง

นี่เป็นโครงการที่เรียบง่าย Arduino จะขับเคลื่อนจอแสดงผล OLED และปุ่มจะหมุนไดย์ กราฟิกแบบกำหนดเองจะแสดงขึ้นสำหรับการตีคริติคอลหรือคริติคอล คุณสามารถแก้ไขโค้ดให้เป็น D8, D10 หรือ D12 ได้อย่างง่ายดาย





สิ่งที่คุณต้องการ

  • 1 x Arduino
  • 1 x 0.96 ' จอแสดงผล I2C OLED
  • 1 x ปุ่มกด
  • 1 x 10k ? ตัวต้านทาน
  • 1 x เขียงหั่นขนม
  • สายเบ็ดคละแบบ
  • รหัสเต็มที่นี่ หากคุณไม่ต้องการปฏิบัติตามคำแนะนำที่เป็นลายลักษณ์อักษรทั้งหมด

นี่คือส่วนสำคัญที่คุณต้องใช้ในการสร้าง D20 ของคุณเอง คุณอาจต้องการติดตั้งลงในเคส (อธิบายไว้ด้านล่าง) และประสานวงจรให้อยู่ในสถานะถาวรมากขึ้น นี่คือส่วนเพิ่มเติมที่คุณต้องทำ:

  • สลักเกลียว 4 x M2 x 10 มม. (0.4 นิ้ว)
  • 4 x M2 ถั่ว
  • แหวนรอง 4 x 7 มม. (0.28 นิ้ว)
  • สแน็ปแบตเตอรี่ 9V (หรือทางเลือกที่เหมาะสม)
  • คละท่อหดความร้อน

จอแสดงผล OLED เหล่านี้ยอดเยี่ยมมาก ปกติจะซื้อได้ในสีขาว น้ำเงิน เหลือง หรือสามอย่างรวมกัน ฉันซื้อสีน้ำเงินเพื่อให้เข้ากับเคสของฉัน ตรวจสอบให้แน่ใจว่าคุณได้รับ I2C รุ่นแทน SPI .



Arduino เกือบทั้งหมดจะเหมาะสม ฉันเลือกนาโนเนื่องจากมีขนาดเล็กพอที่จะใส่ในเคสได้ ดูคู่มือการซื้อของเราสำหรับข้อมูลเพิ่มเติมเกี่ยวกับรุ่น Arduino

The Circuit

นี่คือวงจรที่คุณต้องการ:





เชื่อมต่อ VCC และ GND บนจอแสดงผล OLED ไปยัง Arduino +5V และ พื้น . เชื่อมต่อ อนาล็อก 4 บน Arduino ไปยังพินที่ระบุว่า SDA . เชื่อมต่อ อนาล็อก 5 เพื่อ SCL เข็มหมุด. หมุดเหล่านี้มีวงจรที่จำเป็นสำหรับการขับเคลื่อนจอแสดงผลโดยใช้บัส I2C หมุดที่แน่นอนจะแตกต่างกันไปตามรุ่น แต่ใช้ A4 และ A5 บน Nano และ Uno ตรวจสอบ เอกสารห้องสมุดสาย สำหรับรุ่นของคุณหากคุณไม่ได้ใช้ Uno หรือ Nano

ต่อแบตเตอรี่กับกราวด์และ ไวน์ เข็มหมุด. ซึ่งหมายถึงแรงดันไฟฟ้าเข้า และยอมรับแรงดันไฟฟ้ากระแสตรงที่แตกต่างกันได้หลากหลาย แต่ให้ตรวจสอบรุ่นเฉพาะของคุณก่อน และบางครั้งอาจแตกต่างกันเล็กน้อย





เชื่อมต่อปุ่มกับ พินดิจิตอล2 . สังเกตว่า 10k ? ตัวต้านทานเชื่อมต่อกับกราวด์ นี่เป็นสิ่งสำคัญมาก! สิ่งนี้เรียกว่าตัวต้านทานแบบดึงลงและป้องกันไม่ให้ Arduino ตรวจพบข้อมูลปลอมหรือการรบกวนเมื่อกดปุ่ม ยังทำหน้าที่ปกป้องบอร์ด หากไม่ได้ใช้ตัวต้านทานนี้ +5V จะเข้าสู่กราวด์โดยตรง นี้เรียกว่า สั้นตาย และเป็นวิธีที่ง่ายในการฆ่า Arduino

หากคุณกำลังบัดกรีวงจรนี้ ให้ป้องกันการเชื่อมต่อของคุณด้วยท่อหดด้วยความร้อน:

อย่าทำให้ร้อนมากเกินไป และทำเมื่อคุณแน่ใจว่าวงจรทำงานแล้วเท่านั้น คุณอาจต้องการบิดสายเคเบิลของคุณเป็นคู่ สิ่งนี้ทำให้พวกเขาเรียบร้อยและช่วยปกป้องพวกเขาจากความเครียดเกินควร:

ปุ่มทดสอบ

เมื่อคุณได้สร้างวงจรแล้ว ให้อัปโหลดรหัสทดสอบนี้ (ตรวจสอบให้แน่ใจว่าได้เลือกบอร์ดและพอร์ตที่ถูกต้องจาก เครื่องมือ > กระดาน และ เครื่องมือ > พอร์ต เมนู):

const int buttonPin = 2; // the number of the button pin
void setup() {
pinMode(buttonPin, INPUT); // setup button
Serial.begin(9600); // setup serial
}
void loop(){
if(digitalRead(buttonPin) == HIGH) {
Serial.print('It Works');
delay(250);
}
}

เมื่ออัปโหลดแล้ว ให้เชื่อมต่อ Arduino ผ่าน USB และเปิดจอภาพอนุกรม ( บนขวา > Serial Monitor ). คุณควรเห็นคำว่า มันได้ผล ปรากฏขึ้นทุกครั้งที่คุณกดปุ่ม

ถ้าไม่มีอะไรเกิดขึ้น ให้ไปตรวจสอบวงจรของคุณอีกครั้ง

การตั้งค่า OLED

คุณต้องติดตั้งสองไลบรารีเพื่อขับเคลื่อนจอแสดงผล ดาวน์โหลด Adafruit_SSD1306 และ Adafruit-GFX [ไม่มีอีกต่อไป] ไลบรารีจาก Github และบันทึกลงในโฟลเดอร์ไลบรารีของคุณ หากคุณไม่แน่ใจว่าโฟลเดอร์ไลบรารีของคุณอยู่ที่ไหน ไปอ่านบทช่วยสอนการเล่นเกมย้อนยุค ที่ฉันกำหนดค่าการแสดงผลเดียวกันนี้โดยละเอียดยิ่งขึ้น

รีสตาร์ท Arduino IDE ของคุณและอัปโหลดภาพร่างการทดสอบจาก ไฟล์ > ตัวอย่าง เมนู. เลือก อดาฟรุต SSD1306 แล้วก็ ssd1306_128x64_i2c . อัปโหลดรหัสนี้ (จะใช้เวลาสักครู่) และคุณจะเห็นรูปร่างและรูปแบบมากมายบนจอแสดงผล:

หากไม่มีอะไรเกิดขึ้น ให้ตรวจสอบการเชื่อมต่อของคุณอีกครั้ง หากตรวจสอบแล้วยังใช้งานไม่ได้ คุณจะต้องแก้ไขโค้ดตัวอย่าง

เปลี่ยนความเร็วการเลื่อนของเมาส์ windows 10

เปลี่ยนบรรทัดนี้ (ที่จุดเริ่มต้นของ ติดตั้ง การทำงาน):

display.begin(SSD1306_SWITCHCAPVCC, 0x3D);

สำหรับสิ่งนี้:

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

สิ่งนี้จะบอกรายละเอียดเฉพาะของไลบรารีเกี่ยวกับจอแสดงผลที่คุณใช้ ตอนนี้คุณควรพร้อมสำหรับการสร้างต่อ

กรณี

หากคุณกำลังสร้างสิ่งนี้บนเขียงหั่นขนมหรือไม่ต้องการสร้างกล่องขึ้นมา คุณสามารถข้ามขั้นตอนนี้ได้

ฉันออกแบบและพิมพ์กล่องนี้ 3 มิติ รับไฟล์ได้ที่ Thingiverse . ไม่ต้องกังวลหากคุณไม่มีเครื่องพิมพ์ 3 มิติ -- บริการออนไลน์ ฮับ ​​3 มิติ และ Shapeways ให้บริการพิมพ์ออนไลน์

ทำกล่องนี้ได้ง่ายๆ จากไม้ หรือจะซื้อพลาสติกก็ได้ กล่องโครงการ .

ฝาปิดเป็นแบบกดให้พอดี และประกอบด้วยช่องเจาะเล็กน้อยสำหรับฮาร์ดแวร์:

รหัส

เมื่อทุกอย่างพร้อมแล้วก็ถึงเวลาสำหรับรหัส นี่คือวิธีการทำงานใน รหัสเทียม :

if button is pressed
generate random number
if random number is 20
show graphic
else if random number is 1
show graphic
else
show number

เพื่อให้ทำงานได้อย่างถูกต้อง จำเป็นต้องสร้างตัวเลขสุ่ม - นี่คือการทอยลูกเต๋า Arduino มีตัวสร้างตัวเลขสุ่มที่เรียกว่า สุ่ม แต่ไม่ควรใช้ แม้ว่าจะดีพอสำหรับงานสุ่มขั้นพื้นฐาน แต่ก็ไม่สุ่มเพียงพอสำหรับงานแม่พิมพ์อิเล็กทรอนิกส์ สาเหตุที่ค่อนข้างซับซ้อน แต่คุณสามารถอ่านเพิ่มเติมหากคุณสนใจที่ boallen.com .

ดาวน์โหลด ทรูแรนดอม ห้องสมุดโดย เซอร์ลีช บน Github เพิ่มสิ่งนี้ในโฟลเดอร์ไลบรารีของคุณและรีสตาร์ท IDE

ตอนนี้สร้างไฟล์ใหม่และตั้งค่ารหัสเริ่มต้นของคุณ (หรือเพียงแค่คว้ารหัสที่เสร็จแล้วจาก GitHub):

#include
#include
#include
#include
#include
Adafruit_SSD1306 display(4);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // setup the OLED
pinMode(buttonPin, INPUT); // setup button
}
void loop() {

}

รหัสนี้กำหนดค่า OLED และรวมไลบรารีทั้งหมดที่คุณต้องการสื่อสารกับมัน พร้อมด้วยไลบรารีหมายเลขสุ่มใหม่ของคุณ เพิ่มสิ่งนี้ในลูปหลัก:

if(digitalRead(buttonPin) == HIGH) {
delay(15);
if(digitalRead(buttonPin) == HIGH) {
display.fillScreen(BLACK); // erase the whole display
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 0);
display.println(TrueRandom.random(1, 21)); // print random number
display.display(); // write to display
delay(100);
}
}

มันค่อนข้างธรรมดาในนาทีนี้ แต่มันก็เป็น D20 ที่ใช้งานได้ เมื่อใดก็ตามที่กดปุ่ม หมายเลขสุ่มระหว่างหนึ่งถึง 20 จะปรากฏขึ้นบนหน้าจอ:

มันใช้งานได้ดี แต่มันน่าเบื่อไปหน่อย มาทำให้มันดีขึ้นกันเถอะ สร้างสองวิธีใหม่ drawDie และ ลบDie :

void drawDie() {
display.drawRect(32, 0, 64, 64, WHITE);
}

สิ่งเหล่านี้จะวาดแม่พิมพ์ตรงกลางหน้าจอ คุณอาจต้องการทำให้สิ่งนี้ซับซ้อนยิ่งขึ้น โดยอาจโดยการวาด D20 หรือ D12 และอื่นๆ แต่การวาดแม่พิมพ์หกด้านแบบพื้นฐานจะง่ายกว่า นี่คือการใช้งานพื้นฐาน:

drawDie();

ถัดไป แก้ไขลูปหลักของคุณเพื่อวาดตัวเลขสุ่ม โดยมีขนาดใหญ่กว่าและอยู่ตรงกลาง เปลี่ยนขนาดข้อความและเคอร์เซอร์เป็นสิ่งนี้:

display.setTextColor(WHITE);
display.setCursor(57, 21);

มันดูดีขึ้นมากในขณะนี้:

ปัญหาเดียวคือกับตัวเลขที่มากกว่าเก้า:

การแก้ไขปัญหานี้เป็นเรื่องง่าย ตัวเลขใดๆ ที่น้อยกว่า 10 จะถูกตั้งเคอร์เซอร์ไว้ที่ตำแหน่งที่แตกต่างจากตัวเลข 10 หรือใหญ่กว่านั้น แทนที่บรรทัดนี้:

การเข้าเว็บลึกผิดกฎหมายไหม
display.setCursor(57, 21);

ด้วยสิ่งนี้:

int roll = TrueRandom.random(1, 21); // store the random number
if (roll <10) {
// single character number
display.setCursor(57, 21);
}
else {
// dual character number
display.setCursor(47, 21);
}

นี่คือสิ่งที่ดูเหมือนตอนนี้:

เหลือเพียงภาพเมื่อคุณหมุนคริติคอลหรือพลาด มีขั้นตอนที่เกี่ยวข้องไม่กี่ขั้นตอน แต่เป็นกระบวนการที่ง่ายพอสมควร

ค้นหาภาพที่เหมาะสมที่คุณต้องการใช้ (ยิ่งง่ายยิ่งดีเพราะจอภาพมีสีเดียวเท่านั้น) นี่คือภาพที่ฉันใช้:

เครดิตรูปภาพ: publicdomainvectors.org

รูปภาพใดๆ ที่คุณต้องการใช้จะต้องแปลงเป็นอาร์เรย์ HEX นี่คือการแสดงรูปภาพในรูปแบบโค้ด มีเครื่องมือมากมายในการทำเช่นนี้ และบางเครื่องมือก็เขียนขึ้นสำหรับจอแสดงผล OLED โดยเฉพาะ วิธีที่ง่ายที่สุดคือการใช้ รูปภาพtoC_Hex เครื่องมือออนไลน์ นี่คือการตั้งค่าที่จำเป็น:

จะบอกได้อย่างไรว่าฉันมีการ์ดจออะไร windows 10

อัปโหลดรูปภาพของคุณและตั้งค่ารูปแบบโค้ดเป็น HEX:0x . ชุด ใช้สำหรับ ถึง สีดำ/ขาวสำหรับฟังก์ชั่นการวาดภาพทั้งหมด . ปล่อยให้ตัวเลือกอื่นๆ ทั้งหมดเป็นค่าเริ่มต้น คุณสามารถปรับขนาดรูปภาพได้ที่นี่หากต้องการ กด รับ C String และคุณควรเห็นข้อมูลภาพปรากฏขึ้น:

คุณจะต้องใช้ข้อมูลที่สร้างขึ้นนี้ในไม่กี่นาที สร้างสองฟังก์ชันที่เรียกว่า วาดระเบิด และ drawSkull (หรือชื่อที่เหมาะสมสำหรับเวอร์ชันของคุณ) นี่คือรหัส:

void drawExplosion() {
// store image in EEPROM
static const unsigned char PROGMEM imExp[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x78,0x7f,0xff,0xc0,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xf0,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,0xfb,0x00,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xc0,0x00,0x00,0x7f,0xff,0xff,0xff,0xff,0xff,0x00,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xfe,0x00,0x00,0x07,0xff,0xff,0xf9,0xff,0xd8,0x00,0x00,0x00,0x3f,0xff,0xf0,0x0f,0x00,0x00,0x00,0x00,0x1f,0x1f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xff,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xff,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0xbf,0xff,0xff,0xff,0x30,0x00,0x00,0x00,0x13,0xf7,0xb8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
display.drawBitmap(0, 0, imExp, 64, 62, 1); // draw mushroom cloud
}
void drawSkull() {
// store image in EEPROM
static const unsigned char PROGMEM imSku[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x78,0x00,0x07,0xf0,0x00,0x00,0x00,0x00,0xfc,0x00,0x07,0xf8,0x00,0x00,0x00,0x00,0xfe,0x00,0x07,0xf8,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfc,0x00,0x00,0x00,0x01,0xfe,0x00,0x07,0xfe,0x00,0x3f,0xc0,0x03,0xfe,0x00,0x01,0xff,0x81,0xff,0xfc,0x07,0xec,0x00,0x00,0x3f,0xc7,0xff,0xff,0x1f,0xc0,0x00,0x00,0x0f,0xcf,0xff,0xff,0xdf,0x00,0x00,0x00,0x07,0xbf,0xff,0xff,0xee,0x00,0x00,0x00,0x01,0x7f,0xff,0xff,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x01,0xff,0xff,0xff,0xf8,0x00,0x00,0x00,0x03,0xff,0xff,0xff,0xfc,0x00,0x00,0x00,0x07,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1f,0xff,0xff,0xff,0xff,0x80,0x00,0x00,0x1e,0x3f,0xff,0x3f,0xc7,0x80,0x00,0x00,0x1e,0x0c,0x0f,0x00,0x07,0x80,0x00,0x00,0x1e,0x00,0x0f,0x00,0x0f,0x80,0x00,0x00,0x1e,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0f,0x00,0x19,0x80,0x0f,0x00,0x00,0x00,0x0d,0x00,0x30,0xc0,0x1f,0x00,0x00,0x00,0x05,0x80,0x70,0xc0,0x1e,0x00,0x00,0x00,0x05,0xf0,0xe0,0xe0,0x36,0x00,0x00,0x00,0x01,0xff,0xe0,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xc4,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0xcc,0x7f,0xf0,0x00,0x00,0x00,0x03,0xff,0x9e,0x7f,0xf0,0x00,0x00,0x00,0x00,0xff,0xfe,0x7f,0xc0,0x00,0x00,0x00,0x00,0x01,0xff,0xf8,0x1c,0x00,0x00,0x00,0x03,0xe0,0x3f,0x01,0xbf,0x00,0x00,0x00,0x07,0xa6,0x40,0x09,0x9f,0x80,0x00,0x00,0x1f,0x27,0x5a,0x39,0x9f,0xf8,0x00,0x01,0xff,0x27,0xdb,0x39,0x0f,0xfc,0x00,0x03,0xfe,0x31,0x7f,0x39,0x07,0xfc,0x00,0x03,0xfc,0x10,0x1a,0x02,0x03,0xf8,0x00,0x03,0xf8,0x10,0x00,0x02,0x01,0xf0,0x00,0x01,0xf8,0x10,0x00,0x02,0x01,0xe0,0x00,0x00,0x78,0x10,0x00,0x02,0x00,0xe0,0x00,0x00,0x70,0x30,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x20,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x73,0x55,0x63,0x00,0x00,0x00,0x00,0x00,0xf9,0x55,0x4f,0x00,0x00,0x00,0x00,0x00,0x7f,0x14,0x1f,0x00,0x00,0x00,0x00,0x00,0x1f,0xe0,0xfe,0x00,0x00,0x00,0x00,0x00,0x0f,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x07,0xff,0xf0,0x00,0x00,0x00,0x00,0x00,0x03,0xff,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
display.drawBitmap(0, 0, imSku, 60, 64, 1); // draw skull cloud
}

หากคุณต้องการใช้รูปภาพที่ฉันใช้ ให้คัดลอกโค้ด หากคุณต้องการใช้ภาพของคุณเองที่คุณสร้างไว้ก่อนหน้านี้ ให้คัดลอกโค้ดไบต์ลงในไฟล์ imSku และ imExp อาร์เรย์ตามต้องการ

นี่คือลักษณะที่ปรากฏบนจอแสดงผล:

ส่วนที่สำคัญที่สุดของรหัสนั้นคือบรรทัดนี้:

static const unsigned char PROGMEM imSku[]

สิ่งนี้บอกให้ Arduino เก็บภาพของคุณใน EEPROM ( EEPROM คืออะไร? ) แทนที่จะเป็น RAM ( คู่มือฉบับย่อสำหรับ RAM ). เหตุผลนี้ง่าย Arduino มี RAM จำกัด และการใช้งานทั้งหมดเพื่อจัดเก็บภาพอาจไม่เหลือให้โค้ดของคุณทำงาน

แก้ไขหลักของคุณ ถ้า คำสั่งเพื่อแสดงกราฟิกใหม่เหล่านี้เมื่อมีการทอยหนึ่งหรือ 20 สังเกตบรรทัดของรหัสเพื่อแสดงตัวเลขควบคู่ไปกับรูปภาพด้วย:

if(roll == 20) {
drawExplosion();
display.setCursor(80, 21);
display.println('20');
}
else if(roll == 1) {
display.setCursor(24, 21);
display.println('1');
drawSkull();
}
else if (roll <10) {
// single character number
display.setCursor(57, 21);
display.println(roll); // write the roll
drawDie(); // draw the outline
}
else {
// dual character number
display.setCursor(47, 21);
display.println(roll); // write the roll
drawDie(); // draw the outline
}

และนี่คือสิ่งที่ม้วนใหม่เหล่านั้นดูเหมือน:

นั่นคือทั้งหมดสำหรับด้านรหัส (ไปคว้ารหัสจาก GitHub หากคุณข้ามไปทั้งหมด) คุณสามารถปรับเปลี่ยนให้เป็น D12, D8 และอื่นๆ ได้อย่างง่ายดาย

การประกอบขั้นสุดท้าย

เมื่อทุกอย่างเสร็จเรียบร้อยแล้ว ก็ถึงเวลาใส่กล่องทุกอย่าง ใส่จอแสดงผล ตรวจสอบให้แน่ใจว่าไม่ได้ขันน็อตแน่นเกินไป นี่อาจเป็นส่วนที่ยากที่สุด ฉันทำหน้าจอแตกเพราะฉะนั้นคุณอาจต้องการใช้เครื่องซักผ้าพลาสติก ฉันตัดสี่เหลี่ยมบางส่วนออกจาก พลาสการ์ด :

น็อตและสลักเกลียวขนาดเล็กอาจเชื่อมต่อได้ยาก เคล็ดลับ: ใช้ Blu-Tack ชิ้นเล็กๆ ที่ปลายไขควงเพื่อใส่น็อตในตอนแรก:

ขันปุ่ม ต่อแบตเตอรี่ และปิดฝา ระวังอย่าพันสายไฟหรือมัดแน่นเกินไป อาจทำให้สายขาดได้ ขึ้นอยู่กับความยาวของลีดต่อท้ายของคุณ คุณอาจต้องป้องกันการเชื่อมต่อที่เปิดเผยด้วยฉนวนบางส่วน (กล่องอนุกรมทำงานได้ดี):

นี่คือสิ่งที่ดูเหมือนภายใน:

และนี่คือผลิตภัณฑ์สำเร็จรูป:

ตอนนี้คุณควรเป็นเจ้าของ D20 อิเล็กทรอนิกส์ที่น่าภาคภูมิใจ!

คุณทำการปรับเปลี่ยนอะไร? คุณเปลี่ยนภาพหรือไม่? แจ้งให้เราทราบในความคิดเห็น เราชอบที่จะเห็นสิ่งที่คุณทำ!

แบ่งปัน แบ่งปัน ทวีต อีเมล คู่มือสำหรับผู้เริ่มต้นในการพูดแบบเคลื่อนไหว

การพูดแบบเคลื่อนไหวอาจเป็นเรื่องท้าทาย หากคุณพร้อมที่จะเริ่มเพิ่มบทสนทนาในโครงการของคุณ เราจะแบ่งขั้นตอนให้คุณ

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • DIY
  • Arduino
  • เกมกระดาน
  • อิเล็กทรอนิกส์
เกี่ยวกับผู้เขียน โจ โคเบิร์น(136 บทความที่ตีพิมพ์)

โจสำเร็จการศึกษาด้านวิทยาการคอมพิวเตอร์จากมหาวิทยาลัยลินคอล์น ประเทศอังกฤษ เขาเป็นนักพัฒนาซอฟต์แวร์มืออาชีพ และเมื่อเขาไม่ได้ขับโดรนหรือเขียนเพลง เขามักจะถูกมองว่าถ่ายภาพหรือผลิตวิดีโอ

เพิ่มเติมจาก Joe Coburn

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก
หมวดหมู่ Diy