Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici
  Enrere

Escriptura de text a la pantalla bicolor Midas

Escriptura de text fix

Les funcions bàsiques per escriure text són ssd1306_write i ssd1306_print. La primera escriu un únic caràcter fix (que indicarem entre cometes) i la segona permet escriure un text de diversos caràcters fix. Els textos aniran al lloc on hi hagi el cursor d'escriptura en aquell moment, sobre el qual no tenim cap control. No obstant, enviant el caràcter \n podem fer que el següent text s'escrigui a la línia següent. Un cop s'arriba al final de la pantalla, el text continuarà a la part superior.

El següent programa envia quatre línies de text, ja que cada enviament acaba amb \n. Quan s'esborrra la pantalla el cursor no es modifica i, per tant, en el següent cicle s'ocupa la segona part de la pantalla. La següent vegada es tornarà al començament, ja que no queden més línies de pantalla disponibles.

#include "ssd1306.h"
void setup(){
  ssd1306_128x64_i2c_init();
  ssd1306_fillScreen(0);
  ssd1306_setFixedFont(ssd1306xled_font6x8);
}
void loop(){
  ssd1306_print("Primer text\n");
  ssd1306_print("Segon text\n");
  ssd1306_print("Tercer text\n");
  ssd1306_write('A');
  ssd1306_write('b');
  ssd1306_write('\n');
  delay(3000);
  ssd1306_clearScreen();  
}

La forma més pràctica d'escriure text, ja que permet controlar-ne la posició, és amb la funció ssd1306_printFixed però tenint en compte que només permet escriure un text fix que li posem entre cometes, no serveix per escriure, per exemple, el valor d'una variable (numèrica o de text).

A continuació tenim un programa de prova en el qual escrivim vuit línies de text a la pantalla. Les tres primeres línies estan en text normal, les tres següents en negreta i les dues darreres en cursiva. Fem servir una font de 6 ⨯ 7 píxels i posem cada línia 6 píxels més a la dreta i 8 píxels més avall que l'anterior, així el primer caràcter de cada línia s'escriurà just a sota del segon caràcter de la precedent.

Observarem que els dues primeres línies mostraran el text en groc i la resta estaran en color blau. Si afegíssim una línia més ja sortiríem fora de l'alçada de la pantalla i el text no es mostraria correctament.

Important: La funció ssd1306_printFixed només permet mostrar text en posicions verticals múltiples de 8 (0, 8, 16, etc.). Si li posem un valor diferent, agafarà la posició vàlida anterior; així, escrivint un 10 ens ho situarà a la posició 8.

#include "ssd1306.h"
void setup(){
  ssd1306_128x64_i2c_init();
  ssd1306_fillScreen(0);
  ssd1306_setFixedFont(ssd1306xled_font6x8);
}
void loop(){
  ssd1306_printFixed(0, 0, "1. Normal", STYLE_NORMAL);
  delay(500);
  ssd1306_printFixed(6, 8, "2. Normal", STYLE_NORMAL);
  delay(500);
  ssd1306_printFixed(12, 16, "3. Normal", STYLE_NORMAL);
  delay(500);
  ssd1306_printFixed(18, 24, "4. Negreta", STYLE_BOLD);
  delay(500);
  ssd1306_printFixed(24, 32, "5. Negreta", STYLE_BOLD);
  delay(500);
  ssd1306_printFixed(30, 40, "6. Negreta", STYLE_BOLD);
  delay(500);
  ssd1306_printFixed(36, 48, "7. Cursiva", STYLE_ITALIC);
  delay(500);
  ssd1306_printFixed(42, 56, "8. Cursiva", STYLE_ITALIC);
  delay(1000);
  ssd1306_clearScreen();  
}

La funció ssd1306_printFixedN és similar a la ssd1306_printFixed però té un paràmetre més que permet especificar un factor d'ampliació per 2, 4 o 8 que fa la mida de lletra més gran a base de repetir píxels (és a dir, sense millorar-ne la qualitat).

#include "ssd1306.h"
void setup(){
  ssd1306_128x64_i2c_init();
  ssd1306_fillScreen(0);
  ssd1306_setFixedFont(ssd1306xled_font6x8);
}
void loop(){
  ssd1306_printFixedN(0, 0, "1. Normal", STYLE_NORMAL, FONT_SIZE_2X);
  delay(500);
  ssd1306_printFixedN(0, 24, "3. N", STYLE_NORMAL, FONT_SIZE_4X);
  delay(1000);
  ssd1306_clearScreen();  
}

Escriptura de text variable

Hi ha una opció de consola que permet escriure text i variables de manera similar a la forma que emprem en el monitor sèrie. La consola fa servir la biblioteca ssd1306_console que s'instal·la automàticament amb la ssd1306, només cal incloure-la.

El següent programa mostra el valor d'una variable amb les seves unitats.

#include "ssd1306.h"
#include "ssd1306_console.h"
Ssd1306Console console;
static uint8_t a = 0;
void setup(){
  ssd1306_128x64_i2c_init();
  ssd1306_clearScreen();
  ssd1306_setFixedFont(ssd1306xled_font8x16);
}
void loop(){
  console.setCursor(24, 16);
  console.print("a = ");
  console.print(a);
  console.println(" mm");
  a++;
  delay(400);
}

Caràcters especials

En principi, les fonts existents disposen dels caràcters ASCII de l'espai (32) fins al ∼ (126). És possible crear una font caràcter a caràcter, ja sigui una font sencera o uns quants caràcters consecutius. Això és molt útil per afegir caràcters especials (símbols, lletres amb accents, etc.). Si definim els nostres caràcters amb les mateixes dimensions que els de la font que fem servir (per exemple 6 ⨯ 8) els podrem combinar fàcilment.

Anem a veure com crearíem dos caràcters especials, el símbol de la tecla acceptar i la lletra omega majúscula. Primer els dibuixem sobre una quadrícula.

acceptar     omega

Haurem de fer una llista amb tants elements com columnes. A cada element tindrem un nombre binari en el qual el bit de menys pes representa la part superior i el de més pes la part inferior. El resultat, per a aquest cas, seria:

                     Acceptar               Omega
                    0b00000000,          0b00000000,
                    0b00010000,          0b01001110,
                    0b00111000,          0b01110001,
                    0b01010100,          0b00000001,
                    0b00010000,          0b01110001,
                    0b00011111,          0b01001110,

Tots els caràcters que definim (sempre consecutius) aniran en un vector constant. El primer element és sempre zero (indica font fixa, l'única possible en aquesta biblioteca), el segon és l'amplada de la font (en píxels), el tercer l'alçada i el quart indica el primer caràcter substituït (hem posat '$' però el mateix seria posar 36 o bé 0x24). Tot seguit venen els caràcters que volem definir (cada caràcter té un valor per columna) i, per acabar, un zero que indica el final de la font.

Si tenim la precaució de deixar la primera columna i la darrera filera de la quadrícula buides tindrem uns caràcters que combinaran bé amb els de les fonts normals. Veiem-ne un exemple en el qual hem substituït el caràcter $ pel d'acceptar (↵) que acabem de definir i el següent (%) per la lletra omega majúscula (Ω). Hem posat lletra de doble mida per poder veure bé els nous caràcters i l'espaiat. Amb la directiva PROGMEM li diem que guardi la font a la memòria de programa per evitar omplir innecessàriament la memòria de dades.

#include "ssd1306.h"
const uint8_t fontesp_6x8[] PROGMEM = {
  0,  // Font fixa
  6,  // Amplada de la font
  8,  // Alçada de la font
  '$',  // Primer caràcter de la font
  // acceptar (substituirà a $)
  0b00000000,  // Primera columna
  0b00010000,
  0b00111000,
  0b01010100,
  0b00010000,
  0b00011111,  // Darrera columna
  // omega (substituirà a %)
  0b00000000,  // Primera columna
  0b01001110,
  0b01110001,
  0b00000001,
  0b01110001,
  0b01001110,  // Darrera columna
  0 // Fi de la font
};
void setup(){
  ssd1306_128x64_i2c_init();
  ssd1306_fillScreen(0);
  ssd1306_setFixedFont(ssd1306xled_font6x8);
  ssd1306_printFixedN(0, 16, "AB", STYLE_NORMAL, FONT_SIZE_2X);
  ssd1306_setFixedFont(fontesp_6x8);
  ssd1306_printFixedN(24, 16, "$%", STYLE_NORMAL, FONT_SIZE_2X);
  ssd1306_setFixedFont(ssd1306xled_font6x8);
  ssd1306_printFixedN(48, 16, "CD", STYLE_NORMAL, FONT_SIZE_2X);
}
void loop(){
}

En el cas de fonts de més de vuit píxels d'alçada, cada columna es codifica en dues components del vector. Primer s'envien les parts superiors de totes les columnes i després les inferiors. Per exemple:

R
                    0b00001000,  // Part superior primera columna
                    0b11111000,
                    0b10001000,
                    0b10001000,
                    0b10001000,
                    0b10001000,
                    0b01110000,
                    0b00000000,  // Part superior darrera columna
                    0b00100000,  // Part inferior primera columna
                    0b00111111,
                    0b00100000,
                    0b00000000,
                    0b00000011,
                    0b00001100,	
                    0b00110000,
                    0b00100000,  // Part inferior darrera columna

Llista de les funcions

Funció Ús Paràmetres Comentaris
Text fix ssd1306_setFixedFont Selecciona una font per escriure text Font seleccionada Opcions:
    ssd1306xled_font6x8
    ssd1306xled_font8x16
    ssd1306xled_font6x8_German
    ssd1306xled_font6x8_AB (només majúscules)
    ssd1306xled_font5x7
    ssd1306xled_font5x7_AB
    digital_font5x7_123 (només números)
    digital_font5x7_AB (només majúscules)
    digital_font5x7
    free_calibri11x12
    free_calibri11x12_cyrillic
    free_calibri11x12_latin
    courier_new_font11x16_digits (només números)
    comic_sans_font24x32_123
    Vector de la font pròpia
ssd1306_write Escriu un caràcter fix Caràcter (entre cometes) S'escriu a la posició actual del cursor
Enviant \n es salta a la línia següent
ssd1306_print Escriu un text fix Text (entre cometes) S'escriu a la posició actual del cursor
Enviant \n es salta a la línia següent
ssd1306_printFixed Escriu un text fix Posició x [0 a 127]
Pos. y [0, 8, 16, 24, 32, 40, 48, 56]
Text (entre cometes)
Estil
Opcions d'estil:
    STYLE_NORMAL
    STYLE_BOLD
    STYLE_ITALIC
ssd1306_printFixedN Escriu un text fix ampliat Posició x [0 a 127]
Pos. y [0, 8, 16, 24, 32, 40, 48]
Text (entre cometes)
Estil
Mida
Opcions de mida:
    FONT_SIZE_NORMAL
    FONT_SIZE_2X
    FONT_SIZE_4X
    FONT_SIZE_8X
Text variable console.setCursor Posa el cursor per a la consola Posició x [0 a 127]
Pos. y [0, 8, 16, 24, 32, 40, 48, 56]
Cal la biblioteca ssd1306_console
console.print Escriu un text o una variable entera Text (entre cometes) o variable
console.println Escriu un text o una variable entera
afegint un retorn de carro al final
Text (entre cometes) o variable

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.