/*
Configuracion mínima del display OLED 128x64 y varias funciones de
demostración de efectos:
-Random Starfield
-Starfield Panoramica
*/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1); //Creacion Objeto display
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Iniciar display
Serial.begin(9600);
}
void loop() {
display.clearDisplay();
snake(100);
display.display();
delay(3000);
}
/*
RANDOM STARFIELD:
Genera un campo de estrellas aleatorio
numStars: Numero de estrellas en el cielo
*/
void starfieldRandom(int numStars) {
randomSeed(analogRead(0)); //Semilla Aleatoria, toma como semilla el valor de un pin desconectado - A0
long randX;
long randY;
for (int x = 0; x <= numStars; x++) {
randX = random(128);
randY = random(64);
display.drawPixel(randX, randY, 1);
}
}
/*
STARFIELD PANORAMICA:
Genera un campo de estrellas aleatorio y lo mueve en una panoramica Vertical
numStars: Numero de estrellas en el cielo
*/
void starfieldPan(int numStars) {
randomSeed(analogRead(0)); //Semilla Aleatoria, toma como semilla el valor de un pin desconectado - A0
long randX;
long randY;
for (int x = 0; x <= numStars; x++) {
randX = random(128);
randY = random(64);
display.drawPixel(randX, randY, 1);
}
}
/*
SNAKE:
Genera un campo de estrellas aleatorio y lo mueve en una panoramica Vertical
tramos: Numero de tramos de linea
*/
void snake(int tramos) {
randomSeed(analogRead(0)); //Semilla Aleatoria, toma como semilla el valor de un pin desconectado - A0
int dir [2][4] { {0, 1, 0, -1}, {-1, 0, 1, 0} };
long dirIndex;
long longitud;
int posX = 64;
int posY = 32;
for (int w = 0; w <= tramos; w++) {
longitud = int(random(15)) + 1;
dirIndex = int(random(4));
for (int z = 0; z < longitud; z++) {
posX += dir[0][dirIndex];
posY += dir[1][dirIndex];
if (posX < 0) {
posX = 0;
break;
}
if (posX > 128) {
posX = 128;
break;
}
if (posY < 0) {
posY = 0;
break;
}
if (posY > 64) {
posX = 64;
break;
}
display.drawPixel(posX, posY, 1);
}
display.display();
delay(50);
}
}