Non sono in grado di poterlo "pesare", ma in effetti ho avuto la medesima impressione.
Cercavo uno StartPoint e questo mi faceva comodo perchè posseggo diversi moduli di questo display ed alcuni encoder rotativi (nudi e crudi a 5 pin senza modulo preassemblato).
Il mio scopo è di visualizzare solo 3 digit e me lo autocostruirò correttamente dimensionato nella forma.
Mi serve per controllare dei valori in un campo di input in Raspberry.
Quidi dovrò ancora lottare un po per interfacciarlo.
Allego lo sketch completo, in forma elementare,e parzialmente bonificato.
// ###############
#include <LedControl.h>
// Serial debug
#define SERIAL_DEBUG
// Rotary encoder digital IO pins
#define PinA 2
#define PinB 3
#define PinSW 4
// MAX7219 digital IO Pins
#define DIN 7
#define CLOCK 6
#define LOAD 5
int unit;
int dec;
int cent;
// inputs: DIN pin, CLK pin, LOAD pin. quantity of MAX7219 Module
LedControl lc = LedControl(DIN, CLOCK, LOAD, 1);
unsigned int valore = 128; // Il display si posiziona su 128 all'avvio
unsigned long time = 0;
// E' coinvolta nel While per il Serial Print ad inizio Loop.
unsigned int num = 0;
void setup() {
lc.shutdown(0, false); // turns on display
lc.setIntensity(0, 2); // intensità luminosa (impostabile da 0 a 15)
#ifdef SERIAL_DEBUG
Serial.begin(9600);
Serial.print("Rotary Encoder Test");
#endif
pinMode(PinA, INPUT_PULLUP); //utilizzare resistori esterni
pinMode(PinB, INPUT_PULLUP); //utilizzare resistori esterni
pinMode(PinSW, INPUT_PULLUP); //utilizzare resistori esterni
attachInterrupt(0, blinkA, LOW);
attachInterrupt(1, blinkB, LOW);
time = millis();
delay(200);
}
void loop() {
lc.clearDisplay(0);
while (num != valore) {
num = valore;
#ifdef SERIAL_DEBUG
Serial.println(num);
#endif
}
Run();
if (digitalRead(PinSW) == 0) { // se Pulsante è LOW ripristina al valore Medio della Scala = 128
delay(10);
valore = 128; // ripristina a 128
#ifdef SERIAL_DEBUG
Serial.println("Switch Pressed");
#endif
}
if (cent <= 0) {
lc.setDigit(0, 2, ' ', false); // leading zero cent
} else if (cent > 0) {
lc.setDigit(0, 2, cent, false);
}
if ((cent <= 0) && (dec <= 0)) {
lc.setDigit(0, 1, ' ', false); // leading zero dec
} else if (dec >= 0) {
lc.setDigit(0, 1, dec, false);
}
lc.setDigit(0, 0, unit, false);
delay(200); // non ridurre altrimenti flickera
}
//Interupt routine for incrementing the variable
void blinkA() {
if ((millis() - time) > 3) // millisecondi minimi per cambio valore durante la rotazione
valore++;
if (valore > 255) {
valore = 255;
}
time = millis();
}
//Interupt routine for decrementing the variable
void blinkB() {
if ((millis() - time) > 3) // millisecondi minimi per cambio valore durante la rotazione
valore--;
if (valore > 255) {
valore = 0;
}
time = millis();
}
void Run() {
unit = abs(valore) % 10;
dec = abs(valore / 10) % 10;
cent = abs(valore / 100) % 10;
}
// *****
Se vado off-topic posso aprire un post separato, perchè vorrei soffermarmi su un problema che ho avuto sempre difficoltà a risolvere con questo modulo assiene alla libreria "LedControl" ad esso dedicata (è molto vecchia, mai aggiornata da anni, ma pare che sia anche la più pratica).
La soppressione degli zero iniziali non mi riesce a dovere.
Nello sketch a corredo ho usato una soluzione artigianale
che, se pur funzionante, non è sicuramente quella giusta.
Essendo coinvolti solo 2 digit accetto il compromesso per il mio scopo, ma ovviamente non è la forma corretta da utilizzare se dovessi applicarlo a tutte le 8 cifre.
Ho provato con gli Array, ieri, qualche mese fa, e qualche anno fa, ma non mi riesce. Ho provato anche con i puntatori ma non ci sono riuscito. Non riesco a passare un valore calcolato a ciascun digit quando desidero sopprimere gli zero iniziali. Ovviamente non sono allenato e non ho basi solide.
Per questo chiedo suggerimenti.
Aggiungo: grazie Claudio