technischer Vorschlag,
Es wird nur das A ausgegeben.
Einfach die erste for schleife auflösen und in ein "BlinkWithoutDelay" Konstrukt überführen.
die variable a halt händisch mitführen.
Ganz ohne Tricks, sodass es ein anfänger verstehen kann.
zum Lernen:
was sind die Variablentypen,
was macht static
Den zeige Ablauf hab ich etwas angepasst. Macht für mich so mehr Sinn die LEDs weiterleuchten zu lassen.
(agmue findet das vermutlich auch besser, er schreibt es auch so in seinem Ablauf).
// https://forum.arduino.cc/index.php?topic=731407.0
// nonblocking - hardware test
const byte zeile[] = {4, 5, 6, 7, 8};
const byte spalte[] = {9, 10, 11, 12, 13};
const byte charTable[][5] = { // aus meiner Sicht ist die zweite Dimension (=jedes einzelne Zeichen) 5
{0b01100, 0b10010, 0b11110, 0b10010, 0b10010}, //A
{0b11100, 0b10010, 0b11110, 0b10010, 0b11100}, //B
{0b01110, 0b10000, 0b10000, 0b10000, 0b01110}, //C
{0b11100, 0b10010, 0b10010, 0b10010, 0b11100}, //D
{0b11110, 0b10000, 0b11100, 0b10000, 0b11110}, //E
{0b11110, 0b10000, 0b11100, 0b10000, 0b10000}, //F
{0b01110, 0b10000, 0b10110, 0b10010, 0b11110}, //G
{0b10010, 0b10010, 0b11110, 0b10010, 0b10010}, //H
{0b00100, 0b00100, 0b00100, 0b00100, 0b00100}, //I
{0b00100, 0b00100, 0b00100, 0b10100, 0b11100}, //J
{0b10010, 0b10100, 0b11000, 0b10100, 0b10010}, //K
{0b10000, 0b10000, 0b10000, 0b10000, 0b11110}, //L
{0b10001, 0b11011, 0b10101, 0b10001, 0b10001}, //M
{0b10010, 0b11010, 0b10110, 0b10010, 0b10010}, //N
{0b01100, 0b10010, 0b10010, 0b10010, 0b01100}, //O
{0b11100, 0b10010, 0b10010, 0b11100, 0b10000}, //P
{0b01110, 0b10001, 0b10101, 0b10010, 0b01101}, //Q
{0b11100, 0b10010, 0b11100, 0b10010, 0b10010}, //R
{0b11110, 0b10000, 0b11110, 0b00010, 0b11110}, //S
{0b11111, 0b00100, 0b00100, 0b00100, 0b00100}, //T
{0b10010, 0b10010, 0b10010, 0b10010, 0b01100}, //U
{0b10001, 0b10001, 0b10001, 0b01010, 0b00100}, //V
{0b10001, 0b10001, 0b10101, 0b10101, 0b01110}, //W
{0b10010, 0b10010, 0b01100, 0b10010, 0b10010}, //X
{0b10001, 0b10001, 0b01110, 0b00100, 0b00100}, //Y
{0b11110, 0b00010, 0b00100, 0b01000, 0b11110}, //Z
{0b00000, 0b00000, 0b00000, 0b00000, 0b00111}, //_
{0b11111, 0b11111, 0b11111, 0b11111, 0b11111}, //ALL <======== wie rufe ich diese Sonderzeichen auf ?
{0b01010, 0b00000, 0b00100, 0b10001, 0b01110}, //smile <======== wie rufe ich diese Sonderzeichen auf ?
{0b10001, 0b00100, 0b00000, 0b01110, 0b10001}, //frown <======== wie rufe ich diese Sonderzeichen auf ?
};
const byte firstChar = 'A'; // mit welchem Zeichen beginnt der charTable
void setup() {
Serial.begin(9600);
for (size_t i = 0; i < sizeof(zeile); i++) { // aufpassen, das klappt erst nach umstellen der Variable zeile auf byte!
pinMode(zeile[i], OUTPUT);
}
for (size_t i = 0; i < sizeof(spalte); i++) {
pinMode(spalte[i], OUTPUT);
}
// verwenden wir in einer späteren Variante wieder
// char myStr[] = "ABCD"; // Variable mit dem anzuzeigenden Text
// wort(myStr, sizeof(myStr) - 1);
}
void loop() {
zeige(charTable['A' - firstChar]); // das soll eigentlich ein A ausgeben
}
// muss noch etwas umgebaut werden
void wort(char *toPrint, size_t len)
{
for (size_t i = 0; i < len; i++)
{
// convert character to a variable
byte myIndex = toPrint[i] - firstChar; // ASCII minus erstem Zeichen somit 0 für das erste Zeichen in deinem Char-Table
zeige(charTable[myIndex]);
Serial.print(myIndex); // Debug Meldungen - nur für mich zum kontrollieren, weil ich deine HW nicht habe
Serial.print("\t");
Serial.println(toPrint[i]);
// evtl eine Zeitsteuerung, oder eine Verzögerung zwischen den Buchstaben
}
}
//
// ***** Ausgabe an die 5x5 LED MAtrix ******
void zeige(const byte buffer2[]) {
const byte interval = 10; // quasi die Zeilenfrequenz
static unsigned long previousMillis = - interval; // statische Variable, damit sie den Funktionsablauf überlebt, initialisiert mit einem hohen Wert damit sie beim ersten Aufruf schon überfällig ist
unsigned long currentMillis = millis();
static byte a = 0; // ersetzt das "a" aus der ersten for schleife
if (currentMillis - previousMillis > interval)
{
digitalWrite(zeile[a], 0); // Anfangs schalten wir die alte(!) Zeile aus.
a++; // jetzt gehts weiter in der nächsten Zeile
if (a > 4) a = 0; // Überlauf verhindern
for (byte i = 0; i < 5; i++) {
digitalWrite(spalte[i], bitRead (buffer2[a], i));
// digitalWrite(spalte[i], 0); // das braucht es meiner Meinung nicht, wir lassen weiter leuchten
}
digitalWrite(zeile[a], 1); // da nun die Spalten passen, schalten wir die aktuelle Zeile ein
// wir lassen die Zeile + alle Spalten leuchten bis zur nächsten Änderung!
previousMillis = currentMillis; // Zeitstempel merken für den nächsten durchlauf
}
}
// ***** Ausgabe an die 5x5 LED MAtrix ******
// kann man löschen
void zeigeAlt(const byte buffer2[]) {
for (int a = 0; a <= 4; a++) {
digitalWrite(zeile[a], 1);
for (int i = 0; i < 5; i++) {
digitalWrite(spalte[i], bitRead (buffer2[a], i));
digitalWrite(spalte[i], 0);
}
digitalWrite(zeile[a], 0);
}
}
bitte um Prüfung mit Hardware.
Dann muss man noch die Wortausgabe anpassen, aber das ist dann nur mehr was kleines.
Erst muss mal das Zeichen blockadefrei gehen.