/* Construcción de marquesinas desde cero II
Written in 2004 by raphik
1. La nueva estrategia consiste en no dejar que la función que saca
el texto en pantalla entre en un buble infinito. Sólo se le permi-
te una escritura por llamada. La variable columna es declarada de
tipo static, para que recuerde su último valor.
Ver la función vuelvePronto().
2. En realidad, esta estrategia no bloqueante permite sacar más de
una marquesina, cada una con su propio texto.
Ver la función otraMarquesina().
3. Se pueden hacer marquesinas con caracteres de mayor tamaño, pero
hay que tener en cuenta el nuevo ancho de los caracteres.
Ver la función elDoble().
La capacidad del microcontrolador es limitada y no conviene abusar de
las marquesinas.
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
uint32_t crono = millis();
void prepararPantalla(void) {
// preparando la pantalla para su primer uso
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE, BLACK);
display.setTextSize(1);
display.setCursor(0,0);
display.print(F("Marquesinas II"));
display.display();
}
void vuelvePronto(void) {
static int columna = SCREEN_WIDTH -1;
display.setTextWrap(false);
char msg[] = "La variable static columna guarda su valor entre llamadas.";
int msgLen = 6 * strlen(msg);
display.setCursor(columna,10);
display.setTextSize(1);
display.print(msg);
display.display();
columna--;
if (columna <= -msgLen) columna = SCREEN_WIDTH -1;
}
void otraMarquesina(void) {
// esta función es calcada de la anterior
static int columna = SCREEN_WIDTH -1;
display.setTextWrap(false);
char msg[] = "Agregar otra marquesina es posible.";
int msgLen = 6 * strlen(msg);
display.setCursor(columna,20);
display.setTextSize(1);
display.print(msg);
display.display();
columna--;
if (columna <= -msgLen) columna = SCREEN_WIDTH -1;
}
void elDoble(void) {
static int columna = SCREEN_WIDTH -1;
display.setTextWrap(false);
char msg[] = "Esta es mayor que las anteriores.";
int msgLen = 2 * 6 * strlen(msg); // la anchura del caracter, el doble
display.setCursor(columna,30);
display.setTextSize(2); // texto de doble tamaño
display.print(msg);
display.display();
columna -= 2;
if (columna <= -msgLen) columna = SCREEN_WIDTH -1;
}
void elMayor(void) {
static int columna = SCREEN_WIDTH -1;
display.setTextWrap(false);
char msg[] = "El pez grande se come al chico.";
int msgLen = 5 * 6 * strlen(msg); // la anchura, cinco veces mayor
display.setCursor(columna,10);
display.setTextSize(5); // texto cinco veces mayor
display.print(msg);
display.display();
columna -= 4;
if (columna <= -msgLen) columna = SCREEN_WIDTH -1;
}
void setup() {
prepararPantalla();
}
void loop() {
if (millis() < crono + 120000) {
if (millis() > crono + 3000 ) vuelvePronto();
if (millis() > crono + 40000 ) otraMarquesina();
if (millis() > crono + 80000 ) elDoble();
} else elMayor();
delay(10);
}