Vill du ha något som är lite unikt för ditt nästa bordspel rollspel? Vad sägs om en elektronisk D20 med anpassad grafik för kritiska träffar och missar? Idag visar jag dig hur du bygger din egen med en Arduino och några enkla delar.
Oroa dig inte om du aldrig har använt en Arduino innan vi har en startguide. Komma igång med Arduino: En nybörjarhandbok Komma igång med Arduino: En nybörjarguide Arduino är en öppen källkods elektronikprototypplattform baserad på flexibel, att använda maskinvara och programvara. Den är avsedd för artister, designers, hobbyister och alla som är intresserade av att skapa interaktiva objekt eller miljöer. Läs mer .
Byggplan
Detta är ett enkelt projekt. En Arduino kommer att köra en OLED-skärm, och en knapp rullar munstycket. Anpassad grafik kommer att visa för kritiska träffar eller kritiska missrullar. Du kan enkelt ändra koden för att vara en D8, D10 eller D12.
Vad du behöver
- 1 x Arduino
- 1 x 0, 96 "I2C OLED-skärm
- 1 x tryckknapp
- 1 x 10k? Motstånd
- 1 x brödbräda
- Assorted hook up wires
- Fullständig kod här, om du inte vill följa hela vägen genom de skriftliga instruktionerna.
Det är kärndelarna du behöver för att bygga din egen D20. Du kanske vill installera den i ett fall (diskuteras nedan) och löd kretsen till ett mer permanent tillstånd. Här är de extra delarna du behöver göra:
- 4 x M2 x 10 mm (0, 4 tum) bultar
- 4 x M2 muttrar
- 4 x 7 mm (0, 28 tum) brickor
- 9V batteri snap (eller lämpligt alternativ)
- Assorterad värmekrympslang
Dessa OLED-skärmar är väldigt coola. De kan vanligtvis köpas i vit, blå, gul eller en blandning av de tre. Jag har köpt en i blått, för att matcha mitt fall. Se till att du får en I2C- modell istället för SPI .
Nästan alla Arduino kommer att vara lämpliga. Jag har valt en nano, eftersom de är små nog att passa in i fallet. Kolla in vår köpguide Arduino Köpguide: Vilket styrelse ska du få? Arduino Köpguide: Vilket styrelse ska du få? Det finns så många olika typer av Arduino brädor där ute, du skulle bli förlåtad för att vara förvirrad. Vilket ska du köpa för ditt projekt? Låt oss hjälpa till med den här Arduino-köpguiden! Läs mer för mer information om Arduino modeller.
Kretskortet
Här är kretsen du behöver:
Anslut VCC och GND på OLED-skärmen till Arduino + 5V och jord . Anslut analoga 4 på Arduino till PIN-märkt SDA . Anslut analoga 5 till SCL- stiftet. Dessa stiften innehåller de kretsar som behövs för att driva displayen med hjälp av I2C-bussen. De exakta stiften varierar beroende på modell, men A4 och A5 används på Nano och Uno. Kontrollera dokumentationen för trådbiblioteket för din modell om du inte använder en Uno eller Nano.
Anslut batteriet till jord och VIN- stiftet. Detta står för spänning i och accepterar en mängd olika likspänningar - men kontrollera din specifika modell först och det kan ibland variera något.
Anslut knappen till digital stift 2 . Lägg märke till hur 10k? motståndet är anslutet till jord. Det här är väldigt viktigt! Detta är känt som ett drag ner motstånd, och det förhindrar att Arduino upptäcker falska data eller störningar som en knapptryckning. Det tjänar också till att skydda styrelsen. Om detta motstånd inte användes skulle + 5V gå direkt i marken. Detta är känt som en död kort och är ett enkelt sätt att döda en Arduino.
Om du lödar denna krets, skydda dina anslutningar med värmekrympslang:
Se till att du inte värmer upp det för mycket, och gör det bara när du är säker på att kretsen fungerar. Du kanske också vill vrida dina kablar i par. Detta håller dem snygga och hjälper till att skydda dem mot otillbörlig stress:
Knapptest
Nu när du har byggt kretsen, ladda upp den här testkoden (se till att du väljer rätt bräde och port från Verktyg> Styrelse och Verktyg> Portmenyer):
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); } }
När du har laddat upp, behåll Arduino ansluten via USB och öppna seriell bildskärm ( Top Right> Serial Monitor ). Du borde se orden Det verkar visas varje gång du trycker på knappen.
Om inget händer, gå och dubbelkollera din krets.
OLED-inställning
Du måste installera två bibliotek för att köra skärmen. Hämta Adafruit_SSD1306- och Adafruit-GFX-biblioteken från Github, och spara dem i din biblioteksmapp. Om du inte är säker på var bibliotekets mappar är, läs min retro spelhandledning Arduino Retro Gaming Med en OLED-skärm Arduino Retro Gaming Med en OLED-skärm Har du någonsin undrat hur mycket arbete du behöver för att skriva egna retrospel? Hur lätt är Pong att koda för Arduino? Läs mer, där jag konfigurerar samma skärm mer detaljerat.
Starta om din Arduino IDE och ladda upp en testskissa från menyn Arkiv> Exempel . Välj Adafruit SSD1306 och sedan ssd1306_128x64_i2c . Ladda upp den här koden (det tar ett tag), och du borde se massor av former och mönster på displayen:
Om inget händer, dubbelkontrollera dina anslutningar. Om det efter kontroll fortfarande inte fungerar, måste du ändra provkoden.
Ändra den här raden (i början av inställningsfunktionen ):
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
Till detta:
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
Detta berättar bibliotekets specifika detaljer om den bildskärm du använder. Du borde nu vara helt inställd på fortsättningen med byggnaden.
Fallet
Om du bygger detta på en brödbräda eller inte vill göra det, kan du hoppa över det här steget.
Jag designade och 3D tryckte den här rutan. Hämta filerna på Thingiverse. Oroa dig inte om du inte har en 3D-skrivare - onlinetjänster 3D-hubbar och shapeways tillhandahåller online-utskriftstjänster.
Du kan enkelt göra den här rutan av trä, eller genom att köpa en plastprojektlåda.
Locket är en enkel push fit design, och innehåller några utklipp för hårdvaran:
Koden
Nu när allt är klart är det dags för koden. Så här fungerar det i Pseudocode:
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
För att detta ska kunna fungera ordentligt måste ett slumptal genereras - det här är rullen på döet. Arduino har en slumptalsgenerator som kallas slumpmässig, men borde inte använda den. Även om det är tillräckligt bra för grundläggande slumpmässiga uppgifter, är det bara inte slumpmässigt nog för en elektronisk dö. Anledningen till varför är något komplicerat, men du kan läsa mer om du är intresserad av boallen.com.
Hämta TrueRandom-biblioteket av sirleech på Github. Lägg till det här i din bibliotekskatalog och starta om IDE.
Skapa nu en ny fil och ställ in din ursprungliga kod (eller ta bara den färdiga koden från 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() { }
Den här koden konfigurerar OLED och innehåller alla bibliotek du behöver kommunicera med, tillsammans med ditt nya slumpmässiga nummerbibliotek. Lägg nu till detta i huvudslingan:
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); } }
Det här är ganska grundläggande i minuten, men det är en fungerande D20. När knappen trycks in visas ett slumptal mellan ett och 20 på skärmen:
Det fungerar bra, men det är lite tråkigt. Låt oss göra det bättre. Skapa två nya metoder, rita och ta bort dem :
void drawDie() { display.drawRect(32, 0, 64, 64, WHITE); }
Dessa kommer att dra en dörr mitt på skärmen. Du kanske vill göra det mer komplicerat, kanske genom att dra en D20, eller en D12 och så vidare, men det är enklare att rita en grundläggande sexsidig dö. Här är den grundläggande användningen:
drawDie();
Ändra sedan din huvudslinga för att dra slumpmässigt nummer, bara större och i mitten. Ändra textstorlek och markör till detta:
display.setTextColor(WHITE); display.setCursor(57, 21);
Det ser mycket bättre ut nu:
Det enda problemet är med siffror större än nio:
Åtgärden för detta är enkelt. Alla siffror mindre än 10 kommer att ha markören inställd till en annan position än de siffrorna 10 eller större. Byt ut denna rad:
display.setCursor(57, 21);
Med detta:
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); }
Så här ser det ut nu:
Allt som är kvar nu är för bilderna när du rullar en kritisk träff eller miss. Det är några steg involverade, men det är en enkel nog process.
Hitta en lämplig bild som du vill använda (ju enklare desto bättre är det att displayen endast är enfärgad). Här är bilderna jag använde:
Alla bilder du vill använda måste konverteras till en HEX-array. Detta är en representation av bilden i kodformat. Det finns många verktyg tillgängliga för detta, och vissa är skrivna specifikt för OLED-skärmar. Det enklaste sättet är att använda PicturetoC_Hex onlineverktyget. Här är de inställningar som behövs:
Ladda upp din bild och sätt kodformatet till HEX: 0x . Set Används för till Svart / Vit för alla dragningsfunktioner . Lämna alla andra alternativ som standardinställningar. Du kan ändra storlek på bilden här om du behöver. Tryck på Get C String och du bör se bilddata visas:
Du behöver den här genererade data på en minut. Skapa två funktioner som heter drawExplosion och drawSkull (eller ett lämpligt namn för din version). Här är koden:
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 }
Om du vill använda bilderna jag har använt, fortsätt och kopiera koden. Om du vill använda dina egna bilder du genererade tidigare kopierar du bytekoden i imSku och imExp-arrayerna efter behov.
Så här ser de här bilderna ut på displayen:
Den viktigaste delen av den koden är den här raden:
static const unsigned char PROGMEM imSku[]
Detta berättar för Arduino att lagra dina bilder i EEPROM (vad är EEPROM? Hur man använder Arduino EEPROM för att spara data mellan strömcykler Hur man använder Arduino EEPROM för att spara data mellan strömcykler Visste du att Arduino kan lagra data när den är avstängd ? Jag pratar om EEPROM, så kom med mig när jag visar dig hur man läser och skriver till den. Läs mer) istället för RAM (snabb guide till RAM En snabb och smutsig guide till RAM: Vad du behöver veta Snabb och smutsig guide till RAM: Vad du behöver veta RAM är en avgörande del av varje dator, men det kan vara förvirrande att förstå om du inte är en teknologisk guru. I det här inlägget bryter vi ner det i lätt-till- förstå villkor. Läs mer). Anledningen till detta är enkelt; Arduino har begränsad RAM, och om du använder allt för att lagra bilder får du inte lämna några återstående för att din kod ska utföras
Ändra ditt huvudförklaring om du vill visa den här nya grafiken när en eller 20 rullas. Notera koden för att visa numret som rullas tillsammans med bilderna också:
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 }
Och här ser de nya rullarna ut:
Det är allt för kodsidan (ta tag i koden från GitHub om du hoppar över allt). Du kan enkelt ändra detta för att vara en D12, D8, och så vidare.
Slutmontering
Nu när allting är klart, är det dags att lägga allt upp. Skruva på displayen, var noga med att inte skruva fast bultarna. Det här är kanske den svåraste delen. Jag knäckte en bildskärm så att du kanske vill använda några plastskivor. Jag skär några kvadrater ur Plasticard:
De små muttrarna och bultarna kan vara knepiga att ansluta. Tips: Använd en liten bit Blu-Tack på änden av en skruvmejsel för att i första hand sitta på muttrarna:
Skruva på knappen, anslut batteriet och stäng locket. Var försiktig så att du inte fäller några trådar, eller buntar dem för hårt, eventuellt orsakar en kortslutning. Beroende på längden på dina bakledare kan du behöva skydda utsatta anslutningar med viss isolering (en seriell låda fungerar bra):
Här är hur det ser ut som inuti:
Och här är den färdiga produkten:
Du borde nu vara den stolta ägaren till en elektronisk D20!
Vilka ändringar gjorde du? Ändrade du bilderna? Låt oss veta i kommentarerna, vi skulle gärna se vad du gjorde!