#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Definición del tamaño de la pantalla OLED
#define SCREEN_WIDTH 128 // Ancho de la pantalla en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla en píxeles
// Declaración de la pantalla SSD1306 conectada a través de I2C (SDA, SCL)
#define OLED_RESET -1 // Número de pin de reinicio (o -1 si se comparte con el pin de reinicio de Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Número de copos de nieve en el ejemplo de animación
#define NUMFLAKES 10
// Tamaño del logotipo (cara de copo de nieve)
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
// Datos del logotipo (cara de copo de nieve)
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
void setup() {
Serial.begin(9600); // Inicia la comunicación serie a 9600 baudios
// Inicializa la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección 0x3D para pantalla de 128x64
Serial.println(F("SSD1306 no pudo inicializarse")); // Muestra un mensaje de error si no se puede inicializar
}
// Inicia la animación de copos de nieve utilizando el logotipo
testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT);
}
void loop() {
// No hace nada en el bucle principal
}
// Definición de variables para la animación de copos de nieve
#define XPOS 0 // Índices en el arreglo 'icons' en la función de abajo
#define YPOS 1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons[NUMFLAKES][3];
// Inicializa las posiciones de los 'copos de nieve'
for (f = 0; f < NUMFLAKES; f++) {
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
for (;;) { // Bucle infinito...
display.clearDisplay(); // Borra el contenido de la pantalla
// Dibuja cada 'copo de nieve':
for (f = 0; f < NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
}
display.display(); // Muestra el contenido en la pantalla
delay(200); // Pausa durante 1/10 de segundo
// Luego, actualiza las coordenadas de cada 'copo'...
for (f = 0; f < NUMFLAKES; f++) {
icons[f][YPOS] += icons[f][DELTAY];
// Si un 'copo' está fuera de la parte inferior de la pantalla...
if (icons[f][YPOS] >= display.height()) {
// Reinicializa a una posición aleatoria, justo arriba
icons[f][XPOS] = random(1 - LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
}
}
}