Spis treści:
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:
int a = 5;
void setup( )
{
. //
}
void loop ( )
{
.
.
}
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:
int var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej
Przykładowo,
int a;
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:
int Suma = 0;
void setup( )
{
Serial.begin(9600);
}
void loop ( )
{
Suma++; //przy kazdym okrazeniu petli, suma jest zwiekszana o 1
Serial.println (Suma); //wyswietlanie obecnego wyniku sumy
delay(2000); //nastepne okrazenie petli za 2s
}
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:
char var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej
Rozważmy kod:
char mojazmienna = ' B ';
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:
float var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Rozważmy kod:
int x ;
int y ;
float z ;
void setup ( )
{
Serial.begin (9600);
}
void loop ( )
{
x = 3 ;
y = x/2 ; // y jest zmienna typu int i nie moze przechowywac ulamkow wiec zwroci 1
z = (float) x / 2.0 ; // z przechowuje wartosc 1.5 bo jest typu float
// to oznacza, ze musimy uzyc dzielenia przez 2.0 zamiat 2
}
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:
float a =4.7 ;
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:
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:
unsigned int var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
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:
short var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
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:
long var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
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:
unsigned long var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
unsigned long czas;
Typ byte
Byte jest rodzajem danych typu unsigned, który przechowuje wartości z przedziału od 0 do 255. Rozważmy kod:
byte var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
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:
word var = val;
gdzie:
var = zmienna
val = wartość przypisana do zmiennej var
Przykładowo:
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.