LED Matica: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(Jedna medziľahlá úprava od rovnakého používateľa nie je 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. | ||
[[ | [[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. | Nižsie uvedený zdrojový kód obsahuje viacero funkcií zostavených pomocou vyššie uvedených jednoduchých metód. | ||
=== Program === | === Program === | ||
Riadok 71: | 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 522: | 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 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 552: | 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 word2[] = "9876543210"; | |||
char | 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( | writeText(word3, delaytime); | ||
delay( | delay(2500); | ||
delay(3000); | |||
settemp(); | settemp(); | ||
delay( | delay(2500); | ||
snowy(); | snowy(); | ||
delay(2500); | delay(2500); | ||
Riadok 585: | Riadok 596: | ||
delay(2500); | delay(2500); | ||
brightnessSwipe(100); | brightnessSwipe(100); | ||
delay(2500); | |||
counter(); | counter(); | ||
} | } | ||
Riadok 592: | Riadok 604: | ||
</tabs> | </tabs> | ||
Zdrojový kód: [[Súbor:LCDemoMatrix_bogar.zip]] | |||
Zdrojový kód: [[ | |||
=== Zaver === | |||
Veľa šťastia k experimentovaniu a bavte sa! | |||
[[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.
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.
Ď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!