PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8x8 LED Matrix Smiley soll zwinkern



wendtdir
08.05.2016, 18:48
Hallo,

mein Smily zwinkert nicht.

Ich habe diese Schaltung aus dem Buch Arduino Workshops, Boxall J. aufgebaut.

31595

Und versuche nun ein Smiley auf der LED Matrix darzustellen. Das Smiley ist kein Problem, aber nun möchte ich es animieren, sprich es soll ein Auge öffnen und schliessen.

Anbei der Code, den ich bis jetzt habe und der leider nicht funktioniert.


#define DATA 6 //Verbindung mit Pin 14 am Schieberegister
#define LATCH 8 //Verbindungmit Pin 12 am Schieberegister
#define CLOCK 10 //Verbindung mit Pin 11 am Schieberegister

byte smile[] = {B00000000, B00000110, B01100110, B00000000, B00011000, B0000000, B11000011, B01111110};
int binary[] = {1, 2, 4, 8, 16, 32, 64, 128};

byte smile1[] = {B00000000, B01100110, B01100110, B00000000, B00011000, B0000000, B11000011, B01111110};
int binary1[] = {1, 2, 4, 8, 16, 32, 64, 128};

void setup() {
// put your setup code here, to run once:

pinMode(LATCH, OUTPUT);
pinMode(CLOCK, OUTPUT);
pinMode(DATA, OUTPUT);


}

void loop() {
// put your main code here, to run repeatedly:

int i;


for ( i = 0; i<8; i++)
{

digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, ~smile1[i]);
shiftOut(DATA, CLOCK, MSBFIRST, binary1[i]);
digitalWrite(LATCH, HIGH);
delay(1);
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, ~smile[i]); //Spalten
shiftOut(DATA, CLOCK, MSBFIRST, binary[i]); //Zeilen
digitalWrite(LATCH, HIGH);
delay(1);

}

}

Wie ich es verstehe, wird im Abstand von 1ms Zeile für Zeile abgearbeitet. Nun folgerte ich, wenn ich ein zweites Array schaffe und ich den Code durchlaufen lasse, erst die 8 Zeilen mit Auge auf, dann die 8 Zeilen mit Augegeschlossen, müsste er zwinkern. Ist aber nicht so. Wo genau liegt mein Denkfehler?

Sisor
08.05.2016, 19:13
Vergleiche mal hiermit:

...
void loop() {
const byte ZWINKERLAENGE = 255; // hier Zwinkerlaenge einstellbar
static byte a = 0; // byte -> max 256 loop-Zyklen
static bool b = false; // schaltvariable fuers Zwinkern
int i;

a++;
if (a == ZWINKERLAENGE) {
a = 0;
b = !b;
}

for (i = 0; i<8; i++) {
digitalWrite(LATCH, LOW);
shiftOut(DATA, CLOCK, MSBFIRST, b? ~smile[i] : ~smile1[i]);
shiftOut(DATA, CLOCK, MSBFIRST, binary[i]);
digitalWrite(LATCH, HIGH);
delay(1);
}
}

i_make_it
08.05.2016, 22:51
Der Denkfehler ist die Trägheit des menschlichen Auges.
Alles was schneller als 25 mal pro Sekunde passiert, wird nicht mehr als Einzelbild wahrgenommen.
Deshalb siehst Du auch einen Smily und nicht einzelne LED Zeilen leuchten.
Das blinzelnde Auge müsste etwas dunkler sein als andere.
Sissor lässt in seinem Code 256 mal das eine Bild refeshen und 256 mal das andere (mit je 1ms Delay).
Gibt ungefähr 3,4 Wechsel pro Sekunde.

wendtdir
09.05.2016, 18:21
Und wieder einmal muss ich mich bedanken, nach der Änderung des Codes hat mein Smiley nun angefangen zu zwinkern und meine Tochter freut es. Danke an euch. Wäre mein Code zu falsch gewesen bzw. es lag nur an der Trägheit des Auges?

i_make_it
09.05.2016, 18:56
Für das menschliche Auge war der Code falsch. Der Smily hat mit knapp 500Hz geblinzelt. Mit einer entsprechenden Kamera hätte man das aufnehmen können.
Im Prinzip hast Du einen Film mit 2 verschiedenen Bildern und knapp 1000 Bildern pro Sekunde.(nur die Delays ohne die eigentliche Zeit zum Codeausführen gerechnet)