En nybörjares guide till Arduino (8 / 15 steg)
Steg 8: Ännu mer blinkande lysdioder
Programmering i LED-sekvens
Öppna exempel blink7.
På linje 3, ser du en ny struktur: vi kallar detta en matris. En matris är i grunden en lista med variabler, i detta fall, det är en lista över variabler av typen int. Vi använder hakparenteser anger att det är en matris. För att initiera matrisen, vi använder krökt parenteser, och värdena avgränsas med kommatecken.
När vi vill använda ett värde från en matris, måste vi ange som placerar i arrayen vi vill ha värdet av. Låt oss använda matrisen i blink7 som ett exempel:
int array [] = {1,2,3,4,5,6,5,4,3,2}.
om vi vill få det första värdet i matrisen, använder vi
Array [0]
Noll mellan hakparenteser kallas index. Arrayer är nollbaserat, detta innebär att det första elementet i arrayen har index noll. Detta kan vara förvirrande först, till exempel, array [5] att returnera 6, där du förväntar dig att återvända 5.
Ni kan föreställa er att detta kan orsaka en hel del problem... Det är därför detta fel har sitt eget namn: ett av ett feleller OBOE för korta.
När du försöker läsa ett värde som inte är inuti matrisen, array [10] till exempel Arduino kommer bara läsa nästa plats i minnet, utan att inse att värdet den har behandlingen är inte en del av matrisen längre. Det kommer bara ge dig värdet hittas på den särskilda platsen i dess minne.
Men det blir ännu värre när du skriver till ett index utanför utbud, eftersom du kan skriva över andra data, som variabler eller bitar av kod som råkar vara på den platsen i minnet! En dålig idé...
Om du vill deklarera en array utan att initiera det ännu, kan du använda
Array [10].
Observera att 10 är antalet element, medan den sista delen kommer att vara array [9]!
Om du initiera den på samma rad, som i blink7, Arduino IDE räknas element för dig och du behöver inte ange något mellan hakparenteserna.
Om du vill veta antalet element i matrisen, kan du använda funktionen sizeof(array) . Den här funktionen returnerar matrisen, storlek i byte (1 byte = 8 bitar). Detta är dock inte mängden beståndsdelar, i blink7, sizeof(array) kommer tillbaka 20. Detta beror på att varje element är ett heltal, och en int är 2 byte lång. Så det totala antalet element är 20/2 = 10.
Vi använder detta för att lämna våra för-loop när vi har läst hela utbud: så länge index är lägre än antalet element, kan vi säkert läsa matrisen. Vi börja med i = 0, eftersom det första elementet har index 0. Denna tid vi bara öka jag med 1. Notationen "i ++" är exakt samma som skriver "jag = i + 1", det är bara kortare. Ett annat sätt att skriva det här skulle vara "jag += 1'.
Eftersom LED #1 är ansluten till stift 2, LED #2 till stift 4, 3 till 6 etc, multiplicera vi antalet LED med 2 för att få pin-kod.
Arduino referens: sammansatta tillägg
Du kan ändra värdena i matrisen till göra din egen sekvens, och du kan även lägga till eller ta bort element, eftersom vi gjort vårt program oberoende av längden på arrayen, med hjälp av funktionen sizeof().
Sammanfattning:
- En matris är en lista över värden (eller tecken eller andra matriser) och använder hakparenteser]
- Detta är förklaringen av en matris: "int array [10]."
- Detta är den förklaringen och initiering av en matris: "int array [] = {1,2,3,4,5,6,5,4,3,2}.
- Matris är nollbaserat, vilket innebär att det första elementet har index 0
- sizeof(array) returnerar storleken i byte för matrisen
- sizeof(data Type) returnerar storleken i byte för datatypen
- sizeof (array) / sizeof (datatypen array) ger dig antalet element i matrisen
Extra: 2-dimensionell matriser (matriser)
I en matris kan elementen inte bara datatyper, liksom ints, men också andra matriser. Detta gör att du kan ha så kallade 2-dimensionell matriser, som kan jämföras med matriser.
Detta används i exempel blink8: nu kan du både ledde numret och förseningen i matrisen.
int array [] [2] = {
{1, 600},
{2, 100},
{3, 100},
{4, 100},
{5, 100},
{6, 600},
{5, 100},
{4, 100},
{3, 100},
{2, 100}
};
Observera att vi har att ange alla mått utom det första mellan hakparenteser, när du deklarerar en flerdimensionell matris.
Syntaxen för få en värdet av matrisen är
Array [rad] [kolumn]
Öppna exempel matrix_sum. Detta exempel kommer inte göra något om du laddar upp det, det har inte alla utgångar, det är bara för lärandesyfte.
Det skapar 4 matriser (2D array), varav två har värden. Därefter beräknas det bara summan av de två matriserna och omkastade matrisen för den första.
Detta görs med hjälp av nästlade for-loopar. På bilden ovan kan du följa denna förklaring.
Siffrorna är den ordning de for-loop kommer att gå över dem. Jag används för raderna, j för kolumnerna. De börjar på första kolumnen och den första raden (1,1) i matrix notation, [0] [0] för array notation, sedan kolumnen är ökat (1,2) eller [1] [0], kolumnen ökas igen (1,3) eller [2] [0] när j ökas igen, j-loopen avslutas, eftersom j inte längre är mindre än tre. Jag ökas, j återställs till noll: (2,1) eller [0] [1], j ökas: (2,2) eller [1] [1], sedan (2,3) eller [2] [1]. Jag ökas, j återställs till noll: (3,1) eller [2] [0], sedan (3,2) eller [2] [1], och slutligen (3,3) eller [2,2]. Nu j avslutar, och jag avslutar också.
Beräkningen av omkastade matrisen är liknande, det swappar bara kolumnerna och raderna:
transposeMatrix [i] [j] = matrisen [j] [i];
Inuti dessa matriser, kan du använda flera matriser, i princip skapa flerdimensionella utrymmen. I teorin, han antal dimensioner är obegränsad, men när du använder mer än tre dimensioner, det blir mycket komplicerat, så andra metoder är att föredra.