Numeri riga multipla su display

Ciao a tutti.

Mi stanno chiedendo di modificare un lettore di RPM, leggo una frequenza e la moltiplico per 4 come da datasheet del motore in questione; che attualmente scrive su un display 4x20.

Vorrebbero il solo numero degli RPM ma più grande, allora stavo pensando di scriverlo occupando più righe.

Ho visto che esiste la libreria LCDBigNumbers, che mi piace anche come grafica, ma non riesco a far scrivere correttamente sul mio display I2C.

Gli esempi funzionano a dovere, ma non riesco a capire dove sbaglio.

Con questo sketch vedo solo: quadrati spenti, quadrati pieni e quadrati "a righe"

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <FreqMeasure.h>
#define USE_SERIAL_2004_LCD
#include "LCDBigNumbers.hpp"
#include "LCDPrintUtils.hpp"

// 1. Configurazione LCD (Indirizzo, Colonne, Righe)
//LiquidCrystal_I2C lcd(0x27, 20, 4);



#if defined(USE_PARALLEL_LCD)
#include <LiquidCrystal.h>
LiquidCrystal myLCD(2, 3, 4, 5, 6, 7); // Depends on your actual connections
//LiquidCrystal myLCD(4, 5, 6, 7, 8, 9); // Sample connections starting at pin 4
#else
#define LCD_I2C_ADDRESS 0x27    // Default LCD address is 0x27 for a 20 chars and 4 line / 2004 display
LiquidCrystal_I2C myLCD(LCD_I2C_ADDRESS, LCD_COLUMNS, LCD_ROWS); // LCD_COLUMNS and LCD_ROWS are set by LCDBigNumbers.hpp depending on the defined display
#endif

// 2. CORREZIONE: Creiamo l'oggetto passando SOLO l'indirizzo dell'LCD.
// Non passiamo il font qui, lo faremo nel setup.
LCDBigNumbers LCD(&myLCD, BIG_NUMBERS_FONT_3_COLUMN_2_ROWS_VARIANT_3); 

// --- Variabili di calcolo ---
float frequenzaCondivisa = 0;
unsigned long ultimoAggiornamentoDisplay = 0;
const unsigned long intervalloDisplay = 300; 

double sommaCampionamenti = 0;
int conteggioCampionamenti = 0;
unsigned long ultimoImpulsoMillis = 0; 
const unsigned long timeoutSoglia = 1000; 

void setup() {
    Serial.begin(9600);
    
    #if defined(USE_PARALLEL_LCD)
        myLCD.begin(); // LCD_COLUMNS and LCD_ROWS are set by LCDBigNumbers.hpp depending on the defined display
    #else
        myLCD.init();
        myLCD.clear();
        myLCD.backlight(); // Switch backlight LED on
    #endif

    FreqMeasure.begin();
    ultimoImpulsoMillis = millis();
}

void loop() {
    
    // 1. LETTURA FREQUENZA
    if (FreqMeasure.available()) {
        sommaCampionamenti += FreqMeasure.read();
        conteggioCampionamenti++;
        ultimoImpulsoMillis = millis(); 

        if (conteggioCampionamenti >= 15) { 
            frequenzaCondivisa = FreqMeasure.countToFrequency(sommaCampionamenti / conteggioCampionamenti);
            sommaCampionamenti = 0;
            conteggioCampionamenti = 0;
        }
    }
    

    // Auto-azzeramento se il motore è fermo
    if (millis() - ultimoImpulsoMillis > timeoutSoglia) {
        frequenzaCondivisa = 0;
    }

    // 2. AGGIORNAMENTO DISPLAY
    if (millis() - ultimoAggiornamentoDisplay >= intervalloDisplay) {
        ultimoAggiornamentoDisplay = millis();
        
        // Calcolo RPM (Moltiplicatore 4 datasheet motore)
        int rpmAttuali = (int)(frequenzaCondivisa * 4);
        
        // Passiamo il valore alla funzione
        mostraRPM(rpmAttuali);
    }
}

void mostraRPM(int valore) {
    // Posizioniamo il cursore (colonna, riga)
    LCD.setBigNumberCursor(0);

    // Stampa il numero gigante
    LCD.print("12345");
}

Attualmente faccio scrivere "12345", e vedo qualcosa di "coerente" perché il disegno è ripetuto correttamente, se uso cifre simili.

Grazie.

Mi rispondo da solo, ho fatto un errore da principiante, quale sono e lo dico senza timore:
non ho inizializzato il display nel setup.

Sistemato così

void setup() {
    Serial.begin(9600);
    
    #if defined(USE_PARALLEL_LCD)
        myLCD.begin(); // LCD_COLUMNS and LCD_ROWS are set by LCDBigNumbers.hpp depending on the defined display
    #else
        myLCD.init();
        myLCD.clear();
        myLCD.backlight(); // Switch backlight LED on
    #endif

    LCD.begin();

    FreqMeasure.begin();
    ultimoImpulsoMillis = millis();
}

ha iniziato magicamente a scrivere correttamente. :sweat_smile:

Mi piacerebbe vedere una foto che facesse vedere come sarebbe il risultato 12345

Probabilmente così:

Mi piacerebbe vedere da rosco251 una foto che facesse vedere come sarebbe il SUO risultato 12345

Ecco com'è l'effetto finale. Non ho una bellissima luce, ma penso si capisca ugualmente.

Ho usato anche io questa libreria in passato, ma avevo modificato i "custom char" per avere i numeri centrati anche verticalmente.
L'effetto finale era una font a "vita alta" in cui la parte superiore risulta "schiacciata" e mi piaceva anche più dell'originale.

Per questo font mi sembra di distinguere 7 custom char compreso il carattere “tutto acceso” probabilmente con la la stessa libreria si potrebbe utilizzare 3 righe anziché 4 e utilizzare la riga rimasta per un testo standard alfanumerico, mi sembra ancora meglio.. pensaci

Questo, come dicevo, serve per rilevare gli RPM di un motore.
Chi lo userà mi ha esplicitamente detto che non gli interessa altro, vuole solo il numero secco e il più grosso possibile.
Le 5 cifre sono più che sufficienti, il motore dovrebbe raggiungere la velocità massima di 4000 RPM, almeno così mi han detto, ma non hanno un datasheet che sia uno...

Ho cercato di convincerlo, ma non ha voluto sentire ragioni. :sweat_smile:

Se poi cambierà idea, adesso ho imparato come fare per selezionare gli eventuali font differenti e liberare spazio.

Il 2 è strano... Il display è danneggiato?

Sì.

Me ne sono accorto dalle foto...