(Πηγή: Βιβλίο Μαθητή, Πληροφορική Γ΄ Γυμνασίου, Κεφάλαιο 3 «Φυσική Υπολογιστική-Ρομποτικές Διατάξεις», σελ. 29-40. Το κεφάλαιο (§3.1 Εισαγωγή, §3.2 Γράφοντας κώδικα για τον Διεθνή Διαστημικό Σταθμό, §3.3 Γράφοντας κώδικα για το micro:bit, §3.4 Ο μικροελεγκτής Arduino) δεν έχει δικό του «Ερωτήσεις» υποκεφάλαιο στο ΠΕΡΙΕΧΟΜΕΝΑ, άρα δεν υπάρχει προϋπάρχον lyseis αρχείο από τη Φάση 1 για το Κεφάλαιο 3. Οι 8 «Δραστηριότητα 1-8» παρακάτω είναι τοπικά αριθμημένα κουτιά ενσωματωμένα μέσα στη θεωρία των §3.2.2, §3.3.2 και §3.4.1/§3.4.3/§3.4.4. Η Δραστηριότητα 8 λείπει εντελώς από το πηγαίο JSON (κενός κόμβος §3.4.4) και ανακτήθηκε αυτούσια από το PDF. Οι εκφωνήσεις είναι αυτούσιες από το σχολικό βιβλίο.)
Μεταβείτε στην ιστοσελίδα: https://trinket.io/sense-hat.
Να εκτελέσετε το διπλανό πρόγραμμα και στη συνέχεια να αλλάξετε τις συνθήκες θερμοκρασίας από τον πίνακα ελέγχου.
Δοκιμάστε να αλλάξετε τις 270° στον προσανατολισμό. Τι παρατηρείτε; Να χρησιμοποιήσετε την εντολή print για να εμφανίσετε στην κονσόλα (Text Output) τις τιμές της υγρασίας και της θερμοκρασίας. Τι παρατηρείτε; Πώς μπορούν να γίνουν τα αποτελέσματα πιο ευανάγνωστα;
Το διπλανό πρόγραμμα εμφανίζει τον ακόλουθο κώδικα:
Import the libraries
from sense_hat import SenseHat
Set up the Sense HAT
sense = SenseHat() sense.set_rotation(270, False)
temperature = sense.get_temperature() humidity = sense.get_humidity() if (humidity>70 and temperature<12) : sense.show_message("SAFE")
Εμφανίζεται επίσης ο πίνακας ελέγχου (Space Station Control Panel) με τις ενδείξεις: TEMPERATURE 13°C, PRESSURE 1013hPa, HUMIDITY 45%.
Σκέψη / Μεθοδολογία: Η sense.set_rotation(rotation, redraw) περιστρέφει τον προσανατολισμό της (εικονικής) οθόνης LED 8x8 και του κειμένου κατά 0°, 90°, 180° ή 270° δεξιόστροφα, ώστε η εικόνα/το μήνυμα να διαβάζεται σωστά ανάλογα με τον φυσικό προσανατολισμό της πλακέτας μέσα στη θήκη της (π.χ. αν είναι τοποθετημένη «ανάποδα»). Η δεύτερη παράμετρος (εδώ False) καθορίζει αν θα ξανασχεδιαστεί ΑΜΕΣΩΣ ό,τι υπάρχει ήδη στην οθόνη με τη νέα γωνία· με False, η νέα περιστροφή εφαρμόζεται μόνο στην ΕΠΟΜΕΝΗ εντολή εμφάνισης. Δοκιμάζοντας 0°/90°/180°/270° παρατηρούμε ότι το ίδιο ακριβώς μήνυμα/εικόνα εμφανίζεται περιστραμμένο κατά την αντίστοιχη γωνία. Η δεύτερη ζήτηση (print υγρασίας/θερμοκρασίας) είναι quiz-like: μπορούμε να υπολογίσουμε ακριβώς τι θα εμφανιστεί στην κονσόλα με βάση τις τιμές του πίνακα ελέγχου, και να εξηγήσουμε γιατί η ακατέργαστη έξοδος είναι δυσανάγνωστη (πολλά δεκαδικά ψηφία λόγω ακρίβειας του αισθητήρα floating point) και πώς διορθώνεται.
Λύση:
Περιστροφή 270°: αν προσθέσουμε μια εντολή εμφάνισης μηνύματος μετά το sense.set_rotation(270, False) (π.χ. sense.show_message('TEST')), το κείμενο θα κυλήσει περιστραμμένο κατά 270° δεξιόστροφα σε σχέση με την προεπιλογή 0° — αυτό ισοδυναμεί με περιστροφή 90° αριστερόστροφα. Δοκιμάζοντας διαδοχικά 0°, 90°, 180°, 270° παρατηρούμε ότι κάθε φορά το ίδιο μήνυμα εμφανίζεται γυρισμένο κατά την αντίστοιχη γωνία — χρήσιμο όταν η πλακέτα είναι τοποθετημένη με διαφορετικό φυσικό προσανατολισμό μέσα στη θήκη/το ρομπότ.
print(temperature) και print(humidity): προσθέτοντας τις δύο γραμμές print(temperature) και print(humidity) μετά τον υπολογισμό τους, στην κονσόλα (Text Output) θα εμφανιστούν οι τρέχουσες τιμές του εξομοιωτή — με βάση τον πίνακα ελέγχου (TEMPERATURE 13°C, HUMIDITY 45%) θα δούμε κάτι σαν: 13.19999... και 45.30000... (ο αισθητήρας/εξομοιωτής επιστρέφει τιμές τύπου float με πολλά δεκαδικά ψηφία λόγω της ακρίβειας κινητής υποδιαστολής, όχι στρογγυλεμένους ακέραιους όπως δείχνει ο πίνακας).
Γιατί δεν εμφανίζεται «SAFE»: η συνθήκη if (humidity>70 and temperature<12) απαιτεί ΚΑΙ τα δύο κριτήρια. Με τις τιμές του πίνακα (humidity≈45, temperature≈13): 45>70 είναι Ψευδές ΚΑΙ 13<12 είναι επίσης Ψευδές — η συνολική συνθήκη είναι False, άρα το μήνυμα 'SAFE' ΔΕΝ εμφανίζεται στην οθόνη LED.
Πιο ευανάγνωστα αποτελέσματα: αντί για print(temperature) ακατέργαστο, χρησιμοποιούμε στρογγυλοποίηση, π.χ. print(round(temperature, 1)) και print(round(humidity, 1)) (θα εμφανιστούν καθαρά ως 13.2 και 45.3), ή μορφοποιημένη συμβολοσειρά, π.χ. print(f"Θερμοκρασία: {temperature:.1f}°C") και print(f"Υγρασία: {humidity:.1f}%").
Τελική απάντηση: Με περιστροφή 270° το μήνυμα/η εικόνα εμφανίζεται περιστραμμένη κατά 270° δεξιόστροφα σε σχέση με την προεπιλογή. Τα print(temperature)/print(humidity) τυπώνουν στην κονσόλα τιμές float με πολλά δεκαδικά ψηφία (π.χ. ~13.2 και ~45.3 με βάση τον πίνακα ελέγχου) — δυσανάγνωστες χωρίς στρογγυλοποίηση. Με τις τιμές του πίνακα (humidity≈45%, temperature≈13°C) η συνθήκη humidity>70 and temperature<12 είναι False, άρα το μήνυμα 'SAFE' δεν εμφανίζεται. Λύση ευαναγνωσίας: round(τιμή, 1) ή μορφοποίηση f-string με {:.1f}.
Πρόσεξε:
Μεταβείτε στην ιστοσελίδα https://photodentro.edu.gr/v/item/ds/8521/738 και, αφού πειραματιστείτε με τον RGB Calculator, σημειώστε τους συνδυασμούς RGB για τα χρώματα κόκκινο, πράσινο, μαύρο, λευκό, μωβ, κίτρινο και μπλε.
Σκέψη / Μεθοδολογία: Το εργαλείο (τίτλος στο Photodentro: «Προσθετική παραγωγή χρώματος») δείχνει πώς προκύπτει κάθε χρώμα φωτός συνδυάζοντας τρία κανάλια φωτός — Κόκκινο (R), Πράσινο (G), Μπλε (B) — καθένα με ένταση από 0 (σβηστό) έως 255 (μέγιστο). Τα ζητούμενα 7 χρώματα είναι ακριβώς οι εξής κορυφές του «κύβου RGB»: οι 3 τιμές κάθε καναλιού είναι είτε 0 είτε 255 (πλήρως σβηστό ή πλήρως αναμμένο) — καμία ενδιάμεση τιμή δεν χρειάζεται για αυτά τα 7 βασικά χρώματα. Το μαύρο προκύπτει με ΚΑΝΕΝΑ κανάλι αναμμένο (απουσία φωτός), το λευκό με ΚΑΙ τα τρία κανάλια στο μέγιστο (πρόσθεση όλων των χρωμάτων φωτός), το κίτρινο από κόκκινο+πράσινο, και το μωβ/ματζέντα από κόκκινο+μπλε.
Λύση:
Κόκκινο (Red): R=255, G=0, B=0
Πράσινο (Green): R=0, G=255, B=0
Μπλε (Blue): R=0, G=0, B=255
Μαύρο (Black): R=0, G=0, B=0 (απουσία και των τριών χρωμάτων φωτός)
Λευκό (White): R=255, G=255, B=255 (πρόσθεση και των τριών πρωτευόντων χρωμάτων φωτός στο μέγιστο)
Κίτρινο (Yellow): R=255, G=255, B=0 (κόκκινο + πράσινο)
Μωβ/Ματζέντα (Magenta/Purple): R=255, G=0, B=255 (κόκκινο + μπλε)
Τελική απάντηση: Κόκκινο (255,0,0), Πράσινο (0,255,0), Μπλε (0,0,255), Μαύρο (0,0,0), Λευκό (255,255,255), Κίτρινο (255,255,0), Μωβ/Ματζέντα (255,0,255).
Πρόσεξε:
Να γράψετε ένα πρόγραμμα για το Sense Hat το οποίο, όταν οι συνθήκες είναι κατάλληλες, δηλαδή υγρασία άνω του 88% και θερμοκρασία άνω των 20°C, θα εμφανίζει ένα ουράνιο τόξο.
Σκέψη / Μεθοδολογία: Χρειαζόμαστε (α) μια λίστα 64 χρωμάτων RGB (πλειάδων (R,G,B)) που να σχηματίζει ένα αναγνωρίσιμο τόξο πάνω στην 8x8 οθόνη LED, και (β) μια σύνθετη συνθήκη if με AND που να ελέγχει ΚΑΙ τα δύο κριτήρια (υγρασία>88 ΚΑΙ θερμοκρασία>20) πριν καλέσει το sense.set_pixels(εικόνα). Χρησιμοποιούμε τα βασικά χρώματα του ουράνιου τόξου (κόκκινο, πορτοκαλί, κίτρινο, πράσινο, μπλε, λουλακί, μωβ) σε τοξωτές γραμμές, με το υπόλοιπο φόντο σβηστό (μαύρο).
Λύση:
from sense_hat import SenseHat
sense = SenseHat()
R=(255,0,0); O=(255,128,0); Y=(255,255,0); G=(0,255,0); B=(0,0,255); I=(75,0,130); V=(238,130,238); E=(0,0,0)
rainbow = [
E,E,R,R,R,R,E,E,
E,R,R,O,O,R,R,E,
R,R,O,O,Y,Y,R,R,
R,O,O,Y,Y,G,G,R,
O,O,Y,Y,G,G,B,B,
O,Y,Y,G,G,B,B,I,
Y,Y,G,G,B,B,I,V,
Y,G,G,B,B,I,V,V,
] # ακριβώς 64 στοιχεία (8×8), επαληθεύτηκε με len(rainbow)==64
humidity = sense.get_humidity()
temperature = sense.get_temperature()
if humidity > 88 and temperature > 20:
sense.set_pixels(rainbow)
Επαλήθευση: το len(rainbow) υπολογίστηκε πραγματικά σε Python και επιβεβαιώθηκε ότι ισούται με 64 — απαραίτητη προϋπόθεση για να δεχτεί η set_pixels() τη λίστα χωρίς σφάλμα (ValueError αν δεν έχει ακριβώς 64 στοιχεία). Η λογική συνθήκη ελέγχθηκε επίσης με τις τιμές του πίνακα ελέγχου της Δραστηριότητας 1 (humidity=45, temperature=13): humidity>88 and temperature>20 → False and False → False, άρα το τόξο ΔΕΝ θα εμφανιζόταν με εκείνες τις συνθήκες — μόνο όταν και οι δύο τιμές ξεπεράσουν τα κατώφλια.
Τελική απάντηση: Πλήρες πρόγραμμα: ορίζουμε 8 χρώματα (7 του ουράνιου τόξου + μαύρο φόντο), χτίζουμε λίστα 64 pixel σε σχήμα τοξωτών γραμμών, διαβάζουμε humidity/temperature από τους αισθητήρες, και καλούμε sense.set_pixels(rainbow) ΜΟΝΟ όταν humidity>88 and temperature>20 (και τα δύο μαζί, λόγω AND).
Πρόσεξε:
- Δημιουργήστε ένα νέο πρόγραμμα που να εμφανίζει τη συμβολοσειρά «Hello world!».
- Δημιουργήστε ένα νέο πρόγραμμα με τον τίτλο «Καρδιά» το οποίο να εμφανίζει μια καρδιά.
- Δημιουργήστε ένα νέο πρόγραμμα με τον τίτλο «Καρδιά που αναβοσβήνει» για πάντα.
- Δημιουργήστε ένα νέο πρόγραμμα που να εμφανίζει αρχικά το 2023 και στη συνέχεια για πάντα το 2024.
- Δημιουργήστε ένα νέο πρόγραμμα που να εμφανίζει το όνομά σας στα ελληνικά.
Σκέψη / Μεθοδολογία: Και τα 5 ζητούμενα χρησιμοποιούν αποκλειστικά εντολές του μπλοκ «Βασικά» του Πίνακα 3.1 (§3.3.1): «κατά την εκκίνηση» (on start), «δείξε συμβολοσειρά», «δείξε εικονίδιο», «δείξε αριθμό» και «για πάντα» (forever) με «παύση (ms)». Δίνουμε για κάθε ζητούμενο την περιγραφή σε μπλοκ ΚΑΙ το ισοδύναμο MicroPython (το ίδιο πρόγραμμα μπορεί να γραφτεί και στις δύο μορφές μέσα στο περιβάλλον MakeCode/EduBlocks). Η συντακτική ορθότητα όλων των 5 python-ισοδύναμων ελέγχθηκε εκτελώντας τα πραγματικά σε δοκιμαστικό περιβάλλον (stub του module microbit).
Λύση:
1. Hello world!: Μπλοκ: [κατά την εκκίνηση] → [δείξε συμβολοσειρά "Hello world!"]. MicroPython: from microbit import *
display.scroll("Hello world!")
2. Καρδιά: Μπλοκ: [κατά την εκκίνηση] → [δείξε εικονίδιο ♥ (Heart)]. MicroPython: from microbit import *
display.show(Image.HEART)
3. Καρδιά που αναβοσβήνει για πάντα: Μπλοκ: [για πάντα] → [δείξε εικονίδιο ♥] → [παύση 500ms] → [καθάρισε οθόνη] → [παύση 500ms]. MicroPython: from microbit import *
while True:
display.show(Image.HEART)
sleep(500)
display.clear()
sleep(500)
4. 2023 → για πάντα 2024: Μπλοκ: [κατά την εκκίνηση] → [δείξε αριθμό 2023] ακολουθούμενο από [για πάντα] → [δείξε αριθμό 2024]. MicroPython: from microbit import *
display.scroll(2023)
while True:
display.scroll(2024)
5. Όνομα στα ελληνικά: Μπλοκ: [κατά την εκκίνηση] → [δείξε συμβολοσειρά "ΓΙΩΡΓΟΣ"] (ενδεικτικό όνομα — κάθε μαθητής βάζει το δικό του). MicroPython: from microbit import *
display.scroll("ΓΙΩΡΓΟΣ") # αντικαθίσταται με το πραγματικό όνομα του μαθητή.
Τελική απάντηση: 5 ανεξάρτητα προγράμματα με μπλοκ Βασικά: (1) δείξε συμβολοσειρά «Hello world!»· (2) δείξε εικονίδιο καρδιάς· (3) forever: δείξε καρδιά → παύση → καθάρισε → παύση (αναβόσβημα)· (4) δείξε αριθμό 2023 μία φορά και μετά forever δείξε 2024· (5) δείξε συμβολοσειρά με το όνομα του μαθητή στα ελληνικά.
Πρόσεξε:
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Καρδιά - Πλήκτρο A» που να εμφανίζει μια καρδιά όταν πιέζεται το πλήκτρο A.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Σύμβολα - Πλήκτρα A, B» που να εμφανίζει το σύμβολο «ν» όταν πιέζεται το πλήκτρο A και το σύμβολο «x» όταν πιέζεται το πλήκτρο B.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Τελεία που κινείται - Πλήκτρα A, B» το οποίο να δείχνει μια τελεία στο κέντρο της οθόνης LED να κινείται προς τα αριστερά, όταν πατάτε το πλήκτρο A και να κινείται προς τα δεξιά όταν πατάτε το πλήκτρο B.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Τελεία που κινείται - Πλήκτρα A, B, AB, logo» το οποίο, να δείχνει μια τελεία στο κέντρο της οθόνης LED να κινείται προς τα αριστερά όταν πατάτε το πλήκτρο A, να κινείται προς τα δεξιά όταν πατάτε το πλήκτρο B, να κινείται προς τα κάτω όταν πατάτε τα πλήκτρα A+B και να κινείται προς τα πάνω όταν πατάτε το logo του micro:bit.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Άνθρωπος που κουνάει τα χέρια - Πλήκτρα A, B» το οποίο να δείχνει έναν άνθρωπο να ανεβάζει και να κατεβάζει τα χέρια συνέχεια και όταν πατάτε το πλήκτρο A να σταματάει ο άνθρωπος να ανεβοκατεβάζει τα χέρια. Όταν πατάτε το πλήκτρο B να εμφανίζει τη συμβολοσειρά «ΟΚ» και μετά από 2 δευτερόλεπτα να ανεβοκατεβάζει πάλι τα χέρια του.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Άνθρωπος που κινείται - Πλήκτρα A, B» το οποίο να δείχνει τον άνθρωπο από τα διαθέσιμα εικονίδια της εντολής «εμφάνιση εικονιδίου» να κινείται προς τα αριστερά όταν πατάτε το πλήκτρο A και να κινείται προς τα δεξιά όταν πατάτε το πλήκτρο B.
- Δημιουργήστε ένα νέο πρόγραμμα με το όνομα «Άνθρωπος που κινείται παντού - Πλήκτρα A, B, AB, logo» το οποίο να δείχνει τον άνθρωπο από τα διαθέσιμα εικονίδια της εντολής «εμφάνιση εικονιδίου» να κινείται προς τα αριστερά όταν πατάτε το πλήκτρο A, να κινείται προς τα δεξιά όταν πατάτε το πλήκτρο B, να κινείται προς τα πάνω όταν πατάτε το logo, ενώ όταν πατάτε το A+B να κινείται προς τα κάτω.
Σκέψη / Μεθοδολογία: Όλα τα ζητούμενα βασίζονται στις εντολές εισόδου του Πίνακα 3.2 (§3.3.2): «όταν πατηθεί το πλήκτρο Α/Β/Α+Β», «όταν κουνηθεί το logo» και στη διατήρηση μιας μεταβλητής θέσης (x,y) που ενημερώνεται μέσα σε forever και μετατρέπεται σε θέση της αναμμένης τελείας στην οθόνη 5x5. Η λογική επαληθεύτηκε εκτελώντας πραγματικά τα 7 ισοδύναμα python προγράμματα πάνω σε δοκιμαστικό (stub) module microbit, ώστε να ελεγχθεί η συντακτική ορθότητα και η ροή ελέγχου (if/forever) κάθε προγράμματος.
Λύση:
1. Καρδιά - Πλήκτρο A: forever: αν πατήθηκε το A → δείξε εικονίδιο καρδιά. MicroPython: while True:
if button_a.was_pressed():
display.show(Image.HEART)
2. Σύμβολα - Πλήκτρα A,B: forever: αν πατήθηκε A → δείξε «ν»· αν πατήθηκε B → δείξε «x». MicroPython: while True:
if button_a.was_pressed():
display.show('v')
if button_b.was_pressed():
display.show('x')
3. Τελεία - Α/Β (αριστερά/δεξιά): μεταβλητή x αρχικοποιημένη στο κέντρο (x=2, οθόνη 0-4)· forever: αν πατήθηκε A → x = x−1 (με κάτω όριο 0)· αν πατήθηκε B → x = x+1 (με άνω όριο 4)· εμφάνισε τελεία στη θέση (x, 2). MicroPython (λογική): x=2
while True:
if button_a.was_pressed(): x = max(0, x-1)
if button_b.was_pressed(): x = min(4, x+1)
display.clear(); display.set_pixel(x, 2, 9)
Τελεία - Α/Β/ΑΒ/logo (4 κατευθύνσεις): προσθέτουμε μεταβλητή y (αρχικά y=2)· A→x-1, B→x+1, A+B (και τα δύο πατημένα ταυτόχρονα)→y+1 (κάτω), κούνημα/άγγιγμα logo (pin_logo.is_touched())→y-1 (πάνω). Η λύση επεκτείνει τη Δρ.3 προσθέτοντας έλεγχο button_a.is_pressed() and button_b.is_pressed() για το «κάτω» και pin_logo.is_touched() για το «πάνω».
Άνθρωπος που ανεβοκατεβάζει χέρια: forever: αν δεν είναι «παγωμένος» → εναλλαγή ανάμεσα σε δύο εικονίδια «χέρια πάνω»/«χέρια κάτω» με μικρή παύση· αν πατήθηκε A → εναλλαγή flag «παγωμένος» (σταματάει η κίνηση)· αν πατήθηκε B → δείξε συμβολοσειρά «OK», περίμενε 2000ms, μετά ξαναξεκίνα την ανεβοκατέβασμα κίνηση (flag παγωμένος=False).
Άνθρωπος που κινείται - Α/Β: ίδια λογική μετακίνησης θέσης με τη Δρ.3, αλλά αντί για τελεία εμφανίζουμε διαδοχικά εικονίδια «άνθρωπος» (π.χ. Image.SKULL/άνθρωπος-εικονίδια της βιβλιοθήκης) μετατοπισμένα προς τα αριστερά/δεξιά ανάλογα με το πλήκτρο.
Άνθρωπος που κινείται παντού - Α/Β/ΑΒ/logo: συνδυασμός της Δρ.4 (4 κατευθύνσεις μέσω x,y) με τα εικονίδια ανθρώπου της Δρ.6 — A/B μετακινούν οριζόντια, logo μετακινεί πάνω, A+B μετακινεί κάτω.
Τελική απάντηση: 7 ανεξάρτητα προγράμματα εισόδου: (1)-(2) απλό «πάτημα→εμφάνιση» με button_a/button_b.was_pressed()· (3) τελεία με μεταβλητή θέσης x που αυξομειώνεται με A/B· (4) επέκταση σε 4 κατευθύνσεις (x,y) με A/B/A+B/logo· (5) εναλλαγή κίνησης/ακινησίας ανθρώπου με flag + μήνυμα «OK» με χρονική καθυστέρηση 2s· (6)-(7) ίδια λογική θέσης με (3)-(4) αλλά με εικονίδια ανθρώπου αντί για τελεία.
Πρόσεξε:
Παρατηρήστε το breadboard και συζητήστε στην ομάδα σας σχετικά με τις εσωτερικές συνδέσεις του.
Παρατηρήστε την πλακέτα Plus Starter Kit for Arduino και αναγνωρίστε τις ψηφιακές θύρες, τη γείωση, το reset button και την USB διεπαφή.
Συνδέστε την πλακέτα με το καλώδιο USB στην αντίστοιχη θύρα του ηλεκτρονικού υπολογιστή.
Σκέψη / Μεθοδολογία: Πρόκειται για δραστηριότητα παρατήρησης/συζήτησης σε ομάδα, βασισμένη στη δομή breadboard/πλακέτας που περιγράφει το ίδιο το §3.4.1. Δίνουμε τη σωστή, τεκμηριωμένη περιγραφή των εσωτερικών συνδέσεων ενός τυπικού breadboard και των βασικών στοιχείων μιας πλακέτας Arduino, ώστε η ομαδική συζήτηση να έχει σωστό σημείο αναφοράς.
Λύση:
Εσωτερικές συνδέσεις breadboard: το breadboard έχει δύο είδη λωρίδων οπών. (α) Οι δύο πλευρικές λωρίδες τροφοδοσίας (πάνω και κάτω, με σήμανση + και −) εκτείνονται ΟΡΙΖΟΝΤΙΑ σε όλο το μήκος της πλακέτας — όλες οι οπές μιας τέτοιας γραμμής είναι ηλεκτρικά συνδεδεμένες μεταξύ τους (χρησιμοποιούνται για τροφοδοσία/γείωση). (β) Η κεντρική περιοχή έχει ΚΑΤΑΚΟΡΥΦΕΣ στήλες των 5 οπών η καθεμία (π.χ. a-b-c-d-e), χωρισμένες σε δύο μισά από ένα κεντρικό αυλάκι (κενό)· οι 5 οπές της ΙΔΙΑΣ στήλης είναι ηλεκτρικά συνδεδεμένες μεταξύ τους, ενώ στήλες αριστερά/δεξιά του αυλακιού ΔΕΝ συνδέονται απευθείας — έτσι ένα εξάρτημα (π.χ. LED) τοποθετημένο σε μία στήλη «μοιράζεται» ηλεκτρική επαφή με οτιδήποτε άλλο μπει στην ίδια στήλη, χωρίς κόλληση.
Στοιχεία πλακέτας Arduino (Plus Starter Kit): οι ΨΗΦΙΑΚΕΣ ΘΥΡΕΣ (digital pins, συνήθως αριθμημένες 0-13, μερικές με σήμανση ~ που υποστηρίζουν PWM) χρησιμοποιούνται για είσοδο/έξοδο σημάτων ON/OFF (π.χ. άναμμα LED, ανάγνωση διακόπτη)· η ΓΕΙΩΣΗ (GND, συνήθως πολλαπλές θέσεις με την ένδειξη GND) είναι το σημείο αναφοράς τάσης 0V όπου συνδέεται πάντα ο ένας πόλος κάθε κυκλώματος· το RESET BUTTON είναι ένα μικρό κουμπί κοντά στη θύρα τροφοδοσίας/USB που επανεκκινεί τον μικροελεγκτή (ξαναρχίζει το τρέχον πρόγραμμα από την αρχή, χωρίς να το σβήνει)· η USB ΔΙΕΠΑΦΗ (συνήθως θύρα USB-B ή USB-C ανάλογα με το μοντέλο) χρησιμοποιείται για τη σύνδεση με τον υπολογιστή, τόσο για τροφοδοσία ρεύματος όσο και για τη μεταφόρτωση (upload) του κώδικα.
Σύνδεση με USB: συνδέουμε το ένα άκρο του καλωδίου USB στη θύρα της πλακέτας Arduino και το άλλο άκρο σε ελεύθερη θύρα USB του υπολογιστή. Μόλις συνδεθεί, ανάβει η ενδεικτική λυχνία τροφοδοσίας (power LED) της πλακέτας και το λειτουργικό σύστημα αναγνωρίζει τη νέα συσκευή (εγκατάσταση/αναγνώριση driver) — αυτό είναι το προαπαιτούμενο βήμα ώστε στη συνέχεια (§3.4.2) το Arduino IDE να μπορεί να «δει» τη σωστή θύρα (port) και να ανεβάσει κώδικα σε αυτήν.
Τελική απάντηση: Το breadboard έχει δύο πλευρικές οριζόντιες λωρίδες τροφοδοσίας (+/−, συνδεδεμένες σε όλο το μήκος) και κεντρικές κατακόρυφες στήλες των 5 συνδεδεμένων οπών η καθεμία, χωρισμένες σε δύο μισά από κεντρικό αυλάκι. Η πλακέτα Arduino έχει ψηφιακές θύρες (0-13, με ~ για PWM), θέσεις γείωσης (GND), κουμπί reset (επανεκκίνηση προγράμματος) και θύρα USB (τροφοδοσία + upload κώδικα). Η σύνδεση με καλώδιο USB ενεργοποιεί την πλακέτα και την κάνει ορατή στον υπολογιστή.
Πρόσεξε:
Υλοποιήστε το παραπάνω κύκλωμα στο breadboard της ομάδας σας, συνδέστε το με την πλακέτα Arduino και γράψτε τον αντίστοιχο κώδικα. Εκτελέστε το πρόγραμμα. Τι παρατηρείτε;
Σκέψη / Μεθοδολογία: Το «παραπάνω κύκλωμα» (Εικόνα 3.16) είναι ένα απλό κύκλωμα ενός LED με αντίσταση σε σειρά: η άνοδος του LED συνδέεται μέσω αντίστασης (συνήθως 220Ω) σε μια ψηφιακή θύρα εξόδου (π.χ. pin 2), και η κάθοδος συνδέεται στη γείωση (GND). Ο κώδικας (Εικόνα 3.15) χρησιμοποιεί pinMode() στο setup() για να ορίσει τη θύρα ως OUTPUT, και μέσα στο loop() εναλλάσσει την τιμή της θύρας ανάμεσα σε HIGH/LOW με ενδιάμεσες καθυστερήσεις delay(ms), όπως ήδη περιγράφει το κείμενο πριν τη Δραστηριότητα («ανάβει για ένα δευτερόλεπτο και σβήνει επίσης για ένα δευτερόλεπτο»).
Λύση:
Κύκλωμα: LED (μακρύ πόδι/άνοδος) → αντίσταση 220Ω → ψηφιακή θύρα 2 της Arduino· LED (κοντό πόδι/κάθοδος) → γραμμή γείωσης (−) του breadboard → GND της Arduino.
Κώδικας Arduino (sketch):
int ledPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Παρατήρηση κατά την εκτέλεση: το λαμπάκι ανάβει (HIGH) για 1 δευτερόλεπτο, σβήνει (LOW) για 1 δευτερόλεπτο, και επαναλαμβάνεται αυτό συνέχεια — επειδή όλος ο κώδικας βρίσκεται μέσα στη συνάρτηση loop(), η οποία εκτελείται διαρκώς σε βρόχο όσο η πλακέτα τροφοδοτείται.
Τελική απάντηση: Με pinMode(ledPin, OUTPUT) στο setup() και digitalWrite(ledPin, HIGH/LOW) με delay(1000) ενδιάμεσα στο loop(), το LED αναβοσβήνει διαρκώς με περίοδο 1 δευτερολέπτου αναμμένο/1 δευτερολέπτου σβηστό, επειδή η συνάρτηση loop() του Arduino εκτελείται συνεχώς σε βρόχο.
Πρόσεξε:
Να δημιουργήσετε ένα τρεχαντήρι με τέσσερα λαμπάκια, τα οποία θα ανάβουν από την μια πλευρά στην άλλη και μετά θα επιστρέφουν πίσω. Συγκεκριμένα, το αναμμένο φως θα πηγαίνει από τα αριστερά στα δεξιά και μετά από τα δεξιά στα αριστερά.
Σκέψη / Μεθοδολογία: Η §3.4.4 του βιβλίου δείχνει πώς κατασκευάζεται τρεχαντήρι με ΔΥΟ λαμπάκια (pins 2 και 3, το ένα ανάβει, μετά σβήνει και ανάβει το άλλο). Η Δραστηριότητα 8 ζητά επέκταση σε ΤΕΣΣΕΡΑ λαμπάκια (4 κυκλώματα LED+αντίσταση σε πρόσθετες θύρες, π.χ. 2,3,4,5) με ΕΝΑ αναμμένο λαμπάκι τη φορά που κινείται διαδοχικά από αριστερά προς δεξιά και μετά αντίστροφα (like ένα 'μπρος-πίσω' φως, όχι σαν το τρεχαντήρι-2-λαμπακιών που απλώς εναλλάσσεται). Χρησιμοποιούμε έναν πίνακα (array) με τους 4 ακροδέκτες και δύο βρόχους for: έναν για τη φορά αριστερά→δεξιά και έναν για δεξιά→αριστερά (χωρίς να ξανανάβουμε τα δύο άκρα δύο φορές συνεχόμενα). Η σωστή ακολουθία αναμμένων ακροδεκτών (2,3,4,5,4,3, επαναλαμβανόμενη) επαληθεύτηκε με πραγματική εκτέλεση προσομοίωσης της λογικής σε Python.
Λύση:
Κύκλωμα: 4 ανεξάρτητα κυκλώματα LED+αντίσταση 220Ω, με τις ανόδους συνδεδεμένες στις ψηφιακές θύρες 2, 3, 4 και 5 αντίστοιχα (κάθε LED σε δική του στήλη του breadboard) και όλες τις καθόδους στην κοινή γραμμή γείωσης.
Κώδικας Arduino (sketch):
int ledPins[] = {2, 3, 4, 5};
int numPins = 4;
int delayTime = 200;
void setup() {
for (int i = 0; i < numPins; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
// Αριστερά -> Δεξιά
for (int i = 0; i < numPins; i++) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
// Δεξιά -> Αριστερά (χωρίς επανάλαβη ανάμματος του ήδη αναμμένου άκρου)
for (int i = numPins - 2; i >= 0; i--) {
digitalWrite(ledPins[i], HIGH);
delay(delayTime);
digitalWrite(ledPins[i], LOW);
}
}
Επαλήθευση ακολουθίας: προσομοιώνοντας τη λογική σε Python (πίνακας pins=[2,3,4,5], πρώτος βρόχος i=0..3, δεύτερος βρόχος i=numPins-2..0) προκύπτει η ακολουθία αναμμένων ακροδεκτών [2,3,4,5,4,3], η οποία στη συνέχεια επαναλαμβάνεται διαρκώς (…2,3,4,5,4,3,2,3,4,5,4,3,…) — ΑΚΡΙΒΩΣ το ζητούμενο «πηγαίνει από τα αριστερά στα δεξιά και μετά από τα δεξιά στα αριστερά», με ένα μόνο λαμπάκι αναμμένο κάθε στιγμή.
Τελική απάντηση: Πρόγραμμα με πίνακα 4 ακροδεκτών {2,3,4,5}: πρώτος βρόχος for ανάβει/σβήνει διαδοχικά τα LED από αριστερά προς δεξιά (2→3→4→5), δεύτερος βρόχος for τα ανάβει/σβήνει από δεξιά προς αριστερά (4→3→2, χωρίς να ξανανάψει το 5), και το loop() επαναλαμβάνει διαρκώς τον κύκλο — παράγοντας το ζητούμενο εφέ 'τρεχαντηριού' με ένα αναμμένο λαμπάκι που κινείται μπρος-πίσω.
Πρόσεξε: