Δουλεύοντας με μεταβλητές

Αντί να αναφερόμαστε σε μια συγκεκριμένη θέση στη μνήμη για να αποθηκεύσουμε δεδομένα (όπως γίνεται στη γλώσσα Assembly) η γλώσσα του Arduino χρησιμοποιεί απλές μεταβλητές που αντιπροσωπεύουν θέσεις μνήμης για την αποθήκευση δεδομένων.

Επειδή η γλώσσα Arduino βασίζεται στη γλώσσα C γιαυτό η γλώσσα Arduino χρησιμοποιεί μεταβλητές όπως ορίζονται και χρησιμοποιούνται στη γλώσσα C

Στη γλώσσα Arduino η δημιουργία μεταβλητών γίνεται σε δύο βήματα.
– Δήλωση της μεταβλητής για χρήση της στον κώδικα Arduino.
– Εκχώρηση δεδομένων στη μεταβλητή.

Δήλωση μεταβλητής

Κατά τη δήλωση μιας μεταβλητής ο μεταφραστής (compiler) αποθηκεύει το όνομα και άλλη πληροφορία σε ένα εσωτερικό πίνακα και έτσι ο μεταφραστής γνωρίζει τι μεταβλητές χρησιμοποιεί και πόσο χώρο καταλαμβάνουν στη μνήμη. Ωστόσο κατά την δήλωση μιας μεταβλητής, ο μεταφραστής (compiler) δεν εκχωρεί την μεταβλητή σε συγκεκριμένη θέση στη μνήμη, αυτό γίνεται αργότερα

Το όνομα μιας μεταβλητής ορίζει την ετικέτα που θα χρησιμοποιήσεις για να αναφερθείς σε αυτή τη θέση στη μνήμη μέσα από τον κώδικα Arduino. Υπάρχει ένα σύνολο κανόνων που πρέπει να ακολουθήσεις για να δηλώσεις το όνομα μιας μεταβλητής.

1] Το όνομα της μεταβλητής πρέπει να περιέχει μόνο γράμματα, αριθμούς, χαρακτήρες υπογράμμισης και δολαρίου.
2] Το όνομα μιας μεταβλητής πρέπει να ξεκινά με γράμμα.
3] Το όνομα μιας μεταβλητής ακολουθεί τον διαχωρισμό μικρών και κεφαλαίων γραμμάτων.
4] Δεν υπάρχει όριο για το μήκος του ονόματος μιας μεταβλητής.

Κατά τη δήλωση μιας μεταβλητής ορίζεται ο τύπος των δεδομένων που αποθηκεύονται στη μεταβλητή και το όνομα της μεταβλητής όλα μαζί σε μια έκφραση.

Ο τύπος δεδομένων που δηλώνεται κατά τον ορισμό μιας μεταβλητής, υποδηλώνει πόση μνήμη καταλαμβάνει για την αποθήκευση και ανάκτηση δεδομένων. Μπορείς να χρησιμοποιήσεις διάφορους τύπους για τον ορισμό μιας μεταβλητής όπως φαίνεται στον ακόλουθο πίνακα. Μετά που δηλώσεις τον τύπο για μια μεταβλητή μόνο αυτός ο τύπος δεδομένων περιέχονται στη μεταβλητή. Για παράδειγμα, η έκφραση:

float percent;

δηλώνει μια μεταβλητή με τύπο float και όνομα percent.

Εκχώρηση τιμής σε μεταβλητή

Η δεύτερη διαδικασία του ορισμού μιας μεταβλητής είναι η εκχώρηση μιας τιμής στη δηλωμένη μεταβλητή. Για να εκχωρήσεις μια τιμή σε μια μεταβλητή χρησιμοποιούμε τον τελεστή εκχώρησης π.χ

int length;
length = 100;

Αυτό το βήμα εκχώρησης τιμής σε μια μεταβλητή, είναι η πραγματική εκχώρηση της μεταβλητής σε μια θέση της μνήμης. Ο μεταφραστής ψάχνει για μια διαθέσιμη θέση στη μνήμη, τόση μεγάλη ώστε να κρατά το μέγεθος του τύπου της μεταβλητής και αποθηκεύει την εκχωρούμενη τιμή σε αυτή τη θέση της μνήμης.

Μπορείς να δηλώσεις τον τύπο μιας μεταβλητής και να της εκχωρήσεις μια τιμή σε ένα βήμα, όπως στο παρακάτω παράδειγμα:

float weigh = 6.7

Επίσης μπορείς να δηλώσεις τον τύπο πολλών μεταβλητών του ίδιου τύπου, σε ένα βήμα, όπως στο ακόλουθο παράδειγμα:

int a, b, c;
a=3; b=9; c=3;

Σταθερές μεταβλητές

Στη γλώσσα C και επομένως στη γλώσσα Arduino μπορείς να χρησιμοποιήσεις διαμορφωτές έτσι ώστε να τροποποιήσεις τον τύπο μιας μεταβλητής. Ο διαμορφωτής const πριν από τον τύπο μιας μεταβλητής λέει στον μεταφραστή ότι η τιμή που εκχωρείται σε μια μεταβλητή δεν θα αλλάξει. Αυτοί οι τύποι τιμών ονομάζονται σταθερές (constants).

Στη γλώσσα Arduino συνηθίζεται τα ονόματα σταθερών μεταβλητών να γράφονται με κεφαλαία γράμματα π.χ.

const float TAX = 0.07;

Η βιβλιοθήκη του Arduino περιέχει διάφορες τιμές σταθερών, που ορίζονται με τιμές, που συνηθίζεις να χρησιμοποιείς στον κώδικα Arduino, όπως HIGH για την τιμή 1 και LOW για την τιμή 0.

Εμβέλεια μεταβλητών

Το τελευταίο χαρακτηριστικό των μεταβλητών που θα πρέπει να γνωρίζεις είναι η εμβέλεια τους. Η εμβέλεια μιας μεταβλητής καθορίζει που η μεταβλητή μπορεί να χρησιμοποιηθεί στον κώδικα Arduino. Υπάρχουν δυο επίπεδα της εμβέλειας:

– Τοπικές μεταβλητές
– Καθολικές μεταβλητές

Κατά τη δήλωση τοπικών μεταβλητών μέσα σε μια συνάρτηση μπορεί να χρησιμοποιηθούν μόνο από αυτή τη συνάρτηση. Για παράδειγμα αν δηλώσεις μια τοπική μέσα στη συνάρτηση setup(), η τιμή αυτής της μεταβλητής είναι διαθέσιμη μόνο μέσα στη συνάρτηση setup(). Εάν προσπαθήσεις να τη χρησιμοποιήσεις στη συνάρτηση loop() θα πάρεις ένα μήνυμα λάθους.

Σε αντίθεση οι καθολικές μεταβλητές μπορούν να χρησιμοποιηθούν οπουδήποτε μέσα στον κώδικα Arduino. Συνήθως δηλώνουμε τις καθολικές μεταβλητές στην αρχή του κώδικα. Αν δηλώσεις μια καθολική μεταβλητή μπορείς να τη χρησιμοποιήσεις στη συνάρτηση setup() ή στη συνάρτηση loop() ή σε οποιαδήποτε άλλη συνάρτηση που δημιούργησες στον κώδικα. Κάθε φορά που εκχωρείς μια τιμή στη μεταβλητή, μπορείς να την ανακτήσεις από οποιαδήποτε συνάρτηση μέσα στον κώδικα.

Συνήθως χρησιμοποιούμε τα δεδομένα που αποθηκεύονται στις μεταβλητές για εκτέλεση αριθμητικών πράξεων. Μια αριθμητική πράξη αντιπροσωπεύεται από τον αριθμητικό τελεστή που δρα στις τιμές των μεταβλητών και δεδομένων και το αποτέλεσμα είναι μια αριθμητική τιμή. Οι αριθμητικοί τελεστές είναι οι γνωστές πράξεις δηλαδή η πρόσθεση η αφαίρεση, ο πολλαπλασιασμός, η διαίρεση και το υπόλοιπο διαίρεσης όπως φαίνονται στον ακόλουθο πίνακα:

Δουλεύοντας με μεταβλητές

Αντί να αναφερόμαστε σε δεδομένα τα οποία είναι ενσωματομένα στον κώδικα Arduino, χρησιμοποιούνται μεταβλητές οι οποίες αντιπροσωπεύουν δεδομένα αποθηκευμένα στη μνήμη. Με αυτά τα δεδομένα μπορούμε να κάνουμε πράξεις.

Για την δήλωση των πράξεων χρησιμοποιούμε τελεστές για να καθορίσουμε τις πράξεις που θέλουμε να κάνουμε με τις μεταβλητές και δεδομένα. Οι τελεστές χωρίζονται στις ακόλουθες κατηγορίες:

Οι αριθμητικοί τελεστές για να κάνουμε αριθμητικές πράξεις με τις μεταβλητές και δεδομένα.
Σχεσιακοί τελεστές για να συγκρίνουμε τα δεδομένα που είναι αποθηκευμένα στις μεταβλητές.
Λογικοί τελεστές για πράξεις μεταξύ λογικών μεταβλητών και εκφράσεων.

Αριθμητικοί τελεστές

Με τα δεδομένα που έχουν εκχωρηθεί στις αριθμητικές μεταβλητές μπορούμε να κάνουμε αριθμητικές πράξεις όπως οριζονται με τους αριθμητικούς τελεστές, δηλαδή όπως με τη γνωστή πρόσθεση, αφαίρεση, πολλαπλασιασμό, διαίρεση και υπόλοιπο διαίρεσης. Χρησιμοποιούμαι σύμβολα για να ορίσουμε την πράξη όπως φαίνεται στην ακόλουθη εικόνα

Τελεστής            Περιγραφή
+                   Πρόσθεση
-                   Αφαίρεση
*                   Πολλαπλασιασμός
/                   Διαίρεση
%                   Υπόλοιπο διαίρεσης

Σχεσιακοί τελεστές

Χρησιμοποιούμε σχεσιακούς τελεστές για να συγκρίνουμε μεταξύ τους αριθμητικές τιμές που έχουν αποθηκευτεί σε μεταβλητές ή με σταθερά αριθμητικά δεδομένα. Οι σχεσιακοί τελεστές μεταξύ αριθμητικών δεδομένων, δίνουν εκφράσεις οι οποίες αντιπροσωπεύουν μια από τις δυο καταστάσεις true ή false.

Οι τελεστές που χρησιμοποιούνται στις σχεσιακές πράξεις μεταξύ αριθμών στη γλώσσα Arduino φαίνονται στον ακόλουθο πίνακα.

Τελεστής            Περιγραφή
<                   μικρότερο από
>                   μεγαλύτερο από
<=                  μικρότερο από ή ίσο με
>=                  μεγαλύτερο από ή ισο με

Λογικοί τελεστές

Με τους λογικούς τελεστές ορίζουμε πράξεις μεταξύ λογικών τιμών όπως με λογικές μεταβλητές και λογικών εκφράσεων, που παίρνουν τιμές true ή false.

Σειρά εκτέλεσης Αριθμητικών πράξεων

Όπως συμβαίνει σε όλα τα υπολογιστικά συστήματα για την σειρά των μαθηματικών πράξεων, έτσι και στην γλώσσα Arduino ακολουθείται η ίδια τακτική. Για παράδειγμα, η εκχώρηση:

result = 4 + 3 * 3

ο μεταφραστής πρώτα θα εκτελέσει τον πολλαπλασιασμό 3 φορές το 3 και μετά προσθέτει το 4 σε αυτό το αποτέλεσμα, που δίνει την τελική τιμή 13 την οποία την εκχωρεί στη μεταβλητή result

Όπως στα μαθηματικά μπορείς να αλλάξεις τη σειρά των πράξεων χρησιμοποιώντας παρενθέσεις

result2 = (4 + 3) * 3

Τώρα ο μεταφραστής πρώτα προσθέτει το 4 και το 3 και μετά πολλαπλασιάζει το αποτέλεσμα με 3 δίνοντας μια τιμή ίση με 21.

Στη γλώσσα Arduino όπως στις άλλες γλώσσες μπορείς να χρησιμοποιήσεις όσα ζευγάρια παρενθέσεων σου χρειάζονται στους υπολογισμούς σου.

Δημιουργία τυχαίων αριθμών

Κατά τη συγγραφή κώδικα, κάποιες φορές παρουσιάζεται η ανάγκη μια μεταβλητή να παίρνει τυχαίες τιμές. Για παράδειγμα, αυτή η ανάγκη δημιουργείται όταν γράφουμε κώδικα μια ένα ηλεκτρονικό ζάρι ή παιχνιδιών με το Arduino, χρησιμοποιώντας οπτικά εφέ με LEDs.

Για την δημιουργία τυχαίου αριθμού χρησιμοποιούμε την συνάρτηση:

random(min, max+1)

Ο τυχαίος αριθμός που παράγεται από αυτή τη συνάρτηση βρίσκεται μεταξύ min και max. Σημειώστε ότι το δεύτερο όρισμα της συνάρτησης είναι το max+1 το οποίο δεν συμπεριλαμβάνεται στην περιοχή αριθμών. Με τον παρακάτω κώδικα το Arduino παράγει μια τυχαία ακέραια τιμή από την περιοχή 100 έως 1000

int a=0;
a = random(100, 1001);

Για την δημιουργία ενός τυχαίου ακέραιου αριθμού μεταξύ 0 έως max+1, μπορείτε να δώσετε μόνο το πάνω όριο, όπως για παράδειγμα στην γραμμή κώδικα a = random(7); παράγεται ένας αριθμός μεταξύ 0 και 6.

Δυστυχώς το Arduino δεν έχει την δυνατότητα να επιλέξει ένα πραγματικά τυχαίο αριθμό. Μπορείτε να συμπεριλάβετε στον κώδικα σας μια τιμή seed ένα τυχαίο αρχικό αριθμό που χρησιμοποιείται στους υπολογισμούς για την δημιουργία ενός τυχαίου αριθμού από το Arduino.

Μπορείτε να ορίσετε ρητά ένα τρόπο αρχικοποίησης της γεννήτριας τυχαίων αριθμών, ξεκινώντας με ένα seed αριθμό, με την ακόλουθη γραμμή κώδικα:

randomSeed(seed);

από εσάς, αλλά ο απλούστερος τρόπος για την δημιουργία ενός τυχαίου αριθμού από το Arduino είναι να γράψετε κώδικα ο οποίος να ορίζει την τιμή seed σαν την τάση από ένα ασύνδετο αναλογικό πιν. Στην ακόλουθη γραμμή κώδικα επιδεικνύεται αυτή η μέθοδος χρησιμοποιώντας το αναλογικό πιν μηδέν.

randomSeed(analogRead(0));

Όταν το αναλογικό πιν δεν είναι συνδεμένο πουθενά, ο στατικός ηλεκτρισμός από το περιβάλλον δημιουργεί ελαφριά μετρήσιμη τάση. Η τιμή αυτής της τάσης μπορούμε να την ορίσουμε στη seed για να παραχθεί ένας τυχαίος ακέραιος αριθμός στη περιοχή lower έως upper με την χρήση της συνάρτησης random(lower, upper+1);