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.
