Che è naturalmente il seguito del mio precedente "per un pugno di bottoni"
la in quel topic parlavamo di come estendere gli ingressi utili di un arduino, "tirando fuori" ogni possibile estensione dalla nostra povera scheda Arduino
adesso sì è presentata, in un'altra discussione l'esigenza di "mettere" molte lucine, e la cosa sembra un po' la naturale estensione della storia dei pulsanti
voi lo sapete, che parlo poco nelle discussioni altrui, in particolare se lo OP latita, però io le idee le ho avute e le ho sviluppate (un poco) quindi, per non disperderle al vento, le lascio scritte qui
un breve riassunto:
facciamo caso di avere un elevato numero di postazioni (elevato potrebbe essere tipo 400-600, per una MEGA, oppure 50-60 per una UNO)
che richiedono abbastanza sporadicamente intervento inatteso (se fosse atteso non ci sarebbe problema) da parte di un operatore, ma sporadicamente vuol proprio dire sporadicamente, anche meno di una volta a settimana
verrebbe comodo avere una "lucetta" per postazione per indicare, magari anche da lontano, dove intervenire, e ho aggiunto io, anche un pulsante per "segnalare" intervento avvenuto
il tutto con dei cosi e delle complessità ancora a livello "umano"
ora, a parte il fatto che ho idee "innovative" su APA102, seriali e catene di lucine, ma questo è altra storia
la soluzione meno "sanguinosa" la ho vista in un bel multiplex di led, e siccome i vari interventi sono sporadici il multiplex deve essere adattivo come velocità, dato che su magari 500 "luci" solo una o due sono "alle volte" accese
ecco quindi l'idea: un doppio array di piedini, chiamiamoli anodi e catodi , con riferimento al diodo led che vi sarà collegato
ma solo un array monodimensionale di elementi accesi-spenti
il multiplex scandisce la matrice bidimensionale di piedini, ma si ferma e accende (sopratutto si ferma) solo se l'elemento deve essere acceso, ecco quindi la cadenza variabile di scansione del multiplex
fatta l'accensione si girano i piedini, si porta in interdizione il led e a questo punto quello che era il catodo diventa un ingresso pulluppato, il vecchio anodo un'uscita a massa e se il pulsante fosse premuto il catodo NON sente il pullup
adesso arrivano schema (per una matrice demo) e programma di esempio
// di Nelson-StandardOil
// IDE 1.8.13
// Progetto:
// Scopo: aggiungere pulsanti ai led multiplati
// piedini, lato anodo del led
byte anodo[] = {2, 3, 4}; // numeri di piena fantasia
byte anodi = sizeof anodo / sizeof anodo[0];
// piedini, lato catodo del led
byte catodo[] = {5, 6, 7}; // tre piedini di anodo e tre di catodo a fare 9 led
byte catodi = sizeof catodo / sizeof catodo[0];
// i singoli gruppi LED-pulsante, chiamati selettori, sono indirizzati comandati ed interrogati da una matrice, mappata su un array
byte selettore[(sizeof anodo / sizeof anodo[0]) * (sizeof catodo / sizeof catodo[0])];
// sembra incredibile, ma è allocazione statica
int selettori = sizeof selettore / sizeof selettore[0];
// serve un ingresso di comando, per provocare l'accensione del led
#define COMANDO 10
// il debounce è hardware
// il tempo in mS per un passo di multiplex
#define SLICE 5
void setup(void)
{
Serial.begin(9600);
Serial.println("Progetto pulsanti");
for (int i = 0; i < anodi; i++)
{
pinMode(anodo[i], INPUT);
}
for (int i = 0; i < catodi; i++)
{
pinMode(catodo[i], INPUT);
}
// tengo i piedini in input, per evitare false accensioni dei led
// l'ingresso di comando, debounce hardware, logica positiva (pulldown)
pinMode(COMANDO, INPUT);
}
void loop(void)
{
int tasto = 0;
// se c'è impulso di comando
if (digitalRead(COMANDO))
{
// simuliamo la necessità di un intervento da parte dell'operatore
// quindi accendiamo un led a caso
int p = random(selettori);
selettore[p] = 1;
Serial.print("Necessità di intervento alla postazione numero: ");
Serial.println(p);
}
//adesso passiamo alla funzione che accende e mantiene accesi i led, interrogando contemporaneamente i pulsanti associati
if ((tasto = premuto()) > -1)
{
// se restituisce -1 nessun tasto premuto
// altri valori negativi riservati per usi futuri
// se restituisce positivo o 0 pulsante corrispondete premuto
// per prima cosa spengo il LED
selettore[tasto] = 0;
// e poi faccio qualcosa, che corriponderà all'azione relativa al completamento dell'operazione indicata dal led
// tipicamente lo trasmetto via seriale
Serial.print("Postazione numero: ");
Serial.print(tasto);
Serial.println(" raggiunta e intervento eseguito");
}
}
int premuto(void)
{
/*
scorre la matrice di scansione
accende i relativi led
e aspetta la pressione del tasto
al primo tasto che sente premuto ne ritorna il numero
*/
for (int i = 0; i < selettori; i++)
{
// per ogni selettore
if (selettore[i])
{
// se attivo lo accende
// calcolo quale anodo e quale catodo attivare
int a = i / anodi;
int c = i - a * anodi;
// faccio le pinmode
pinMode(anodo[a], OUTPUT);
pinMode(catodo[c], OUTPUT);
digitalWrite(anodo[a], 1);
digitalWrite(catodo[a], 0);
// polarizzazione diretta, il led si accende
// per il multiplex, tengo attivo un tempo di multiplex
delay(SLICE);
// adesso vedo se il suo pulsante è premuto
// l'anodo diventa -
digitalWrite(anodo[a], 0);
//il catodo diventa un ingresso pulluppato
pinMode(catodo[c], INPUT_PULLUP);
// se l'ingresso non sente il 5V significa che il pulsante è premuto
if (!digitalRead(catodo[c]))
{
// rimetto comunque a posto anodo e catodo
pinMode(catodo[c], INPUT);
pinMode(anodo[a], INPUT);
return i;
// pulsante premuto, valore restituito, lavoro finito
}
// se non sono uscito il tasto non è premuto
// rimetto comunque a posto anodo e catodo
pinMode(catodo[c], INPUT);
pinMode(anodo[a], INPUT);
}
}
// se siamo arrivati qui nessun selettore è stato trovato premuto
return -1;
}
rimane sempre il fatto che non ho così tanto hardware per fare le prove, il programma e lo schema sono di principio, ma lo schema è elementare e il programma compila
quindi una eventuale messa a punto non dovrebbe essere difficile
e adesso buon appetito
ma come si ridimiensiona l'immagine? non lo trovo più...