Programma tavolo matrice led 4x3 arduino

Buonpomeriggio a tutti,

Stò andando avanti con un progetto che ho iniziato da un pò di tempo ( che avevo spiegato con calma qua tavolo a led - Generale - Arduino Forum )

in pratica prima del progetto vero e proprio ho creato un prototipo per eliminare tutti i vari problemi che avrei incontrato la prima volta.

ho costruito quindi un tavolino da 12 celle ( 4*3) pilotato da 5 shift register 74HC595 (dentro ad ogni cella un led RGB che ha quindi bisogno di 3 pin per essere controllato)

tramite una libreria riesco a pilotarli singolarmente senza molti problemi in termini di difficoltà, ma ne risente la lunghezza straziante dei codici, che già per una matrice 4x3 si fa sentire....(dovendo poi farne uno 8x12 ci impazzirei per farci uno snake o un tetris...)

avevo quindi chiesto aiuto per realizzare un programma che mi potesse permettere di cambiare la "schermata" del tavolino in maniera più semplice e veloce, grazie alla scrittura di frame che rappresentavano la mia matrice nell'arduino.

ad esempio per scrivere nel tavolino 4x3 ( 4 righe, 3 colonne) la lettera "L" di rosso sarebbe bastato scrivere nel programma:

"R "
"R "
"R "
"RRR"

per una "C" ci colore blu:

"BBB"
"B "
"B "
"BBB"

per una "O" di colore giallo:
"GGG"
"G G"
"G G"
"GGG"

e così via, inserendo la lettera del colore per riempire le celle di quel colore e mettendo uno spazio
per le celle che avrei voluto lasciare spente.

questo mi permetterebbe di velocizzare e facilitare la stesura del programma in maniera considerevole.

Steso un primo codice però nel provarlo non ottengo alcun risultato, il tavolino non da segni di vita...

const int n_righe=4;        // numero di righe del display
  const int n_colonne=3;      // numero di colonne del display
  const int n_caratteri=4;    // numero di caratteri (frames) che compongono una animazione
  const int n_separatori=1;   // numero di spazi che separano un carattere (frame) dall'altro nella definizione
  
  const int latch = 11;       // pin di latch
  const int clock = 12;       // pin di clock
  const int dati = 8;         // pin dati seriali
  
  const int dly=1000;         // usato solo in fase di debug  !!!
  
  // Definizione dei frames da visualizzare
  // assicurarsi che le definizioni siano coerenti con n_righe, n_colonne e n_separatori
  char Str0[]="R   V V BBB  M ";
  char Str1[]="R   V V B   M M";
  char Str2[]="R   V V B   MMM";
  char Str3[]="RRR VVV BBB M M";
  char* myStrings[]={Str0,Str1,Str2,Str3};

//.............................................................................................
  void setup ()
  {
    pinMode(latch,OUTPUT);
    pinMode(clock,OUTPUT);
    pinMode(dati,OUTPUT);
    digitalWrite(latch,LOW);
    digitalWrite(clock,LOW);

    Serial.begin(9600);
  }

//.............................................................................................
  void loop ()
  {
    send();
  }
  
//.............................................................................................
  void send()
  {
    int col;
    
    for (int carattere=0;carattere<n_caratteri;carattere++)
    {
      for (int riga=0;riga<n_righe;riga++)
      {
        for (int colonna=0;colonna<n_colonne;colonna++)
        {
          col=carattere*(n_colonne+n_separatori)+colonna;
          Serial.print(myStrings[riga][col]);
          switch (myStrings[riga][col])
          {
            case 'B':
              Serial.print("blu");
              digitalWrite(dati,HIGH);
              clk();
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,LOW);
              clk();
              break;
            case 'V':
              Serial.print("verde");
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,HIGH);
              clk();
              digitalWrite(dati,LOW);
              clk();
              break;
            case 'R':
              Serial.print("rosso");
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,HIGH);
              clk();
              break;
            case 'M':
              Serial.print("magenta");
              digitalWrite(dati,HIGH);
              clk();
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,HIGH);
              clk();
              break;
            default:
              Serial.print("spento");
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,LOW);
              clk();
              digitalWrite(dati,LOW);
              clk();
              break;
          }
          delay(dly);
        }
        Serial.println();
      }
      ltch();
    }
  }
  
//.............................................................................................
  void clk(void)
  {
    digitalWrite(clock,HIGH);
    digitalWrite(clock,LOW);
  }
  
//.............................................................................................
  void ltch(void)
  {
    digitalWrite(clock,HIGH);
    digitalWrite(clock,LOW);
  }

qualcuno saprebbe darmi qualche indicazione sull'errore?
il programma non l'ho scritto di mio pugno, sono stato aiutato, ma è stato scritto "su misura" (almeno con questa intenzione) per il mio caso.

Dovesse mancare qualche dato per potervi "render partecipi" e capire il problema, lo scriverò qua sotto quando mi sarà fatto notare.

-i pin Latch, clock, Data sono stati scelti casualmente

  • il tavolino con programmi scritti di mio pugno funziona al 100%, quindi non ci sono problemi di cablaggio eccetera
    -la sequenza numerica delle dodici celle del tavolino è:
    1 2 3
    4 5 6
    7 8 9
    10 11 12
    -ogni cella del tavolino potrà cambiare 7 colori, con le varie combinazioni di "acceso-spento" dei led RGB, ma nel programma sono inseriti soltanto 4 colori per il momento, i primari del led rosso verde blu, più il magenta ( viola) dato dal rosso e blu accesi contemporaneamente.
    -il programma che ho scritto prima dovrebbe come risultato finale scrivere in sequenza le lettere che compongo il nome "LUCA" (L rossa) (U verde)(C blu) (A magenta/fuxia)

Grazie in anticipo per l'aiuto, dovessero mancarvi dati o informazioni riguardanti al progetto scrivete pure :slight_smile: