blog.ijacek007.cz

Blog o všem trochu jinak.

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.


obrázek Propojené komponenty

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.


obrázek ESP8266

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.


obrázek Rozmnístění bodů elektronické kostky

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.


obrázek elektronická kostka v akci :-)


obrázek schéma zapojení


obrázek Prostředí Arduino

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


Štítky článku deti | elektronika | myslenky | zajimavosti |
Autor Ijacek.007 27.01.2019 Opravil(a) sokorka zobrazeno 716x
Předchozí článek Poznatky o práci solárních panelu, UPS modulu a ESP8266


gravatar

Vložit komentář

Nick *:
WWW:
Email * (nezobrazuje se ):
Gravatar:
Pamatuj si mě:
Komentář článku *:
Opiš následující text: *

* - vyžadované údaje. RSS kanál s komentáři

Přihlášení



Audioknihy

Jsme milovníci audio knížek, kterých aktuálně máme zakoupených 130. Poslech všech dohromady zabral přes 1875 hodin.

Z tohoto množství jsme si již stihli poslechnout téměř 45% tedy 59 audioknih.

Aktuálně poslouchaná audioknihakniha je Marťan

Poslední hodnocenou audioknihou je Nabíječ .

Nejlépe hodnocenou audioknihou je Astronautův průvodce životem na Zemi .

Reklama