Rull i stil med denne DIY Electronic D20 Die

Vil du ha noe unikt på ditt neste spillmøte? Sjekk ut denne DIY elektronisk D20, med tilpasset grafikk for kritiske treff og savner.

Vil du ha noe unikt på ditt neste spillmøte?  Sjekk ut denne DIY elektronisk D20, med tilpasset grafikk for kritiske treff og savner.
Annonse

Vil du ha noe unikt for ditt neste bordspill rollespill? Hva med en elektronisk D20 med tilpasset grafikk for kritiske treff og savner? I dag skal jeg vise deg hvordan du kan bygge din egen med en Arduino og noen få enkle deler.

Ikke bekymre deg hvis du aldri har brukt en Arduino før, vi har en startveiledning Komme i gang med Arduino: En nybegynnersveiledning Komme i gang med Arduino: En nybegynnersguide Arduino er en åpen kilde elektronikk prototyping plattform basert på fleksibel, å bruke maskinvare og programvare. Det er ment for kunstnere, designere, hobbyister, og alle som er interessert i å lage interaktive objekter eller miljøer. Les mer .

Bygg Plan

Dette er et enkelt prosjekt. En Arduino vil kjøre en OLED-skjerm, og en knapp vil rulle dysen. Egendefinert grafikk vil vise for kritiske hit eller kritiske savneruller. Du kan enkelt endre koden til å være en D8, D10 eller D12.

Hva trenger du

arduino_d20_what_you_need

  • 1 x Arduino
  • 1 x 0, 96 "I2C OLED-skjerm
  • 1 x trykknapp
  • 1 x 10k? motstand
  • 1 x brødbrett
  • Assortert koble opp ledninger
  • Full kode her, hvis du ikke vil følge hele veien gjennom de skriftlige instruksjonene.

Det er kjernedelen du trenger for å bygge din egen D20. Du kan ønske å installere den i et tilfelle (diskuteres nedenfor) og loddetableren til en mer permanent tilstand. Her er de ekstra delene du trenger for å gjøre det:

  • 4 x M2 x 10 mm (0, 4 tommer) bolter
  • 4 x M2 nøtter
  • 4 x 7 mm (0, 28 tommer) skiver
  • 9V batterispenning (eller egnet alternativ)
  • Assortert varmekrympeslange

Disse OLED-skjermene er veldig kule. De kan vanligvis kjøpes i hvitt, blått, gult eller en blanding av de tre. Jeg har kjøpt en i blått, for å matche saken min. Pass på at du får en I2C- modell i stedet for SPI .

Nesten noen Arduino vil være egnet. Jeg har valgt en nano, da de er små nok til å passe inn i saken. Sjekk ut vår kjøpeguide Arduino Kjøpsguide: Hvilket styre bør du få? Arduino Kjøpsguide: Hvilket styre bør du få? Det er så mange forskjellige typer Arduino boards der ute, du vil bli tilgitt for å være forvirret. Hvilken bør du kjøpe for prosjektet ditt? La oss hjelpe, med denne Arduino kjøpesiden! Les mer for mer informasjon om Arduino-modeller.

Kredsløpet

Her er kretsen du trenger:

arduino d20 krets

Koble VCC og GND på OLED-skjermen til Arduino + 5V og bakken . Koble analog 4 på Arduino til PIN-merket SDA . Koble analog 5 til SCL- pinnen. Disse pinnene inneholder kretsene som trengs for å kjøre skjermen ved hjelp av I2C-bussen. De eksakte pinnene vil variere etter modell, men A4 og A5 brukes på Nano og Uno. Sjekk Wirebibliotekets dokumentasjon for modellen din hvis du ikke bruker Uno eller Nano.

Koble batteriet til jord og VIN- pin. Dette står for spenning i, og aksepterer en rekke forskjellige DC spenninger - men sjekk din spesifikke modell først, og det kan noen ganger variere litt.

Koble til knappen til digital pin 2 . Legg merke til hvordan 10k? motstanden er koblet til bakken. Dette er veldig viktig! Dette er kjent som en nedtrekksmotstand, og det forhindrer at Arduino oppdager falske data eller forstyrrelser som en trykknapp. Det tjener også til å beskytte styret. Hvis denne motoren ikke ble brukt, ville + 5V gå rett i bakken. Dette er kjent som en død kort og er en enkel måte å drepe en Arduino på.

Hvis du løser denne kretsen, beskytter du forbindelsene med varmekrympeslanger:

arduino d20 heatshrink

Pass på at du ikke varme opp det for mye, og bare gjør det når du er sikker på at kretsen fungerer. Du kan også ønske å vri kablene i par. Dette holder dem ryddige og bidrar til å beskytte dem mot unødig stress:

arduino d20 snoede kabler

Knapptest

Nå som du har bygget kretsen, last opp denne testkoden (pass på å velge riktig brett og port fra Verktøy> Styret og Verktøy> 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 lastet opp, må du holde Arduino tilkoblet via USB og åpne seriell skjerm ( Topp høyre> Seriell skjerm ). Du bør se ordene Det virker vises hver gang du trykker på knappen.

Hvis ingenting skjer, gå og dobbelkjekke kretsen din.

OLED-oppsett

arduino oled test

Du må installere to biblioteker for å kjøre skjermen. Last ned Adafruit_SSD1306- og Adafruit-GFX-bibliotekene fra Github, og lagre dem i bibliotekets mappe. Hvis du ikke er sikker på hvor du er biblioteksmapper, kan du lese min retro spillveiledning. Arduino Retro Gaming Med en OLED-skjerm Arduino Retro Gaming med en OLED-skjerm. Noen gang lurt på hvor mye arbeid det tar å skrive egne retrospill? Hvor lett er Pong å kode for Arduino? Les mer, der jeg konfigurerer denne samme skjermen mer detaljert.

Start Arduino IDE på nytt og last opp en testskisse fra Fil> Eksempler- menyen. Velg Adafruit SSD1306 og deretter ssd1306_128x64_i2c . Last opp denne koden (det tar litt tid), og du bør se mange former og mønstre på skjermen:

arduino oled test

Hvis ingenting skjer, dobbeltklikk på tilkoblingene. Hvis det etter at du har sjekket det fortsatt ikke vil fungere, må du endre prøvekode.

Endre denne linjen (ved starten av oppsettfunksjonen ):

 display.begin(SSD1306_SWITCHCAPVCC, 0x3D); 

Til dette:

 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

Dette forteller bibliotekets spesifikke detaljer om skjermen du bruker. Du bør nå være satt til å fortsette med bygningen.

Saken

Hvis du bygger dette på en brettbrett, eller ikke ønsker å pakke det opp, kan du hoppe over dette trinnet.

arduino d20 tilfelle

Jeg har designet og 3D trykt denne boksen. Få filene på Thingiverse. Ikke bekymre deg hvis du ikke har en 3D-skriver - Internett-tjenester 3D Hubs og Shapeways tilbyr online utskriftstjenester.

Du kan enkelt gjøre denne boksen ut av tre, eller ved å kjøpe en plastprosjektboks.

Lokket er en enkel push-fit design, og inneholder noen utklipp for maskinvaren:

arduino d20 tilfelle

Koden

Nå som alt er klart, er det tid for koden. Slik fungerer 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 

For at dette skal fungere skikkelig, må et tilfeldig tall bli generert - dette er rollen til døra. Arduino har en tilfeldig talgenerator kalt tilfeldig, men bør ikke bruke den. Selv om den er god nok til grunnleggende tilfeldige oppgaver, er det ikke tilfeldig nok for en elektronisk dør. Årsakene til dette er noe komplisert, men du kan lese mer om du er interessert i boallen.com.

Last ned TrueRandom-biblioteket av sirleech på Github. Legg til dette i bibliotekmappen din og start IDEen på nytt.

Opprett nå en ny fil og sett opp din første kode (eller bare ta den ferdige koden fra 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() { } 

Denne koden konfigurerer OLED, og ​​inkluderer alle bibliotekene du trenger å kommunisere med det, sammen med ditt nye tilfeldige nummerbibliotek. Legg nå dette til hovedløkken:

 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); } } 

Dette er ganske grunnleggende i minuttet, men det er en fungerende D20. Når du trykker på knappen, vises et tilfeldig tall mellom en og 20 på skjermen:

arduino d20 første kode

Dette fungerer bra, men det er litt kjedelig. La oss gjøre det bedre. Lag to nye metoder, tegne og slette :

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

Disse vil tegne en dør midt på skjermen. Du kan ønske å gjøre dette mer komplisert, kanskje ved å tegne en D20 eller en D12 og så videre, men det er enklere å tegne en grunnleggende sekssidig dør. Her er grunnleggende bruken:

 drawDie(); 

Deretter endrer du hovedløkken for å tegne tilfeldig tall, bare større og i midten. Endre tekststørrelsen og markøren til dette:

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

Det ser mye bedre ut nå:

arduino d20 enkeltperson

Det eneste problemet er med tall større enn ni:

arduino d20 dual character

Fiksingen for dette er enkel. Eventuelle tall mindre enn 10 vil ha markøren satt til en annen posisjon enn tallene 10 eller større. Erstatt denne linjen:

 display.setCursor(57, 21); 

Med dette:

 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); } 

Her er det som ser ut som nå:

arduino d20 fast dual karakter

Alt som er igjen, er for bildene når du ruller en kritisk hit eller savner. Det er noen få skritt involvert, men det er en enkel nok prosess.

Finn et passende bilde du vil bruke (jo enklere jo bedre, siden skjermen kun er enfarge). Her er bildene jeg brukte:

arduino d20 kunstverk
Bildekreditt: publicdomainvectors.org

Ethvert bilde du vil bruke, må konverteres til et HEX-array. Dette er en representasjon av bildet i kodeform. Det er mange verktøy tilgjengelig for dette, og noen er skrevet spesielt for OLED-skjermer. Den enkleste måten er å bruke PicturetoC_Hex online verktøyet. Her er innstillingene som trengs:

arduino bilde til hex

Last opp bildet ditt, og sett kodeformatet til HEX: 0x . Sett Brukes til til svart / hvitt for alle tegnefilmfunksjoner . La alle de andre alternativene stå som standard. Du kan endre størrelsen på bildet her hvis du trenger det. Trykk på Get C String, og du bør se bildedataene:

arduino d20 bilde data

Du vil trenge denne genererte data om et minutt. Opprett to funksjoner kalt drawExplosion og drawSkull (eller et passende navn for din versjon). Her er 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 } 

Hvis du vil bruke bildene jeg har brukt, så fortsett og kopier koden. Hvis du vil bruke dine egne bilder du genererte tidligere, kopierer du bytekoden til imSku og imExp- arrays etter behov.

Slik ser bildene ut på skjermen:

arduino oled bilder

Den viktigste delen av koden er denne linjen:

 static const unsigned char PROGMEM imSku[] 

Dette forteller Arduino å lagre bildene dine i EEPROM (hva er EEPROM? Hvordan bruke Arduino EEPROM for å lagre data mellom effektsykluser. Hvordan bruke Arduino EEPROM for å lagre data mellom effektsykluser. Visste du at Arduino kan lagre data når den er slått av ? Jeg snakker om EEPROM, så bli med meg når jeg viser deg hvordan du leser og skriver til den. Les mer) i stedet for RAM-en (hurtig guide til RAM En rask og skitten guide til RAM: Hva du trenger å vite A Rask og skitten guide til RAM: Det du trenger å vite RAM er en avgjørende komponent i hver datamaskin, men det kan være forvirrende å forstå om du ikke er en teknologisk guru. I dette innlegget bryter vi det ned i lett-til- forstå vilkårene. Les mer). Årsaken til dette er enkel; Arduino har begrenset RAM, og bruk av alt for å lagre bilder kan ikke etterlate noen gjenværende for at koden skal utføres

Endre hovedoppsettet hvis du vil vise denne nye grafikken når en eller 20 rulles. Legg merke til kodelinjene for å vise nummeret rullet sammen med bildene også:

 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 } 

Og her ser de nye rollene ut som:

arduino d20 kritiske bilder

Det er alt for kodesiden (ta tak i koden fra GitHub hvis du hoppet over alt det). Du kan enkelt endre dette for å være en D12, D8, og så videre.

Sluttmontering

Nå som alt annet er ferdig, er det på tide å pakke alt opp. Skru på displayet, pass på at du ikke overtrer boltene. Dette er muligens den vanskeligste delen. Jeg sprakk en skjerm med det, så du kan ønske å bruke noen plastskiver. Jeg kuttet noen firkanter ut av Plasticard:

Arduino D20 Spacers

De små mutrene og boltene kan være vanskelig å koble til. Tips: Bruk et lite stykke Blu-Tack på enden av en skrutrekker for å sette opp mutterne:

Arduino D20 mutter

Skru på knappen, koble til batteriet og lukk lokket. Vær forsiktig så du ikke fanger noen ledninger, eller koble dem opp for tett, muligens forårsaker kortslutning. Avhengig av lengden på dine bakledninger, må du kanskje beskytte utsatte forbindelser med litt isolasjon (en seriell boks fungerer bra):

Arduino D20 Innvendig papp

Her ser det ut som det ser ut inni:

Arduino D20 Inside

Og her er det ferdige produktet:

Arduino D20 Skull

Du bør nå være den stolte eieren av en elektronisk D20!

Hvilke modifikasjoner gjorde du? Har du endret bildene? Gi oss beskjed i kommentarene, vi vil gjerne se hva du gjorde!

In this article