Jakie rodzaje zmiennych mamy w Arduino?

Czas czytania: 5 min.

Zmienne w Arduino

W programowaniu bardzo istotny jest typ deklarowanych zmiennych. Od niego zależy poprawność kodu, a także możliwości danej zmiennej i np. dokładność obliczeń w napisanym przez nas programie. W tym artykule przedstawiono typy zmiennych używanych w programowaniu w środowisku Arduino IDE.

Programowanie komputerów z użyciem zmiennych

Komputery, w tym miniaturowe platformy do prototypowania jak np. Arduino, wykonują obliczenia i operacje logiczne za pomocą procesora. Sercem procesora i mikrokontrolera, jest jednostka arytmetyczno-logiczna (ALU), która wykonuje proste operacje na lokalizacjach w pamięci, np. dodawanie, odejmowanie i iloczyn logiczny. Jednostka arytmetyczno-logiczna nie rozpoznaje co te dane reprezentują, nawet pomimo wiedzy projektanta lub użytkownika docelowego. Dane poddawane operacjom arytmetyczno-logicznym, są potrzebne w wykonywaniu obliczeń na liczbach całkowitych jak i zmiennoprzecinkowych.

Cały kontekst dla tych operacji pochodzi z kompilatora, a wskazówki dotyczące kontekstu trafiają do kompilatora od użytkownika. Natomiast zadaniem programisty, jest przekazanie kompilatorowi, która z wartości pobieranych do obliczeń jest liczbą całkowitą, a która jest liczbą zmiennoprzecinkową. Kompilator musi więc zrozumieć co mamy na myśli, kiedy chcemy przykładowo zsumować ze sobą dwie liczby – jedną całkowitą, a drugą – zmiennoprzecinkową. W jednych przypadkach jest to prosta czynność, a w innych już nie. Ten z pozoru prosty proces, jest bardziej złożony niż się to może wydawać, szczególnie patrząc na to przez pryzmat wykonywania tych obliczeń bezpośrednio przez człowieka na kartce lub w pamięci. Z tego względu, wprowadzając dane liczbowe do programu, niezbędne jest określenie typu zmiennej przyporządkowanej do tego argumentu.

Arduino - typy zmiennych

Typy zmiennych służą do identyfikacji typów danych i związanych z nimi funkcji do obsługi danych. Określanie ich służy do deklarowania funkcji i zmiennych, które określają wzorzec bitowy i przestrzeń pamięci.

W środowisku programowania Arduino IDE, są wykorzystywane następujące typy zmiennych, które omówimy na przykładach:

  • void
  • int
  • char
  • float
  • double
  • unsigned int
  • short
  • long
  • unsigned long
  • byte
  • word

Typ void

Typ danych void określa pusty zestaw wartości i jest używany tylko do deklarowania funkcji. Jest używany jako typ zwracany dla funkcji, które nie zwracają żadnej wartości. Rozważmy poniższy kod:

  1. int a = 5;
  2. void setup( )
  3. {
  4. . //
  5. }
  6. void loop ( )
  7. {
  8. .
  9. .
  10. }

Typ int

Typy danych int obejmuje liczby całkowite, takie jak np. 1, 27, 39, -11, -27, -46 itd. Nie mają one części ułamkowej (mantysy). Typy danych całkowitych, jest uważany za podstawowy typ danych do przechowywania liczb. Rozmiar danych typu int wynosi dwa bajty (16 bitów). Zakres danych typu int obejmuje liczby z przedziału od -32768 to 32767 lub w zapisie potęgowym od – (215) do ((215) – 1). 

W mikrokontrolerach AVR ATmega i płytce Arduino UNO R3, typ danych int przechowuje wartości o rozmiarze do dwóch bajtów. Natomiast w przypadku płytek Arduino Zero i Arduino MKR1000 opartych na mikrokontrolerze SAMD21 oraz Arduino Due, typ danych int przechowuje wartości od 4 do 32 bitów. Wobec tego, minimalny zakres obejmuje liczby z przedziału od -(231) do ((231)-1) lub zapisując inaczej, od -2147483648 do 2147483647. Liczby ujemne są natomiast przechowywane w postaci potęg liczby 2 o wykładniku naturalnym. Wartość najwyżej położonego bitu (MSB), określa znak liczby. Rozważmy poniższy kod:

  1. int var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej

Przykładowo,

  1. int a;
  2. int b = 4;

Jakakolwiek zmienna lub identyfikator zmiennej stają się zmienną całkowitą i może przechowywać tylko liczby całkowite. Rozważmy poniższy kod:

  1. int Suma = 0;
  2. void setup( )
  3. {
  4. Serial.begin(9600);
  5. }
  6. void loop ( )
  7. {
  8. Suma++; //przy kazdym okrazeniu petli, suma jest zwiekszana o 1
  9. Serial.println (Suma); //wyswietlanie obecnego wyniku sumy
  10. delay(2000); //nastepne okrazenie petli za 2s
  11. }

Typ char

Typ danych char może przechowywać dowolną liczbę zestawów znaków. Identyfikator zadeklarowany jako char staje się zmienną znakową. Literały pisane są w jednym cudzysłowie. Często mówi się, że typ char jest typem całkowitym. Dzieje się tak dlatego, że symbole, litery itp. są reprezentowane w pamięci przez powiązane kody liczbowe i są to tylko i wyłącznie liczby całkowite. Rozmiar typu danych char to minimum osiem bitów. Możemy użyć typu danych byte dla typu danych jak unsigned char o długości 8 bitów lub jednego bajtu. Na przykład, litera ‘A’ według kodowania ASCII ma przypisaną wartość liczbową 65. Z tego względu, jeśli wprowadzimy wyrażenie ‘A’ + 2, według standardu ASCII będzie miało ono wartość 67. Rozważmy kod:

  1. char var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej

Rozważmy kod:

  1. char mojazmienna = ' B ';
  2. char mojazmienna = 66 ; // obie wartosci sa rowne sobie

Typ float

Liczba zawierająca część ułamkową i część całkowitą, jest uważana za liczbę zmiennoprzecinkową. Na przykład 3.142 jest liczbą zmiennoprzecinkową. Liczba 14 jest liczbą całkowitą, a 14.0 jest liczbą zmiennoprzecinkową. Ze względu na większą rozdzielczość, liczby ułamkowe są używane do przybliżania wartości ciągłych i analogowych (np. przy pomiarze napięć elektrycznych za pomocą przetwornika ADC wbudowanego w mikrokontroler). Liczby zmiennoprzecinkowe można również zapisać w postaci wykładnika. Liczby mogą być tak duże jak 3.4028235E+38 i tak małe jak -3.4028235E+38. Zatem rozmiar typu danych float, wynosi 4 bajty lub 32 bity.

Rozważmy kod:

  1. float var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Rozważmy kod:

  1. int x ;
  2. int y ;
  3. float z ;
  4. void setup ( )
  5. {
  6. Serial.begin (9600);
  7. }
  8. void loop ( )
  9. {
  10. x = 3 ;
  11. y = x/2 ; // y jest zmienna typu int i nie moze przechowywac ulamkow wiec zwroci 1
  12. z = (float) x / 2.0 ; // z przechowuje wartosc 1.5 bo jest typu float
  13. // to oznacza, ze musimy uzyc dzielenia przez 2.0 zamiat 2
  14. }

 

Z powyższego kodu wynika, że nawet jeśli do obliczeń zmiennoprzecinkowych używamy liczb całkowitych, należy dopisywać po nich kropkę dziesiętną oraz zero. W innym przypadku, kompilator zrozumie, że użyliśmy liczby całkowitej i będzie zwracał wartości całkowite. Liczby zmiennoprzecinkowe można także przekonwertować do postaci całkowitej. Rozważmy kod:

  1. float a =4.7 ;
  2. int b = a + 0.5 ; // program zwraca wartosc 5

Typ double

Typ danych double jest również używany do obsługi liczb dziesiętnych lub zmiennoprzecinkowych. Zajmuje dwa razy więcej pamięci niż typ float. Przechowuje liczby zmiennoprzecinkowe z większą precyzją i zakresem. Typ double oznacza liczby zmiennoprzecinkowe podwójnej precyzji i zajmuje cztery bajty na płytach ATmega i UNO oraz 8 bajtów na Arduino Due. Rozważmy kod:

  1. double var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Typ unsigned int

Typ unsigned int przechowuje wartość do dwóch bajtów lub 16 bitów. Przechowuje tylko wartości dodatnie. Zakres typu danych unsigned int wynosi od 0 do 65 535 lub od 0 do ((216) – 1). Arduino Due przechowuje wartość danych bez znaku wynoszącą 4 bajty lub 32 bity. Różnica między typem danych bez znaku i ze znakiem to bit znaku. W 16-bitowej liczbie, 15 bitów jest interpretowanych z uzupełnieniem do dwójek, podczas gdy najwyższy bit jest interpretowany jako liczba dodatnia lub ujemna. Jeśli starszy bit to „1”, jest uważany za liczbę ujemną. Rozważmy kod:

  1. unsigned int var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. unsigned int pinLED = 3;

Typ short

Short to typ danych całkowitych, który przechowuje dwa bajty lub 16-bitowe dane.

Zakres typu zmiennej short wynosi od -32768 do 32767 lub – (215) do ((215) – 1). Arduino oparte na mikrokontrolerach ARM i ATmega zwykle przechowuje wartość danych typu short na dwóch bajtach. Rozważmy kod:

  1. short var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. short pinLED = 3;

Typ long

Typ danych long jest uważany za zmienne o rozszerzonym rozmiarze, które przechowują cztery bajty (32-bity). Rozmiar danych typu long obejmuje zakres od -2147483648 do 2147483647. Używając liczb całkowitych, po co najmniej jednej z liczb, powinna występować litera L, co wymusza, aby liczba była typem danych long. Rozważmy kod:

  1. long var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. long speed = 186000L;

Typ unsigned long

Typy danych typu unsigned long są również uważane za zmienne o rozszerzonym rozmiarze, które przechowują 4 bajty (32-bity).Ten typ jednak nie przechowuje liczb ujemnych, jak inne typy danych bez znaku, co sprawia, że ich rozmiar mieści się w zakresie od 0 do 4 294 967 295 lub (2^32 – 1). Rozważmy kod:

  1. unsigned long var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. unsigned long czas;

Typ byte

Byte jest rodzajem danych typu unsigned, który przechowuje wartości z przedziału od 0 do 255Rozważmy kod:

  1. byte var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. byte x = 22;

Typ word

Typ word dotyczy liczb nieujemnych rozpisanych na szesnastu bitach lub dwóch bajtach i zawiera się w przedziale od 0 do 65535. Rozważmy kod:

  1. word var = val;

gdzie:

var = zmienna

val = wartość przypisana do zmiennej var

Przykładowo:

  1. word d = 5000;

Jak oceniasz ten wpis blogowy?

Kliknij gwiazdkę, aby go ocenić!

Średnia ocena: 4.2 / 5. Liczba głosów: 27

Jak dotąd brak głosów! Bądź pierwszą osobą, która oceni ten wpis.

Podziel się:

Picture of Maciej Figiel

Maciej Figiel

Wszechstronny, chętnie podejmuje się wyzwań, bo uważa, że jest to najszybsza droga ku rozwojowi. Ceni sobie kontakt z naturą i aktywny wypoczynek. Pasjonat motoryzacji i nowych technologii.

Zobacz więcej:

Rafał Bartoszak

Problem Europejskich technologii

Nie sposób zaprzeczyć, że innowacyjność odgrywa kluczową rolę w długoterminowym rozwoju gospodarczym. Europa jednak napotyka pewne wyzwania w tym obszarze. W tym artykule przyjrzymy się im bliżej.

Masz pytanie techniczne?
Napisz komentarz lub zapytaj na zaprzyjaźnionym forum o elektronice.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Ze względów bezpieczeństwa wymagane jest korzystanie z usługi Google reCAPTCHA, która podlega Polityce prywatności i Warunkom użytkowania.