Σκοπός Συλλογή & Επεξεργασία Δεδομένων Προγραμματίζοντας τον Arduino ΙΙ Εντολή Εκχώρησης & Εντολές Ελέγχου. Πρόγραμμα Εντολές Επεξεργασίας Δεδομένων Εντολή Εκχώρησης Εντολές Ελέγχου Λογική συνθήκη Εντολή Επιλογής if Εντολές Επανάληψης 1
Μέρος Β : Εντολές Εκχώρησης & Ελέγχου Β.1 ΣΚΟΠΟΣ Η είσοδος δεδομένων σ ένα πρόγραμμα, μέσα από τις εντολές εισόδου, είναι απαραίτητη προϋπόθεση, για τη λειτουργία του προγράμματος. Από την άλλη πλευρά, οι εντολές εξόδου του προγράμματος φανερώνουν / εξωτερικεύουν τη λειτουργία του προγράμματος, είτε αυτή περιλαμβάνει την ανάλυση των δεδομένων ή την επίδραση / επενέργεια του προγράμματος, στο εξωτερικό περιβάλλον. Όμως, ένα πρόγραμμα δεν είναι μόνον είσοδος και έξοδος. Το κυριότερο χαρακτηριστικό και η βασικότερη λειτουργία ενός προγράμματος, είναι η ανάλυση / επεξεργασία των δεδομένων που το πρόγραμμα διαβάζει, μέσα από τις εντολές εισόδου. Αυτή η επεξεργασία γίνεται, χρησιμοποιώντας εντολές που ορίζουν διάφορες μορφές αλγεβρικών και λογικών υπολογισμών, στα δεδομένα του προγράμματος. Έτσι, ανάμεσα στις εντολές εισόδου και τις εντολές εξόδου ενός προγράμματος, είναι οι εντολές που επεξεργάζονται τα δεδομένα του προγράμματος. Σ αυτή την ενότητα, εξετάζουμε αυτές τις εντολές, δηλαδή τις εντολές που χρησιμοποιούμε σ ένα πρόγραμμα, για να προσδιορίζουμε την επεξεργασία των δεδομένων του προγράμματος. Ξεκινάμε από την εντολή εκχώρησης. Β.2 Η Εντολή Εκχώρησης σ ένα Πρόγραμμα Αν ένα πρόγραμμα διαβάζει δεδομένα ή μετρήσεις, από αισθητήρες και όργανα μέτρησης, είναι για να επεξεργάζεται, δηλαδή, να αναλύει αυτές τις μετρήσεις και στη βάση αυτής της ανάλυσης, να μεταβάλλει / να επιδρά στο εξωτερικό περιβάλλον, μέσα από εντολές, όπως η analogwrite() και η digitalwrite() που δημιουργούν τάσεις και μπορεί να οδηγούν ή να ρυθμίζουν τη λειτουργία διάφορων κινητήρων. Έτσι, ένα πρόγραμμα, μετά τις εντολές εισόδου και πριν από τις εντολές εξόδου, περιλαμβάνει εντολές που προσδιορίζουν την επεξεργασία των δεδομένων του προγράμματος. Η βασικότερη εντολή επεξεργασίας δεδομένων, σ ένα πρόγραμμα, είναι η εντολή εκχώρησης που έχει τη μορφή: Το σύμβολό = στην εντολή, δεν δηλώνει την ισότητα της παράστασης στα δεξιά με τη τιμή της μεταβλητής, στα αριστερά του συμβόλου, αλλά εκχώρηση, δηλαδή 2
Εικόνα 1: Το κύκλωμα (δεξιά) και το πρόγραμμα (αριστερά), για τη μέτρηση της θερμοκρασίας με τον TMP36. Το πρόγραμμα διαβάζει τη μέτρηση από τον TMP36, χρησιμοποιώντας την analogread() και μέσα από δύο εντολές εκχώρησης, μετατρέπει αυτή τη μέτρηση, πρώτα, στη τιμή τάσης που δημιουργεί ο αισθητήρας και μετά, στην αντίστοιχη θερμοκρασία. την αποθήκευση της τιμής της αλγεβρικής παράστασης, στη μεταβλητή, στα αριστερά του =. Η παράσταση στα δεξιά του =, είναι μία αλγεβρική παράσταση που περιλαμβάνει αριθμητικές πράξεις / υπολογισμούς σε τιμές που το πρόγραμμα διαβάζει, από διάφορους αισθητήρες ή όργανα μέτρησης. Το αποτέλεσμα του υπολογισμού που προσδιορίζεται από αυτή τη παράσταση, εκχωρείται, δηλαδή αποθηκεύεται στη μεταβλητή, στα αριστερά του =. Ένα χαρακτηριστικό παράδειγμα της λειτουργίας της εντολής εκχώρησης, σ ένα πρόγραμμα, είναι η μέτρηση της θερμοκρασίας, χρησιμοποιώντας τον TMP36. Η συνδεσμολογία του αισθητήρα στον Arduino, παριστάνεται στην Εικόνα 1. Το 3
πρόγραμμα που διαβάζει τη μέτρηση από τον αισθητήρα και μετατρέπει αυτή τη μέτρηση σε τιμή θερμοκρασίας, παριστάνεται στην Εικόνα 1. Σ αυτό το πρόγραμμα, η εντολή analogread() διαβάζει τη τάση που δημιουργεί ο αισθητήρας, στην αναλογική θύρα A0 του Arduino (Εικόνα 1). Είδαμε παραπάνω πως η analogread() καλείται με μία παράμετρο που προσδιορίζει μία αναλογική θύρα του Arduino, για να διαβάσει τη τάση, σ αυτή τη θύρα. Είδαμε ακόμα πως η analogread() δεν επιστρέφει τη τιμή της τάσης που καλείται να διαβάσει, αλλά μία τιμή στο διάστημα [0, 1023] που είναι ανάλογη αυτής της τάσης. Αν για παράδειγμα, σ ένα πρόγραμμα, η analogread() καλείται να διαβάσει τη τάση στην A0 του Arduino και η τάση σ αυτή τη θύρα είναι 3 V, τότε η analogread() δεν επιστρέφει τη τιμή 3, αλλά τη τιμή: 1023 * 3 / 5 = 614! Επειδή λοιπόν η μέτρηση που η analogread() επιστρέφει στο πρόγραμμα, από τον αισθητήρα θερμοκρασίας, δεν δείχνει απευθείας τη τιμή θερμοκρασίας που μετράει ο αισθητήρας, αλλά μία αντίστοιχη τιμή, χρειάζεται να κάνουμε μία σειρά από μετατροπές σ αυτή τη τιμή, για να καταλήξουμε στη πραγματική τιμή θερμοκρασίας που μετράει ο αισθητήρας. Η πρώτη από αυτές τις μετατροπές, είναι να μετατρέψουμε τη τιμή που επιστρέφει η analogread() στο πρόγραμμα, στη πραγματική τιμή τάσης που δημιουργεί ο TMP36 στην A0, διαιρώντας τη μέτρηση που επιστρέφει η analogread() και που αποθηκεύεται στη μεταβλητή val δια 204.6. Αυτό ακριβώς κάνει η εντολή εκχώρησης αμέσως μετά την analogread(), στο πρόγραμμα της Εικόνας 1. Μετατρέπει τη τιμή που επιστρέφει η analogread() που είναι ανάλογη της τάσης στην Α0 του Arduino και που αποθηκεύεται στη μεταβλητή val, στη πραγματική τιμή τάσης που δημιουργεί ο αισθητήρας στην Α0, διαιρώντας την δια 204.6. Η τιμή που υπολογίζεται από αυτή τη διαίρεση και που είναι η πραγματική τάση που δημιουργεί ο αισθητήρας TMP36 στην Α0, εκχωρείται, δηλαδή, αποθηκεύεται στη μεταβλητή V. Η επόμενη μετατροπή, είναι να μετατρέψουμε τιμή της μεταβλητής V, από τάση σε θερμοκρασία, χρησιμοποιώντας τη χαρακτηριστική καμπύλη του αισθητήρα θερμοκρασίας, στην Εικόνα 2. Αυτή η καμπύλη δείχνει τη τιμή θερμοκρασίας που αντιστοιχεί σε κάθε τιμή τάσης που μπορεί να δημιουργεί ο αισθητήρας. Από τη χαρακτηριστική καμπύλη του αισθητήρα, βλέπουμε πως η θερμοκρασία που αντιστοιχεί σε τιμή τάσης από το αισθητήρα, είναι, ενώ σε τάση από τον αισθητήρα, αντιστοιχεί θερμοκρασία. Έτσι, βλέπουμε πως η χαρακτηριστική καμπύλη του α- ισθητήρα θερμοκρασίας είναι μία ευθεία που περνάει από τα σημεία (0, 0.5) και (50, 1). Επομένως, η εξίσωση αυτής της καμπύλης είναι η εξίσωση της ευθείας: 4
Εικόνα 2: Η χαρακτηριστική καμπύλη του αισθητήρα θερμοκρασίας TMP36. Η καμπύλη δείχνει τη θερμοκρασία που αντιστοιχεί σε κάθε τιμή τάσης που μπορεί να δημιουργεί ο αισθητήρας. Επειδή αυτή η καμπύλη είναι μία ευθεία που περνάει από τα σημεία (0, 0.5) και (50, 1), η εξίσωση αυτής της καμπύλης που δίνει θερμοκρασία, από τάση, είναι η εξίσωση της ευθείας από αυτά τα σημεία. Άρα, όπου V είναι μία τιμή τάσης από τον αισθητήρα και T είναι η αντίστοιχη θερμοκρασία. Η παραπάνω εξίσωση μας επιτρέπει να μετατρέπουμε μία τιμή τάσης από τον αισθητήρα TMP36, στην αντίστοιχη τιμή θερμοκρασίας. Έτσι, η δεύτερη εντολή εκχώρησης στο πρόγραμμα της Εικόνας 1, χρησιμοποιεί αυτή την εξίσωση, για να μετατρέψει τη τάση που δημιουργεί ο αισθητήρας στην Α0 του Arduino και που έ- χουμε αποθηκεύσει στη μεταβλητή V, σε μία τιμή θερμοκρασίας και αποθηκεύει αυτή τη θερμοκρασία, στη μεταβλητή Temp (Εικόνα 3). Ο λόγος που χρησιμοποιούμε μεταβλητές, όπως οι μεταβλητές στο πρόγραμμα της Εικόνας 1 και αποθηκεύουμε αποτελέσματα υπολογισμών από το πρόγραμμα, σ 5
αυ Εικόνα 3: Η εντολή εκχώρησης που μετατρέπει μία τιμή τάσης από τον αισθητήρα, στην αντίστοιχη θερμοκρασία, χρησιμοποιώντας τη χαρακτηριστική εξίσωση του αισθητήρα θερμοκρασίας και αποθηκεύει αυτή τη τιμή θερμοκρασίας, στη μεταβλητή Temp. τές τις μεταβλητές, είναι για να μπορούμε, μέσα από τις μεταβλητές, να χρησιμοποιούμε τα αποτελέσματα προηγούμενων υπολογισμών, σε επόμενους υπολογισμούς, από το πρόγραμμα, χωρίς να χρειάζεται να ξανακάνουμε τους προηγούμενους υπολογισμούς, συνδυάζοντας έτσι, τα αποτελέσματα από πολλούς επιμέρους υπολογισμούς, σ ένα σύνθετο υπολογισμό / σύνθετη ανάλυση που μας επιτρέπει χρήσιμα συμπεράσματα και λειτουργίες, στη βάση των μετρήσεων από αισθητήρες. Έτσι, μετά τη μετατροπή της τάσης από τον αισθητήρα TMP36 σε θερμοκρασία και την αποθήκευση αυτής της τιμής θερμοκρασίας, στη μεταβλητή Temp, χρησιμοποιούμε αυτή τη μεταβλητή, σε επόμενες εντολές στο πρόγραμμα της Εικόνας 1, για να εκτελέσουμε μία λειτουργία να ανάψουμε ή να σβήσουμε τη LED στη βάση της τιμής της μεταβλητής Temp. Αντί της LED, θα μπορούσαμε να λειτουργούμε ξεκινάμε ή σταματάμε ένα κινητήρα που θα μπορούσε να είναι ο κινητήρας ενός κλιματιστικού, επιχειρώντας έτσι, να αλλάξουμε τη κατάσταση στο εξωτερικό περιβάλλον, στη βάση της μέτρησης της θερμοκρασίας από τον TMP36 και μέσα από τη λειτουργία ενός κινητήρα, από το πρόγραμμα. Β.3 Εντολές Ελέγχου Εκτός από τις εντολές εισόδου, όπως η analogread(), τις εντολές εξόδου και την εντολή εκχώρησης, η C, αλλά και κάθε άλλη γλώσσα προγραμματισμού διαθέτει δύο ακόμα βασικές εντολές: την εντολή επιλογής και την εντολή επανάληψης. Αυτές οι πέντε κατηγορίες εντολών, δηλαδή οι εντολές εισόδου, οι εντολές εξόδου, η εκχώρηση, η εντολή επιλογής και η εντολή επανάληψης, είναι όλες οι εντολές που διαθέτει, όχι μόνον η C, αλλά και κάθε άλλη γλώσσα προγραμματισμού. Κάθε πρόγραμμα στη C, αλλά και σε κάθε άλλη γλώσσα προγραμματισμού, γράφεται χρησιμοποιώντας εντολές, από αυτές τις πέντε κατηγορίες εντολών. 6
Αν και υπάρχουν περισσότερες από μία εντολές επιλογής η if και η switch και περισσότερες από μία εντολές επανάληψης η while, do while και η for όλες οι διαφορετικές εντολές επιλογής έχουν την ίδια βασική λειτουργία. Ανάλογα, όλες οι διαφορετικές εντολές επανάληψης εκτελούν την ίδια βασική λειτουργία που είναι να επαναλαμβάνουν την εκτέλεση μίας ομάδας εντολών, περισσότερες από μία φορές. Οι δύο αυτές κατηγορίες εντολών, δηλαδή οι εντολές επιλογής και οι εντολές επανάληψης ανήκουν σε μία ευρύτερη κατηγορία, τις εντολές ελέγχου. Αυτό γιατί τόσο η εντολή επιλογής, όσο και η εντολή επανάληψης, λειτουργούν ώστε να αλλάζουν τη ροή εκτέλεσης ενός προγράμματος. Τι εννοούμε? Ένα πρόγραμμα αποτελείται από εντολές είναι ένας συνδυασμός εντολών. Καθεμία από αυτές, υποδεικνύει / προσδιορίζει στο μικροεπεξεργαστή, να εκτελέσει μία λειτουργία ή έναν υπολογισμό. Από τη πρώτη γλώσσα προγραμματισμού που ήταν η Assembly, μέχρι τις περισσότερες σημερινές γλώσσες προγραμματισμού, με εξαίρεση το LabVIEW που είναι γλώσσα ροής και τις γλώσσες του ταυτόχρονου προγραμματισμού, ο μικροεπεξεργαστής εκτελεί τις εντολές ενός προγράμματος, αυστηρά, με τη σειρά που είναι γραμμένες στο πρόγραμμα, ξεκινώντας από τη πρώτη εντολή του προγράμματος και εκτελώντας κάθε επόμενη εντολή, μέχρι τη τελευταία, μόνον αφού προηγούμενα, έχει ολοκληρώσει την εκτέλεση της πριν από αυτήν, εντολής, στο πρόγραμμα. Οι εντολές ελέγχου, δηλαδή η εντολή επιλογής και η εντολή επανάληψης επιτρέπουν στο μικροεπεξεργαστή να αλλάζει την εκτέλεση ενός προγράμματος, χωρίς όμως να παραβαίνει το κανόνα να εκτελεί τις εντολές αυτού του προγράμματος με τη σειρά που είναι γραμμένες στο πρόγραμμα. Η εντολή επιλογής επιτρέπει στο μικροεπεξεργαστή να επιλέγει αν θα εκτελέσει μία εντολή του προγράμματος ή αν αντί γι αυτή, θα εκτελέσει μία εναλλακτική εντολή. Η εντολή επανάληψης επιτρέπει στον υπολογιστή να επιλέγει να εκτελέσει μία εντολή ή μία ομάδα εντολών περισσότερες από μία φορές, πριν προχωρήσει στην εκτέλεση της επόμενης εντολής. Γενικά, αυτές οι εντολές η εντολή επιλογής και η εντολή επανάληψης, πρώτα, εξετάζουν μία συνθήκη. Μετά, υποδεικνύουν / οδηγούν το μικροεπεξεργαστή να εκτελέσει τη μία, από δύο τουλάχιστον εναλλακτικές εντολές ή ομάδες εντολών ή να επαναλάβει την εκτέλεση μίας εντολής ή ομάδας εντολών, περισσότερες από μία φορές, στη βάση αυτής της συνθήκης. Παρακάτω, βλέπουμε αυτές τις εντολές, λίγο πιο αναλυτικά και πως αυτές επιτρέπουν στο μικροεπεξεργαστή να αλλάζει την εκτέλεση ενός προγράμματος, αλλά χωρίς να παρεκκλίνει από την αυστηρά σειριακή εκτέλεση των εντολών του προγράμματος, 7
B.3.1 Η Εντολή Επιλογής if Η εντολή επιλογής if περιλαμβάνει / αποτελείται από μία συνθήκη και δύο εντολές ή ομάδες εντολών. Mία ομάδα, μετά τη λέξη if και μία εναλλακτική ομάδα εντολών, μετά την else. H γενική μορφή της εντολής, είναι: Η λογική συνθήκη προσδιορίζει μία σύγκριση. Συγκρίνει τη τιμή μίας μεταβλητής με τη τιμή μίας άλλης μεταβλητής, σταθεράς ή αλγεβρικής παράστασης, αν δηλαδή, η τιμή της πρώτης μεταβλητής είναι ίση, μεγαλύτερη, μεγαλύτερη ή ίση, μικρότερη, μικρότερη ή ίση από τη τιμή της αλγεβρικής παράστασης, στα δεξιά του τελεστή σύγκρισης (Εικόνα 4). Αν η συνθήκη ισχύει (είναι αληθής), τότε ο μικροεπεξεργαστής εκτελεί τις εντολές μετά την if. Αντίθετα, αν η συνθήκη δεν ισχύει (είναι ψευδής), ο μικροεπεξεργαστής εκτελεί μόνον τις εντολές μετά την else (εναλλακτικές εντολές), προσπερνώντας τις εντολές μετά την if (Εικόνα 4). Εικόνα 4: Ένα απλό παράδειγμα της εντολής επιλογής. 8
Για παράδειγμα, η εντολή επιλογής στο πρόγραμμα των Εικόνων 1 και 4, εξετάζει αν η τιμή της Temp, δηλαδή η θερμοκρασία που μετράει ο TMP36 είναι μεγαλύτερη από ένα όριο που είναι οι 30. Αν η τιμή της Temp είναι μεγαλύτερη των 30, τότε ο μικροεπεξεργαστής εκτελεί τη digitalwrite(led, HIGH), μετά την if που ανάβει τη LED, ενώ αν η Temp δεν είναι μεγαλύτερη των 30, τότε ο μικροεπεξεργαστής εκτελεί τη digitalwrite(led, LOW), μετά την else, σβήνοντας τη LED (Εικόνα 4). B.3.2 Η εντολή Επανάληψης While H while είναι η βασικότερη εντολή επανάληψης στη C και σε κάθε γλώσσα προγραμματισμού. Περιλαμβάνει μία συνθήκη και μία ομάδα εντολών και προσδιορίζει πως οι εντολές στο εσωτερικό της, θα εκτελούνται, για όσο η συνθήκη είναι αληθής (Εικόνα 5). Όσο η συνθήκη είναι αληθής, η while εξακολουθεί να εκτελεί τις εντολές στο εσωτερικό της, ελέγχοντας πάλι τη συνθήκη, στο τέλος κάθε επανάληψης. Εικόνα 4: Η λειτουργία της εντολής επανάληψης. 9