per qualche lucina in più...

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ù...

Standardoil:

ma come si ridimiensiona l’immagine? non lo trovo più…

aggiungi spazio width=xxx dopo image nelle quadre … “image width=500” ← o la larghezza che vuoi, puoi impostare anche height=xxx nello stesso modo ma non so se poi te le deforma se non sono in proporzione … con solo width l’altezza la proporziona da solo …

non ho così tanto hardware per fare le prove

Ti ho spedito 500 led e 500 pulsanti, quando ti arrivano voglio vedere il modello fisico funzionante :stuck_out_tongue:
(sto scherzando, ovviamente :D)

Etemenanki:
Ti ho spedito 500 led e 500 pulsanti, quando ti arrivano voglio vedere il modello fisico funzionante

E i 18km di filo?

ne ho mandati 20, non si sa mai … :smiley: