Stap 8: Zelfs meer flikkerende LEDs
De LED-volgorde programmeren
Open de voorbeeld blink7.
Op lijn 3, ziet u een nieuwe structuur: we noemen dit een matrix. Een array is in feite een lijst van variabelen, in dit geval, het is een lijst van variabelen van het type int. Wij vierkante haken gebruiken om aan te geven dat er een matrix. Om de array te initialiseren, we gebruiken gebogen haken, en de waarden worden gescheiden door komma's.
Wanneer we willen een waarde uit een matrix te gebruiken, zullen we moeten specificeren die plaats in de array die we de waarde van willen. Laten we de matrix in blink7 als voorbeeld te gebruiken:
int array [] = {1,2,3,4,5,6,5,4,3,2};
Als we willen de eerste waarde van de matrix op te halen, wij gebruiken
array[0]
De nul tussen vierkante haakjes wordt de indexgenoemd. Arrays zijn op nul gebaseerde, dit betekent dat het eerste in de array element index nul. Dit kan verwarrend op het eerste, bijvoorbeeld array [5] zal terugkeren 6, waar je zou verwachten om terug te keren 5.
U kunt zich voorstellen dat dit een heleboel problemen kan veroorzaken... Dat is waarom deze fout heeft een eigen naam: een uit-door-één foutof hobo voor korte.
Wanneer u probeert te lezen van een waarde die niet binnen de matrix, matrix [10] bijvoorbeeld, de Arduino zal lees net de volgende plaats in het geheugen, zonder zich te realiseren dat de waarde er lezing is niet een deel van de matrix meer. Het geeft je alleen de waarde die het vindt op die bijzondere plek in zijn geheugen.
Maar dingen nog erger wanneer u het schrijven van een index is buiten de matrix, omdat u kan het overschrijven van andere gegevens, zoals variabelen of stukjes code die toevallig op die plaats in het geheugen! Een slecht idee...
Als u een array declareren wilt zonder het nog te initialiseren, kunt u
array[10];
Opmerking dat 10 het aantal elementen, is terwijl het laatste element array [9] zal worden!
Als u het initialiseren op dezelfde regel, zoals in blink7, de Arduino IDE zal tellen de elementen voor u, en u hoeft niet te geven iets tussen de haakjes.
Als u weten van het aantal elementen in de matrix wilt, kunt u de functie sizeof(array) . Deze functie geeft als resultaat de grootte van de matrix, in bytes (1 byte = 8-bits). Dit is echter niet het bedrag van de elementen, in blink7, sizeof(array) 20 zal terugkeren. Dit is omdat elk element een int is, en een int 2 bytes lang is. Dus het totale aantal elementen is 20/2 = 10.
We gebruiken dit om af te sluiten onze for-lus wanneer we de hele matrix heb gelezen: zo lang als de index kleiner dan het aantal elementen is, kunnen we veilig het lezen van de matrix. We beginnen met i = 0, aangezien het eerste element index 0 is. Ditmaal alleen verhogen wij ik met 1. De notatie 'i ++' is precies hetzelfde als schrijven ' ik = i + 1', het is gewoon korter. Een andere manier van schrijven van dit zou ' ik += 1'.
Omdat LED #1 is aangesloten op pin 2, LED #2 naar pin 4, 3 tot en met 6 etc, vermenigvuldigen we het LED-nummer door 2 te krijgen het pin-nummer.
Arduino Referentie: samengestelde toevoeging
Kunt u de waarden in de matrix om uw eigen reeks, en u kan zelfs toevoegen of verwijderen van elementen, aangezien we ons programma onafhankelijk van de lengte van de matrix, gemaakt met behulp van de functie sizeof().
Samenvatting:
- Een array is een lijst van waarden (of tekens, of andere arrays) en maakt gebruik van vierkante haakjes]
- Dit is de verklaring van een matrix: "int array [10];"
- Dit is de aangifte en de initialisatie van een array: ' int array [] = {1,2,3,4,5,6,5,4,3,2};
- Array indices zijn nul, wat betekent dat het eerste element is index 0
- sizeof(array) geeft de grootte in bytes van de array
- sizeof(data type) geeft de grootte in bytes van het gegevenstype
- sizeof (array) / sizeof (gegevenstype van matrix) geeft u het aantal elementen in de matrix
Extra: 2-dimensionale arrays (Matrices)
In een array kan de elementen niet alleen gegevenstypen, zoals ints, maar ook andere arrays. Dit kunt u zogenaamde 2-dimensionale arrays, die kunnen worden vergeleken met matrices.
Dit wordt gebruikt in het voorbeeld blink8: nu kunt u de led cijfers en/of de vertraging in de matrix instellen.
int array[][2] = { {1, 600}, {2, 100}, {3, 100}, {4, 100}, {5, 100}, {6, 600}, {5, 100}, {4, 100}, {3, 100}, {2, 100} };
Merk op dat we hebben om op te geven van alle dimensies behalve de eerste tussen de vierkante haakjes, wanneer een multi-dimensionale array declareren.
De syntaxis om een waarde uit de array is
array[row][column]
Open de voorbeeld matrix_sum. In het volgende voorbeeld zal niets doen als u het uploaden, het hoeft niet elke uitgangen, het is gewoon voor leren doeleinden.
Het maakt 4 matrices (2D arrays), waarvan er twee waarden hebben. Het berekent net de som van de twee matrices, en de getransponeerde matrix voor de eerste.
Dit wordt gedaan met behulp van geneste for-lussen. U kunt deze uitleg volgen op de afbeelding hierboven.
De nummers zijn de volgorde van die de for-lus zal gaan over hen. Ik wordt gebruikt voor de rijen, j voor de kolommen. Ze beginnen op de eerste kolom en de eerste rij (1,1) in de matrix notatie [0] [0] voor matrix notatie, dan is de kolom is Oplopend (1,2) of [1] [0], de kolom opnieuw wordt verhoogd (1,3) of [2] [0] wanneer j wordt verhoogd weer, de j-lus heeft afgesloten, omdat j niet langer minder dan drie is. Ik wordt verhoogd, j gaat terug naar nul: (2,1) of [0] [1], j wordt verhoogd: (2,2) of [1] [1], dan (2,3) of [2] [1]. Ik wordt verhoogd, j gaat terug naar nul: (3,1) of [2] [0], then (3,2) of [2] [1], en ten slotte (3,3) of [2,2]. Nu j sluit u af, en ik sluit ook.
De berekening van de getransponeerde matrix is gelijk, het wisselt gewoon de kolommen en de rijen:
transposeMatrix [i] [j] = matrixA [j], [i];
Binnen deze arrays kunt u meer arrays, in feite het creëren van multi-dimensionale ruimten. In theorie, hij aantal dimensies is onbeperkt, maar zodra u meer dan drie dimensies gebruiken, krijgt het echt ingewikkeld, dus andere methoden voorkeur zijn.