Arduino – Adattípusok, változók

Az adattípusokat különböző változók vagy függvények deklarálására használjuk. A változó típusa határozza meg, hogy mekkora helyet foglal el a memóriában, és hogyan kell kezelni az adott bitek csoportját.

A változókat az alábbi szintaxis szerint vezetjükbe.

type variableName = value;

int ledPin = 3;

Az arduino programban definiált konstansok nem foglalnak el semmilyen program memóriát a chipen. A fordító ezekre az állandókra való hivatkozásokat a fordítás idején megadott értékkel helyettesíti. Ezeket a konstansokat a #define kulcsszóval vezetjük be.

#define constantName value

#define ledPin 3

A const egy változó minősítő kulcsszó, amely módosítja a változó viselkedését, így a változó „csak olvasható” lesz. Ez azt jelenti, hogy a változó ugyanúgy használható, mint bármely más típusú változó, de az értéke nem változtatható meg.  A const kulcsszóval definiált konstansok betartják a változó hatókörének szabályait. Ezért előnyösebb a használata mint #define.

const char ledPin = 3;

A függvényben vagy kódblokkban deklarált változók helyi változók. Csak azok a utasítások használhatják, amelyek a függvényben vagy a kódblokkban vannak, kívülről nem érhetők el.

Az alábbi példában a „sum” függvény belsejében deklaráljuk a „myLocalVariable” nevű változót. Ezt a változót csak a „sum” függvény belsejében tudjuk használni. Ezeket helyi vagy lokális változóknak nevezzük.

int sum(int num_1, int nun_2)
{
  int myLocalVariable = 0;

  myLocalVariable = num_1 + nun_2;
  return myLocalVariable;
}

A globális változókat az összes függvényen kívül definiáljuk, általában a program tetején. A globális változó bármely funkcióval elérhető. Vagyis egy globális változó a teljes programban használható a deklarálása után.

A következő példában a „myGlobalVariable” nevű változót a program elején, a függvényeken kívül deklaráltuk. Az így létrehozott változó bárhonnan elérhető, ezért ezeket globális változóknak nevezzük.

int myGlobalVariable = 1;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.Print(myGlobalVariable);
}

Egyenlőre ennyit a változók létrehozásáról és hatókörükről. Lássuk az adattípusokat.

void

A void kulcsszót csak a függvények deklarálásához használjuk. A void azt jelzi, hogy a függvény várhatóan nem ad vissza információt (nincs visszatérési értéke) ahhoz a függvényhez, ahonnan hívták. Saját függvényt is írhatunk vele, amit csak meghívunk egy másik helyen a kódban. A vázlatunk egyik legfontosabb függvénye is void:

void setup()
{

}

bool

Két értéke lehet: true vagy false. Minden bool változó egy byte-ot foglal el a memóriában.

bool value = false;
bool buttonValue = true; 

boolean

A boolean nem standard típus. Használd helyette a bool adattípust.

char

Ez az adat típus egy byte memóriát foglal el, karakter érték tárolására alkalmas, tehát 1 karakter értékét tárolja. A betűket szimmpla idézőjelbe ‘A’, a karakter stringeket dupla idézőjelbe „abc” írjuk. Előjeles adat típus, ez azt jelenti hogy -128 és 127 közötti étékeket tárolhat.

char value = 'A';
char value = "abc";

A karaktereket számként tároljuk, a betűk decimális értéke visszakereshető az ASCII karakter szabványban. Az „A” + 1 értéke 66, mivel az A nagybetű ASCII értéke 65. A Serial.println() parancs segítségével kiirattathatjuk a többi számrendszerben is a soros monitorra.

char value = 'A';

Serial.println(value);
Serial.println(value, DEC);
Serial.println(value, HEX);
Serial.println(value, OCT);
Serial.println(value, BIN);

unsigned char

Ugyanaz, mint az byte adattípus. Egy byte memóriát foglal el. 0 és 255 közötti számokat lehet benne tárolni. Ha lehet használd helyette a byte-ot.

unsigned char myChar = 160;

byte

1 byte-on tárol előjel nélküli számokat, 0 és 255 között. 

byte myByte = 25;

int

Elsődleges adattípus a számok tárolásához. Az ATmega alapú táblákon (pl: Arduino Uno) az integer 16 bit (2 byte) értéket tárol, -32 768 és 32 767 között. Aritmetikai operátorokkal a hagyományos módon működnek, de bitenkénti operátorokat is használhatunk velük.

int myInt = 26;

int a = 5;        // binary: 0000000000000101
int b = a << 14;  // binary: 0100000000000000

unsigned int

Előjel nélküli egész számok tárolására alkalmas. Mivel ugyanúgy 2 byte-on működik mint az integer, nagyobb pozitív értéket tud tárolni: 0 és 65 535 között az ATMega alapú arduinoknál.

unsigned int var = 23;

word

Ugyan az mint az unsigned int. 16 biten tárol előjel nélkül számokat, 0 és 65535 között.

word myWord = 25000;

long

32 biten (4 byte) tárol előjeles számértéket -2 147 483 648 és 2 147 483 647 között. Ha egész számokkal számolunk, akkor az értékek közül legalább az egyiknek hosszúnak kell lennie, vagy egy egész konstansnak, amelyet egy L követ, vagy egy hosszú típusú változónak, amely hosszúra kényszeríti.

long speedOfLight_km_s = 300000L;

unsigned long

Az unsigned long változók kibővített méretű változók a számok tárolásához, és 32 bitet (4 bájt) tárolnak. A szokásos long-al ellentétben az unsigned long nem fog negatív számokat tárolni, így 0 és 4 294 967 295 (2 ^ 32 – 1) tartományba esnek.

unsigned long time = millis();

short

16 bites adat típus, ATMega és ARM alapú Arduinokhoz. Tárolt érték -32 768 és 32 767 között.

short myShort = 10;

float

A float tizedes ponttal rendelkező számokat tátol. A lebegőpontos számok akár 3,4028235E + 38 és akár -3,4028235E + 38 is lehetnek. 32 bit (4 bájt) információként vannak tárolva. A float adattípusban csak 6-7 tizedes számjegy van. Ez az összes számjegyre értendő és nem a tizedespont utáni számjegyekre.

A lebegőpontos számok nem pontosak, és furcsa eredményeket hozhatnak, ha összehasonlítjuk őket. Például a 6.0 / 3.0 nem egyenlő a 2.0-val. Ehelyett ellenőriznie kell, hogy a számok közötti különbség abszolút értéke kisebb-e, mint valami kis szám. Lebegőpontról egész számra történő konvertálás csonkolással eredményezi:

float x = 2.9;
int y = x;

Az y változó eredmény kettő lesz. Kerekítéshez használjuk a round() függvényt:

float x = 2.9;
int y = round(x);

Így az eredmény 3 lesz.

double

Kettős pontosságú lebegőpontos szám.  Az Uno és más ATMEGA alapú táblákon ez 4 bájtot foglal el.

double myDouble = 68.665;

string – char array

Létrehozhatunk stringet egy karakterlánc tömbbel. Ezeket az alábbi példák szerint lehet deklarálni, mindegyik érvényes. A karaktertömbök utolsó eleme a 0 (nulla), innen ismeri fel a fordító a string végét. A tömbökről itt bővebben.

char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '
char Str1[15];
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";
'}; char Str4[ ] = "arduino"; char Str5[8] = "arduino"; char Str6[15] = "arduino";

String – object

Szöveg alapú stringeket manipulálhatunk vele. Erről itt bővebben.

array

A tömb egy memóriahely, amelyek azonos típusú elemeket tárol. A tömb adott helyére vagy elemére való hivatkozásként megadjuk a tömb nevét és az adott elem pozíciószámát a tömbben. A tömbökről itt bővebben.


A következő fejezetben az operátorokról lesz szó.