/* Construcción de marquesinas desde cero I
Written in 2004 by raphik
1. Incluir las librerías Adafruit.
2. Definir macros para el alto y el ancho.
3. Generar el objeto "display" de tipo Adafruit_SSD1306.
4. Antes de escribir en la pantalla hay que prepararla para su uso.
Ver la función prepararPantalla().
Ya se puede escribir en la pantalla.
5. Cuando el texto sobrepasa la anchura de la pantalla
el texto se desborda y cae a la línea siguiente.
Ver la función desbordamiento().
6. La librería Adafruit incorpora una función que evita el desborda-
miento del texto: display.setTextWrap(false)
Ver la función noDesbordar().
7. Para lograr que el texto se deslice por la pantalla, dando la im-
presión de avanzar, hay que hacer llamadas sucesivas a la función
display.print() decrementando la columna. Para que el texto
avance 100 píxeles: Ver la función adelanteTexto().
8. Como el texto tiene más de 100 píxeles de largo, la función ante-
rior no consigue sacar todo el texto en pantalla. Toca calcular
la longitud del texto. Sabiendo que cada caracter ocupa 6 píxeles,
el texto completo mide: msgLen = 6 * strlen("texto").
Para que salga todo el texto, hay que hacerlo avanzar hasta que
columna > -msgLen.
Ver la función queSalgaTodo().
9. Ya sale todo, pero estéticamente no queda bien. Mejoraría mucho si
el saliese desde el margen derecho. Para eso, la visualización de-
be empezar en la última columna: columna = SCREEN_WIDTH -1
Ver función la desdeLaDerecha().
Para repetir el mensaje indefinidamente bastaría un bucle infinito. El
problema es que nunca se recuperaría el control. Hay que buscar otra
estrategia.
Ver función enBucle().
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
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("Pantalla preparada."));
display.display();
}
void desbordamiento(void) {
display.clearDisplay();
display.setCursor(0,0);
display.print(F("Los textos largos que superan la anchura de la pantalla se desbordan y pasan a ocupar los renglones siguientes."));
display.display();
}
void noDesbordar(void) {
display.clearDisplay();
display.setCursor(0,0);
display.setTextWrap(false);
display.print(F("Declarar setTextWrap(false) evita el desbordamiento."));
display.display();
}
void adelanteTexto(void) {
int columna;
display.clearDisplay();
display.setTextWrap(false);
for (columna = 0; columna > -100; columna--) {
display.setCursor(columna,0);
display.print(F("El texto se desliza hacia la izquierda 100 puntos."));
display.display();
}
}
void queSalgaTodo(void) {
int columna;
display.clearDisplay();
display.setTextWrap(false);
char msg[] = "El texto dentro de una variable mejora su manejo.";
int msgLen = 6 * strlen(msg);
for (columna = 0; columna > -msgLen; columna--) {
display.setCursor(columna,0);
display.print(msg);
display.display();
}
}
void desdeLaDerecha(void) {
int columna;
display.clearDisplay();
display.setTextWrap(false);
char msg[] = "Es mejor sacar el texto desde el margen derecho.";
int msgLen = 6 * strlen(msg);
for (columna = SCREEN_WIDTH -1; columna > -msgLen; columna--) {
display.setCursor(columna,0);
display.print(msg);
display.display();
}
}
void enBucle(void) {
int columna;
display.clearDisplay();
display.setTextWrap(false);
char msg[] = "Ahora que el texto sale en bucle, se pierde el control.";
int msgLen = 6 * strlen(msg);
while (true) {
for (columna = SCREEN_WIDTH -1; columna > -msgLen; columna--) {
display.setCursor(columna,0);
display.print(msg);
display.display();
}
}
}
void setup() {
prepararPantalla();
delay(5000);
desbordamiento();
delay(5000);
noDesbordar();
delay(5000);
adelanteTexto();
delay(5000);
queSalgaTodo();
delay(5000);
desdeLaDerecha();
delay(5000);
enBucle();
}
void loop() {
// put your main code here, to run repeatedly:
}