[RISOLTO]Problema con matrice led 8x8

ciao a tutti, da poco ho acquistato una matrice led 8x8 bicolore(verde e rosso)...l ho collegata al mio arduino UNO tramite un MCP23016 IO expander I2C e utilizzando la libreria Wire sono riuscito a far accendere i singoli led...quello che non riesco a fare è creare una figura statica come per esempio una lettera il problema è che visivamente vedo led accesi anche se in teoria dovrebbere essere spenti...spero di essere stato più o meno chiaro... grazie in anticipo dell aiuto...

codice? schema di collegamento?

scusate se rispondo solo ora ma il mio pc ha deciso di abbandonarmi e adesso devo formattare e rinstallare il tutto in questo week cerco di postare il codice che avevo utilizzato...mentre per il circuito non saprei come fare....

Per il circuito: carta, penna e macchina fotografica. Ciao Uwe

nello schema non ho inserito i collegamenti tra IO expander e la matrice perchè altrimenti non si capiva piu nulla(non che cosi si capisca sinceramente ma è stato il meglio che sono riuscito a fare per ora se non va bene trovero un modo migliore) nei collegamneti non ho inserito il condensatore che va tra la resistenza e il CLK spero che non sia questo a dare tutti i problemi…(non so se ho inserito la foto dello schema nel posto giusto non sono molto pratico di forum chiedo scusa in anticipo e ringrazio per la pazienza)

#include <Wire.h>

const unsigned int riga1 = 13;  //imposto i pin delle varie righe
const unsigned int riga2 = 12;
const unsigned int riga3 = 11;
const unsigned int riga4 = 10;
const unsigned int riga5 = 2;
const unsigned int riga6 = 3;
const unsigned int riga7 = 4;
const unsigned int riga8 = 5;

unsigned int temp = 500;        //tempo attesta scambio led


void setup(){
  pinMode(riga1,OUTPUT);        //imposto i pin come OUTPUT
  pinMode(riga2,OUTPUT);
  pinMode(riga3,OUTPUT);
  pinMode(riga4,OUTPUT);
  pinMode(riga5,OUTPUT);
  pinMode(riga6,OUTPUT);
  pinMode(riga7,OUTPUT);
  pinMode(riga8,OUTPUT);
  
  digitalWrite(riga1,HIGH);     //imposto tutti i pin a livello alto
  digitalWrite(riga2,HIGH);
  digitalWrite(riga3,HIGH);
  digitalWrite(riga4,HIGH);
  digitalWrite(riga5,HIGH);
  digitalWrite(riga6,HIGH);
  digitalWrite(riga7,HIGH);
  digitalWrite(riga8,HIGH);
  
  Wire.begin();                 //avvio comunicazione I2C
  
  Wire.beginTransmission(0x20); //imposto i pin da 0.0 a 0.7 del IO expander come OUTPUT
  Wire.write(0x06);
  Wire.write(0x00);
  Wire.endTransmission();
  
  Wire.beginTransmission(0x20); //imposto i pin da 1.0 a 1.7 del IO expander come OUTPUT
  Wire.write(0x07);
  Wire.write(0x00);
  Wire.endTransmission();
}

void loop(){
  digitalWrite(riga1,LOW);      // imposto la riga che mi interessa
  digitalWrite(riga2,HIGH);
  digitalWrite(riga8,HIGH);
  
  Wire.beginTransmission(0x20); //invio un byte con il led da attivare
  Wire.write(0x00);
  Wire.write(B10000000);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga1,HIGH);     //cambio riga
  digitalWrite(riga2,LOW);
  
  Wire.beginTransmission(0x20); //invio un byte con il led da attivare
  Wire.write(0x00);
  Wire.write(B01000000);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga2,HIGH);
  digitalWrite(riga3,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00100000);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga3,HIGH);
  digitalWrite(riga4,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00010000);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga4,HIGH);
  digitalWrite(riga5,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00001000);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga5,HIGH);
  digitalWrite(riga6,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00000100);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga6,HIGH);
  digitalWrite(riga7,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00000010);
  Wire.endTransmission();
  
  delay(temp);
  
  digitalWrite(riga7,HIGH);
  digitalWrite(riga8,LOW);
  
  Wire.beginTransmission(0x20);
  Wire.write(0x00);
  Wire.write(B00000001);
  Wire.endTransmission();
  
  delay(temp);
}

questo è il codice che utilizzo praticamente alterno i led e creo una diagonale il problema è che eseguendo questo codice per una frazione di secondo riesco a vedere il led precedente (nella riga successiva) acceso…credo che sia un problema di codice…
grazie in anticipo dell aiuto…

non riesco a caricare l immagine dello schema...la inserisco nell Addition Options... ma poi mi da errore dopo che carica...l immagine sono 2.5 MB circa...

nessuno ha una mezza idea di come poter risolvere il problema???su internet ho visto un sacco di gente che utilizza queste matrici e fanno praticamente quello che vogliono....

scusate s e insisto sull' argomento ma non mi do pace...guardando per giorni e giorni su internet ho letto da qualche parte che andando a cambiare dei parametri posso variare la frequenza di una uscita di arduino utilizzano i timer presenti nel micro...secondo voi è questo il mio problema???devo variare la frequenza????

secondo me il problema è che non stai spegnendo il led precedente. o melgio: spegni tutta la sua riga, a quanto pare, ma non spegni il port expander, che magari al suo interno ha dei condensatori che prima che si scarichino fanno da tampone. Prova a non spegnere le "righe", ma fare tutto da port expander.

se non ho capito male praticamente prima di cambiare riga (se cosi la possiamo chiamare) devo spegnere il led,cambio riga e poi accendo il led successivo....

Wire.beginTransmission(0x20); //invio un byte con il led da attivare
  Wire.write(0x00);
  Wire.write(B10000000);
  Wire.endTransmission();

  delay(temp);

  Wire.beginTransmission(0x20); //invio un byte con il led da disattivare
  Wire.write(0x00);
  Wire.write(B00000000);
  Wire.endTransmission();
  

  
  digitalWrite(riga1,HIGH);     //cambio riga
  digitalWrite(riga2,LOW);
  
  Wire.beginTransmission(0x20); //invio un byte con il led da attivare
  Wire.write(0x00);
  Wire.write(B01000000);
  Wire.endTransmission();

esatto, ma non capisco questo bisogno di "cambiare riga"

praticamente io prova a far illuminare la diagonale della mia matrice alternando i led ho allegato un immagina che magari puo aiutare a capire…(magari poi sonoio che sbaglio completamente il codice)…

esempio.jpg

risolto con la modifica che mi hai consigliato va tutto come deve....grazie mille sono diventato scemo a trovare soluzioni assurde quando alla fine era una mia stupidata grazie ancora....