You are on page 1of 49

Εισαγωγή στον Εμπράγματο Προγραμματισμό

(Physical Computing),
μέσω της πλατφόρμας Arduino.
Σημειώσεις Εργαστηρίου

Σπύρος Τσαλαπάτας
Τμήμα Γεωπονίας Ιχθυολογίας και Υδάτινου Περιβάλλοντος
Πανεπιστήμιο Θεσσαλίας

ΒΟΛΟΣ 2021

Αυτή η εργασία δημοσιεύεται από τον Σπύρο This work is licensed by Spyros Tsalapatas under the
Τσαλαπάτα, υπό την Creative Commons Creative Commons Attribution-ShareAlike 3.0 Unported
Attribution-ShareAlike 3.0 Unported License. Δείτε License. To view a copy of this license, visit
αντίγραφο της αδείας στο http://creativecommons.org/licenses/by-sa/3.0/.
http://creativecommons.org/licenses/by-sa/3.0/
-1-

1 Εμπράγματος Προγραμματισμός (Physical Computing)


Ο όρος Εμπράγματος Προγραμματισμός αναφέρεται σε προγραμματισμό υπολογιστικών συστημάτων για
αλληλεπίδραση με φυσικά αντικείμενα και συσκευές, σε αντίθεση με τις συνήθεις εφαρμογές που απλά
απεικονίζουν κάποιας μορφής πληροφορία σε οθόνες. Ο πρωτότυπος Αγγλικός όρος είναι Physical
Computing. Η συνήθης μετάφραση του όρου στα ελληνικά είναι Φυσικός Προγραμματισμός (επί λέξη
μετάφραση από τον Αγγλικό). Προσωπικά βρίσκω αυτή την μετάφραση ατυχή, και προϊόν της κακής
συνήθειας να μεταφράζουμε όρους, χωρίς να δίνουμε ιδιαίτερη προσοχή ούτε στην ουσιαστική έννοια του
πρωτότυπου, ούτε στις δυνατότητες και τους χρωματισμούς της γλώσσας στην οποία μεταφράζουμε.

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

«Ε.Π. είναι η χρήση λογισμικού και κατάλληλου υλικού για την υλοποίηση κατασκευών που μπορούν να
αισθανθούν και να ανταποκριθούν σε ερεθίσματα από τον πραγματικό κόσμο.
[http://en.wikipedia.org/wiki/Physical_computing]»

«Ε.Π. είναι μια μαθησιακή προσέγγιση στο πώς οι άνθρωποι επικοινωνούν μεταξύ τους μέσω υπολογιστών,
που έχει σαν αφετηρία και βάση τους έμφυτους τρόπους έκφρασης. Παραδοσιακά στη διδασκαλία σχεδίασης
Διεπιφανιών Υπολογιστή παίρνουμε σαν δεδομένο το υλικό (πληκτρολόγιο, οθόνη, ποντίκι, ηχεία και απλά
επικεντρωνόμαστε στη χρήση λογισμικού που είναι απαραίτητο για το σχεδιασμό μέσα σ’ αυτά τα όρια. Στον
Ε.Π. παίρνουμε το ανθρώπινο σώμα σαν δεδομένο και προσπαθούμε να σχεδιάσουμε μέσα στα όρια της
έκφρασής του. [Tom Igoe, http://www.tigoe.net/blog/what-is-physical-computing/]»

Ο συνδυασμός του πνεύματος των δυο ορισμών μπορεί να μας δώσει μια καλή εικόνα για τον Ε.Π. και τους
ανθρώπους που ασχολούνται μ’ αυτόν.

Βέβαια η τεχνολογία αυτή υπάρχει και αναπτύσσεται για δεκαετίες (ρομποτική, συστήματα αυτομάτου
ελέγχου). Μέχρι πρόσφατα όμως ήταν πολύπλοκη, ακριβή, και συνεπώς μη προσβάσιμη για το ευρύ κοινό.
Με την ανάπτυξη της υπολογιστικής ισχύος, τη μείωση του κόστους, και την απλοποίηση της διαδικασίας
προγραμματισμού των σχετικών συσκευών, η τεχνολογία άρχισε να χρησιμοποιείται για ερασιτεχνικούς,
καλλιτεχνικούς και εκπαιδευτικούς σκοπούς, από ανθρώπους με μικρή ή και μηδενική προηγούμενη
εμπειρία σε προγραμματισμό Η/Υ και ηλεκτρονική τεχνολογία. Το ρεύμα αυτό ενισχύθηκε από ανθρώπους
με σημαντική εμπειρία στον τομέα, που δημιούργησαν ολοκληρωμένα συστήματα υλικού και λογισμικού
ειδικά για χρήση από μη ειδικούς.

1.1 Λογισμικό και υλικό ανοιχτού κώδικα


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

1.2 Φιλοσοφία και άδειες χρήσης Ανοιχτού και Ελεύθερου Λογισμικού και
υλικού

-1-
-2-

1.3 Πλατφόρμες (Arduino, Lego, Raspberry pi, others)


Υπάρχουν πολλές πλατφόρμες εκτός του Arduino (υλικό και λογισμικό που) που μπορούν να
χρησιμοποιηθούν. …..

1.4 Ενδιαφέρουσες Εφαρμογές


Στο blog του σεμιναρίου (empragmatos.blogspot.gr) είναι αναρτημένες πληροφορίες για διάφορες
ενδιαφέρουσες εφαρμογές, και σύνδεσμοι προς αναλυτικές περιγραφές τους. Το blog θα ενημερώνεται κατά
τη διάρκεια του σεμιναρίου τουλάχιστον.

1.5 Arduino στην εκπαίδευση


Ελλιπείς πληροφορίες για τρέχουσες εφαρμογές. Αναφορά στις δυνατότητες.

1.6 Scratch για Arduino

2 Στο ψητό
Υπάρχουν διάφορες εκδοχές του υλικού (πλακέτας) και επίσημες, σχεδιασμένες από την αρχική ομάδα, και
ανεπίσημες, σχεδιασμένες από άλλες ομάδες. Η κύρια λειτουργία είναι ίδια σε όλες τις εκδοχές. Οι διαφορές
εντοπίζονται στο μέγεθος και σε διάφορες λεπτομέρειες της διασύνδεσης με εξωτερικά εξαρτήματα και
συσκευές.

2.1 Η βάση του συστήματος


Η βάση του συστήματος είναι ένας μικροελεγκτής (microcontroller). Ο μικροελεγκτής είναι ένα
ολοκληρωμένο κύκλωμα (integrated circuit) ή αλλιώς «τσιπάκι» (chip).

Εικόνα 1. Μικροελεγκτής ATMEL ATMEGA328

Ο μικροελεγκτής είναι ο «εγκέφαλος» του συστήματος. Βέβαια ο «εγκέφαλος» αυτός δεν έχει καμία
δυνατότητα επεξεργασίας αν δεν του δώσουμε εμείς προκαθορισμένες οδηγίες. Τη διαδικασία αυτή την
λέμε προγραμματισμό. Έχει ακίδες (pins, ποδαράκια) που χρησιμοποιούνται για την τροφοδοσία του
(ηλεκτρική), τη ρύθμιση της λειτουργίας του, και την διασύνδεση με άλλα εξαρτήματα και κατ’ επέκταση
εξωτερικές συσκευές.

Κάποιες από αυτές τις ακίδες είναι οι είσοδοι και έξοδοι του μικροελεγκτή. Μπορούμε να τις δούμε σαν
«νευρικές απολήξεις» πάνω στις οποίες είναι δυνατόν να συνδεθούν «αισθητήρια όργανα» (για τον άνθρωπο
είναι μεταξύ άλλων τα αυτιά και τα μάτια) και «μέλη» (για τον άνθρωπο τα χέρια και τα πόδια). Μέσω των
εισόδων δέχεται πληροφορία από τον εξωτερικό κόσμο, την οποία μπορεί να επεξεργαστεί. Μέσω των
-2-
-3-

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

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

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

Θα δούμε σ’ αυτό το στάδιο τα βασικά στοιχεία της δομής του Arduino. Τις λεπτομέρειες θα τις δούμε
προοδευτικά σε πρακτικά παραδείγματα.

Εικόνα 2. Βασικά στοιχεία δομής Arduino

1. Ο μικροελεγκτής
2. Είσοδος τροφοδοσίας (ρεύματος).
3. Είσοδος USB για τη διασύνδεση με τον υπολογιστή (όσο υπάρχει σύνδεση με τον υπολογιστή, δεν
είναι απαραίτητη η σύνδεση της εισόδου τροφοδοσίας).
4. Πλήκτρο επανεκκίνησης.
5. Ψηφιακές ακίδες (είσοδοι/έξοδοι)
6. Αναλογικές είσοδοι
7. Έξοδος τροφοδοσίας (για τα διάφορα εξαρτήματα που θα συνδέσουμε, αισθητήρες, φωτάκια,
κινητήρες κ.λπ.).
8. LED (φωτάκι) συνδεδεμένο στην ψηφιακή 13

2.3 Ψηφιακή και αναλογική λειτουργία ακίδων


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

-3-
-4-

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

Μία ακίδα λειτουργεί ψηφιακά όταν μπορεί να έχει μόνο δύο διακριτές τιμές (Αναμμένο/Σβηστό, ή 1/0, ή
Αληθές/Ψευδές, όλα ισοδύναμα ή συνώνυμα κατά μία άλλη έννοια). Χρησιμοποιούνται για συσκευές που
έχουν σε μία από δύο διακριτές καταστάσεις. Για παράδειγμα ένα φως πού μπορεί να είναι ή αναμμένο ή
σβηστό, θα το συνδέσουμε για να το ελέγξουμε σε μία ψηφιακή έξοδο. Ένα διακόπτη που μπορεί να είναι ή
ενεργοποιημένος ή απενεργοποιημένος θα τον συνδέσουμε για να «διαβάσουμε» την κατάστασή του σε μία
ψηφιακή είσοδο. Τέτοιους διακόπτες μπορεί να έχουν τα συστήματα συναγερμού για να δείχνουν αν μία
πόρτα είναι ανοιχτή ή κλειστή.

Μία ακίδα λειτουργεί αναλογικά όταν μπορεί να έχει ένα εύρος τιμών, αν και περιορισμένο. Αυτό μας
επιτρέπει για παράδειγμα να ρυθμίσουμε την φωτεινότητα μιας λάμπας ή την ταχύτητα ενός κινητήρα που
συνδέονται σε μία έξοδο. Επίσης μας επιτρέπει να διαβάσουμε αισθητήρες θερμοκρασίας, ή έντασης
φωτισμού που δίνουν ένα εύρος τιμών και όχι απλά μία ένδειξη ενεργοποίησης ή απενεργοποίησης. Οι τιμές
είναι απαραίτητα ακέραιες και προφανώς διακριτές. Ο Arduino επιτρέπει για τις αναλογικές εξόδους
ακέραιες τιμές από 0 ως 255 (256 τιμές), και για τις αναλογικές εισόδους ακέραιες τιμές από 0 ως 1023 (1024
τιμές). Οι αριθμοί αυτοί είναι περίεργοι γιατί δεν είναι στρόγγυλοι, ας πούμε 250 αντί 256 και 1000 αντί για
1024. Αυτό ισχύει στο δεκαδικό σύστημα αρίθμησης, στο δυαδικό σύστημα οι αριθμοί 256 και 1024 είναι
στρόγγυλοι (100000000 και 10000000000 αντίστοιχα, βλέπε παράρτημα II). Μπορούμε να χρησιμοποιήσουμε
μία αναλογική έξοδο για να ρυθμίσουμε την ένταση μιας λάμπας. Μπορούμε να χρησιμοποιήσουμε μία
αναλογική είσοδο, με έναν κατάλληλο αισθητήρα, για να «διαβάσουμε» τη θερμοκρασία ενός χώρου.

Οι τιμές που παίρνουν οι αναλογικές συνδέσεις δεν έχουν άμεση σχέση με τα πραγματικά μεγέθη που
αντιπροσωπεύουν. Στο παράδειγμα της μέτρησης της θερμοκρασίας ας πούμε οι τιμές 0 ως 1023 δεν
σημαίνουν 00C ως 1023οC. Η αναλογική είσοδος λειτουργεί ως εξής.

• Ο αισθητήρας έχει τη δυνατότητα να μετρήσει ένα συγκεκριμένο εύρος τιμών του πραγματικού
μεγέθους. Για το παράδειγμα της θερμοκρασίας ας πούμε ότι ο συγκεκριμένος αισθητήρας μπορεί να
μετρήσει από 5οC ως 133οC.
• Αυτό δίνει ένα εύρος 128οC (133 – 5 = 128).
• Το εύρος αυτό διαιρείται σε 1024 ίσα μέρη με μέγεθος για το καθένα 0,125oC (128οC / 1024 ή 1/8
του βαθμού).
• Καθένα από αυτά τα μέρη («κομμάτια» θερμοκρασίας) αντιστοιχίζεται σε μία από τις τιμές της
αναλογικής εισόδου (0-1023) με τη σειρά.

Πραγματική θερμοκρασία Τιμή


αναλογικής
Από Μέχρι εισόδου
5 οC ο
5,125 C 0
5,125 οC ο
5,250 C 1
5,250 οC 5,375 οC 2

132,750 οC 132,875 οC 1022
132,875 οC ο
133 C 1023

0 1 2 1022 1023
5 οC 5,125 οC 5,250 οC 5,375 οC 132,750 οC 132,875 οC 133 οC
-4-
-5-

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

3 Σηκώστε τα μανίκια
Κάθε ταξίδι αρχίζει μ’ ένα μικρό βήμα. Το απλούστερο πράγμα που μπορούμε να κάνουμε με ένα
μικροελεγκτή είναι αναβοσβήνουμε ένα LED. Για μεγαλύτερη ευκολία η ψηφιακή σύνδεση 13 του Arduino
έχει συνδεδεμένο ένα LED πάνω στην πλακέτα όπως είδαμε στην εικόνα 2. Προφανώς για αυτό το
παράδειγμα δεν χρειάζεται να συνδέσουμε τίποτε σε είσοδο ή σε έξοδο.

Είπαμε ότι για να μπορέσει να κάνει οτιδήποτε ο Arduino πρέπει να του δώσουμε οδηγίες. Αυτό γίνεται σε
δύο απλά στάδια.

1. Γράφουμε το πρόγραμμα στο προγραμματιστικό περιβάλλον ή το ανοίγουμε από ένα αρχείο. Στην
ορολογία του Arduino το πρόγραμμα λέγεται «σχέδιο» (sketch). Επίσης το περιεχόμενο ενός
προγράμματος ή και τα επιμέρους τμήματά του λέγονται γενικά «κώδικας». Το σχέδιο είναι οι
οδηγίες γραμμένες σε «γλώσσα προγραμματισμού» που είναι εύκολα κατανοητή στον άνθρωπο.
2. «Ανεβάζουμε» το πρόγραμμα στον Arduino σε γλώσσα που είναι κατανοητή σε υπολογιστή (γλώσσα
μηχανής). Την μετατροπή την κάνει αυτόματα το προγραμματιστικό περιβάλλον. Μόλις το
πρόγραμμα ανεβεί ο Arduino αρχίζει να το «τρέχει»

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

Δείγμα γλώσσας προγραμματισμού Αντίστοιχο δείγμα γλώσσας μηχανής


int a, b, c; 01001011
01110110
void setup(){ 11100110
} 10010010
01010111
void loop(){ .
a = 2; .
b = 3; .
c = a + b; 1898 γραμμές
analogWrite(9, c);
}

3.1 Το προγραμματιστικό περιβάλλον


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

-5-
-6-

Εικόνα 3. Το προγραμματιστικό περιβάλλον του Arduino

Η μπλε λωρίδα στο πάνω μέρος είναι ο τίτλος του παράθυρου. Περιλαμβάνει ένα όνομα για το σχέδιο
βασισμένο στην ημερομηνία. Το όνομα βέβαια μπορούμε να το αλλάξουμε. Επίσης αναφέρεται η έκδοση του
περιβάλλοντος.

Η επόμενη γκρίζα λωρίδα είναι, προφανώς, το μενού.

Η σκούρα κυανοπράσινη λωρίδα περιέχει συντομεύσεις για τις συχνότερα χρησιμοποιούμενες εντολές
[έλεγχος του κώδικα, έλεγχος και «ανέβασμα» στον Arduino, δημιουργία νέου σχεδίου, άνοιγμα σχεδίου,
αποθήκευση σχεδίου, σειριακό παράθυρο]. Το σειριακό παράθυρο χρησιμοποιείται για δεχόμαστε μηνύματα
από τον Arduino (λεπτομέρειες αργότερα).

Στη λευκή περιοχή γράφουμε τον κώδικά μας.

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

Ο κώδικας που φαίνεται στην Εικόνα 3 υπάρχει στο παράδειγμα Afesvesi. Για να το ανοίξουμε επιλέγουμε
από το μενού Αρχείο->Παραδείγματα->Seminar->Afesvesi. Θα ανοίξει ένα νέο παράθυρο με τον κώδικα.

3.2 Τα στοιχεία και η μορφή του κώδικα


Θα δούμε τώρα και τις βασικά στοιχεία του κώδικα. Ο κειμενογράφος του προγραμματιστικού
περιβάλλοντος είναι προσαρμοσμένος στην δομή της γλώσσας προγραμματισμού. Μπορεί να αναγνωρίσει
τα διάφορα στοιχεία και να τα χρωματίσει για να μας διευκολύνει στο να γράψουμε, να ελέγξουμε και να
διορθώσουμε τον κώδικά μας. Η Εικόνα 3 δείχνει το προγραμματιστικό περιβάλλον με φορτωμένο ένα
σχέδιο που σκοπό έχει να αναβοσβήνει ένα LED (λαμπάκι).

3.2.1 Τι σημαίνουν τα χρώματα στον κώδικα;


Βασική έννοια στη δομή του κώδικα είναι η γραμμή. Η γραμμή είναι συνεχές κείμενο που το κλείνουμε
πατώντας το πλήκτρο <Enter>. Πατώντας το πλήκτρο <Enter> αρχίζουμε μια νέα γραμμή.

Το πρώτο στοιχείο που βλέπουμε στην εικόνα 3 είναι κείμενο σε γκρίζο χρώμα, γραμμένο σε «ανθρώπινη»
γλώσσα. Το κείμενο αυτό λέγεται στην προγραμματιστική ορολογία σχόλιο, και προφανώς δεν είναι μέρος

-6-
-7-

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


κάνει και να βοηθήσουμε άλλους που θα διαβάσουν τον κώδικά μας να τον κατανοήσουν. Υπάρχουν δύο
τρόποι να επισημάνουμε τα σχόλια. Ό πρώτος είναι να ξεκινήσουμε πληκτρολογώντας /* (πλάγια γραμμή,
αστέρι), να γράψουμε το σχόλιό μας σε όσες γραμμές θέλουμε και να το κλείσουμε με */ (αστέρι, πλάγια
γραμμή). Αυτή η μέθοδος χρησιμοποιείται στο πρώτο κομμάτι του κώδικα της εικόνας 3. Ο δεύτερος τρόπος
είναι να πληκτρολογήσουμε // (δύο πλάγιες γραμμές) σε οποιοδήποτε σημείο της γραμμής. Το κείμενο που
ακολουθεί είναι σχόλιο και τελειώνει στο τέλος της γραμμής. Η μέθοδος αυτή χρησιμοποιείται σε όλο τον
υπόλοιπο κώδικα της εικόνας 3.

Ότι δεν είναι γκρίζο είναι ο πραγματικός κώδικας. Βλέπουμε ότι το προγραμματιστικό περιβάλλον
χρησιμοποιεί τρία χρώματα. Ποια είναι η σημασία τους;

Το πορτοκαλί χρώμα σημειώνει τις δεσμευμένες λέξεις. Αυτές είναι εντολές ή άλλα στοιχεία κώδικα που
σημαίνουν κάτι συγκεκριμένο και δεν μπορούν να χρησιμοποιηθούν για άλλους σκοπούς (το ποιοι θα
μπορούσαν να είναι αυτοί οι σκοποί θα το δούμε παρακάτω). Για παράδειγμα το pinMode(13,
OUTPUT); σημαίνει όρισε την ακίδα 13 ως έξοδο (θυμηθείτε ότι κάθε ακίδα μπορεί να οριστεί σαν είσοδος
ή έξοδος). Σημειώστε ότι το περιβάλλον ξεχωρίζει τα πεζά γράμματα από τα κεφαλαία και τα θεωρεί
διαφορετικά. Το pinMode δεν είναι το ίδιο με το pinmode. Το πρώτο είναι δεσμευμένη λέξη και σημαίνει
κάτι συγκεκριμένο. Το δεύτερο δεν είναι δεσμευμένη λέξη και για το περιβάλλον δεν σημαίνει κάτι, εκτός αν
κατά κάποιο τρόπο το ορίσουμε εμείς. Λεπτομέρειες για το πώς και γιατί μπορούμε να δώσουμε ένα τέτοιο
ορισμό θα δούμε αργότερα. Αν γράφοντας τον κώδικα από λάθος πληκτρολογήσουμε pinmode, δεν θα
αλλάξει το χρώμα σε πορτοκαλί και θα το καταλάβουμε εύκολα.

Το μπλε χρώμα σημειώνει της σταθερές που αναγνωρίζει το περιβάλλον. Αυτές είναι σύμβολα για
συγκεκριμένες τιμές. Χρησιμοποιούνται για να μην χρειάζεται να θυμόμαστε μια τιμή (ας πούμε ένα αριθμό),
αν αυτή είναι δύσκολη, αλλά και για να διαβάζεται ο κώδικας πιο εύκολα. Για παράδειγμα, η αριθμητική τιμή
που δίνουμε για να ορίσουμε μία ακίδα ως έξοδο είναι 1. Η σταθερά OUTPUT συμβολίζει (αντιπροσωπεύει)
την τιμή 1. Το pinMode(13, OUΤPUT) είναι πιο σαφές για τον άνθρωπο από το pinMode(13, 1).
Επίσης δεν χρειάζεται να θυμόμαστε ποια είναι η αριθμητική τιμή για να ορίσουμε έξοδο.

Το μαύρο χρώμα είναι όλα τα άλλα στοιχεία του κώδικα και θα δούμε τις λεπτομέρειες καθώς θα
προκύπτουν σε παραδείγματα.

Παρατηρούμε ότι κάθε επιμέρους ακολουθία η τελειώνει με (;). Αυτό είναι ένα κομμάτι κώδικα που στην
αγγλική ορολογία λέγεται statement. Η πιο σωστή μεταφορά στα ελληνικά είναι «πρόταση». Όπως και η
προτάσεις στην «ανθρώπινη» γλώσσα περιγράφει πλήρως μία έννοια και μπορεί να σταθεί μόνη της. Η
πρόταση δεν τελειώνει στο τέλος της γραμμής αλλά μόνο όταν εμφανιστεί το (;). Θα μπορούσαμε δηλαδή να
γράψουμε και

pinMode(13,
HIGH);

3.2.2 Θεμελιώδης δομή, setup(), loop()


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

// Η ρουτίνα setup() τρέχει μία φορά στην αρχή.


void setup() {
// η ψηφιακή σύνδεση 13 θα είναι έξοδος.
pinMode(13, OUTPUT);
}
-7-
-8-

// η ρουτίνα loop() επαναλαμβάνεται συνέχεια:


void loop() {
digitalWrite(13, HIGH); // άναψε το LED (δώσε τάση/ρεύμα)
delay(1000); // περίμενε ένα δευτερόλεπτο
digitalWrite(13, LOW); // σβήσε το LED ("κόψε" την τάση/ρεύμα)
delay(1000); // περίμενε ένα δευτερόλεπτο
}

Το κάθε κομμάτι είναι μία ρουτίνα ή συνάρτηση. Αγνοούμε προς το παρόν τη λέξη void, επισημαίνοντας ότι
είναι απλώς απαραίτητο να υπάρχει, τουλάχιστον για τις συγκεκριμένες ρουτίνες. Η επόμενη λέξη είναι το
όνομα της ρουτίνας, που ακολουθείται υποχρεωτικά από ένα ζεύγος παρενθέσεων. Η χρησιμότητα των
παρενθέσεων είναι πολύ συγκεκριμένη αλλά προς το παρόν απλά θα ξέρουμε ότι πρέπει να βρίσκονται εκεί.
Αμέσως μετά ανοίγει μία «καμπυλόγραμμη» αγκύλη που σημειώνει την αρχή του κώδικα της ρουτίνας. Ο
κώδικας της ρουτίνας κλείνει με την αντίστοιχη «καμπυλόγραμμη» αγκύλη.

Η ρουτίνα setup() πρέπει να υπάρχει πάντα σε ένα σχέδιο, έστω και κενή
void setup () {}.
Εκτελείται μία φορά όταν αρχίσει η εκτέλεση του σχεδίου και χρησιμοποιείται για να «στήσουμε» τον
Arduino για την εφαρμογή μας (να δηλώσουμε ποιες ακίδες θα είναι είσοδοι, ποιες έξοδοι και άλλα σχετικά).

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

3.2.3 Οι πρώτες μας εντολές


Τέλος με τη γενική δομή. Ας δούμε τώρα τα στοιχεία τις προτάσεις που λένε στον μικροελεγκτή να κάνει κάτι
συγκεκριμένο. Για να δώσουμε μια τέτοια οδηγία χρησιμοποιούμε μία από τις δεσμευμένες λέξεις. Οι
δεσμευμένες λέξεις που χρησιμοποιούμε στο σχέδιο που μελετάμε, εκτός από τις setup kai loop είναι οι
pinMode, digitalWrite και delay.

Την pinMode την είδαμε πιο πάνω.

Η digitalWrite(13, HIGH) σημαίνει γράψε στην ακίδα 13 την τιμή HIGH. Η λέξη HIGH είναι
σταθερά του προγραμματιστικού περιβάλλοντος και αντιπροσωπεύει την τιμή 1. Πρακτικά σημαίνει «άναψε
ότι είναι συνδεδεμένο». Στην πραγματικότητα η λειτουργία είναι λίγο πιο σύνθετη αλλά προς το παρόν αυτό
μας αρκεί. Τα στοιχεία πού είναι μέσα στις παρενθέσεις λέγονται παράμετροι και είναι πληροφορίες που
χρειάζεται η εντολή για να κάνει αυτό που θέλουμε. Στην προκείμενη περίπτωση είναι η τιμή που θέλουμε να
γράψουμε και ο αριθμός της ακίδας στην οποία θέλουμε να τη γράψουμε.

Η digitalWrite(13, LOW) είναι αντίστοιχη με την προηγούμενη αλλά σημαίνει «σβήσε ότι είναι
συνδεδεμένο» (πάλι μία απλούστευση που προς το παρόν αρκεί). Η λέξη LOW είναι επίσης σταθερά και
αντιπροσωπεύει την τιμή 0.

Η delay(1000) σημαίνει περίμενε (μην κάνεις τίποτε) για 1 δευτερόλεπτο. Δίνουμε την τιμή 1000 γιατί η
delay() μετράει το χρόνο σε χιλιοστά του δευτερολέπτου. Για δύο δευτερόλεπτα δίνουμε 2000. Για μισό
δευτερόλεπτο δίνουμε 500 κ.ο.κ.

-8-
-9-

3.2.4 Επιτέλους δράση!


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

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

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

Μπορούμε εδώ να πειραματιστούμε αλλάζοντας τις τιμές στις προτάσεις delay() για να πετύχουμε
διαφορετικούς ρυθμούς.

4 Εξωστρέφεια.
Μέχρι στιγμής είδαμε τη βασική δομή ενός σχεδίου. Επίσης είδαμε το προγραμματιστικό περιβάλλον και πως
μπορούμε να «ανεβάσουμε» το σχέδιο στον Arduino. Τέλος είδαμε το σχέδιο σε λειτουργία και παίζοντας με
κάποιες τιμές μεταβάλλαμε αυτή τη λειτουργία.

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

4.1 Στοιχεία που ξέρουμε αλλά μπορεί να μη θυμόμαστε.


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

Εικόνα 4. Σχηματικό διάγραμμα ηλεκτρικού κυκλώματος

< VIR.>

Υπάρχουν περιορισμοί στο τι μπορούμε να συνδέσουμε σ’ ένα κύκλωμα και με ποιόν τρόπο. Αν συνδέσουμε
ένα λαμπάκι φακού στην πρίζα (μην το κάνετε ποτέ) θα καεί. Αν συνδέσουμε μία οικιακή λάμπα σε μπαταρία

-9-
-10-

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

4.1.2 Τα βασικά μεγέθη


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

Η πηγή είναι αυτή που «σπρώχνει» το ηλεκτρικό ρεύμα (ή απλά ρεύμα) για να τρέξει στο κύκλωμα. Σε ένα
αντίστοιχο υδραυλικό κύκλωμα θα ήταν η αντλία. Στην Εικόνα 4 η πηγή είναι στη δεξιά άκρη. Το μέγεθος
που περιγράφει τη δύναμη/δυνατότητα που έχει η πηγή να «σπρώξει» το ρεύμα ονομάζεται διαφορά τάσης
συμβολίζεται με V και μετριέται σε volt, που συμβολίζονται επίσης με V. Όπως ξέρουμε από τις μπαταρίες, η
πηγή έχει ένα θετικό πόλο (+) και ένα αρνητικό πόλο (-). Ο αρνητικός πόλος έχει κατά σύμβαση τάση 0V και
το σημείο στο οποίο συνδέεται στο κύκλωμα το λέμε γείωση. Σημειώνεται στο κύκλωμα με ένα τρίγωνο που
αποτελείται από οριζόντιες γραμμές (Εικόνα 4). Το σημείο στο οποίο συνδέεται ο θετικός πόλος της πηγής
λέγεται τάση τροφοδοσίας και έχει τάση την ονοματική τιμή της πηγής (1,5V μία κοινή μπαταρία, 5V για τον
Arduino). Σημειώνεται στο κύκλωμα (Εικόνα 4) με ένα σχήμα Τ που στο πάνω μέρος του γράφουμε την
ονομαστική τάση. Πολλές φορές σημειώνεται και με ένα βέλος που δείχνει προς τα πάνω. Βλέπουμε ότι τα
«θετικός» και «αρνητικός» αναφέρονται σε ένα σημείο που βρίσκεται ψηλότερα (μεγαλύτερη τιμή) και ένα
σημείο που βρίσκεται χαμηλότερα (μικρότερη τιμή) αντίστοιχα. ΔΕΝ αναφέρονται σε πάνω από το μηδέν και
κάτω από το μηδέν. Τα προαναφερθέντα σημαίνουν ότι η πηγή (και κατ’ επέκταση η τάση) εκτός από την
τιμή, έχει και φορά ή πολικότητα. Άρα η πηγή έχει γενικά ένα σωστό και ένα λάθος (ανάποδο) τρόπο να
συνδεθεί στο κύκλωμα. Στις συσκευές που τροφοδοτούνται από μπαταρία, σημειώνεται πάντα που πρέπει
να βρίσκεται ο θετικός πόλος και πού ο αρνητικός. Αντίστοιχα αν η πηγή είναι τοποθετημένη, υπάρχει ένας
σωστός και ένας λάθος (ανάποδος) τρόπος να συνδεθούν οι καταναλωτές. Αυτό δεν ισχύει απαραίτητα για
όλους τους καταναλωτές, αλλά πρέπει πάντα να το έχουμε υπ’ όψιν μας.

Το ηλεκτρικό ρεύμα είναι αυτό που μεταφέρει την ενέργεια μέσα από κύκλωμα προς τους καταναλωτές
(όπως, ας πούμε, το νερό που τρέχει σ’ ένα ρυάκι, μεταφέρει την ενέργεια που κινεί ένα νερόμυλο). Το
μέγεθος που περιγράφει πόσο ρεύμα «τρέχει» σε ένα κύκλωμα ονομάζεται ένταση, συμβολίζεται με I και
μετριέται σε Ampere, που συμβολίζονται με A. Όπως και η τάση, το ρεύμα εκτός από την τιμή του (0,5 Α ας
πούμε) έχει και φορά. Το ρεύμα τρέχει μέσα στο κύκλωμα, από το σημείο με την υψηλότερη τάση προς το
σημείο με τη χαμηλότερη τάση. Δηλαδή από το θετικό πόλο της πηγής προς τον αρνητικό. Στην Εικόνα 4 η
ροή του ρεύματος σημειώνεται με καμπύλα βέλη. Κάθε πηγή μπορεί να παρέχει ρεύμα μέχρι κάποια
συγκεκριμένη μέγιστη τιμή. Επίσης κάθε καταναλωτής μπορεί να ανεχθεί ροή ρεύματος μέχρι μία
συγκεκριμένη μέγιστη τιμή. Αν γίνει υπέρβαση αυτής της τιμής η πηγή ή ο καταναλωτής αντίστοιχα θα
καταστραφούν. --- έκλυση θερμότητας κ.λ.π. ----

Οι καταναλωτές είναι τα διάφορα εξαρτήματα και συσκευές που περιλαμβάνονται στο κύκλωμα.
Καταναλώνουν ενέργεια. Καταναλώνοντας την ενέργεια εμποδίζουν την ροή του ρεύματος στο κύκλωμα. Το
μέγεθος που περιγράφει το βαθμό στον οποίο ένας καταναλωτής εμποδίζει τη ροή του ρεύματος λέγεται
αντίσταση συμβολίζεται με R και μετριέται σε ohm (Ω). <πτώση τάσης>

Οι αγωγοί συνδέουν όλα τα άλλα στοιχεία μεταξύ τους και, πρακτικά, δεν καταναλώνουν ενέργεια ούτε
εμποδίζουν τη ροή του ρεύματος. Η αντίστασή τους είναι αμελητέα, πρακτικά μηδενική. Αν συνδέσουμε τον
αρνητικό και το θετικό πόλο μιας πηγής με έναν αγωγό, χωρίς να παρεμβάλλονται καταναλωτές, τότε
κάνουμε ένα βραχυκύκλωμα. Επειδή δεν υπάρχει κάτι που να εμποδίζει σημαντικά τη ροή του ρεύματος,
-10-
-11-

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

Στα κυκλώματα, κάθε συνεχής γραμμή, που περιλαμβάνει καταναλωτές και δεν περιλαμβάνει διακλαδώσεις,
ονομάζεται κλάδος.
Κάθε σημείο στο οποίο ενώνονται κλάδοι, ονομάζεται κόμβος.
Αν μία γραμμή ενώνει δύο κόμβους αλλά δεν περιλαμβάνει καταναλωτές, τότε δεν είναι κλάδος και οι δύο
κόμβοι ενώνονται σε έναν (τους θεωρούμε και είναι και πρακτικά ένας) .
Καταναλωτές που είναι συνδεδεμένοι στον ίδιο κλάδο, λέμε ότι είναι συνδεδεμένοι εν σειρά (Εικόνα 4, R3
και R4).
Καταναλωτές που είναι συνδεδεμένοι σε διαφορετικούς κλάδους, που αρχίζουν και καταλήγουν στους ίδιους
κόμβους λέμε ότι είναι συνδεδεμένοι παράλληλα (Εικόνα 4, R1 και R2 καθώς και ο συνδυασμός των R3 και
R4).

4.2 Τι είναι το LED;


Πρακτικά το LED είναι ένα λαμπάκι. Έχει όμως κάποια ιδιαίτερα χαρακτηριστικά που χρειάζονται προσοχή.

Εικόνα 5. LED: Φωτογραφία, σκίτσο, συνήθη σύμβολα.

Στην πραγματικότητα το LED Είναι μία Φωτοεκπέμπουσα Δίοδος (Light Emitting Diode). Η δίοδος είναι ένα
εξάρτημα (καταναλωτής) που επιτρέπει στο ρεύμα να περνά από μέσα του μόνο κατά τη μία κατεύθυνση.
Άρα έχει σωστή και ανάποδη σύνδεση δηλαδή πολικότητα. Στην προκειμένη περίπτωση λέγεται
Φωτοεκπέμπουσα γιατί όταν περνάει ρεύμα από μέσα της, εκπέμπει φώς.

Βλέπουμε ότι το LED έχει δύο ακίδες (ποδαράκια) και ένα «κεφάλι». Βλέπουμε επίσης ότι το ένα ποδαράκι
είναι μακρύτερο. Το μακρύτερο ποδαράκι είναι ο θετικός πόλος και λέγεται άνοδος. Το κοντύτερο ποδαράκι
είναι ο αρνητικός πόλος και λέγεται κάθοδος. Επίσης παρατηρούμε ότι στην θέση της καθόδου η βάση του
κεφαλιού είναι πεπλατυσμένη. Αυτό μας βοηθά να ξεχωρίσουμε την κάθοδο από την άνοδο στην περίπτωση
που τα ποδαράκια είναι κομμένα. Κατά τη σύνδεση, για να περάσει ρεύμα και να ανάψει, η άνοδος πρέπει
να βρίσκεται προς το θετικό πόλο της πηγής και η κάθοδος προς τον αρνητικό. Αν το συνδέσουμε ανάποδα,
δεν θα περάσει ρεύμα και δεν θα ανάψει. Επίσης, και προφανώς, αν συνδέσουμε και τα δύο ποδαράκια στο
θετικό πόλο ή και τα δύο ποδαράκια στον αρνητικό πόλο το LED δεν θα ανάψει. Όταν το LED επιτρέπει να
περνά ρεύμα από μέσα του λέμε ότι άγει.

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

-11-
-12-

συνδέουμε πάντα το LED σε σειρά με έναν αντιστάτη. Τη ακριβή διάταξη αυτής της σύνδεσης θα τη δούμε
λίγο παρακάτω. Ο αντιστάτης είναι ένας καταναλωτής, που η μόνη του λειτουργικότητα είναι να εμποδίζει
(περιορίζει) τη ροή του ρεύματος στο κύκλωμα. Χαρακτηρίζεται από την αντίστασή του σε ohm (Ω).
Συνηθίζεται (κακώς) ο αντιστάτης να λέγεται αντίσταση. Αυτό μπορεί να προκαλέσει σύγχυση μεταξύ του
μεγέθους και του καταναλωτή (εξαρτήματος).

4.3 Η πλάκα πρωτοτύπων (breadboard)


Η πλάκα πρωτοτύπων (η και απλά πλάκα) μας επιτρέπει να συναρμολογήσουμε ένα πρωτότυπο κύκλωμα
εύκολα και γρήγορα.

Εικόνα 6. Πλάκες πρωτοτύπων Εικόνα 7. Απλό κύκλωμα Εικόνα 8. Σύνθετο κύκλωμα


(Breadboards)

Έχει υποδοχές στις οποίες μπορούν να «κουμπώσουν» ηλεκτρικά και ηλεκτρονικά εξαρτήματα καθώς και
καλώδια για τη διασύνδεσή τους. Επειδή τα διάφορα εξαρτήματα ακολουθούν αυστηρά ένα πρότυπο για το
μέγεθος και της αποστάσεις των ακίδων τους και των ακροδεκτών τους είναι εύκολο να κατασκευάσουμε μια
τέτοια πλάκα στην οποία να μπορούμε να «κουμπώσουμε οποιοδήποτε από αυτά. Εγκυκλοπαιδικά, η
μικρότερη απόσταση μεταξύ ακίδων είναι 2.54mm (χιλιοστά). Όλες οι μεγαλύτερες αποστάσεις είναι ακέραια
πολλαπλάσια αυτής της βασικής. Η επιλογή του 2.54 φαίνεται περίεργη αλλά το πρότυπο σχεδιάστηκε σε
ίντσες· 2.54mm είναι 1/10 της ίντσας.

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

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

Κατά σύμβαση χρησιμοποιούμε κόκκινο χρώμα για ότι είναι συνδεδεμένο στην τάση τροφοδοσίας και μαύρο
για ότι είναι συνδεδεμένο στη γείωση. Αν η πλάκα μας έχει τις μεγάλες ράγες κωδικοποιημένες χρωματικά
είναι καλό να χρησιμοποιούμε τις κόκκινες για την τάση τροφοδοσίας και τις μπλε (θα έπρεπε να είναι
μαύρες κανονικά) για τη γείωση. Επίσης θα είναι καλό η τάση τροφοδοσίας να είναι πάνω από τη γείωση
όπως κοιτάμε την πλάκα. Καλώδια που συνδέονται στη τάση τροφοδοσίας είναι καλό να είναι κόκκινα·
καλώδια που συνδέονται στη γείωση είναι καλό να είναι μαύρα. Επίσης είναι καλό να αποφεύγουμε αυτά τα
χρώματα για άλλες συνδέσεις. Οι τήρηση των συμβάσεων κάνει το κύκλωμά μας πιο «ευανάγνωστο». Αν για

-12-
-13-

οποιοδήποτε λόγο δεν μπορούμε να τηρήσουμε τα παραπάνω είναι καλό να κάνουμε μια δική μας
κωδικοποίηση και να την τηρούμε.

4.4 Χρωματικός κώδικας τιμής αντίστασης.


Επειδή οι αντιστάτες είναι μικροί, αν αναγράφονταν το μέγεθός τους (τιμή σε Ohm) με αριθμούς, αυτοί θα
ήταν σχετικά δυσανάγνωστοι. Για να διευκολυνθεί η ανάγνωση του μεγέθους του αντιστάτη χρησιμοποιείται
ένας χρωματικός κώδικας. Αν παρατηρήσετε έναν από τους αντιστάτες που έχετε μπροστά σας θα δείτε ότι
έχει τέσσερεις χρωματιστές λωρίδες. Η μία είναι χρυσή ή ασημένια και είναι η τελευταία. Όταν διαβάζουμε
το αντιστάτη αυτή η λωρίδα πρέπει να είναι στα δεξιά.

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

Μαύρο Καφέ Κόκκινο Πορτοκαλί Κίτρινο Πράσινο Μπλε Μώβ Γκρί Λευκό

0 1 2 3 4 5 6 7 8 9

Η σειρά των κορεσμένων χρωμάτων είναι κατά τη σειρά του ουράνιου τόξου. Τα δύο πρώτα χρώματα είναι τα
πιο σκοτεινά και τα δύο τελευταία είναι τα πιο φωτεινά από τα ακόρεστα.

Πίσω στις λωρίδες. Το μέγεθος του αντιστάτη γράφεται με τους αριθμούς που προκύπτουν από τις δύο
πρώτες λωρίδες, ακολουθούμενους από τόσο μηδενικά όσα υποδεικνύει η τρίτη λωρίδα.
ΠΡΩΤΗ ΛΩΡΙΔΑ
ΔΕΥΤΕΡΗ ΛΩΡΙΔΑ
ΤΡΙΤΗ ΛΩΡΙΔΑ

ΤΙΜΗ ΜΕ ΠΟΛΛΑΠΛΑΣΙΑΣΤΗ
ΜΕ ΔΙΑΧΩΡΙΣΤΙΚΑ Κ = ΧΙΛΙΑΔΕΣ (ΚΙΛΟ)
ΑΠΟΚΩΔΙΚΟΠΟΊΗΣΗ ΧΙΛΙΑΔΩΝ Μ = ΕΚΑΤΟΜΥΡΙΑ (ΜΕΓΑ)

2 2 1 220 220 220 Ω


2 2 0 22 22 22 Ω
1 0 2 1000 1.000 1 ΚΩ
4 7 3 47000 47.000 47 ΚΩ
4 7 2 4700 4.700 4,7 ΚΩ
3 3 5 3300000 3.300.000 3,3 ΜΩ
6 8 4 680000 680.000 680 ΚΩ
Πίνακας 1. Παραδείγματα χρωματικού κώδικα.
(Στην πραγματικότητα οι αριθμοί δεν υπάρχουν στις λωρίδες)

4.5 Σύνδεση LED


?????????????????????????????????????????

4.6 Πως συνδέουμε ένα LED στον Arduino.


Για να ελέγξουμε (αναβοσβήσουμε) ένα LED με τον Arduino, το συνδέουμε σε μία ακίδα που θα την ορίσουμε
ως ψηφιακή έξοδο.

Όταν γράφουμε την τιμή HIGH σε μία ακίδα ψηφιακής εξόδου ουσιαστικά δίνουμε εντολή στον Arduino να
συνδέσει (εσωτερικά) αυτή την ακίδα με το θετικό πόλο της πηγής. Άρα αυτή η ακίδα θα έχει τάση 5V και θα

-13-
-14-

είναι ισοδύναμη με το θετικό πόλο της πηγής. Αντίστοιχα όταν γράφουμε την τιμή LOW δίνουμε την εντολή
να συνδεθεί η ακίδα με τη γείωση (0V).

Εικόνα 9. Σύνδεση LED στην ακίδα 9 και αντίστοιχο σχηματικό διάγραμμα.

Για το παράδειγμα αυτό θα συνδέσουμε ένα LED στην ακίδα 9 του ARDUINO. Θα χρησιμοποιήσουμε την ίδια
διάταξη που χρησιμοποιήσαμε προηγουμένως για να το τροφοδοτήσουμε από την πηγή με μοναδική
διαφορά ότι η άκρη του αντιστάτη που συνδέονταν στο θετικό πόλο της πηγής θα συνδέεται τώρα με την
ακίδα 9. Όταν γράψουμε την τιμή HIGH στην ακίδα 9 θα έχουμε σύνδεση από την τάση τροφοδοσίας στη
γείωση και το LED θα είναι αναμμένο. Όταν γράψουμε LOW στην ακίδα 9 θα έχουμε σύνδεση από τη γείωση
στη γείωση και το LED δεν θα ανάψει.

Το σχέδιο που θα χρησιμοποιήσουμε θα είναι ουσιαστικά ίδιο με το σχέδιο του παραδείγματος 1. Θα


αλλάξουμε μόνο τον αριθμό της ακίδας στις εντολές pinMode() και digitalWrite(). Είναι καλό να
προσπαθήσουμε να γράψουμε το κώδικα του νέου σχεδίου εξ’ αρχής, παρά να μετατρέψουμε τον
υφιστάμενο του προηγούμενου παραδείγματος, για να αποκτήσουμε κάποια άνεση και αυτοπεποίθηση στον
προγραμματισμό.

<Διαφορά παραδείγματος και σχεδίου αδυναμία αποθήκευσης παραδείγματος (αποθήκευση ως σχέδιο)>

5 Κάτι σχετικά λειτουργικό


Ας δοκιμάσουμε τώρα με τα στοιχειώδη που ξέρουμε να εφαρμόσουμε κάτι συγκεκριμένο και σχετικά
λειτουργικό. Θα χρησιμοποιήσουμε ένα LED για να εκπέμψουμε το διεθνές σήμα κινδύνου SOS σε κώδικα
Morse.

5.1 Μικρή εισαγωγή στον κώδικα Morse


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

Το κάθε γράμμα αντιπροσωπεύεται από μία ομάδα από τελείες και παύλες. Αν πρόκειται για μετάδοση με
φως, η τελεία αντικαθίσταται από μικρής διάρκειας αναλαμπή και ή παύλα από μεγάλης διάρκειας
αναλαμπή. Η ίδια λογική ισχύει και για ηχητική μετάδοση.

-14-
-15-

Οι διάρκειες των στοιχείων του κώδικα ακολουθούν τη λογική του παρακάτω πίνακα:

Στοιχείο κώδικα Αναλογική Παράδειγμα


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

Εικόνα 10. Λατινικά γράμματα και αριθμοί σε κώδικα Morse

Α .- Η .... Ν -. Τ -
B -... Θ -.-. Ξ -..- Y -.--
Γ -- Ι .. Ο --- Φ ..-.
Δ -.. Κ -.- Π .--. Χ ----
Ε . Λ .-.. Ρ .-. Ψ --.-
Ζ --.. Μ -- Σ ... Ω .--
Πίνακας 3. Ελληνικά γράμματα σε κώδικα Morse

5.2 Σχεδιασμός της υλοποίησης (τι ακριβώς θέλουμε να πετύχουμε)


Θα εκπέμψουμε με φως το σήμα SOS σε κώδικα Morse. Από την Εικόνα 10 βλέπουμε ότι ο κώδικας του
γράμματος S είναι τρεις τελείες και ο κώδικας του γράμματος O είναι τρεις παύλες. Επειδή θα
χρησιμοποιήσουμε φως αυτό μεταφράζεται σε τρεις σύντομες αναλαμπές και τρεις μακρύτερες αναλαμπές
αντίστοιχα. Σύμφωνα με τα παραπάνω ξέρουμε επίσης ότι οι μακρύτερες αναλαμπές θα πρέπει να είναι
τριπλάσιες σε διάρκεια από τις σύντομες.

Θα επιλέξουμε αρχικά τη διάρκεια που επιθυμούμε για την τελεία (σύντομη αναλαμπή). Ας ορίσουμε αυτή τη
διάρκεια στο μισό δευτερόλεπτο (0,5s). Από αυτή την επιλογή προκύπτει ότι η διάρκεια της παύλας
(μακρύτερης αναλαμπής πρέπει να είναι 3x0,5 = 1,5s (ενάμιση δευτερόλεπτο).

Πρέπει να υπολογίσουμε επίσης τα διαστήματα ανάμεσα στις αναλαμπές. Θα θεωρήσουμε το SOS λέξη.
Σύμφωνα πάλι με τα όσα είπαμε παραπάνω τα διαστήματα ανάμεσα σε στοιχεία (τελείες ή παύλες) που
ανήκουν στο ίδιο γράμμα είναι ίσα σε διάρκεια με την τελεία, δηλαδή 0,5s (μισό δευτερόλεπτο). Τα
διαστήματα ανάμεσα σε γράμματα είναι τριπλάσια από την τελεία (όσο και η παύλα), δηλαδή 1,5s. Θα
-15-
-16-

θεωρήσουμε το SOS σαν λέξη. Ανάμεσα σε διαδοχικές εκπομπές του SOS θα έχουμε διάστημα λέξης, δηλαδή
7x0,5 = 3,5s.

Τελεία Παύλα Διαστ. Στοιχείο Διαστ. Γράμματος Διαστ. Λέξης


0,5s 1,5s 0,5s 1,5s 3,5s

5.3 Υλοποίηση
Για τη μετάδοση του σήματος SOS σ΄ αυτό το παράδειγμα θα χρησιμοποιήσουμε απλά ένα LED. Το κύκλωμα
είναι το ίδιο που χρησιμοποιήσαμε στο προηγούμενο παράδειγμα. Πρέπει απλά να προσέξουμε ότι το LED
είναι συνδεδεμένο στην ακίδα που θα χρησιμοποιήσουμε στο σχέδιο παρακάτω (την 9).

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

Ο κώδικας της μετάδοσης θα γραφτεί μέσα στη loop()


Ανάβουμε το LED
Περιμένουμε όσο ορίζεται για την διάρκεια της τελείας ή παύλας αντίστοιχα.
Σβήνουμε το LED
Περιμένουμε όσο ορίζεται για τη διάρκεια του διαστήματος
(προσοχή στις διαφορές στοιχείου-γράμματος-λέξης)
Συνεχίζουμε μέχρι να ολοκληρώσουμε το SOS
Επειδή είμαστε μέσα στη loop() ο κώδικας θα επαναλαμβάνεται συνέχεια.

Είναι καλό να προσπαθήσουμε να γράψουμε όλο τον κώδικα μόνοι μας. Ο πλήρης και λειτουργικός κώδικας
υπάρχει στο παράδειγμα SOS.

6 Μεταβλητές
Το σχέδιο που γράψαμε κάνει αυτό που θέλουμε σωστά. Αν όμως θέλουμε κάθε φορά που το
χρησιμοποιούμε να μπορούμε να συνδέσουμε το LED σε διαφορετική ακίδα, τα πράγματα μπερδεύονται. Η
αναφορά στον αριθμό της ακίδας υπάρχει σε 19 σημεία του κώδικα. Θα μπορούσαμε βέβαια κάθε φορά να
εντοπίζουμε αυτά τα σημεία και να αλλάζουμε τον αριθμό της ακίδας. Θα μπορούσαμε επίσης να γράφουμε
19 διαφορετικά σχέδια (τόσες είναι οι διαθέσιμες ακίδες), ένα για κάθε ακίδα. Και οι δύο λύσεις είναι
χρονοβόρες, δυσλειτουργικές και άκομψες.

Υπάρχει ευτυχώς καλύτερη λύση. Μπορούμε να χρησιμοποιήσουμε μία μεταβλητή. Η μεταβλητή είναι ένα
«κουτί» στο οποίο δίνουμε ένα όνομα (ας πούμε «κουτί 1»). Μέσα στο κουτί μπορούμε να βάλουμε έναν
αριθμό. Μπορούμε επίσης όποτε χρειάζεται να αλλάζουμε αυτόν τον αριθμό. Όταν χρησιμοποιούμε το
όνομα της μεταβλητής στον κώδικά μας, δίνουμε εντολή να χρησιμοποιηθεί ο αριθμός που περιέχει το κουτί.

Στην περίπτωσή μας μπορούμε να βάλουμε το αριθμό 9 στο «κουτί 1». Κατόπιν για digitalWrite(9, HIGH), να
γράφουμε digitaWrite(«κουτί 1», HIGH). Αυτό σημαίνει γράψε στην ακίδα με τον αριθμό που περιέχεται στο
«κουτί 1» (μεταβλητή) την τιμή HIGH. Αν θέλουμε να αλλάξουμε το αριθμό της ακίδας στη οποία είναι
συνδεδεμένο το LED απλά πρέπει να αλλάξουμε τον αριθμό που περιέχει ή μεταβλητή, να τον κάνουμε ας
πούμε 13. Ο υπόλοιπος κώδικας θα παραμείνει ίδιος γιατί κάθε αναφορά στο «κουτί 1» θα παραπέμπει τώρα
στον αριθμό 13, τη νέα τιμή της μεταβλητής.

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

-16-
-17-

6.1 Δήλωση και ορισμός τιμής μεταβλητής


Στην μεταβλητή μπορούμε να δώσουμε όποιο όνομα θέλουμε υπό τον όρο ότι περιέχει μόνο λατινικά
γράμματα, αριθμούς και κάτω παύλες. Επίσης η το όνομα της μεταβλητής πρέπει να αρχίζει υποχρεωτικά
από γράμμα (όχι αριθμό). Συνηθίζεται να χρησιμοποιούμε πεζά (μικρά) λατινικά γράμματα συνοδευόμενα
από αριθμούς αν έχει έννοια η αρίθμηση (π.χ. led1 led2 led3 αν χρησιμοποιούμε τρία διαφορετικά led). Αν το
όνομα αποτελείται από δύο ή περισσότερες λέξεις αρχίζουμε με την πρώτη λέξη με πεζά γράμματα και
γράφουμε το πρώτο μόνο γράμμα κάθε επόμενης λέξης κεφαλαίο (π.χ. arithmosMitroou,
arithmosAkyronPsifodeltion). Είναι πολύ σημαντικό να χρησιμοποιούμε ονόματα που έχουν νόημα για την
εφαρμογή μας και υπονοούν καθαρά τη χρήση της μεταβλητής.

Για να δηλώσουμε μία μεταβλητή πρέπει πρώτα να ορίσουμε τον τύπο της (αν είναι ακέραιος αριθμός,
πραγματικός αριθμός, γράμμα κ.λ.π.), και μετά το όνομά της. Προς το παρών θα μας χρειάζονται μόνο
ακέραιες μεταβλητές. Χρησιμοποιούμε της ακόλουθη πρόταση:

int akidaLed;

Το int είναι συντόμευση του integer που σημαίνει ακέραιος. Το akidaLed είναι το όνομα της μεταβλητής και
είναι δική μας επιλογή. Θα μπορούσε επίσης να είναι led ή akida ή fotaki ή metabliti1 ή agriotoumpanos ή
xq8rfDv. Αυτά τα ονόματα όμως δεν περιγράφουν ακριβώς (ή και καθόλου) τη χρήση της μεταβλητής και
κάνουν τον κώδικα δυσανάγνωστο.

Για να δώσουμε μία τιμή στη μεταβλητή χρησιμοποιούμε την ακόλουθη πρόταση:

akidaLed = 9; //για να δώσουμε την τιμή 9

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

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

int akidaLed = 9;

Προς το παρόν θα κάνουμε όλες τις δηλώσεις των μεταβλητών στην αρχή του κώδικα ΠΡΙΝ από τη ρουτίνα
setup(). Οι μεταβλητές μπορούν να δηλωθούν και σε άλλα σημεία, αλλά η λειτουργικότητά τους θα είναι
διαφορετική και δεν χρειάζεται να δούμε να μπούμε σε τόση λεπτομέρεια αυτή τη στιγμή.

Ο κώδικας για την εκπομπή του SOS με χρήση μεταβλητής για τον αριθμό της ακίδας υπάρχει στο
παράδειγμα SOSmetablitiAkida

7 Αριθμητικές πράξεις και τελεστές


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

Διάρκεια τελείας και διάρκεια διαστήματος μεταξύ στοιχείων 0.5s


Διάρκεια παύλας και διάρκεια διαστήματος μεταξύ γραμμάτων 1,5s
Διάρκεια διαστήματος μεταξύ λέξεων 3,5s

Θα μπορούσαμε να χρησιμοποιήσουμε μία μεταβλητή για κάθε μία από αυτές και να της δίνουμε την
επιθυμητή τιμή. Τα ονόματα των μεταβλητών θα μπορούσαν να είναι mikriDiarkeia, meseaDiarkeia,
-17-
-18-

megaliDiarkeia ή diarkeiaTeliasKaiDiastStoixeion, diarkeiPavlasKaiDiastGrammaton, diarkeiaDiastLekseon ή


ακόμα teliaStoixeio, pavlaGramma, leksi.

Είναι όμως καλύτερο να χρησιμοποιήσουμε ξεχωριστή μεταβλητή για κάθε λειτουργική διάρκεια του κώδικα
Morse, έστω και αν οι τιμές μερικών απ’ αυτές συμπίπτουν. Όπως ήδη είπαμε αυτό θα κάνει τον κώδικα πιο
ευανάγνωστο. Για παράδειγμα diarkTel, diarkPav, diastStoix, diastGramm, diastLeks. Οι δηλώσεις έχουν ως
εξής:

int diarkTel = 500; // θυμηθείτε διάρκεια σε χιλιοστά του δευτερολέπτου


int diarkPav = 1500;
int diastStoix = 500;
int diastGramm = 1500;
int diastLeks = 3500;

Ξέρουμε όμως ότι οι διάρκειες ορίζονται ως πολλαπλάσια της διάρκειας της τελείας. Θα ήταν λοιπόν
προτιμότερα να ορίζουμε μόνο τη διάρκεια της τελείας και οι υπόλοιπες να υπολογίζονται με ένα
πολλαπλασιασμό. Έτσι περιορίζουμε, ουσιαστικά μηδενίζουμε την πιθανότητα λάθους.

Τα σημεία που χρησιμοποιούμε για να δηλώσουμε αριθμητική πράξη λέγονται τελεστές. Στη γλώσσα
προγραμματισμού του Arduino χρησιμοποιούμε διαφορετικούς από τους συνηθισμένους τελεστές για τον
πολλαπλασιασμό και τη διαίρεση. Κατά τα άλλα η σύνταξη (δομή) είναι η ίδια μ’ αυτή που έχουμε συνηθίσει
<αριθμός><τελεστής><αριθμός> (5+3, 6-2, 8*3, 12/4).

Συνήθως Για κώδικα


Πρόσθεση + +
Αφαίρεση - -
Πολλαπλασιασμός x *
Διαίρεση : /
Πίνακας 4. Τελεστές, Συνήθεις και για κώδικα

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

int diarkTel = 500; // θυμηθείτε διάρκεια σε χιλιοστά του δευτερολέπτου


int diarkPav = diarkTel * 3;
int diastStoix = diarkTel * 1;
int diastGramm = diarkTel * 3;
int diastLeks = diarkTel * 7;

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

digitalWrite(akidaLed, HIGH);
delay(diarkTel);
digitalWrite(akidaLed, LOW);
delay(diarkStoix);
κ.ο.κ.

Τώρα για να αλλάξουμε το ρυθμό μετάδοσης αρκεί να αλλάξουμε την τιμή για τη διάρκεια της τελείας
(μεταβλητή diarkTel). Όλες οι τιμές των άλλων μεταβλητών θα υπολογιστούν αυτόματα και θα ακολουθούν
εγγυημένα το πρότυπο του κώδικα Morse (εκτός αν έχουμε κάνει εμείς καμιά ανοησία γράφοντας τον
κώδικα). Ο πλήρης κώδικας υπάρχει στο παράδειγμα SOSmetavlitiDiarkeia.

-18-
-19-

8 Ο Arduino «διαβάζει» ή πως «μιλάμε» στον Arduino


Μέχρι στιγμής το μόνο που έχουμε πετύχει ουσιαστικά είναι να αναβοσβήνουμε LED. Ο Arduino
χρησιμοποιήθηκε για να ελέγξει εξωτερικές συσκευές. Είπαμε όμως ότι ο Arduino μπορεί και να «διαβάσει»
εξωτερικούς αισθητήρες ή άλλα εξαρτήματα και να αντιδράσει ανάλογα (βάση πάντα του σχεδίου που του
έχουμε φορτώσει εμείς).

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

Ο διακόπτης πρέπει να συνδεθεί σε συνδυασμό με έναν αντιστάτη με συγκεκριμένο τρόπο, που φαίνεται στη
Εικόνα 11. Αν προσπαθήσουμε να δούμε το γιατί τώρα, μάλλον θα μπερδευτούμε περισσότερο. Απλά πρέπει
να ξέρουμε ότι αυτός είναι ο σωστός τρόπος. Το LED ξέρουμε ήδη πως συνδέεται.

Από άποψη κώδικα όλα τα στοιχεία που χρειαζόμαστε τα έχουμε δει εκτός από τον τρόπο που διαβάζουμε
την ακίδα ψηφιακής εισόδου. Για το σκοπό αυτό χρησιμοποιούμε την εντολή digitalRead(). Όπως
προηγουμένως ορίσαμε την χρησιμοποιούμενη ακίδα σαν έξοδο μπορούμε να ορίσουμε τώρα την ακίδα σαν
είσοδο pinMode(2, INPUT). Δεν είναι όμως απαραίτητο γιατί αρχικά όταν ενεργοποιηθεί ο Arduino
όλες οι ακίδες είναι ορισμένες σαν είσοδοι. Πρέπει πρώτα να ορίσουμε μία μεταβλητή στην οποία θα
βάζουμε την τιμή που θα διαβάζει η digitalRead() από την ακίδα. Έστω ότι τη μεταβλητή την
ονομάζουμε katastasiDiakopti και ο διακόπτης είναι συνδεδεμένος στην ακίδα 2. Η πρόταση που θα
χρησιμοποιήσουμε για το διάβασμα του διακόπτη είναι:

katastasiDiakopti = digitalRead(2);

Βλέπουμε δύο διαφορές. Κατ’ αρχήν ενώ η digitalWrite() είχε δύο παραμέτρους, η digitalRead() έχει
μόνο μία παράμετρο: τον αριθμό της ακίδας την οποία θέλουμε να διαβάσουμε. Προφανώς δεν υπάρχει
ανάγκη να ορίσουμε κάποια τιμή σε παράμετρο. Η δεύτερη διαφορά είναι ότι ενώ η digitalWrite()
χρησιμοποιείται μόνη της, η digitalRead() χρησιμοποιείται σε συνδυασμό με μία μεταβλητή. Αυτό
συμβαίνει γιατί όταν εκτελεστεί η digitalWrite() γράφει μία τιμή στην ακίδα, η τιμή παραμένει στην
ακίδα μέχρι να την αλλάξουμε και η δουλειά της εντολής έχει τελειώσει. Όταν όμως χρησιμοποιήσουμε την
digitalRead() η τιμή που διαβάζουμε υπάρχει στιγμιαία. Αν θέλουμε να τη χρησιμοποιήσουμε
αργότερα πρέπει να τη βάλουμε σε μία μεταβλητή. Μετά μπορούμε να χρησιμοποιούμε αυτή τη μεταβλητή
για να κάνουμε ότι χρειαστεί αφού η τιμή θα παραμείνει εκεί μέχρι να την αλλάξουμε.

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

-19-
-20-

Εικόνα 11. Διακόπτης για είσοδο και LED για έξοδο

9 Εντολές για αναλογική είσοδο και έξοδο


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

9.1 Εντολή για αναλογική έξοδο


Ως αναλογικές έξοδοι μπορούν να χρησιμοποιηθούν ΜΟΝΟ οι ακίδες 3,5,6,9,10 και 11. Οι ακίδες αυτές είναι
σημειωμένες με ένα ~ (περισπωμένη ας πούμε) πριν από τον αριθμό τους. Για να χρησιμοποιήσουμε μία
ακίδα ως αναλογική έξοδο πρέπει πρώτα να οριστεί σαν έξοδος:

pinMode(6, OUTPUT); // για την ακίδα 6

Για να γράψουμε μία αναλογική τιμή στην ακίδα χρησιμοποιούμε την analogWrite() που παίρνει σαν
παραμέτρους τον αριθμό της ακίδας, και την τιμή που θέλουμε να γράψουμε:

analogWrite(6, 173); // γράψε στην ακίδα 6 την τιμή 173

Όπως έχουμε ήδη πει οι τιμές που μπορούμε να γράψουμε σε μία αναλογική έξοδο είναι ακέραιοι από 0 ως
255. Δείτε το παράδειγμα AnalogikiEksodosEllipes σαν άσκηση και το AnalogikiEksodos σαν λύση. Για το
παράδειγμα αυτό πρέπει να συνδέσουμε ένα LED στην ακίδα 6 όπως ακριβώς το συνδέσαμε σε άλλες ακίδες
σε προηγούμενα παραδείγματα. Το LED θα ανάβει σε διάφορες εντάσεις για μισό δευτερόλεπτο κάθε φορά.

9.2 Εντολή για αναλογική είσοδο


Ως αναλογικές είσοδοι μπορούν να χρησιμοποιηθούν MONO «αναλογικές ακίδες» Α0-Α5. Όπως είπαμε δεν
είναι απαραίτητο να ορίσουμε μια ακίδα σαν είσοδο. Για το διάβασμα της αναλογικής εισόδου
χρησιμοποιούμε την analogRead(), που είναι ανάλογη με την digitalRead(). Την τιμή που
διαβάζουμε την βάζουμε σε μία μεταβλητή όπως και για την ψηφιακή είσοδο. Με αυτά που είπαμε μέχρι
τώρα ο τρόπος χρήσης της πρέπει να είναι προφανής.

[μεταβλητή] = analogRead(A0); // Για την αναλογική ακίδα Α0

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

-20-
-21-

9.2.1 Τι είναι το ποτενσιόμετρο και πως το συνδέουμε


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

Όλα τα ποτενσιόμετρα έχουν τρείς ακίδες σύνδεσης. Πάντα είναι κατασκευασμένα κατά τρόπο που να είναι
ευδιάκριτες δύο ακραίες ακίδες και μία μεσαία. Οι ακραίες ακίδες συνδέονται μία στην τάση τροφοδοσίας
και μία στη γείωση. Το ποτενσιόμετρο δεν έχει πολικότητα άρα δεν έχει σημασία ποια από τις ακραίες ακίδες
θα συνδεθεί στη τάση τροφοδοσίας και ποια στη γείωση. Η μεσαία ακίδα συνδέεται στην αναλογική είσοδο
του Arduino.

Εικόνα 12. Ποτενσιόμετρο σε αναλογική είσοδο, LED σε αναλογική έξοδο

Σε πρώτη φάση δεν θα χρησιμοποιήσουμε το LED. Θα το χρησιμοποιήσουμε στο αμέσως επόμενο


παράδειγμα.

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

Για να ενεργοποιήσουμε την δυνατότητα πρέπει κατ’ αρχήν να συμπεριλάβουμε την ακόλουθη πρόταση στη
setup():

Serial.begin(9600);

Αυτό λέει στον Arduino να αρχίσει (begin) σειριακή επικοινωνία (Serial) με τον υπολογιστή με ταχύτητα
9600bps. Το τι ακριβώς σημαίνει «σειριακή» και τι ακριβώς σημαίνει η ταχύτητα σε bps δεν έχει ιδιαίτερη
σημασία. Κρατάμε μόνο τις βασικές έννοιες «άρχισε» «επικοινωνία» στα «9600». Επίσης δεν
πειραματιζόμαστε με την ταχύτητα διότι μπορεί να έχει μόνο πολύ συγκεκριμένες τιμές και στις
περισσότερες εφαρμογές η ρύθμισή της δεν μπορεί να φέρει σημαντική βελτίωση.

Επιπλέον η πληροφορία γράφεται σε ειδικό παράθυρο στον υπολογιστή που στα αγγλικά λέγεται Serial
Monitor. Για να το ανοίξουμε πρέπει να χρησιμοποιήσουμε το εικονίδιο πάνω δεξιά στο
προγραμματιστικό περιβάλον, ή να επιλέξουμε από το μενού Εργαλεία->Παρακολούθηση σειριακής. Αν δεν
-21-
-22-

ανοίξουμε αυτό το παράθυρο, δεν θα βλέπουμε την πληροφορία· κατά τα άλλα το πρόγραμμα θα λειτουργεί
κανονικά.

Για να γράψουμε κάτι στη οθόνη του υπολογιστή χρησιμοποιούμε μέσα στη loop() τις εντολές
Serial.print()και Serial.println(). Θα δούμε πρακτικά με το παρακάτω παράδειγμα πως
λειτουργούν σε συνδυασμό με το διάβασμα μιας αναλογικής εισόδου. Ο κώδικας υπάρχει και στο
παράδειγμα AnologikiEisodosKaiSeiriaki.

int analogikiA0;

void setup(){
Serial.begin(9600);
}

void loop(){
analogikiA0 = analogRead(Α0);
Serial.print("H timi tis akidas einai: ");
Serial.println(analogikiA0);
}

Πρέπει πλέον να αναγνωρίζουμε ότι η πρώτη γραμμή είναι μια δήλωση ακέραιης μεταβλητής με όνομα
analogikiA0.

Στη setup() δίνουμε εντολή να αρχίσει η σειριακή επικοινωνία για να μπορούμε να στέλνουμε πληροφορία
στην οθόνη του υπολογιστή.

Στη loop() διαβάζουμε κατ΄ αρχήν την τιμή της αναλογικής εισόδου με την analogRead(). Επειδή

Μετά γράφουμε την πληροφορία στην οθόνη. Όλες οι εντολές που έχουν σχέση με την σειριακή επικοινωνία
αρχίζουν με «Serial.» (σημειώστε την τελεία). Ας πούμε εδώ απλουστευτικά ότι αυτό γίνεται για να
διευκρινίζεται ότι είναι εντολές που σχετίζονται με τη σειριακή επικοινωνία και όχι κοινές εντολές. Αν η
παράμετρος της print() ή της println()είναι κείμενο μέσα σε εισαγωγικά, τότε γράφουν αυτούσιο το
κείμενο (η χρήση των εισαγωγικών είναι εννοιολογικά ίδια με τη χρήση τους σε ένα απλό κείμενο). Αν η
παράμετρος δεν περικλείεται σε εισαγωγικά, τότε θεωρείται ότι είναι όνομα μεταβλητής και γράφεται η τιμή
της (και όχι το όνομά της). Η διαφορά ανάμεσα στη print() και την println() είναι ότι η println()
όταν τελειώσει στέλνει και αλλαγή γραμμής αντίθετα από την print(). Για παράδειγμα με τον παραπάνω
κώδικα το αποτέλεσμα στην οθόνη θα είναι κάτι σαν:

H timi tis akidas einai: 576


H timi tis akidas einai: 435
H timi tis akidas einai: 367
. . .

Αν και οι δύο εντολές ήταν println() τότε θα είχαμε:

H timi tis akidas einai:


576
H timi tis akidas einai:
435
H timi tis akidas einai:
367
. . .

Αν και οι δύο εντολές ήταν print() τότε θα είχαμε:


-22-
-23-

H timi tis akidas einai: 576H timi tis akidas einai: 435H timi tis akidas
einai: 367 . . .

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

10 Χρήση τιμών από αναλογική είσοδο για έλεγχο αναλογικής εξόδου


Είδαμε πως διαβάζουμε μία αναλογική είσοδο. Δεν χρησιμοποιήσαμε τις τιμές όμως για να κάνουμε κάτι. Ας
πούμε ότι θέλουμε να χρησιμοποιήσουμε τις τιμές της αναλογικής εισόδου για να ελέγξουμε την ένταση ενός
LED, συνδεδεμένου σε μία αναλογική έξοδο. Η πρώτη σκέψη θα μπορούσε να είναι ότι απλά χρησιμοποιούμε
την τιμή που διαβάσαμε σε μία εντολή analogWrite για κάποια συγκεκριμένη ακίδα, για παράδειγμα
analogWrite(6,timiAkidas). Το πρόβλημα είναι ότι η analogWrite μπορεί να δεχτεί τιμές από 0
ως 255, ενώ οι τιμές που διαβάζουμε με την analogRead είναι από 0 ως 1023.

Η λύση είναι να διαιρέσουμε την τιμή που διαβάσαμε με το 4 και να δώσουμε στην analogWrite το
αποτέλεσμα της διαίρεσης. Σημειώνεται ότι όταν διαιρούμε ακεραίους (μεταβλητές ορισμένες σαν
ακεραίους και συγκεκριμένους αριθμούς χωρίς υποδιαστολή) στον κώδικά μας, το αποτέλεσμα είναι το
πηλίκο της διαίρεσης (ακέραιο) και το υπόλοιπο απλά αγνοείται. Παραδείγματα: 6/3=2, 7/3=2, 8/3=2, 9/3=3
και προσοχή στο 0/3=0, 1/3=0, 2/3=0, 3/3=1.

Με αυτή τη λογική η μέγιστη τιμή που θα διαβάσουμε θα μετατραπεί σε 1023/4=255 που είναι η μέγιστη
τιμή για την έξοδο· η ελάχιστη τιμή που θα διαβάσουμε είναι το 0 και θα παραμείνει 0 (ελάχιστη)· η τιμή 512
που είναι ακριβώς στη μέση των τιμών εισόδου θα μετατραπεί σε 512/4 =128 που είναι ακριβώς στη μέση
των τιμών εξόδου.

Ομοίως όλες οι άλλες τιμές θα μετατραπούν αναλογικά. Η αναλογία είναι το μόνο που μας ενδιαφέρει στην
αναλογική είσοδο και έξοδο. Αν διαβάσουμε μία τιμή που είναι τα 3/7 της μέγιστης τιμής εισόδου, για να
πετύχουμε ένα αντίστοιχο αποτέλεσμα σε μία έξοδο πρέπει απλά να γράψουμε μία τιμή που αντιστοιχεί στα
3/7 της μέγιστης τιμής εξόδου. Map(v,s1,e1,s2,e2) function

11 Δομές ελέγχου: αποφάσεις και επαναλήψεις


Όλα τα προγράμματα που είδαμε μέχρι τώρα έχουν εντολές που απλά εκτελούνται η μία μετά την άλλη,
εκτελούνται πάντα, και από μία φορά (σε κάθε επανάληψη της loop() ). Αυτό δεν είναι πάντα επιθυμητό.

Ας υποθέσουμε ότι έχουμε δύο LED και ένα στιγμιαίο διακόπτη. Θέλουμε να ανάβουμε το ένα LED όταν ο
διακόπτης είναι ενεργοποιημένος και το άλλο όταν δεν είναι. Πρέπει να μπορούμε να διαβάζουμε την
κατάσταση του διακόπτη, όπως ήδη κάναμε, και μετά ανάλογα να εκτελούμε μόνο τις εντολές που ανάβουν
το ένα LED ή μόνο τις εντολές που ανάβουν το άλλο.

Αν το περιγράψουμε αυτό με λόγια ή διαδικασία είναι η ακόλουθη:

Διάβασε την ακίδα του διακόπτη (ας πούμε την 4) και βάλε την τιμή στη μεταβλητή katastasiDiakopti.
Αν η τιμή της μεταβλητής είναι HIGH, άναψε το LED ακίδα 9 και σβήσε το LED στην ακίδα 10.
Αλλιώς άναψε το LED στην ακίδα 10 και σβήσε το LED στην ακίδα 9.

Παρατήρηση: Στην απλή περιγραφή λέμε απλά άναψε το ένα LED ή το άλλο. Για την εφαρμογή όμως όταν
πρέπει να ανάψει το ένα LED πρέπει ταυτόχρονα να σβήσει το άλλο. Ας πούμε ότι ο διακόπτης δεν είναι
ενεργοποιημένος και κατά συνέπεια δίνουμε εντολή

-23-
-24-

Ας το δούμε τώρα σε κώδικα (εννοείται ότι έχουμε ήδη δηλώσει τις μεταβλητές μας, έχουμε ορίσει την έξοδο
κ.λπ.)

katastasiDiakopti = digitalRead(4);

if (katastasiDiakopti == HIGH){

digitalWrite(9, HIGH);

digitalWirte(10, LOW);

-24-
-25-

Παραρτήματα

-25-
-26-

I Κώδικας Παραδειγμάτων
Τον κώδικα κάθε παραδείγματος μπορείτε να τον αντιγράψετε (copy/paste) στο προγραμματιστικό
περιβάλλον σε ένα νέο σχέδιο. Πρέπει όμως πρώτα να διαγράψετε ότι υπάρχει, συγκεκριμένα μία κενή void
setup() και μία κενή void loop().

/*
Αφέσβεση(αναβόσβημα)
Ανάβει ένα LED για ένα δευτερόλεπτο,
το σβήνει για ένα δευτερόλεπτο
και επαναλαμβάνει συνέχεια

Ο κώδικας του παραδείγματος είναι δημόσιος (public domain)


και βασίζεται στο παράδειγμα Blink του περιβάλλοντος Arduino.
*/

// Η ακίδα 13 έχει συνδεδεμένο ένα LED


// στις περισσότερες εκδοχές του Arduino.

// Η ρουτίνα setup() τρέχει μία φορά στην αρχή ή όταν πατήσουμε


// το πλήκτρο επανεκκίνησης.

void setup() {
// όρισε την ακίδα 13 ώς έξοδο.
pinMode(13, OUTPUT);
}

// Η ρουτίνα loop() εκτελείται σε συνεχή επανάληψη μετά την setup()


void loop() {
digitalWrite(13, HIGH); // Άναψε το LED - HIGH σημαίνει σύνδεσε στα 5V (δώσε ρεύμα)
delay(1000); // Περίμενε 1 δευτερόλεπτο (1000 χιλιοστά του δευτερολέπτου)
digitalWrite(13, LOW); // Σβήσε το LED- LOW σημαίνει σύνδεσε στη γείωση (κόψε το ρεύμα)
delay(1000); // Περίμενε 1 δευτερόλεπτο
}

-26-
-27-

/*
SOS
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Χρησιμοποιεί ένα LED συνδεδεμένο στην ακίδα 9.

Ο κώδικας του παραδείγματος είναι δημόσιος (public domain)


*/

void setup() {
// όρισε την ακίδα 9 ώς έξοδο.
pinMode(9, OUTPUT);
}

void loop() {
// Επιλέγεται διάρκεια τελείας 0,5s (μισό δευτερόλεπτο)
// Βλέπε σημειώσεις για λεπτομέρειες του κώδικα Morse

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του S


digitalWrite(9, HIGH); // Πρώτη τελεία του S
delay(500); // διάρκεια τελείας 0,5s

digitalWrite(9, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Δέυτερη τελεία του S


delay(500); // διάρκεια τελείας 0,5s

digitalWrite(9, LOW); // Διάστημα σοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Τρίτη τελεία του S


delay(500); // διάρκεια τελείας 0,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ S και O


digitalWrite(9, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(1500); // Διάρκεια διαστήματος 1,5s

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του Ο


digitalWrite(9, HIGH); // Πρώτη πάυλα του O
delay(1500); // διάρκεια παύλας 1,5s

digitalWrite(9, LOW); // Διάστημα σοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Δεύτερη παύλα του O


delay(1500); // διάρκεια παύλας 1,5s

digitalWrite(9, LOW); // Διάστημα σοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Τρίτη παύλα του O


delay(1500); // διάρκεια παύλας 1,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του Ο (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ Ο και S (του δεύτερου S)


digitalWrite(9, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(1500); // Διάρκεια διαστήματος 1,5s

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του δεύτερου S


digitalWrite(9, HIGH); // Πρώτη τελεία του S
delay(500); // διάρκεια τελείας 0,5s

digitalWrite(9, LOW); // Διάστημα σοιχείων του ιδίου γράμματος (LED σβηστό)

-27-
-28-

delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Δέυτερη τελεία του S


delay(500); // διάρκεια τελείας 0,5s

digitalWrite(9, LOW); // Διάστημα σοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος 0,5s

digitalWrite(9, HIGH); // Τρίτη τελεία του S


delay(500); // διάρκεια τελείας 0,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

// Επισης ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του ΄σήματος SOS

// ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ λέξεων


// (θεωρούμε το SOS λέξη, το διάστημα ανάμεσα σε διαδοχικά SOS
// είναι διάστημα μεταξύ λέξεων)
digitalWrite(9, LOW); // Διάστημα μεταξύ λέξεων (LED σβηστό)
delay(3500); // Διάρκεια διαστήματος 3,5s

-28-
-29-

/*
SOSmetablitiAkida
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Μπορούμε να επιλέξουμε σε ποιά ακίδα θα είναι το LED
μέσω της μεταβλητής akidaLed

Ο κώδικας του παραδείγματος είναι δημόσιος (public domain)


*/

// OΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΗΣ
int akidaLed = 9; // ορίζεται ΑΚΕΡΑΙΑ μεταβλητ΄ή με όνομα akidaLed
// και (αρχική) τιμή 9

void setup() {
// όρισε την ακίδα του LED ως έξοδο (ο αριθμός της είναι στη μεταβλητή akidaLed.
pinMode(akidaLed, OUTPUT);
}

void loop() {
// Επιλέγεται διάρκεια τελείας 0,5s (μισό δευτερόλεπτο)
// Βλέπε σημειώσεις για λεπτομέρειες του κώδικα Morse

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του S


digitalWrite(akidaLed, HIGH); // Πρώτη τελεία του S
delay(500); // διάρκεια τελείας 0,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχείων 0,5s

digitalWrite(akidaLed, HIGH); // Δέυτερη τελεία του S


delay(500); // διάρκεια τελείας 0,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχείων 0,5s

digitalWrite(akidaLed, HIGH); // Τρίτη τελεία του S


delay(500); // διάρκεια τελείας 0,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ S και O


digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(1500); // Διάρκεια διαστήματος μεταξύ γραμμάτων 1,5s

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του Ο


digitalWrite(akidaLed, HIGH); // Πρώτη πάυλα του O
delay(1500); // διάρκεια παύλας 1,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχείων 0,5s

digitalWrite(akidaLed, HIGH); // Δεύτερη παύλα του O


delay(1500); // διάρκεια παύλας 1,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχείων 0,5s

digitalWrite(akidaLed, HIGH); // Τρίτη παύλα του O


delay(1500); // διάρκεια παύλας 1,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του Ο (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ Ο και S (του δεύτερου S)


digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(1500); // Διάρκεια διαστήματος μεταξύ γραμματων 1,5s

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του δεύτερου S

-29-
-30-

digitalWrite(akidaLed, HIGH); // Πρώτη τελεία του S


delay(500); // διάρκεια τελείας 0,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχείων 0,5s

digitalWrite(akidaLed, HIGH); // Δέυτερη τελεία του S


delay(500); // διάρκεια τελείας 0,5s

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(500); // Διάρκεια διαστήματος μεταξύ στοιχέιων 0,5s

digitalWrite(akidaLed, HIGH); // Τρίτη τελεία του S


delay(500); // διάρκεια τελείας 0,5s
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

// Επισης ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του ΄σήματος SOS

// ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ λέξεων


// (θεωρούμε το SOS λέξη, το διάστημα ανάμεσα σε διαδοχικά SOS
// είναι διάστημα μεταξύ λέξεων)
digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ λέξεων (LED σβηστό)
delay(3500); // Διάρκεια διαστήματος μεταξύ λέξεων 3,5s

-30-
-31-

/*
SOSmetablitiDiarkeia
Εκπέμπει το σήμα SOS σε κώδικα Morse.
Το σήμα επαναλαμβάνεται συνέχεια.
Μπορούμε να επιλέξουμε σε ποιά ακίδα θα είναι το LED
μέσω της μεταβλητής akidaLed
Μπορούμε να ορίσουμε τη διάρκεια της τελείας
μέσω της μεταβλητής diarkTel.
Οι υπόλοιπες διάρκειες υπολογίζονται αυτόματα και
οι τιμές τους δίνονται σε αντίστοιχες μεταβλητές

Ο κώδικας του παραδείγματος είναι δημόσιος (public domain)


*/

// OΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ

int akidaLed = 9; // Ο αριθμός της ακίδας στην οποία συνδέεται το LED

int diarkTel = 500; // Διάρκεια τελείας και βάση υπολογισμού


int diarkPav = diarkTel * 3; // Διάρκεια παύλας
int diastStoix = diarkTel * 1; // Διάρκεια διατήματως μεταξύ στοιχείων ενός γράμματος
int diastGramm = diarkTel * 3; // Διάρκεια διατήματος μεταξύ γραμμάτων
int diastLeks = diarkTel * 7; // Διάρκεια διαστήματος μεταξύ λέξεων

void setup() {
// όρισε την ακίδα του LED ως έξοδο (ο αριθμός της είναι στη μεταβλητή akidaLed)
pinMode(akidaLed, OUTPUT);
}

void loop() {

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του S


digitalWrite(akidaLed, HIGH); // Πρώτη τελεία του S
delay(diarkTel);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Δέυτερη τελεία του S


delay(diarkTel);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Τρίτη τελεία του S


delay(diarkTel);
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ S και O


digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(diastGramm);

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του Ο


digitalWrite(akidaLed, HIGH); // Πρώτη πάυλα του O
delay(diarkPav);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Δεύτερη παύλα του O


delay(diarkPav);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Τρίτη παύλα του O

-31-
-32-

delay(diarkPav);
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του Ο (τρείς τελείες)

//ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ Ο και S (του δεύτερου S)


digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ γραμμάτων (LED σβηστό)
delay(diastGramm);

// ΑΡΧΗ ΜΕΤΑΔΟΣΗΣ του δεύτερου S


digitalWrite(akidaLed, HIGH); // Πρώτη τελεία του S
delay(diarkTel);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Δέυτερη τελεία του S


delay(diarkTel);

digitalWrite(akidaLed, LOW); // Διάστημα στοιχείων του ιδίου γράμματος (LED σβηστό)


delay(diastStoix);

digitalWrite(akidaLed, HIGH); // Τρίτη τελεία του S


delay(diarkTel);
// ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του S (τρείς τελείες)

// Επισης ΤΕΛΟΣ ΜΕΤΑΔΟΣΗΣ του ΄σήματος SOS

// ΔΙΑΣΤΗΜΑ ΜΕΤΑΞΥ λέξεων


// (θεωρούμε το SOS λέξη, το διάστημα ανάμεσα σε διαδοχικά SOS
// είναι διάστημα μεταξύ λέξεων)
digitalWrite(akidaLed, LOW); // Διάστημα μεταξύ λέξεων (LED σβηστό)
delay(diastLeks);

-32-
-33-

/*
DiabasmaDiakopti
Διαβάζει την κατάσταση ενός διακόπτη συνδεδεμένου στην ακίδα 2
Ανάβει ή σβήνει ένα LED σύμφωνα με την κατάσταση του διακόπτη.

Ο κώδικας του παραδείγματος είναι δημόσιος (public domain)


*/

int akidaDiakopti = 2; // Η ακίδα 2 έχει συνδεδεμένο ένα διακόπτη


int akidaLed = 9; // Η ακίδα 2 έχει συνδεδεμένο ένα LED

int katastasiDiakopti; // Μεταβλητή για την αποθήκευση της κατάστασης του διακόπτη

void setup() {
pinMode(akidaDiakopti, INPUT); // Η ακίδα με το διακόπτη είναι είσοδος
pinMode(akidaLed, OUTPUT); // Η ακίδα με το LED είναι έξοδος
}

void loop() {

katastasiDiakopti = digitalRead(akidaDiakopti); // Διαβασε την κατάσταση του διακόπτη και βάλε


// την τιμή στην αντίστοιχη μεταβλητή
digitalWrite(akidaLed, katastasiDiakopti); // Γραψε την τιμή της κατάστασης του διακόπτη
delay(10); // Καθυστέρηση για σταθερότητα
// (ένα εκατοστό του δευτερολέπτου)
}

-33-
-34-

/* AnalogikiEksodosEllipes
Ανάβει ένα LED συνδεδεμένο στην ακίδα 6 σε διάφορα επίπεδα έντασης

Ο κώδικας είναι δημόσιος (Public Domain)


*/

void setup(){
pinMode(6, OUTPUT);
}

void loop(){
analogWrite(6, 0); // LED σβηστό
delay(500);

// Συμπληρώστε τον κώδικα για δύο ενδιάμεσες εντάσεις στο LED

analogWrite(6, 255); //LED σε μέγιστη ένταση


delay(500);
}

/* AnalogikiEksodos
Ανάβει ένα LED συνδεδεμένο στην ακίδα 6 σε διάφορα επίπεδα έντασης

Ο κώδικας είναι δημόσιος (Public Domain)


*/

void setup(){
pinMode(6, OUTPUT);
}

void loop(){
analogWrite(6, 0); // LED σβηστό
delay(500);

analogWrite(6, 100); // LED σε χαμηλή ένταση


delay(500);

analogWrite(6, 175); // LED σε μεγαλύτερη ένταση


delay(500);

analogWrite(6, 255); //LED σε μέγιστη ένταση


delay(500);
}

-34-
-35-

/*
AnalogikiEisodosKaiSeiriaki
Διαβάζει ένα ποτενσιόμετρο συνδεδεμένο στην ακίδα A0
και γράφει την τιμή στην οθόνη του υπολογιστή.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Για να δούμε την πληροφορία που γράφεται στην οθόνη του υπολογιστή
πρέπει να επιλέξουμε από το μενού του Arduino Εργαλεία->Σειριακή Οθόνη
META το ανέβασμα του σχεδίου στον Arduino.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ο κώδικας του παραδείγματος είναι δημόσιος (Public Domain)


*/

int analogikiA0; // μεταβλητή για την τιμή που θα διαβάσουμε από την ακίδα

void setup(){
Serial.begin(9600); // άρχισε την επικοινωνία με τον υπολογιστή

// δεν χρειάζεται να ορίσουμε την ακίδα σαν είσοδο διότι είναι


// ήδη ορισμένη με την εκκίνηση του Arduino
}

void loop(){
analogikiA0 = analogRead(A0); // διάβασε την τιμή της ακίδας και φύλαξέ την στην μεταβλητή.

Serial.print("H timi tis akidas einai: "); // γραψε στην οθόνη επεξηγηματικό κείμενο
// μην αλλάζεις γραμμή.
Serial.println(analogikiA0); // γράψε στην οθόνη την τιμή της μεταβλητής analogikiA0
// μετά άλλαξε γραμμή.
delay(10); // ΑΠΑΡΑΙΤΗΤΗ μικρή καθυστέρηση για να σταθεροποιηθεί η επόμενη τιμή της εισόδου
}

-35-
-36-

/*
AnalogikiEisodosSeiriakiLED
Διαβάζει ένα ποτενσιόμετρο συνδεδεμένο στην ακίδα A0
γράφει την τιμή στην οθόνη του υπολογιστή
και ανάβει ένα ΛΕΔ.

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Για να δούμε την πληροφορία που γράφεται στην οθόνη του υπολογιστή
πρέπει να επιλέξουμε από το μενού του Arduino Εργαλεία->Σειριακή Οθόνη
META το ανέβασμα του σχεδίου στον Arduino.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ο κώδικας του παραδείγματος είναι δημόσιος (Public Domain)


*/

int analogikiA0; // μεταβλητή για την τιμή που θα διαβάσουμε από την ακίδα
int akidaLed = 6; // αριθμός ακίδας για αναλογική έξοδο (3,5,6,9,10 ή 11)

void setup(){
Serial.begin(9600); // άρχισε την επικοινωνία με τον υπολογιστή

pinMode(akidaLed, OUTPUT); // όρισε την ακίδα σαν έξοδο

// δεν χρειάζεται να ορίσουμε την ακίδα Α0 σαν είσοδο διότι είναι


// ήδη ορισμένη με την εκκίνηση του Arduino
}

void loop(){
analogikiA0 = analogRead(A0); // διάβασε την τιμή της ακίδας και φύλαξέ την στην μεταβλητή.

Serial.print("H timi tis akidas einai: "); // γραψε στην οθόνη επεξηγηματικό κείμενο
// μην αλλάζεις γραμμή.
Serial.println(analogikiA0); // γράψε στην οθόνη την τιμή της μεταβλητής analogikiA0
// μετά άλλαξε γραμμή.
analogWrite(6, analogikiA0 / 4); // γράψε την προσαρμοσμένη τιμή στην ακίδα 6
// -διαιρουμε την τιμή με το 4 γιατί η αναλογική είσοδος
// -δεχεται τιμές μεχρι το 255, ενώ η αναλογική
// -είσοδος δινει τιμές μεχρι το 1023
delay(10); // ΑΠΑΡΑΙΤΗΤΗ μικρή καθυστέρηση για να σταθεροποιηθεί η επόμενη τιμή της εισόδου
}

-36-
-37-

/*
IFdiakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος δεν κάνει τίποτε
Περιμένει για λίγο και επαναλαμβάνει
*/

int akidaLed = 8; // ακίδα σύνδεσης του LED (έξοδος)


int akidaDiakopti = 7; // ακίδα σύνδεσης του διακόπτη (είσοδος)
int katastasiDiakopti = LOW; // μεταβλητή για το διάβασμα του διακόπτη
// αρχική τιμή LOW (διακόπτης απενεργοποιημένος)

void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}

void loop(){

katastasiDiakopti = digitalRead(akidaDiakopti);

if (katastasiDiakopti == HIGH){ // Αν ο διακόππτης είναι ενεργοποιημένος και μόνο


digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
} // Τέλος των εντολών που θα εκτελεστούν αν ο διακόπτης είναι ενεργοποιημένος

// **** Αν ο διακόπτης δεν είναι ενεργοποιημένος


// **** Θα αγνοηθούν οι παραπάνω εντολές και θα έρθουμε αμέσως εδώ

delay(300); // περίμενε λίγο πρίν επαναλάβεις


}

-37-
-38-

/*
IF_ELSE_diakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος αναβει το LED για ένα σχετικά μεγάλο διάστημα
Περιμένει για λίγο και επαναλαμβάνει
*/

int akidaLed = 8; // ακίδα σύνδεσης του LED (έξοδος)


int akidaDiakopti = 7; // ακίδα σύνδεσης του διακόπτη (είσοδος)
int katastasiDiakopti = LOW; // μεταβλητή για το διάβασμα του διακόπτη
// αρχική τιμή LOW (διακόπτης απενεργοποιημένος)

void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}

void loop(){

katastasiDiakopti = digitalRead(akidaDiakopti);

if (katastasiDiakopti == HIGH){ // ** Αν ο διακόπτης είναι ενεργοποιημένος


digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
digitalWrite(akidaLed, HIGH); // άναψε
delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
} // ** Τέλος των εντολών που θα εκτελεστούν αν ο διακόπτης είναι ενεργοποιημένος

else { // ** Αλλιώς (αν ο διακόπτης δεν είναι ενεργοποιημένος


digitalWrite(akidaLed, HIGH); // άναψε
delay(500);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
} // ** Τέλος των εντολών που θα εκτελεστούν αν ο διακόπτης ΔΕΝ είναι ενεργοποιημένος

// **** Σ' αυτή την περίπτωση θα εκτελεστούν οπωσδήποτε


// **** ή οι εντολές του IF
// **** ή οι εντολές του ELSE
// **** ποτέ όμως και οι μεν και οι δε

delay(300); // περίμενε λίγο πρίν επαναλάβεις

-38-
-39-

/*
IF_ELSE_FOR_diakoptis
Διαβάζει ένα διακόπτη.
Αν είναι ενεργοποιημένος αναβοσβήνει ενα LED γρήγορα τρεις φορές
Αν δεν είναι ενεργοποιημένος αναβει το LED για ένα σχετικά μεγάλο διάστημα
Περιμένει για λίγο και επαναλαμβάνει.
Χρησιμοποιούμε τη δομή FOR για να αποφύγουμε την μονότονη επανάληψη πανομοιότυπου κώδικα:
λέμε (αναψε-σβήσε τρεις φορές)
αντί (αναψε-σβήσε, αναψε-σβήσε, αναψε-σβήσε)
Αν οι επαναλήψεις είναι πιό πολλές, ας πούμε 100, το πλεονέκτημα είναι πιό προφανές
Εκτός από τον περιορισμό της έκτασής στου ο κώδικας γίνεται και πιό ευανάγνωστος
*/

int akidaLed = 8; // ακίδα σύνδεσης του LED (έξοδος)


int akidaDiakopti = 7; // ακίδα σύνδεσης του διακόπτη (είσοδος)
int katastasiDiakopti = LOW; // μεταβλητή για το διάβασμα του διακόπτη
// αρχική τιμή LOW (διακόπτης απενεργοποιημένος)

void setup(){
pinMode(akidaLed, OUTPUT); // ορισμός εξόδου
digitalWrite(akidaLed, LOW); // Για να είμαστε σίγουροι ότι τo LED θα είναι σβηστό στο ξεκίνημα.
}

void loop(){

katastasiDiakopti = digitalRead(akidaDiakopti);

if (katastasiDiakopti == HIGH){ // ** Αν ο διακόπτης είναι ενεργοποιημένος


for (int i = 1; i <= 3; i++){ // τρείς επαναλήψεις (αναλαμπές)
// για i = 1 ως 3
// εδώ χρησιμοποιούμε τη μεταβλητή i μόνο για να μετρήσουμε
// τις επαναλήψεις.

digitalWrite(akidaLed, HIGH); // άναψε


delay(100);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
}
} // ** Τέλος των εντολών που θα εκτελεστούν αν ο διακόπτης είναι ενεργοποιημένος

else { // ** Αλλιώς (αν ο διακόπτης δεν είναι ενεργοποιημένος


digitalWrite(akidaLed, HIGH); // άναψε
delay(500);
digitalWrite(akidaLed, LOW); // σβήσε
delay(100);
} // ** Τέλος των εντολών που θα εκτελεστούν αν ο διακόπτης ΔΕΝ είναι ενεργοποιημένο

delay(300); // περίμενε λίγο πρίν επαναλάβεις

-39-
-40-

/*
FOR_monoxromatiko
ανάβει σιγά σιγά ένα LED
το σβήνει σιγά σιγά
και επαναλαμβάνει
*/

int akidaLed = 9; // ακίδα για LED

void setup(){
pinMode(akidaLed, OUTPUT);
}

void loop(){

for (int i = 0; i <= 255; i++){ // 256 επαναλήψεις με αυξανόμενη ένταση


// εδώ χρησιμοποιούμε την μεταβλητή i, όχι μόνο για να μετρήσουμε
// τις επναλήψεις αλλά και σαν τιμή για την αναλογική έξοδο.
// Η i παίρνει τιμές από 0 ως 255 που είναι το πλήρες εύρος
// τιμών της αναλογικής εξόδου.
analogWrite(akidaLed, i);
delay(10);
} // τέλος των εντολών που επαναλαμβάνονται από τη FOR

for (int i = 255; i >= 0; i--){ // 256 επαναλήψεις με μειούμενη ένταση


analogWrite(akidaLed, i);
delay(10);
}// τέλος των εντολών που επαναλαμβάνονται από τη FOR\
}

-40-
-41-

/*
FOR_Trixromatiko

Σε ένα τριχρωματικό LED σαρώνει όλο το εύρος των χρωμάτων της ίριδας
αχίζει από κόκκινο
περνάει μέσα από το κίτρινο στο πράσινο
μετά μέσα από το κυανοπράσινο στο μπλέ
μετά μέσα από το μώβ πίσο στο κόκκινο.
*/
int kokkino = 5; // ακίδα για το κόκκινο χρώμα (αναλογική έξοδος)
int prasino = 6; // πράσινο
int ble = 9; // μπλε

void setup(){
pinMode(kokkino, OUTPUT);
pinMode(prasino, OUTPUT);
pinMode(ble, OUTPUT);
}

void loop(){
for (int i = 0; i <= 255; i= i + 5){ // 51 επαναλήψεις, το βήμα είναι 5 [0, 5, 10 ... 255]
analogWrite(kokkino, i); // το κόκκινο αυξάνεται (0-255 ανά 5)
analogWrite(ble, 255 - i); // το μπλε μειώνεται (255-0 ανά 5)
delay(50);
}

for (int i = 0; i <= 255; i= i + 5){


analogWrite(prasino, i); // το πράσινο αυξάνεται (0-255 ανά 5)
analogWrite(kokkino, 255 - i); // το κόκκινο μειώνεται (255-0 ανά 5)
delay(50);
}

for (int i = 0; i <= 255; i= i + 5){


analogWrite(ble, i); // το μπλε αυξάνεται (0-255 ανά 5)
analogWrite(prasino, 255 - i); // το πρασινο μειώνεται (255-0 ανά 5)
delay(50);
}
}

-41-
-42-

/*
WHILE_analogiki_eisodos

Διαβάζει ένα ποτενσιόμετρο και κρατάει το LED αναμμένο αν και για όσο η τιμή είναι >= 512
Μετά το σβήνει και το κρατάει σβησμένο όσο η τιμή είναι < 512
και επαναλαμβάνει
*/

int akidaPot = 0; // αναλογική είσοδος για το ποτενσιόμετρο


int akidaLed = 9; // ψηφιακή έξοδος γαι το LED

int timi = 512; // η τιμή της αναλογικής εισόδου


// δίνουμε αυθαίρετα αρχική τιμή 512 (LED αναμμένο)

void setup(){
pinMode(9, OUTPUT); // ορισμός ακίδας εξόδου

Serial.begin(9600); // άρχισε την επικοινωνία με τον υπολογιστή


}

void loop(){

digitalWrite(akidaLed, HIGH); // άναψε

while (timi >= 512){ // όσο η τιμή που διάβασες είναι >= 512
timi = analogRead(akidaPot); // διάβασε μια νέα τιμή
Serial.println(akidaPot); // γράψε την τιμή στην οθόνη του υπολογιστή
delay(10); // περίμενε λίγο
}

// Αν φθάσουμε εδώ η τελευταία τιμή που διαβάσαμε είναι < 512

digitalWrite(akidaLed, LOW); // αφού η τιμή είναι < 512 σβήσε το LED

while (timi < 512){ // όσο η τιμή που διάβασες είναι < 512
timi = analogRead(akidaPot); // διάβασε μια νέα τιμή
Serial.println(akidaPot); // γράψε την τιμή στην οθόνη του υπολογιστή
delay(10); // περίμενε λίγο
}
// Αν φθάσουμε εδώ η τελευταία τιμή που διαβάσαμε είναι >= 512
// Γυρνάμε στην αρχή για να ξανανάψει το LED και να συνεχιστεί η διαδικασία
// Η πρώτη εντολή θα ανάψει το LED, ορθά αφού η τελευταία τιμή που διαβάσαμε
// είναι >= 512.
}

-42-
-43-

II Συστήματα Αρίθμησης και Στρόγγυλοι Αριθμοί


Στην περίπτωση του εύρους τιμών των αναλογικών εισόδων και εξόδων του Arduino ο δεκαδικός αριθμός
256 (δεκαδικό σύστημα αρίθμησης) αντιστοιχεί στο στρόγγυλο αριθμό 100000000 (1 και 8 μηδενικά) στο
δυαδικό σύστημα αρίθμησης (1x28). Ο 1024 (δεκαδικό) αντιστοιχεί στον στρόγγυλο 10000000000 (1 και 10
μηδενικά) στο δυαδικό (1x210) .

Στο δεκαδικό σύστημα έχουμε 10 ψηφία (από 0 ως 9). Όταν αριθμώντας τελειώσουν τα ψηφία ο επόμενος
αριθμός είναι μία δεκάδα και γράφεται στα αριστερά των μονάδων. Η έννοια της δεκάδας συνδέεται άμεσα
με το γεγονός ότι έχουμε στη διάθεσή μας δέκα ψηφία.

Πριν πάμε στο δυαδικό σύστημα θα δούμε το οκταδικό που είναι πιο ευνόητο. Στο οκταδικό σύστημα έχουμε
οκτώ ψηφία (0-7). Όταν τα ψηφία τελειώσουν ο επόμενος αριθμός είναι μία οκτάδα. Άρα ο αριθμός που
γράφεται 10 στο οκταδικό είναι μία οκτάδα και μηδέν μονάδες ίσος με το 8 στο δεκαδικό. Ο αριθμός που
γράφεται 17 στο οκταδικό είναι μία οκτάδα και επτά μονάδες δηλαδή ίσος με το 15 στο δεκαδικό.

Στο δεκαδικό μετά το 99 (εννέα δεκάδες και εννέα μονάδες έχουμε δέκα δεκάδες ή μία δεκάδα δεκάδων και
γράφουμε 100) η αντίστοιχη κατάσταση στο οκταδικό προκύπτει για τον αριθμό που γράφεται 77 (7 είναι το
μεγαλύτερο διαθέσιμο ψηφίο για το οκταδικό όπως το 9 στο δεκαδικό). Εδώ έχουμε όμως επτά οκτάδες και
επτά μονάδες και ο επόμενος αριθμός είναι οκτώ οκτάδες ή μία οκτάδα οκτάδων που γράφεται στο οκταδικό
100. Είναι ίσος με το 64 (8x8) στο δεκαδικό. Βλέπουμε λοιπόν ότι αριθμοί που είναι στρόγγυλοι στο οκταδικό
σύστημα αρίθμησης δεν είναι στρόγγυλοι στο δεκαδικό (και αντίστροφα προφανώς).

Αντίστοιχα με το δεκαδικό σε ένα πολυψήφιο οκταδικό αριθμό το πρώτο ψηφίο από τα δεξιά αντιστοιχεί σε
μονάδες (1), το δεύτερο αντιστοιχεί (πολλαπλασιάζεται) σε οκτάδες (8), το επόμενο σε 64 (82), το επόμενο σε
512 (83), 4096(84).

Στο δυαδικό σύστημα έχουμε δύο μόνο ψηφία (0-1). Τα ψηφία τελειώνουν πολύ γρήγορα (θα λέγαμε
αμέσως) κατά την αρίθμηση. Το 1 στο δυαδικό γράφεται επίσης 1, όπως και σε όλα τα άλλα συστήματα. Στο
δυαδικό όμως ήδη έχουν τελειώσει τα διαθέσιμα ψηφία. Ο επόμενος αριθμός λοιπόν είναι μία δυάδα,
γράφεται 10 και είναι ίσος με το 2 στο δεκαδικό (μία δυάδα και μηδέν μονάδες).

Μετά αυξάνουμε πάλι τις μονάδες. Ο επόμενος αριθμός γράφεται 11 που είναι μία δυάδα και μία μονάδα
ίσος με το 3 στο δεκαδικό. Και πάλι μας τελείωσαν τα ψηφία και μάλιστα και για τις μονάδες και για τις
δυάδες. Άρα προσθέτουμε ένα ακόμα ψηφίο που αντιστοιχεί σε δύο δυάδες ή μία δυάδα δυάδων. Γράφουμε
100 που είναι ίσο με μία δυάδα δυάδων (2x2 = 4), μηδέν δυάδες και μηδέν μονάδες άρα 4 στο δεκαδικό.

Τα ψηφία αρχίζοντας από τα δεξιά αντιστοιχούν σε μονάδες (1), δυάδες (2), τετράδες (22 = 4), οκτάδες (23 =
8), δεκαεξάδες (24 = 16) κοκ. Ο αριθμός 1101 στο δυαδικό αντιστοιχεί (αρχίζοντας από δεξιά προς αριστερά,
ανάποδα) στον 1x1 + 0x2 + 1x22 + 1x23 = 1x1 + 0x2 + 1x4 + 1x8 = 13 στο δεκαδικό.

-43-
-44-

III Νότες και Συχνότητες


Στη σύγχρονη (συγκερασμένη) μουσική κλίμακα η οκτάβα διαιρείται σε 12 ημιτόνια. Η βασική συχνότητα
είναι η συχνότητα του κεντρικού ΛΑ (440Hz). Αυτή είναι η βάση του κουρδίσματος όλων των οργάνων. Για να
υπολογίσουμε τη συχνότητα κάθε ημιτονίου πολλαπλασιάζουμε τη συχνότητα του προηγούμενου με τη
δωδέκατη ρίζα του 2 (Η διαιρούμε τη συχνότητα του επόμενο με τον ίδιο αριθμό αν πηγαίνουμε προς τα
κάτω. Ο αριθμός αυτός στρογγυλεμένος είναι 1.06. Με αυτή την προσέγγιση στα δύο δεκαδικά ψηφία
παίρνουμε αρκετά καλά αποτελέσματα και, πρακτικά, δεν χρειαζόμαστε περισσότερη ακρίβεια.

Στους πίνακες Α,Β,Γ,Δ βλέπουμε τις νότες και τις συχνότητές του για τις πιο χρηστικές οκτάβες. Το κεντρικό
ΛΑ είναι στο πίνακα Β σημειωμένο με γκρι φόντο.

Η δεύτερη στήλη κάθε πίνακα είναι η συχνότητα της νότας στρογγυλεμένη σε ακέραιο. Η tone() που
χρησιμοποιούμε για τον Arduino δέχεται μόνο ακέραιες συχνότητες. Ακόμα και αυτή η προσέγγιση όμως
δίνει πολύ καλά αποτελέσματα. Η τελευταία στήλη κάθε πίνακα είναι ένα μέτρο της απόκλισης της ακέραιης
προσέγγισης από την πραγματική συχνότητα. Εργαστηριακές παρατηρήσεις έδειξαν ότι αν το μέτρο αυτό
είναι κάτω από 5, οι περισσότεροι άνθρωποι δεν καταλαβαίνουν τη διαφορά. Βλέπουμε από τον πίνακα ότι
το μέτρο είναι λίγο πάνω από το 5 για μία μόνο νότα και κοντά στο 5 για μία μόνο ακόμα.
Α ΝΤΟ 131 130.81 2.48 Β ΝΤΟ 262 261.63 2.48 Γ ΝΤΟ 523 523.25 0.83 Δ ΝΤΟ 1047 1046.50 0.82
ΝΤΟ # 139 138.59 5.10 ΝΤΟ # 277 277.18 1.14 ΝΤΟ # 554 554.37 1.14 ΝΤΟ # 1109 1108.73 0.42
ΡΕ 147 146.83 1.98 ΡΕ 294 293.66 1.98 ΡΕ 587 587.33 0.97 ΡΕ 1175 1174.66 0.50
ΡΕ # 156 155.56 4.85 ΡΕ # 311 311.13 0.71 ΡΕ # 622 622.25 0.71 ΡΕ # 1245 1244.51 0.68
ΜΙ 165 164.81 1.96 ΜΙ 330 329.63 1.96 ΜΙ 659 659.26 0.67 ΜΙ 1319 1318.51 0.64
ΦΑ 175 174.61 3.82 ΦΑ 349 349.23 1.13 ΦΑ 698 698.46 1.13 ΦΑ 1397 1396.91 0.11
ΦΑ # 185 185.00 0.03 ΦΑ # 370 369.99 0.03 ΦΑ # 740 739.99 0.03 ΦΑ # 1480 1479.98 0.03
ΣΟΛ 196 196.00 0.02 ΣΟΛ 392 392.00 0.02 ΣΟΛ 784 783.99 0.02 ΣΟΛ 1568 1567.98 0.02
ΣΟΛ # 208 207.65 2.90 ΣΟΛ # 415 415.30 1.27 ΣΟΛ # 831 830.61 0.81 ΣΟΛ # 1661 1661.22 0.23
ΛΑ 220 220.00 0.00 ΛΑ 440 440.00 0.00 ΛΑ 880 880.00 0.00 ΛΑ 1760 1760.00 0.00
ΛΑ # 233 233.08 0.61 ΛΑ # 466 466.16 0.61 ΛΑ # 932 932.33 0.61 ΛΑ # 1865 1864.66 0.32
ΣΙ 247 246.94 0.41 ΣΙ 494 493.88 0.41 ΣΙ 988 987.77 0.41 ΣΙ 1976 1975.53 0.41

Ε ΝΤΟ 1.00 ΣΤ ΝΤΟ 1.00 Ζ ΝΤΟ 10.0 Η ΝΤΟ 8.1


Κουρδισμένο στην οκτάβα πάνω από το
Μήκη κλειστών σωλήνων σε εκατοστα.
Aναλογίες συχνοτήτων με βάση το ΝΤΟ.

Συγκεκριμένα μήκη σε εκατοστα (cm)


Aναλογίες μηκών με βάση το ΝΤΟ.

ΝΤΟ # 1.06 ΣΙ 1.06 ΣΙ 10.6 ΣΙ 8.6


ΡΕ 1.12 ΛΑ# 1.12 ΛΑ# 11.2 ΛΑ# 9.1 κεντρικό ΛΑ (τρίτος πίνακας)
ΡΕ # 1.19 ΛΑ 1.19 ΛΑ 11.9 ΛΑ 9.7
ΜΙ 1.26 ΣΟΛ# 1.26 ΣΟΛ# 12.6 ΣΟΛ# 10.2
ΦΑ 1.33 ΣΟΛ 1.33 ΣΟΛ 13.3 ΣΟΛ 10.8
ΦΑ # 1.41 ΦΑ # 1.41 ΦΑ # 14.1 ΦΑ # 11.5
ΣΟΛ 1.50 ΦΑ 1.50 ΦΑ 15.0 ΦΑ 12.2
ΣΟΛ # 1.59 ΜΙ 1.59 ΜΙ 15.9 ΜΙ 12.9
ΛΑ 1.68 ΡΕ# 1.68 ΡΕ# 16.8 ΡΕ# 13.7
ΛΑ # 1.78 ΡΕ 1.78 ΡΕ 17.8 ΡΕ 14.5
ΣΙ 1.89 ΝΤΟ# 1.89 ΝΤΟ# 18.9 ΝΤΟ# 15.3
ΝΤΟ 2.00 ΝΤΟ 2.00 ΝΤΟ 20.0 ΝΤΟ 16.2

Ο πίνακας Ε δείχνει την αναλογία της συχνότητας της κάθε νότας μίας οκτάβας με βάση το ΝΤΟ· δεν έχει
ιδιαίτερη πρακτική σημασία.

Ο πίνακας ΣΤ δείχνει τις αναλογίες μηκών σωλήνων ή ελασμάτων που απαιτούνται για κατασκευάσουμε ένα
αυτοσχέδιο όργανο (Αυλό του Πανός, Μεταλλόφωνο ή Κρόταλλα). Σημειώνεται ότι σειρά από τις νότες είναι
αντίστροφη, διότι μακρύτερα μήκη δίνουν χαμηλότερες συχνότητες. Για την αίσθηση της μελωδίας έχει
σημασία κυρίως η αναλογία των συχνοτήτων. Ο πίνακας Ζ δίνει συγκεκριμένα μήκη σε εκατοστά. Αν βέβαια
θέλουμε να χρησιμοποιήσουμε το όργανό μας σε συνδυασμό με τυποποιημένα όργανα, πρέπει να είναι
κουρδισμένο. Ο πίνακας Η δίνει συγκεκριμένα μήκη σε εκατοστά για κλειστούς σωλήνες (Αυλό του Πανός)
κουρδισμένους στην οκτάβα του πίνακα Γ.

-44-
-45-

IV Το μικρό εγχειρίδιο προγραμματισμού του Arduino


Αυτό είναι ένα υποσύνολο του εγχειριδίου προγραμματισμού του Arduino. Περιλαμβάνει τις εντολές και
δομές που είδαμε στο σεμινάριο. Με αυτές τις εντολές μπορούμε να υλοποιήσουμε πάρα πολλές
λειτουργικές εφαρμογές.

Όπου υπάρχει κείμενο ανάμεσα σε τρίγωνες αγκύλες (π.χ. <αριθμός ακίδας>) είναι περιγραφικό. Εξηγεί τι
πρέπει να βάλουμε σε αυτή τη θέση. Για το συγκεκριμένο παράδειγμα πρέπει να αντικατασταθεί από ένα
αριθμό ακίδας ή το όνομα μιας μεταβλητής που «περιέχει» έναν αριθμό ακίδας. Τις τρίγωνες αγκύλες δεν τις
περιλαμβάνουμε στον κώδικά μας.

Βασική Δομή Σχεδίου (προγράμματος)

-45-
-1-

Βιβλιογραφία
[1] Physical Computing, Θεόδωρος Χ. Κασκάλης, Τμήμα Διοίκησης Τεχνολογίας, Πανεπιστήμιο
Μακεδονίας, http://pdkap.sch.gr/praktika2010/ergasies/Physical_Computing.pdf

[2] Arduino site, http://arduino.cc/ <Αγγλικά>

-1-
-1-

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

Εμπράγματος Προγραμματισμός (Physical Computing) .................................................... 1


Λογισμικό και υλικό ανοιχτού κώδικα ............................................................................................................... 1

Φιλοσοφία και άδειες χρήσης Ανοιχτού και Ελεύθερου Λογισμικού και υλικού .............................................. 1

Πλατφόρμες (Arduino, Lego, Raspberry pi, others) ............................................................................................ 2

Ενδιαφέρουσες Εφαρμογές ............................................................................................................................... 2

Arduino στην εκπαίδευση .................................................................................................................................. 2

Scratch για Arduino ............................................................................................................................................ 2

Στο ψητό .......................................................................................................................... 2


Η βάση του συστήματος..................................................................................................................................... 2

Η πλακέτα........................................................................................................................................................... 3

Ψηφιακή και αναλογική λειτουργία ακίδων ...................................................................................................... 3

Σηκώστε τα μανίκια.......................................................................................................... 5
Το προγραμματιστικό περιβάλλον ..................................................................................................................... 5

Τα στοιχεία και η μορφή του κώδικα ................................................................................................................. 6


Τι σημαίνουν τα χρώματα στον κώδικα; ....................................................................................................... 6
Θεμελιώδης δομή, setup(), loop() ................................................................................................................ 7
Οι πρώτες μας εντολές .................................................................................................................................. 8
Επιτέλους δράση! .......................................................................................................................................... 9

Εξωστρέφεια. ................................................................................................................... 9
Στοιχεία που ξέρουμε αλλά μπορεί να μη θυμόμαστε. ..................................................................................... 9
Το ηλεκτρικό κύκλωμα................................................................................................................................... 9
Τα βασικά μεγέθη ........................................................................................................................................ 10

Τι είναι το LED; ................................................................................................................................................. 11

Η πλάκα πρωτοτύπων (breadboard) ................................................................................................................ 12

Χρωματικός κώδικας τιμής αντίστασης. .......................................................................................................... 13

Πως συνδέουμε ένα LED στον Arduino. ........................................................................................................... 13

Κάτι σχετικά λειτουργικό ............................................................................................... 14


Μικρή εισαγωγή στον κώδικα Morse .............................................................................................................. 14

Σχεδιασμός της υλοποίησης (τι ακριβώς θέλουμε να πετύχουμε) .................................................................. 15

Υλοποίηση ........................................................................................................................................................ 16

Μεταβλητές ................................................................................................................... 16
Δήλωση και ορισμός τιμής μεταβλητής ........................................................................................................... 17

Αριθμητικές πράξεις και τελεστές................................................................................... 17

Ο Arduino «διαβάζει» ή πως «μιλάμε» στον Arduino ..................................................... 19

-1-
-2-

Εντολές για αναλογική είσοδο και έξοδο ........................................................................ 20


Εντολή για αναλογική έξοδο ............................................................................................................................ 20

Εντολή για αναλογική είσοδο........................................................................................................................... 20


Τι είναι το ποτενσιόμετρο και πως το συνδέουμε ...................................................................................... 21
Πως γράφουμε πληροφορία από τον Arduino στην οθόνη του υπολογιστή. ............................................. 21

Χρήση τιμών από αναλογική είσοδο για έλεγχο αναλογικής εξόδου .............................................................. 23

Δομές ελέγχου: αποφάσεις και επαναλήψεις ................................................................. 23

ΠΑΡΑΡΤΗΜΑΤΑ

I ......................................................................................................... Κώδικας Παραδειγμάτων


...................................................................................................................................... 26

II ....................................................................Συστήματα Αρίθμησης και Στρόγγυλοι Αριθμοί


...................................................................................................................................... 43

III ............................................................................................................. Νότες και Συχνότητες


...................................................................................................................................... 44

IV ........................................................... Το μικρό εγχειρίδιο προγραμματισμού του Arduino


...................................................................................................................................... 45

-2-

You might also like