Pai Nerd. Hoje meu filho, o Nicolas, faz 1 ano, e claro que tem Arduino pra comemorar :DPosted by Dicas Arduino on Quinta, 17 de setembro de 2015
Pra quem estiver interessado, vou deixar o código-fonte, mas já aviso, que foi algo rápido, sem muito planejamento, e que com certeza dá pra ser melhorado.
Uma das melhorias que poderiam ser feitas, é substituir os delays, pelos millis. Tenho um artigo falando sobre como fazer isso. veja aqui.
Outro detalhe é que utilizo uma classe que criei pra gerar números aleatórios não repetidos. Quem quiser saber mais detalhes sobre essa classe, veja o artigo, clicando aqui.
valeu!
código-fonte:
#include "LedControl.h"
/**********************************************************************************
************************************CLASSE UNIQUE RANDOM***************************
**********************************************************************************/
class UniqueRandom{
private:
int _index;
int _min;
int _max;
int _tam;
int* _list;
void _init(int min, int max) {
_list = 0;
if (min < max) { _min = min; _max = max; } else { _min = max; _max = min; }
_tam = _max - _min;
_index = 0;
}
public:
UniqueRandom(int max) { _init(0, max); randomize(); } //construtor com 1 parametro
UniqueRandom(int min, int max) { _init(min, max); randomize(); } //construtor com 2 parametros
void randomize() {
if (_list == 0) { _list = (int*) malloc(_tam * sizeof(int)); }
for (int i=0; i<_tam; i++) { _list[i] = _min+i; } //preenche a lista do menor ao maior valor
//embaralha a lista
for (int i=0; i<_tam; i++) {
int r = random(0, _tam); //sorteia uma posição qualquer
int aux = _list[i];
_list[i] = _list[r];
_list[r] = aux;
}
}
int next() { //retorna o proximo numero da lista
int n = _list[_index++];
if (_index >= _tam ) { _index = 0;} //após recuper o ultimo numero, recomeça na posicao 0
return n;
}
~UniqueRandom(){ free ( _list ); } //destrutor
};
/**********************************************************************************
************************************FIM CLASSE UNIQUE RANDOM***********************
**********************************************************************************/
/*
pin 4 is connected to the DataIn
pin 6 is connected to the CLK
pin 5 is connected to LOAD
*/
LedControl lc(4,6,5, 2); //2 max7219
UniqueRandom ur(64); //declaracao do objeto unique random
/* we always wait a bit between updates of the display */
unsigned long delaytime=500;
void setup() {
int seed = 0;
for (int i=0; i<10; i++) {
seed += ( analogRead(A0) + analogRead(A1) + analogRead(A2) + analogRead(A3) + analogRead(A4) + analogRead(A5) ) ;
delay(10);
}
randomSeed(seed);
lc.shutdown(0,false);
lc.setIntensity(0,1);
lc.clearDisplay(0);
lc.shutdown(1,false);
lc.setIntensity(1,1);
lc.clearDisplay(1);
int lin = 0;
lc.setColumn(1, lin++, B11111111);
lc.setColumn(1, lin++, B11111111);
lc.setColumn(1, lin++, B01110000);
lc.setColumn(1, lin++, B00111000);
lc.setColumn(1, lin++, B00011100);
lc.setColumn(1, lin++, B00001110);
lc.setColumn(1, lin++, B11111111);
lc.setColumn(1, lin++, B11111111);
delay(500);
}
byte leds_0[8] = {
B00111000,
B00111000,
B00011000,
B00011000,
B00011000,
B00011000,
B01111110,
B01111110
};
byte leds_1[8] = {
B11000011,
B11100011,
B11110011,
B11111011,
B11011111,
B11001111,
B11000111,
B11000011
};
void loop() {
int aleatorio = random(0, 9);
//aleatorio = 8;
Serial.println(aleatorio);
if (aleatorio == 0) {
//linhas de cima para baixo
lc.clearDisplay(0);
delay(delaytime/2);
for(int row=0;row<8;row++) { lc.setRow(0,row, leds_0[row]);delay(50); }
delay(delaytime*5);
}
if (aleatorio == 1) {
//linhas de baixo para cima
lc.clearDisplay(0);
delay(delaytime/2);
for(int row=7;row>=0;row--) { lc.setRow(0,row, leds_0[row]);delay(50); }
delay(delaytime*5);
}
if (aleatorio == 2) {
//direita para a esquerda
lc.clearDisplay(0);
delay(delaytime/2);
for (int col=0;col<8;col++){
for(int row=0;row<8;row++) { lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 ); }
delay(50);
}
delay(delaytime*5);
}
if (aleatorio == 3) {
//esquerda para a direita
lc.clearDisplay(0);
delay(delaytime/2);
for (int col=7;col>=0;col--){
for(int row=0;row<8;row++) { lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 ); }
delay(50);
}
delay(delaytime*5);
}
if (aleatorio == 4) {
//direita para a esquerda
lc.clearDisplay(0);
delay(delaytime/2);
for(int row=0;row<8;row++) {
for (int col=0;col<8;col++){
lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 );
if ( (leds_0[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 5) {
//direita para a esquerda
lc.clearDisplay(0);
delay(delaytime/2);
for(int row=0;row<8;row++) {
for (int col=7;col>=0;col--){
lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 );
if ( (leds_0[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 6) {
//------------------------
lc.clearDisplay(0);
delay(delaytime/2);
for (int col=0;col<8;col++){
for(int row=0;row<8;row++) {
lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 );
if ( (leds_0[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 7) {
//--------------------------
lc.clearDisplay(0);
delay(delaytime/2);
for (int col=7;col>=0;col--){
for(int row=0;row<8;row++) {
lc.setLed(0, row, col, (leds_0[row] & (1 << (7-col) )) != 0 );
if ( (leds_0[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 8) {
//--------------------------
lc.clearDisplay(0);
delay(delaytime/2);
for(int i=0;i<64;i++) {
int r = ur.next();
int l = r / 8;
int c = r % 8;
int val = (leds_0[l] & (1 << (7-c) )) != 0 ;
if ( val ) { delay(100); }
lc.setLed(0, l, c, val );
}
ur.randomize();
delay(delaytime*5);
}
aleatorio = random(0, 9);
if (aleatorio == 0) {
//linhas de cima para baixo
lc.clearDisplay(1);
delay(delaytime/2);
for(int row=0;row<8;row++) { lc.setRow(1,row, leds_1[row]);delay(50); }
delay(delaytime*5);
}
if (aleatorio == 1) {
//linhas de baixo para cima
lc.clearDisplay(1);
delay(delaytime/2);
for(int row=7;row>=0;row--) { lc.setRow(1,row, leds_1[row]);delay(50); }
delay(delaytime*5);
}
if (aleatorio == 2) {
//direita para a esquerda
lc.clearDisplay(1);
delay(delaytime/2);
for (int col=0;col<8;col++){
for(int row=0;row<8;row++) { lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 ); }
delay(50);
}
delay(delaytime*5);
}
if (aleatorio == 3) {
//esquerda para a direita
lc.clearDisplay(1);
delay(delaytime/2);
for (int col=7;col>=0;col--){
for(int row=0;row<8;row++) { lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 ); }
delay(50);
}
delay(delaytime*5);
}
if (aleatorio == 4) {
//direita para a esquerda
lc.clearDisplay(1);
delay(delaytime/2);
for(int row=0;row<8;row++) {
for (int col=0;col<8;col++){
lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 );
if ( (leds_1[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 5) {
//direita para a esquerda
lc.clearDisplay(1);
delay(delaytime/2);
for(int row=0;row<8;row++) {
for (int col=7;col>=0;col--){
lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 );
if ( (leds_1[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 6) {
//------------------------
lc.clearDisplay(1);
delay(delaytime/2);
for (int col=0;col<8;col++){
for(int row=0;row<8;row++) {
lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 );
if ( (leds_1[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 7) {
//--------------------------
lc.clearDisplay(1);
delay(delaytime/2);
for (int col=7;col>=0;col--){
for(int row=0;row<8;row++) {
lc.setLed(1, row, col, (leds_1[row] & (1 << (7-col) )) != 0 );
if ( (leds_1[row] & (1 << (7-col) )) != 0 ) {
delay(100);
}
}
}
delay(delaytime*5);
}
if (aleatorio == 8) {
//--------------------------
lc.clearDisplay(1);
delay(delaytime/2);
for(int i=0;i<64;i++) {
int r = ur.next();
int l = r / 8;
int c = r % 8;
int val = (leds_1[l] & (1 << (7-c) )) != 0 ;
if ( val ) { delay(100); }
lc.setLed(1, l, c, val );
}
ur.randomize();
delay(delaytime*5);
}
}
muito bom
ResponderExcluir