Mooi Danny!
Als ik jouw code bekijk, dan zien we veel herhaling van soortgelijke stappen.
Dit is vaak een indicatie dat het e.e.a. efficiënter kan - jouw code is geen probleem hoor, maar dit is wel een uitstekend voorbeeld om wat dieper te gaan in code schrijven. Alles hieronder is uiteraard optioneel ... 😊
Arrays gebruiken
Als voorbeeld dit stukje code:
int row1=A3;
int row2=A2;
int row3=A1;
int row4=A0;
int row5=13;
int row6=12;
int row7=11;
int row8=10;
int col1=2;
int col2=3;
int col3=4;
int col4=5;
int col5=6;
int col6=7;
int col7=8;
int col8=9;
int offTime=30;
int offTime1=500;
//Waarom twee timers? Wel alles wordt in sneltempo aan en uitgedaan, maar
//de vier ledjes in het midden laat ik tezamen pinken met de tweede timer
void setup() {
// put your setup code here, to run once:
delay,(offTime);
pinMode(row1, OUTPUT);
pinMode(row2, OUTPUT);
pinMode(row3, OUTPUT);
pinMode(row4, OUTPUT);
pinMode(row5, OUTPUT);
pinMode(row6, OUTPUT);
pinMode(row7, OUTPUT);
pinMode(row8, OUTPUT);
pinMode(col1, OUTPUT);
pinMode(col2, OUTPUT);
pinMode(col3, OUTPUT);
pinMode(col4, OUTPUT);
pinMode(col5, OUTPUT);
pinMode(col6, OUTPUT);
pinMode(col7, OUTPUT);
pinMode(col8, OUTPUT);
// Om een LED te laten oplichten moet de row HIGH en de col LOW
// Om te starten alle outputs in de uitschakel stand brengen
digitalWrite(row1, LOW);
digitalWrite(row2, LOW);
digitalWrite(row3, LOW);
digitalWrite(row4, LOW);
digitalWrite(row5, LOW);
digitalWrite(row6, LOW);
digitalWrite(row7, LOW);
digitalWrite(row8, LOW);
digitalWrite(col1, HIGH);
digitalWrite(col2, HIGH);
digitalWrite(col3, HIGH);
digitalWrite(col4, HIGH);
digitalWrite(col5, HIGH);
digitalWrite(col6, HIGH);
digitalWrite(col7, HIGH);
digitalWrite(col8, HIGH);
//Bedoeling is LED per LED te laten oplichten voor een bepaalde
//tijd, deze daarna te doven en naar de volgende te gaan.
// We beginnen bij de LED van rij1 col1 en dan rij2 col1
//En zo verder het buitenste vierkant, dan het tweede enz.
}
We kunnen dit een stuk korter schrijven, bijvoorbeeld zoiets als dit
#define offTime 30
#define offTime1 500
#define RowColCount 8
// Definieer arrays voor regels en kolommen
int row[RowColCount] = { A3, A2, A1, A0, 13, 12, 11, 10 };
int col[RowColCount] = { 2, 3, 4, 5, 6, 7, 8, 9 };
void setup() {
for(int i=0; i < RowColCount; i++) {
pinMode(row[i], OUTPUT);
pinMode(col[i], OUTPUT);
}
// Om een LED te laten oplichten moet de row HIGH en de col LOW
// Om te starten alle outputs in de uitschakel stand brengen
for(int i=0; i < RowColCount; i++) {
digitalWrite(row[i], LOW);
digitalWrite(col[i], HIGH);
}
}
void loop() { }
Misschien even wat uitleg;
Ik heb de twee timers en de regel en kolom nummers met #define gedefinieerd.
Dit is natuurlijk niet verplicht, maar redelijk gebruikelijk.
#define term waarde
Define zorgt ervoor dat de compiler elk voorkomen van een "term" vervangen wordt door "waarde".
Omdat het een zogenaamde compiler-directive is, wordt de regel NIET afgesloten met een punt-komma.
Vervolgens heb ik 2 arrays gemaakt; row en col.
Hierin heb de pin waarden opgeslagen.
For-Loops gebruiken
Het gebruik van een array maakt het makkelijker om "herhalingen" in een loop te zetten.
Omdat de matrix vierkant is, kunnen we deze loops zelfs combineren.
Als de matrix niet vierkant had geweest dan hadden we een waarde moeten definiëren voor kolommen en een waarde voor regels.
Het e.e.a. had er dan zo uitgezien (waarbij col en row verschillend kunnen zijn):
#define offTime 30
#define offTime1 500
#define rowCount 8
#define colCount 8
// Definieer arrays voor regels en kolommen
int row[rowCount] = { A3, A2, A1, A0, 13, 12, 11, 10 };
int col[colCount] = { 2, 3, 4, 5, 6, 7, 8, 9 };
void setup() {
for(int i=0; i < rowCount; i++) {
pinMode(row[i], OUTPUT);
}
for(int i=0; i < colCount; i++) {
pinMode(col[i], OUTPUT);
}
// Om een LED te laten oplichten moet de row HIGH en de col LOW
// Om te starten alle outputs in de uitschakel stand brengen
for(int i=0; i < rowCount; i++) {
digitalWrite(row[i], LOW);
}
for(int i=0; i < colCount; i++) {
digitalWrite(col[i], HIGH);
}
}
void loop() { }
Wat array's betreft: deze beginnen bij nul met tellen. Dus het eerste element van de regels is row[0] (wat in jouw code "row1" was).
Dus een voorbeeld van jouw code en hoe deze er dan met array's uit ziet:
digitalWrite(row1, HIGH);
digitalWrite(col1, LOW);
delay(offTime);
digitalWrite(row1, LOW);
digitalWrite(col1, HIGH);
wordt dan
digitalWrite(row[0], HIGH);
digitalWrite(col[0], LOW);
delay(offTime);
digitalWrite(row[0], LOW);
digitalWrite(col[0], HIGH);
Functies gebruiken
Omdat we al even spraken over gosub en functies, en je het aanzetten van een LED, en weer uitzetten van een LED, herhaaldelijk gebruikt, zouden we dit in een eenvoudige functie kunnen gieten. We kunnen dan X (row) en Y (col) doorgeven. Ik heb de offTime er ook maar als parameter bij gezet, zodat je op andere momenten dezelfde functie kunt gebruiken waarbij de wachttijd (offtime) anders kan zijn.
Als voorbeeld:
void LedAanUit(int X, int Y, int WachtTijd) {
// LED AAN
digitalWrite(row[X], HIGH);
digitalWrite(col[Y], LOW);
// Wachten
delay(WachtTijdTime);
// LED UIT
digitalWrite(row[X], LOW);
digitalWrite(col[Y], HIGH);
}
We kunnen nu elke keer dat je dit in jouw code schrijft (niet vergeten dat "tellen" in een array bij nul begint):
digitalWrite(row1, HIGH);
digitalWrite(col1, LOW);
delay(offTime);
digitalWrite(row1, LOW);
digitalWrite(col1, HIGH);
digitalWrite(row2, HIGH);
digitalWrite(col1, LOW);
delay(offTime);
digitalWrite(row2, LOW);
digitalWrite(col1, HIGH);
digitalWrite(row3, HIGH);
digitalWrite(col1, LOW);
delay(offTime);
digitalWrite(row3, LOW);
digitalWrite(col1, HIGH);
De code vervangen door (dus weer niet vergeten dat tellen bij nul begint:
LedAanUit(0,0,offTime);
LedAanUit(1,0,offTime);
LedAanUit(2,0,offTime);
Niet alleen wordt de code nu aanzienlijk korter, en makkelijker, maar ook veel beter leesbaar wordt.
Hiermee kunnen we do code in jouw vorige post in z'n geheel schrijven als:
#define offTime 30
#define offTime1 500
#define RowColCount 8
int row[RowColCount] = { A3, A2, A1, A0, 13, 12, 11, 10 };
int col[RowColCountCount] = { 2, 3, 4, 5, 6, 7, 8, 9 };
void setup() {
delay,(offTime);
for(int i=0; i < RowColCount; i++) {
pinMode(row[i], OUTPUT);
pinMode(col[i], OUTPUT);
}
// Om een LED te laten oplichten moet de row HIGH en de col LOW
// Om te starten alle outputs in de uitschakel stand brengen
for(int i=0; i < RowColCountCount; i++) {
digitalWrite(row[i], LOW);
digitalWrite(col[i], HIGH);
}
}
void loop() {
LedAanUit(0,0,offTime);
LedAanUit(1,0,offTime);
LedAanUit(2,0,offTime);
LedAanUit(3,0,offTime);
LedAanUit(4,0,offTime);
LedAanUit(5,0,offTime);
LedAanUit(6,0,offTime);
LedAanUit(7,0,offTime);
// Tot hier ok voor LED's col 1
LedAanUit(7,1,offTime);
LedAanUit(7,2,offTime);
LedAanUit(7,3,offTime);
LedAanUit(7,4,offTime);
LedAanUit(7,5,offTime);
LedAanUit(7,6,offTime);
LedAanUit(7,7,offTime);
// tot hier ook ok
LedAanUit(6,7,offTime);
LedAanUit(5,7,offTime);
LedAanUit(4,7,offTime);
LedAanUit(3,7,offTime);
LedAanUit(2,7,offTime);
LedAanUit(1,7,offTime);
LedAanUit(0,7,offTime);
// Tot hier ok
LedAanUit(0,6,offTime);
LedAanUit(0,5,offTime);
// etc
}
void LedAanUit(int X, int Y, int WachtTijd) {
// LED AAN
digitalWrite(row[X], HIGH);
digitalWrite(col[Y], LOW);
// Wachten
delay(WachtTijdTime);
// LED UIT
digitalWrite(row[X], LOW);
digitalWrite(col[Y], HIGH);
}
Nog een keer: For-Loops
Maar zelfs dit kan nog korter, door middel van for-loops:
void loop() {
for(int i=0; i < RowColCount; i++) {
LedAanUit(0,i,offTime);
}
// Tot hier ok voor LED's col 1
for(int i=1; i < RowColCount; i++) {
LedAanUit(7,i,offTime);
}
// tot hier ook ok
for(int i=6; i >= 0; i--) {
LedAanUit(i,7,offTime);
}
// etc
}
Ik snap helemaal dat dit wat veel kan zijn, en dit is zeker niet als kritiek bedoelt, maar eerder om je verder te helpen met code schrijven voor de Arduino.
Dsu ... Food for thought 😊