Operácie

LED Matica: Rozdiel medzi revíziami

Zo stránky SensorWiki

StudentDTV (diskusia | príspevky)
Bez shrnutí editace
StudentDTV (diskusia | príspevky)
Bez shrnutí editace
 
(2 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 6: Riadok 6:
Cieľom mojej práce je oboznámiť sa s programovaním LED matrixu pomocou Arduina. Ukážeme si funkcie a kreatívne nápady využitia 8x8 LED matice.
Cieľom mojej práce je oboznámiť sa s programovaním LED matrixu pomocou Arduina. Ukážeme si funkcie a kreatívne nápady využitia 8x8 LED matice.


[[Obrázok:ard.jpg|400px|thumb|center|Vývojová doska ACROB.]]
[[Súbor:Full_bogar.jpg|400px|center|Arduino s LED Matrixom.]]


'''Literatúra:'''  
'''Literatúra:'''  
Riadok 35: Riadok 35:
Kontrolerov VCC zapojíme na Arduinov 5V pin, a GND na jeden z dvoch GND pinov Arduina. Ostatné piny sa zapájajú na ľubovoľný digitálny výstupný pin Arduina. V tomto návode budú  
Kontrolerov VCC zapojíme na Arduinov 5V pin, a GND na jeden z dvoch GND pinov Arduina. Ostatné piny sa zapájajú na ľubovoľný digitálny výstupný pin Arduina. V tomto návode budú  
Din na Arduino D8, CS na D9 a CLK na D10.
Din na Arduino D8, CS na D9 a CLK na D10.
[[Súbor:Ardu_bogar.jpg|400px|center|Arduino zapojenie.]]
[[Súbor:Matrix_bogar.jpg|400px|center|LED Matrix zapojenie.]]


Ďalej potrebujeme nainštalovať vývojové prostredie [https://support.arduino.cc/hc/en-us/articles/360019833020-Download-and-install-Arduino-IDE Arduino IDE].
Ďalej potrebujeme nainštalovať vývojové prostredie [https://support.arduino.cc/hc/en-us/articles/360019833020-Download-and-install-Arduino-IDE Arduino IDE].
Riadok 65: Riadok 69:
</source>
</source>


Nižsie uvedený zdrojový kód obsahuje viacero funkcií zostavených pomocou vyššie uvedených jednoduchých metód. Veľa šťastia k experimentovaniu a bavte sa!
Nižsie uvedený zdrojový kód obsahuje viacero funkcií zostavených pomocou vyššie uvedených jednoduchých metód.
 
 
[[Súbor:ledRGB.jpg|400px|thumb|center|RGB LED.]]
 
Nezabudnite doplniť schému zapojenia!
 
[[Súbor:schd.png|400px|thumb|center|Schéma zapojenia LCD displeja.]]
 


=== Program ===
=== Program ===
Riadok 79: Riadok 75:


<tabs>
<tabs>
<tab name="Zdrojový kód"><source lang="c" style="background: LightYellow;">
<tab name="Zdrojový kód">
<source lang="c" style="background: LightYellow;">
//We always have to include the library
//We always have to include the library
#include "LedControl.h"
#include "LedControl.h"
Riadok 530: Riadok 527:
//18 kvintillion (18 trilion v sk num sys)
//18 kvintillion (18 trilion v sk num sys)


//1 125 899 906 842 624 seconds //1 biliarda
//1 125 899 906 842 624 seconds //quintilion / biliarda
//18 764 998 447 377 minutes //18 bilion
//18 764 998 447 377 minutes //trilion / 18 bilion
//31 274 997 412 hours // 31 miliarda
//31 274 997 412 hours // 31 miliarda
//1 303 124 892 days
//1 303 124 892 days
//3 567 761 years
//3 567 761 years


//In 3 million years due to tidal deceleration gradually slowing Earth's rotation, a day on Earth is expected to be one minute longer than it is today
// “Očakáva sa, že za 3 milióny rokov sa v dôsledku prílivového spomalenia postupne spomaľujúcej rotácie Zeme bude deň na Zemi o jednu minútu dlhší ako dnes.”
void counter(){
void counter(){
   for(unsigned long i=0;i<pow(2,64);i+=1){
   for(unsigned long i=0;i<pow(2,64);i+=1){
Riadok 560: Riadok 559:


void loop() {
void loop() {
  rows(150);
  columns(150);
  single(25);
   /*for spaces use _ char, for heart use {, for fei logo use ` char*/
   /*for spaces use _ char, for heart use {, for fei logo use ` char*/




   char word1[] = "stu_fei_`{";
   char word1[] = "stu_fei_`{";
   //char word[] = "9876543210";
   char word2[] = "9876543210";
   char word2[] = "peter_bogar_";
   char word3[] = "peter_bogar_";
 


   int delaytime=350;
   int delaytime=350;
   //counter();
   //counter();
   writeText(word1, delaytime);
   writeText(word1, delaytime);
  delay(2000);
  writeText(word2, 500);
   delay(1000);
   delay(1000);
   writeText(word2, delaytime);
   writeText(word3, delaytime);
   delay(1000);
   delay(2500);
 
  rows(150);
  columns(150);
    
    
   //delay(2000);
   delay(3000);
  single(25);
  delay(1000);
   settemp();
   settemp();
   delay(1000);
   delay(2500);
   snowy();
   snowy();
   delay(2500);
   delay(2500);
Riadok 593: Riadok 596:
   delay(2500);
   delay(2500);
   brightnessSwipe(100);
   brightnessSwipe(100);
  delay(2500);
   counter();
   counter();
}
}
Riadok 600: Riadok 604:
</tabs>
</tabs>


Pridajte sem aj zbalený kompletný projekt, napríklad takto (použite jednoznačné pomenovanie, nemôžeme mať na serveri 10x ''zdrojaky.zip'':
Zdrojový kód: [[Súbor:LCDemoMatrix_bogar.zip]]
 
Zdrojový kód: [[Médiá:projektMenoPriezvisko.zip|zdrojaky.zip]]
 
 
=== Overenie ===


Na používanie našej aplikácie stačia dve tlačítka a postup používania je opísaný v sekcii popis riešenia.
Na konci uvádzame fotku záverečnej obrazovky pred resetom. Vypísaný je tu priemerný čas a najlepší čas.


[[Súbor:fotka.jpg|400px|thumb|center|Aplikácia.]]
=== Zaver ===


'''Video:'''
Veľa šťastia k experimentovaniu a bavte sa!
<center><youtube>_l02MBu41n0</youtube></center>
[[Súbor:srdiecko_bogar.jpg|400px|thumb|center|Zaver]]




[[Category:DTV]][[Category:DTV2023]]
[[Category:DTV]][[Category:DTV2023]]

Aktuálna revízia z 21:24, 18. jún 2023

Záverečný projekt predmetu DTV / LS2023 - Peter Bogár


Úvod

Cieľom mojej práce je oboznámiť sa s programovaním LED matrixu pomocou Arduina. Ukážeme si funkcie a kreatívne nápady využitia 8x8 LED matice.

Chyba pri vytváraní náhľadu: Súbor s rozmermi väčšími než 12,5 MP
Arduino s LED Matrixom.

Literatúra:


Analýza a opis riešenia

Budeme potrebovať

Kontroler čip MAX7219 deserializuje dáta na dvojicu x,y signálov, ktoré rozosvietia danú led na x stĺpci a y riadku. Nám stačí poslať signál tomuto čipu jedným data pinom, namiesto 16 - jeden pre každý riadok a stĺpec.

Ak máte Arduino s nenaspájkovanými pinmi, je ich potrebné naspájkovať. Ak sú už naspájkované, preskakujte tento krok.

Začnime spojením kontroleru s Arduinom. Kontroler potrebuje 5 pinov: VCC = Napájanie GND = Uzemnenie Din = Data in CS = Chip Select CLK = Clock signal

Kontrolerov VCC zapojíme na Arduinov 5V pin, a GND na jeden z dvoch GND pinov Arduina. Ostatné piny sa zapájajú na ľubovoľný digitálny výstupný pin Arduina. V tomto návode budú Din na Arduino D8, CS na D9 a CLK na D10.

Arduino zapojenie.
Arduino zapojenie.
Chyba pri vytváraní náhľadu: Súbor s rozmermi väčšími než 12,5 MP
LED Matrix zapojenie.

Ďalej potrebujeme nainštalovať vývojové prostredie Arduino IDE. Po nainštalovaní si prostredia si importujeme knižnicu ledControl. Kliknutím na Tools v hornej lište a vybraním Manage Libraries sa dostaneme na obrazovku s prehliadačom knižníc. Vyhľadajme dopyt "LedControl", a stiahnime knižnicu od autora Eberhard. V tomto návode sme použili verziu 1.0.6.

#include "LedControl.h"

/*
 pin 8 is connected to the DataIn 
 pin 9 is connected to CS
 pin 10 is connected to the CLK 
 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(8,10,9,1);

Zadefinujme si objekt kontrolera v kóde. Objekt lc obsahuje niekoľko vstavaných funkcií, ktorými môžeme LED maticou manipulovať. Tie hlavné funkcie sú:

  lc.shutdown(0,false); //vypne úsporný režim (true=zapne)
  lc.setIntensity(0,0); //nastavi jasitosť displeju (druhe cislo)
  lc.clearDisplay(0); //vynuluje displej
  lc.setLed(0,7,7,true); //nastavi jednu ledku na vyp/zap
  lc.setRow(0,7,B11111111); //nastavi cely riadok naraz
  lc.setColumn(0,col,B11111111); //nastavi cely stlpec naraz

Nižsie uvedený zdrojový kód obsahuje viacero funkcií zostavených pomocou vyššie uvedených jednoduchých metód.

Program

//We always have to include the library
#include "LedControl.h"
#include "math.h"

/*
 pin 8 is connected to the DataIn 
 pin 9 is connected to CS
 pin 10 is connected to the CLK 
 
 We have only a single MAX72XX.
 */
LedControl lc=LedControl(8,10,9,1);



void printletter(byte letter[]){
  lc.setRow(0,0,letter[0]);
  lc.setRow(0,1,letter[1]);
  lc.setRow(0,2,letter[2]);
  lc.setRow(0,3,letter[3]);
  lc.setRow(0,4,letter[4]);

}

void writeText(char text[], long wait) {
  /* here is the data for the characters */
  byte a[5]={B01111110,B10001000,B10001000,B10001000,B01111110};
  byte b[5]={B01101100,B10010010,B10010010,B10010010,B11111110};
  byte c[5]={B01000100,B10000010,B10000010,B10000010,B01111100};
  byte d[5]={
    B01111100,
    B10000010,
    B10000010,
    B10000010,
    B11111110};
  byte e[5]={
    B00000000,
    B10010010,
    B10010010,
    B10010010,
    B11111110};
  byte f[5]={
    B00000000,
    B10010000,
    B10010000,
    B10010000,
    B11111110};
  
  byte g[5]={
    B00000000,
    B10011100,
    B10010010,
    B10000010,
    B01111100};

  byte h[5]={
    B00000000,
    B11111110,
    B00010000,
    B00010000,
    B11111110};

  byte i[5]={
    B00000000,
    B00000010,
    B10111110,
    B00100010,
    B00000000
    };

  byte j[5]={
    B00000000,
    B00000000,
    B10111110,
    B00000010,
    B00000100
    };

  byte k[5]={
    B00000000,
    B11000110,
    B00101000,
    B00010000,
    B11111110};

  byte l[5]={
    B00000000,
    B00000000,
    B00000010,
    B00000010,
    B11111110};

  byte m[5]={
    B11111110,
    B01000000,
    B00100000,
    B01000000,
    B11111110};

  byte n[5]={
    B11111110,
    B00000110,
    B00011000,
    B01100000,
    B11111110};

  byte o[5]={
      B0011100,
      B0100010,
      B0100010,
      B0100010,
      B0011100};

  byte p[5]={
    B00000000,
    B01100000,
    B10010000,
    B10010000,
    B11111110};

  byte q[5]={
    B00011010,
    B00100100,
    B00101010,
    B00100010,
    B00011100};

  byte r[5]={
    B00000000,
    B01101110,
    B10010000,
    B10010000,
    B11111110};


  byte s[5]={
    B00000000,
    B01001100,
    B10010010,
    B10010010,
    B01100100};

  byte t[5]={
    B11000000,
    B10000000,
    B11111110,
    B10000000,
    B11000000};

  byte u[5]={
    B11111110,
    B00000010,
    B00000010,
    B00000010,
    B11111110};


  byte v[5]={
    B11111000,
    B00000100,
    B00000010,
    B00000100,
    B11111000};

  byte w[5]={
    B11111000,
    B00000100,
    B00011000,
    B00000100,
    B1111100};

  byte x[5]={
    B11000110,
    B00101000,
    B00010000,
    B00101000,
    B11000110};

  byte y[5]={
    B11100000,
    B00010000,
    B00011110,
    B00010000,
    B11100000};

  byte z[5]={
    B11000110,
    B10100010,
    B1001001,
    B10001010,
    B10000110};

  byte zero[5]={
    B01111100,
    B10001010,
    B10010010,
    B10100010,
    B01111100};

  byte one[5]={
    B00000000,
    B00000000,
    B11111110,
    B01000000,
    B00000000};

  byte two[5]={
    B01110010,
    B10010010,
    B10010010,
    B01001010,
    B01100110};

  byte three[5]={
    B01101100,
    B10010010,
    B10010010,
    B10000010,
    B01000100};

  byte four[5]={
    B00000000,
    B00001000,
    B00111110,
    B00001000,
    B11111000};

  byte five[5]={
    B00000000,
    B1000110,
    B10010010,
    B10010010,
    B11110100};

  byte six[5]={
    B00000000,
    B0100110,
    B10010010,
    B10010010,
    B01111100};

  byte seven[5]={
    B00000000,
    B11000000,
    B10110000,
    B10001110,
    B10000000};

  byte eight[5]={
    B00000000,
    B01101100,
    B10010010,
    B10010010,
    B01101100};

  byte nine[5]={
    B00000000,
    B11111110,
    B10010010,
    B10010010,
    B11110010};

  byte space[5]={
    B00000000,
    B00000000,
    B00000000,
    B00000000,
    B00000000};

  byte heart[5]={
    B00111000,
    B01000100,
    B00100010,
    B01000100,
    B00111000
    };

    byte fei[5]={
    B00000010,
    B00000000,
    B00001010,
    B00000000,
    B00101010
    };

  byte* alphabet[] = {space,fei,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,heart};
  byte* numbers[] = {zero,one,two,three,four,five,six,seven,eight,nine};


  /*for spaces use _ char, for heart use {, for fei logo use ` char*/
  /*char word[] = "`stu_fei_{";*/
  for(int i=0;i<strlen(text);i++){
    int letter = text[i];
    char* letter2;
    if(letter > 47 && letter < 58){
      letter2 = numbers[letter-48];  
    }
    else{
      letter2 = alphabet[letter - 95];
    }
    printletter(letter2);
    delay(wait);
  }
}

void rows(int delaytime) {
  for(int row=0;row<8;row++) {
    delay(delaytime);
    lc.setRow(0,row,B11111111);
    delay(delaytime);
    lc.setRow(0,row,(byte)0);
  }
}


void columns(int delaytime) {
  for(int col=0;col<9;col++) {
    delay(delaytime);
    lc.setColumn(0,col,B11111111);
    lc.setColumn(0,col-1,(byte)0);
    delay(delaytime);
  }
}

void single(int delaytime) {
  for(int i = 1; i>=0;i--){
    for(int row=0;row<8;row++) {
      for(int col=0;col<8;col++) {
        delay(delaytime);
        lc.setLed(0,row,col,i);
        delay(delaytime);
        for(int j=0;j<1;j++) {
          lc.setLed(0,row,col,!i);
          delay(delaytime);
          lc.setLed(0,row,col,i);
          delay(delaytime);
          }
      }
    }
  }
}

void settemp(){
  lc.setRow(0,5,B01010101);
  lc.setRow(0,6,B01011100);
  lc.setRow(0,7,B01000100);
}

void snowy(){
  byte snow[5]={
    B01010100,
    B00111000,
    B01111100,
    B00111000,
    B01010100};
  printletter(snow);

}


void sunny(){
  byte sun[5]={
    B00111000,
    B01111100,
    B01111100,
    B01111100,
    B00111000};
  printletter(sun);

}

void cloudy(){
  byte cloud[5]={
    B01010100,
    B10101010,
    B10000001,
    B01100101,
    B00011010};
  printletter(cloud);

}

void lightning(){
  byte flash[5]={
    B00011100,
    B00111000,
    B01111111,
    B00000110,
    B00001100};
  printletter(flash);
  delay(500);
  lc.setIntensity(0,15);
  delay(10);
  lc.setIntensity(0,0);
  delay(100);
  lc.setIntensity(0,15);
  delay(20);
  lc.setIntensity(0,0);


}

void rainy(){
  byte rain1[5]={
    B01010100,
    B10101010,
    B10000001,
    B01111111,
    B00100100};

  byte rain2[5]={
    B01010100,
    B10101010,
    B10000001,
    B01111111,
    B10010010};


  for(int i=0;i<3;i++){
    printletter(rain1);
    delay(200);
    printletter(rain2);
    delay(200);
  }

}


void brightnessSwipe(int delaytime){
  int i=8;
  for(;i>=0;i--){
    lc.setColumn(0,i,B11111111);
  }

  for(;i<=16;i++){
    lc.setIntensity(0,i);
    delay(delaytime);
  }
  for(;i>=0;i--){
    delay(delaytime);
    lc.setIntensity(0,i);
  }

  lc.clearDisplay(0);
}


//18,446,744,073,709,551,616
//18 kvintillion (18 trilion v sk num sys)

//1 125 899 906 842 624 seconds //quintilion / biliarda
//18 764 998 447 377 minutes //trilion / 18 bilion
//31 274 997 412 hours // 31 miliarda
//1 303 124 892 days
//3 567 761 years

//In 3 million years due to tidal deceleration gradually slowing Earth's rotation, a day on Earth is expected to be one minute longer than it is today
// “Očakáva sa, že za 3 milióny rokov sa v dôsledku prílivového spomalenia postupne spomaľujúcej rotácie Zeme bude deň na Zemi o jednu minútu dlhší ako dnes.”
void counter(){
  for(unsigned long i=0;i<pow(2,64);i+=1){
    for(int row=0;row<7;row++){
      lc.setRow(0,row,(byte)(i>>(row*8)));
      //delay(5);
    }
  }
}



void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,0);
  /* and clear the display */
  lc.clearDisplay(0);
}

void loop() {

  rows(150);
  columns(150);
  single(25);


  /*for spaces use _ char, for heart use {, for fei logo use ` char*/


  char word1[] = "stu_fei_`{";
  char word2[] = "9876543210";
  char word3[] = "peter_bogar_";
  

  int delaytime=350;
  //counter();
  writeText(word1, delaytime);
  delay(2000);
  writeText(word2, 500);
  delay(1000);
  writeText(word3, delaytime);
  delay(2500);
  
  delay(3000);
  settemp();
  delay(2500);
  snowy();
  delay(2500);
  sunny();
  delay(2500);
  cloudy();
  delay(2500);
  rainy();
  delay(2500);
  lightning();
  delay(2500);
  brightnessSwipe(100);
  delay(2500);
  counter();
}

Zdrojový kód: Súbor:LCDemoMatrix bogar.zip


Zaver

Veľa šťastia k experimentovaniu a bavte sa!

Chyba pri vytváraní náhľadu: Súbor s rozmermi väčšími než 12,5 MP
Zaver