#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "face_bmp.h"
#define SCREEN_WIDTH 128 // Ancho de la pantalla OLED, en píxeles
#define SCREEN_HEIGHT 64 // Alto de la pantalla OLED, en píxeles
// Declaración para una pantalla SSD1306 conectada a I2C (pines SDA, SCL)
#define OLED_RESET -1 // Pin de reinicio # (o -1 si se comparte el pin de reinicio de Arduino)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUM_FACES 10 // Número de caritas en la animación
#define FACE_WIDTH 16
#define FACE_HEIGHT 16
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = generar voltaje de pantalla desde 3.3V internamente
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección 0x3D para 128x64
Serial.println(F("Fallo en la asignación de SSD1306"));
for (;;); // No continuar, entrar en bucle infinito
}
testAnimate(face_bmp, FACE_WIDTH, FACE_HEIGHT); // Anima las caritas felices
}
void loop() {
}
#define X_POS 0 // Índices en el arreglo 'caritas' en la función de abajo
#define Y_POS 1
#define DELTA_Y 2
void testAnimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, faces[NUM_FACES][3];
// Inicializa las posiciones de las caritas felices
for (f = 0; f < NUM_FACES; f++) {
faces[f][X_POS] = random(1 - FACE_WIDTH, display.width());
faces[f][Y_POS] = -FACE_HEIGHT;
faces[f][DELTA_Y] = random(1, 6);
}
for (;;) { // Bucle infinito...
display.clearDisplay(); // Borra el búfer de la pantalla
// Dibuja cada carita feliz:
for (f = 0; f < NUM_FACES; f++) {
display.drawBitmap(faces[f][X_POS], faces[f][Y_POS], bitmap, w, h, SSD1306_WHITE);
}
display.display(); // Muestra el contenido en la pantalla
delay(200); // Pausa de 200 milisegundos (1/5 segundo)
// Luego, actualiza las coordenadas de cada carita...
for (f = 0; f < NUM_FACES; f++) {
faces[f][Y_POS] += faces[f][DELTA_Y];
// Si una carita feliz se encuentra fuera de la parte inferior de la pantalla...
if (faces[f][Y_POS] >= display.height()) {
// Reinicialízala en una posición aleatoria, justo fuera de la parte superior
faces[f][X_POS] = random(1 - FACE_WIDTH, display.width());
faces[f][Y_POS] = -FACE_HEIGHT;
faces[f][DELTA_Y] = random(1, 6);
}
}
}
}