Δημιουργώντας functions

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

Δηλώνοντας functions

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

datatype funcname() {
// code statements
}

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

Παράδειγμα: Για την δημιουργία μιας function που δεν επιστρέφει δεδομένα χρησιμοποιούμε τον τύπο δεδομένων void:

void MyFunction() {
Serial.println(“This is my first function”);
}

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

void setup(){
Serial.begin(9600);
MyFunction();
Serial.println(“Now we’ re back to the main program”);
}

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

Επιστρέφοντας μια τιμή

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

return value;

όπου value η τιμή που επιστρέφει η συνάρτηση. Η τιμή value μπορεί να είναι μια αριθμητική τιμή οποιαδήποτε τύπου δεδομένων ή μια τιμή string.

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

float MyFunction3() {
float result;
result = 10.0/2.0;
return result;
}

Για να πάρεις την τιμή που επιστρέψει η συνάρτηση θα πρέπει να την εκχωρήσεις σε μια μεταβλητή όπως φαίνεται ακολούθως:

float value;
value = MyFunction3();

Εκχωρώντας τιμές σε συναρτήσεις

Συχνά δημιουργείται η ανάγκη να εκχωρήσουμε μια ή περισσότερες τιμές σε μια function για επεξεργασία.

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

value = area(10, 20);

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

int area(int width, int height){
int result = width * height;
return resul;
}

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

void setup() {
          int returnValue;
          Serial.begin(9600);
           Serial.print(“The area of a 10 X 20 size room is”);
           returnValue = area(10, 20);
           Serial.print ln(returnValue);
}
void loop(){
}
int area(int width, int height){
            int result = width * height;
            return result;
}

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

1) Καθολικές μεταβλητές
2) τοπικές μεταβλητές

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

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

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

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