Dnes Vám ukážu, jak si vytvořit elektronickou hrací kostku. Kostka bude využívat Led displej 8×8 a bude využívat bezdotykové ovládání.
Vše co tedy budeme potřebovat, je destička s kompatibilním Arduino zařízením. Já jsem využil menší čip ESP8266 s WiFi modulem na desce Nodemcu, ale samozřejmě lze využít klasické Arduino nebo Arduino Nano. Jen jsem prostě měl doma navíc tento modul. Dále je potřeba samotná LED 8×8 displej a poté pro ovládání infračervený modul sledování bílé čáry TCRT5000.
Zapojení je velice jednoduché. K napájení všech modulů využívám 3.3V přímo z desky Nodemcu. Ta pro své napájení může využívat 5V USB konektor a tak lze celou kostku napájet z USB, třeba pomocí POWERBANKY. Celé zapojení jsem pak schoval do průhledné krabičky, ve které je jediný otvor na USB kabel.
Princip fungování je jednoduchý. Při zakrytí optické závory a jejím opětovném uvolnění, například prstem, se vybere náhodné číslo mezi 10 a 14 náhodnými čísly kostky. Zde je náhodně vybráno číslo mezi 1 a 6.
Postup losování se postupně zpomaluje, až se nakonec zastaví a na displeji se zobrazí obrázek kostky. Pro celé losování jsem použil funkci intro() pro zobrazené konkrétní podoby kostky, poté slouží funkce rozsvit, která jako parametr používá právě číslo, které má zobrazit. Na začátku každého průchodu funkcí se nejdříve všechny body zhasnou a poté se nastaví, které odpovídají pozici na kostce.
Zdrojový kód
// LED matice s MAX7219
// připojení potřebné knihovny
#include "LedControl.h"
// upraven soubor pro fungování s ESP
// J:\arduino\libraries\LedControl\src/LedControl.h:30:26: fatal error: avr/pgmspace.h:
// nastavení propojovacích pinů
#define DIN 4
#define CS 14
#define CLK 12
#define SIGNAL 16
int signalstate = 1;
int lastsignalstate = 1;
// tato proměnná údává počet matic,
// počítání začíná od nuly
#define leddis 0
// inicializace LED matice z knihovny
LedControl led8=LedControl(DIN, CLK, CS, leddis);
// proměnná typu pole, 1 označují rozsvícené LED
int poc = -1;
int rozinej = 1;
void setup() {
Serial.begin(9600); // zapnutí seriové komunikace
pinMode(SIGNAL, INPUT); // nastavení na příjem signálu
// probuzení matice pro zahájení komunikace
led8.shutdown(leddis,false);
// nastavení LED matice na střední svítivost (0-15)
led8.setIntensity(leddis,7);
// vypnutí všech LED diod na matici
led8.clearDisplay(leddis);
}
void intro( ) {
led8.clearDisplay(leddis);
int pocet_c = ( random(10, 15));
int rychlost = 50*pocet_c;
for(poc=0;poc<pocet_c;poc++){
rozsvit( random(1, 7));
delay(poc*50);
}
}
void rozsvit( int poc) {
led8.clearDisplay(leddis);
if (poc == 1){
led8.setLed(leddis,3,3,true);
led8.setLed(leddis,3,4,true);
led8.setLed(leddis,4,3,true);
led8.setLed(leddis,4,4,true);
}else if (poc == 2){
led8.setLed(leddis,0,5,true);
led8.setLed(leddis,0,6,true);
led8.setLed(leddis,1,5,true);
led8.setLed(leddis,1,6,true);
led8.setLed(leddis,6,1,true);
led8.setLed(leddis,6,2,true);
led8.setLed(leddis,7,1,true);
led8.setLed(leddis,7,2,true);
}
else if (poc == 3){
led8.setLed(leddis,0,5,true);
led8.setLed(leddis,0,6,true);
led8.setLed(leddis,1,5,true);
led8.setLed(leddis,1,6,true);
led8.setLed(leddis,3,3,true);
led8.setLed(leddis,3,4,true);
led8.setLed(leddis,4,3,true);
led8.setLed(leddis,4,4,true);
led8.setLed(leddis,6,1,true);
led8.setLed(leddis,6,2,true);
led8.setLed(leddis,7,1,true);
led8.setLed(leddis,7,2,true);
}else if (poc == 4){
led8.setLed(leddis,0,1,true);
led8.setLed(leddis,0,2,true);
led8.setLed(leddis,1,1,true);
led8.setLed(leddis,1,2,true);
led8.setLed(leddis,0,5,true);
led8.setLed(leddis,0,6,true);
led8.setLed(leddis,1,5,true);
led8.setLed(leddis,1,6,true);
led8.setLed(leddis,6,1,true);
led8.setLed(leddis,6,2,true);
led8.setLed(leddis,7,1,true);
led8.setLed(leddis,7,2,true);
led8.setLed(leddis,6,5,true);
led8.setLed(leddis,6,6,true);
led8.setLed(leddis,7,5,true);
led8.setLed(leddis,7,6,true);
}else if (poc == 5){
led8.setLed(leddis,0,1,true);
led8.setLed(leddis,0,2,true);
led8.setLed(leddis,1,1,true);
led8.setLed(leddis,1,2,true);
led8.setLed(leddis,0,5,true);
led8.setLed(leddis,0,6,true);
led8.setLed(leddis,1,5,true);
led8.setLed(leddis,1,6,true);
led8.setLed(leddis,3,3,true);
led8.setLed(leddis,3,4,true);
led8.setLed(leddis,4,3,true);
led8.setLed(leddis,4,4,true);
led8.setLed(leddis,6,1,true);
led8.setLed(leddis,6,2,true);
led8.setLed(leddis,7,1,true);
led8.setLed(leddis,7,2,true);
led8.setLed(leddis,6,5,true);
led8.setLed(leddis,6,6,true);
led8.setLed(leddis,7,5,true);
led8.setLed(leddis,7,6,true);
}else if (poc == 6){
led8.setLed(leddis,0,1,true);
led8.setLed(leddis,0,2,true);
led8.setLed(leddis,1,1,true);
led8.setLed(leddis,1,2,true);
led8.setLed(leddis,0,5,true);
led8.setLed(leddis,0,6,true);
led8.setLed(leddis,1,5,true);
led8.setLed(leddis,1,6,true);
led8.setLed(leddis,3,1,true);
led8.setLed(leddis,3,2,true);
led8.setLed(leddis,4,1,true);
led8.setLed(leddis,4,2,true);
led8.setLed(leddis,3,5,true);
led8.setLed(leddis,3,6,true);
led8.setLed(leddis,4,5,true);
led8.setLed(leddis,4,6,true);
led8.setLed(leddis,6,1,true);
led8.setLed(leddis,6,2,true);
led8.setLed(leddis,7,1,true);
led8.setLed(leddis,7,2,true);
led8.setLed(leddis,6,5,true);
led8.setLed(leddis,6,6,true);
led8.setLed(leddis,7,5,true);
led8.setLed(leddis,7,6,true);
}
}
void loop() {
// random(min, max)
//rozsvit( random(1, 7));
// přečteme signál ze snímače
signalstate = digitalRead(SIGNAL);
// porovnáme z předchozím stavem
if (signalstate != lastsignalstate) {
// if the state has changed, increment the counter
if (signalstate == HIGH) {
// spínano nulou pokud je na portu low
Serial.println("on");
intro( );
} else {
// if the current state is LOW then the button went from on to off:
Serial.println("off");
}
// Delay a little bit to avoid bouncing
delay(50);
}
// save the current state as the last state, for next time through the loop
lastsignalstate = signalstate;
delay(50);
// delay(1000);
}
To jestli je hra s elektronickou kostkou zábavnější, než s tou klasickou již nechám na Vás. Při hraní s elektronickou si netrénujete hod a příjdete o předávání kostky spoluhráčům. Digitální však zase nemusíte většinou hledat pod stolem. Celá elektronická kostka přitom nemá velký odběr a tak se mi u dvojice powerbank, které jsem zkoušel s kostkou stávalo, že powerbanky odpojovaly napětí a uspávaly se, bylo tak nutné několikrát za hru kostku zase zapnout. Vyřešit by tento problém šlo například přidáním baterií místo powerbanky, nicméně pro test funkčnosti mi bohatě powerbanka stačila.
Mohlo by Vás zajímat
Arduino led 8×8 ovládani jednotlivých bodů
ESP32 s oled displejem jako počítadlo odvinutých metrů
Měření teploty a vlhkosti ve foliovníku díky nodemcu s ESP8266
Vložit komentář
* - vyžadované údaje. RSS kanál s komentáři