/*
Capitulo 47 de Arduino desde cero en Español.
Programa que muestra texto ALARMA dentro de un rectangulo para resaltar
Requiere instalar librerias Adafruit GFX y Adafruit SSD1306
Autor: bitwiseAr
*/
#include <Wire.h> // libreria para bus I2C
#include <Adafruit_GFX.h> // libreria para pantallas graficas
#include "Adafruit_SSD.h" // libreria para controlador SSD1306
#include "FPS.h"
#define ANCHO 128 // reemplaza ocurrencia de ANCHO por 128
#define ALTO 64 // reemplaza ocurrencia de ALTO por 64
#define OLED_RESET 4 // necesario por la libreria pero no usado
#define BUZZER 11
Adafruit_SSD oled(ANCHO, ALTO, &Wire, OLED_RESET, 800000); // crea objeto
int16_t X;
int16_t Y;
void drawBattery (int x, int y) {
int fill = (millis() / 300) % 6;
oled.drawRect(x, y, 18, 12, SSD_WHITE);
for (int bar = 0; bar < fill; bar++){
oled.fillRect(x + 2 + 3 * bar, y + 2, 2, 8, SSD_WHITE);
}
oled.fillRect(x + 19, y + 3, 2, 6, SSD_WHITE);
}
uint8_t BRICK_A_A = 0;
uint8_t BRICK_B_B = 1;
uint8_t DOOR__0_0 = 2;
uint8_t DOOR__1_0 = 3;
uint8_t DOOR__2_0 = 4;
uint8_t DOOR__0_1 = 5;
uint8_t DOOR__1_1 = 6;
uint8_t DOOR__2_1 = 7;
uint8_t BLACK_BCK = 8;
byte BRICK_A_A_DATA[4] = {
0b00100111,
0b01010111,
0b00100011,
0b00000101,
};
byte BRICK_B_B_DATA[4] = {
0b01110010,
0b01110101,
0b00110010,
0b01010000,
};
byte DOOR__0_0_DATA[4] = {
0b00000111,
0b11000111,
0b00100011,
0b00010101,
};
byte DOOR__1_0_DATA[4] = {
0b00010010,
0b00010101,
0b00010010,
0b00010000,
};
byte DOOR__2_0_DATA[4] = {
0b00010111,
0b00100111,
0b11000011,
0b00000101
};
byte DOOR__0_1_DATA[4] = {
0b00000000,
0b11111111,
0b00000000,
0b01000000
};
byte DOOR__1_1_DATA[4] = {
0b01010000,
0b01010000,
0b01010100,
0b01010100
};
byte DOOR__2_1_DATA[4] = {
0b01010100,
0b00000000,
0b11111111,
0b00000000
};
byte BLACK_BCK_DATA[4] = {
0b00000000,
0b00000000,
0b00000000,
0b00000000
};
byte textures[9][4] = {
{BRICK_A_A_DATA[0], BRICK_A_A_DATA[1], BRICK_A_A_DATA[2], BRICK_A_A_DATA[3]},
{BRICK_B_B_DATA[0], BRICK_B_B_DATA[1], BRICK_B_B_DATA[2], BRICK_B_B_DATA[3]},
{DOOR__0_0_DATA[0], DOOR__0_0_DATA[1], DOOR__0_0_DATA[2], DOOR__0_0_DATA[3]},
{DOOR__1_0_DATA[0], DOOR__1_0_DATA[1], DOOR__1_0_DATA[2], DOOR__1_0_DATA[3]},
{DOOR__2_0_DATA[0], DOOR__2_0_DATA[1], DOOR__2_0_DATA[2], DOOR__2_0_DATA[3]},
{DOOR__0_1_DATA[0], DOOR__0_1_DATA[1], DOOR__0_1_DATA[2], DOOR__0_1_DATA[3]},
{DOOR__1_1_DATA[0], DOOR__1_1_DATA[1], DOOR__1_1_DATA[2], DOOR__1_1_DATA[3]},
{DOOR__2_1_DATA[0], DOOR__2_1_DATA[1], DOOR__2_1_DATA[2], DOOR__2_1_DATA[3]},
{BLACK_BCK_DATA[0], BLACK_BCK_DATA[1], BLACK_BCK_DATA[2], BLACK_BCK_DATA[3]},
};
uint8_t level[32][6]= {
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__0_0, DOOR__0_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__1_0, DOOR__1_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__2_0, DOOR__2_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__0_0, DOOR__0_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__1_0, DOOR__1_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__2_0, DOOR__2_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__0_0, DOOR__0_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__1_0, DOOR__1_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{DOOR__2_0, DOOR__2_1, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_A_A, BRICK_A_A, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
{BRICK_B_B, BRICK_B_B, BLACK_BCK, BLACK_BCK, BLACK_BCK, BLACK_BCK},
};
void drawTexture (int col, int row, byte texture[]){
uint8_t x = col * 4;
uint8_t y = row * 8;
for (int i = 0; i < 4; i++) {
byte pixels = texture[i];
oled.drawByte(x + i, y, pixels);
}
}
String timeToString(unsigned long time) {
//int seconds = int((time % 60000) / 1000);
int minutes = int((time % 60000) / 1000);
//int hours = int(time / 3600000);
//String secondsText = (seconds < 10 ? "0": "") + String(seconds);
String minutesText = (minutes < 10 ? "a": "") + String(minutes);
//String hoursText = (hours < 10 ? "0": "") + String(hours);
return ":" + minutesText;
}
void updateDisplay(int fps, int offsetX){
oled.clearDisplay(); // limpia pantalla
//oled.drawRect(20, 20, 88, 44, WHITE); // dibuja rectangulo
oled.setCursor(28, 34); // ubica cursor en coordenadas 28,34
oled.setTextSize(1); // establece tamano de texto en 2
oled.setTextColor(WHITE); // establece color al unico disponible (pantalla monocromo)
oled.setCursor(50, 0);
oled.print( "FPS:" + String(fps)); // escribe texto
oled.setCursor(4, 0);
oled.print(timeToString(millis()));
//Serial.println(timeToString(millis()));
drawBattery(ANCHO - 24, 0);
for (uint8_t col = 0; col < 32; col+= 1){
for (uint8_t row = 0; row < 2; row+= 1){
uint8_t textureIndex = level[col][row];
drawTexture(col, row + 2, textures[textureIndex]);
}
}
//Serial.println(level[0][0]);
//Serial.println(BRICK_A_A);
drawTexture(0, 3, textures[0]);
oled.display(offsetX, 2);
}
int offsetX = 0;
void move(int fps){
float timeOffset = (millis() % 10000) / 10000.00;
byte offsetY = 0x3F * timeOffset;
X = 512 - analogRead(A0);
if (X < -200){
offsetX = (ANCHO + offsetX - 1) % ANCHO;
} else if (X > 200){
offsetX = (offsetX + 1) % ANCHO;
}
//offsetX = ANCHO * timeOffset;
// Serial.println(timeOffset);
// oled.SSD_command(0x40 | offset);
updateDisplay(fps, offsetX);
}
FPS fpsController(30, &move);
void setup() {
Serial.begin(9600);
Wire.begin(); // inicializa bus I2C
oled.begin(SSD_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
fpsController.start();
updateDisplay(30, 0);
Serial.println("timeOffset");
}
void loop() {
fpsController.tick();
}