/*
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_SSD1306.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_SSD1306 oled(ANCHO, ALTO, &Wire, OLED_RESET); // crea objeto
void drawBattery (int x, int y) {
int fill = (millis() / 300) % 6;
oled.drawRect(x, y, 18, 12, SSD1306_WHITE);
for (int bar = 0; bar < fill; bar++){
oled.fillRect(x + 2 + 3 * bar, y + 2, 2, 8, SSD1306_WHITE);
}
oled.fillRect(x + 19, y + 3, 2, 6, SSD1306_WHITE);
}
byte BRICK_A[] = {0b00000100, 0b00010101, 0b10011000, 0b01100010, 0b11001110};
byte BRICK_B[] = {0b00010100, 0b10010110};
int offsetsUp[] = {-1, -1, -2, -2, -3, -3, -4, -4};
void drawBrick (int x, int y, boolean isBrickA){
if (isBrickA){
int length = sizeof(BRICK_A);
for (int i = 0; i < length; i++) {
byte myByte = BRICK_A[i];
int pixelX = int ((myByte >> 6) & 0b11);
int pixelY = int ((myByte >> 4) & 0b11);
oled.drawPixel(pixelX + x, pixelY + y, 1);
pixelX = int ((myByte >> 2) & 0b11);
pixelY = int ((myByte ) & 0b11);
oled.drawPixel(pixelX + x, pixelY + y, 1);
}
} else {
int length = sizeof(BRICK_B);
for (int i = 0; i < length; i++) {
byte myByte = BRICK_B[i];
int pixelX = int ((myByte >> 6) & 0b11);
int pixelY = int ((myByte >> 4) & 0b11);
oled.drawPixel(pixelX + x, pixelY + y, 1);
pixelX = int ((myByte >> 2) & 0b11);
pixelY = int ((myByte ) & 0b11);
oled.drawPixel(pixelX + x, pixelY + y, 1);
}
}
}
void updateDisplay(int fps){
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); // escribe texto
oled.setCursor(32, 0);
oled.print( millis());
oled.drawPixel(1, 0, WHITE);
oled.drawPixel(0, 1, WHITE);
drawBattery(ANCHO - 24, 0);
for (int i = 0; i < 10; i++) {
drawBrick(i * 8, 16, true);
drawBrick(i * 8 + 4, 16, false);
}
for (int i = 0; i < 10; i++) {
drawBrick(i * 8, 20, false);
drawBrick(i * 8 + 4, 20, true);
}
for (int i = 0; i < 10; i++) {
drawBrick(i * 8, 24, true);
drawBrick(i * 8 + 4, 24, false);
}
for (int i = 0; i < 10; i++) {
drawBrick(i * 8, 28, false);
drawBrick(i * 8 + 4, 28, true);
}
oled.display();
}
void move(int fps){
float timeOffset = (millis() % 2000) / 2000.00;
byte offset = 0x3F * timeOffset;
// Serial.println(timeOffset);
oled.ssd1306_command(0x40 | offset);
updateDisplay(fps);
Serial.println(fps);
}
FPS fpsController(50, &move);
void setup() {
Serial.begin(9600);
Wire.begin(); // inicializa bus I2C
oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // inicializa pantalla con direccion 0x3C
fpsController.start();
updateDisplay(30);
Serial.println("timeOffset");
}
void loop() {
fpsController.tick();
}