Κάνε μια μικροσκοπική πλακέτα κονσόλα παιχνιδιών, μετεωρολογικό σταθμό, πιάνο, πυξίδα και πολλά ακόμα, με την CircuitPython.
Δεν έχεις γράψει ποτέ κώδικα; Κανένα πρόβλημα. Ξέρεις ήδη λίγη Python; Πήγαινε κατευθείαν στις αποστολές. Κάθε αποστολή που τελειώνεις σου δίνει XP (κοίτα τη μπάρα πάνω πάνω!).
Ξεκίνα την περιπέτεια ▶🔍Γνώρισε το CLUE
Το Adafruit CLUE είναι ένας μικρός υπολογιστής (ένας μικροελεγκτής) περίπου στο μέγεθος μιας πιστωτικής κάρτας. Είναι γεμάτο gadgets. Δες τι έχει πάνω του:
Μέχρι το τέλος της περιπέτειας θα έχεις χρησιμοποιήσει όλα αυτά. Θα χρειαστείς επίσης:
- Ένα καλώδιο USB που μεταφέρει δεδομένα (κάποια καλώδια κάνουν μόνο φόρτιση, και αυτά δεν θα δουλέψουν!)
- Έναν υπολογιστή με Chrome ή Edge (και Chromebook κάνει μια χαρά)
🐍Python σε 20 λεπτά
Η CircuitPython είναι Python φτιαγμένη για μικροσκοπικές πλακέτες. Αν ξέρεις ήδη Python, ρίξε μια γρήγορη ματιά και προχώρα. Αν όχι, αυτές είναι οι μόνες ιδέες που χρειάζεσαι για όλη την περιπέτεια. Μετά την Εγκατάσταση, δοκίμασέ τες στο REPL (δες την «Επίλυση προβλημάτων») ή μέσα στο code.py.
🧱 Έρχεσαι από Scratch ή MakeCode;
Ξέρεις ήδη προγραμματισμό! Η Python απλώς χρησιμοποιεί λέξεις που πληκτρολογείς αντί για τουβλάκια. Να η «μετάφραση»:
| Τουβλάκι | Python |
|---|---|
| για πάντα (forever) | while True: |
| επανάλαβε 10 | for i in range(10): |
| εάν <> τότε / αλλιώς | if ...: |
| όρισε score σε 0 | score = 0 |
| άλλαξε score κατά 1 | score += 1 |
| πες Γεια / show string | print("Hello") |
| περίμενε 1 δευτ. / pause 1000 ms | time.sleep(1) |
| φτιάξε ένα τουβλάκι / function | def my_block(): |
| λίστα / πίνακας (array) | things = [1, 2, 3] |
| πρόσθεσε κάτι στη λίστα | things.append(4) |
| στοιχείο 1 της λίστας | things[0] (η Python ξεκινάει από 0!) |
| μήκος λίστας | len(things) |
| διάλεξε τυχαίο 1 έως 6 | random.randint(1, 6) |
1. Σχόλια: σημειώσεις για ανθρώπους
Ό,τι γράψεις μετά το # ο υπολογιστής το αγνοεί.
# Αυτό είναι σχόλιο. Το CLUE το προσπερνάει.
2. print(): στείλε ένα μήνυμα
Δείχνει ένα μήνυμα στην κονσόλα Serial (και στην οθόνη του CLUE, μέχρι το πρόγραμμά σου να ζωγραφίσει κάτι άλλο εκεί).
print("Γεια!")
print(2 + 3) # τυπώνει 5
3. Μεταβλητές: κουτιά με ετικέτα
score = 0 # ένας αριθμός
name = "Robo" # το κείμενο (ένα "string") μπαίνει σε εισαγωγικά
score = score + 10 # τώρα το score είναι 10
score += 5 # συντόμευση για score = score + 5, τώρα 15
print(name, "έχει", score, "πόντους")
4. Μαθηματικά: η Python είναι αριθμομηχανή
print(7 + 2) # 9 πρόσθεση
print(7 - 2) # 5 αφαίρεση
print(7 * 2) # 14 πολλαπλασιασμός (αστεράκι, όχι x)
print(7 / 2) # 3.5 διαίρεση
print(7 // 2) # 3 διαίρεση χωρίς το υπόλοιπο
print(7 % 2) # 1 ΜΟΝΟ το υπόλοιπο
print(2 ** 3) # 8 δύναμη: 2 x 2 x 2
print(round(3.7)) # 4
Το % είναι πολύ χρήσιμο: n % 2 == 0 σημαίνει «το n είναι ζυγός», και το angle % 360 κρατάει μια γωνία από 0 έως 359.
5. True / False και if
Η εσοχή μετράει! Οι γραμμές που είναι πιο μέσα κατά 4 κενά ανήκουν στο if.
temperature = 30
if temperature > 25:
print("Καύσωνας!")
elif temperature > 15:
print("Ωραία.")
else:
print("Μπρρρ!")
Συγκρίσεις: > μεγαλύτερο, < μικρότερο, >= μεγαλύτερο ή ίσο, == ίσο (δύο ίσον!), != διαφορετικό. Συνδύασε ελέγχους με and (και), or (ή), not (όχι), για παράδειγμα if a > 0 and b > 0:.
6. Βρόχοι: κάν' το ξανά
for i in range(3): # τρέχει 3 φορές: i = 0, 1, 2
print("Ζήτω!", i)
for i in range(10, 0, -2): # ξεκίνα από 10, σταμάτα πριν το 0, βήμα -2
print(i) # 10 8 6 4 2
count = 0
while count < 3: # επανάλαβε ΟΣΟ αυτό είναι True
count += 1
print("μέτρησα ως το", count)
while True: # τρέχει ΓΙΑ ΠΑΝΤΑ...
print("Δεν σταματάω ποτέ!")
break # ...εκτός αν βγεις με break
Σχεδόν κάθε πρόγραμμα για το CLUE έχει έναν βρόχο while True:, ώστε να ελέγχει συνέχεια τα κουμπιά και τους αισθητήρες.
7. Λίστες (πίνακες / arrays!): πολλά πράγματα σε ένα κουτί
Στο Scratch λέγονται λίστες, στο MakeCode πίνακες (arrays) και στην Python λίστες (lists). Μια λίστα κρατάει πράγματα με σειρά, μέσα σε αγκύλες [ ].
pets = ["cat", "dog", "hamster"]
print(pets[0]) # cat (η μέτρηση ξεκινάει από το 0!)
print(pets[2]) # hamster
print(pets[-1]) # hamster (-1 = το ΤΕΛΕΥΤΑΙΟ)
print(len(pets)) # 3 (πόσα στοιχεία έχει)
pets[1] = "parrot" # άλλαξε ένα στοιχείο
pets.append("fish") # πρόσθεσε στο τέλος
pets.insert(0, "frog") # πρόσθεσε στη θέση 0
pets.remove("cat") # βγάλε ένα στοιχείο με βάση την τιμή του
last = pets.pop() # βγάλε το τελευταίο (και κράτα το)
print(pets, last) # ['frog', 'parrot', 'hamster'] fish
if "frog" in pets: # υπάρχει στη λίστα;
print("Κουάξ!")
Βρόχος πάνω σε μια λίστα
scores = [12, 45, 7, 30]
for s in scores: # το s γίνεται κάθε στοιχείο με τη σειρά
print("σκορ:", s)
for i in range(len(scores)): # όταν χρειάζεσαι και τη θέση
print("παίκτης", i, "έφερε", scores[i])
print(sum(scores), max(scores), min(scores)) # 94 45 7
print(sorted(scores)) # [7, 12, 30, 45]
print(scores[1:3]) # [45, 7] ένα «κομμάτι» (slice): στοιχεία 1 και 2
Φτιάχνοντας μια λίστα λίγο-λίγο
evens = [] # ξεκίνα με άδεια λίστα
for n in range(1, 11):
if n % 2 == 0:
evens.append(n)
print(evens) # [2, 4, 6, 8, 10]
Λίστες μέσα σε λίστες: ένα πλέγμα
Τέλειο για ταμπλό παιχνιδιών και λαβυρίνθους. grid[γραμμή][στήλη]:
grid = [
[0, 1, 0],
[1, 1, 1],
[0, 1, 0],
]
print(grid[1][2]) # γραμμή 1, στήλη 2 -> 1
grid[0][0] = 9
for row in grid:
print(row)
🧩 Δοκίμασέ το: γρίφοι με λίστες (οι απαντήσεις είναι μέσα)
1. nums = [5, 10, 15, 20]. Τι είναι το nums[-2]; 2. Τι δίνει το len([]); 3. Μετά από a = [1, 2] και a.append(a[0] + a[1]), τι είναι το a;
Απαντήσεις: 1. 15 2. 0 (άδεια λίστα) 3. [1, 2, 3]
8. Tuples (πλειάδες): λίστες που δεν αλλάζουν ποτέ
Παρενθέσεις ( ) αντί για αγκύλες. Μπορείς να τις διαβάσεις αλλά όχι να τις αλλάξεις. Το CLUE τις χρησιμοποιεί συνέχεια: τα χρώματα και οι μετρήσεις των αισθητήρων είναι tuples.
purple = (255, 0, 255) # πόσο κόκκινο, πράσινο, μπλε
print(purple[0]) # 255
x, y, z = (1, 2, 3) # "ξεπακετάρουμε" ένα tuple σε 3 μεταβλητές
# purple[0] = 100 # ΛΑΘΟΣ! τα tuples δεν αλλάζουν
9. Strings: παιχνίδι με κείμενο
word = "clue"
print(word.upper()) # CLUE
print(len(word)) # 4 γράμματα
print(word[0]) # c (τα strings δουλεύουν σαν λίστες από γράμματα!)
print("Hi " + word + "!") # Hi clue! (το + κολλάει κείμενα μαζί)
print("ha" * 3) # hahaha
age = 12
print("Είμαι " + str(age)) # το str() κάνει έναν αριθμό κείμενο
print(int("7") + 1) # το int() κάνει κείμενο αριθμό: 8
10. import: δανείσου υπερδυνάμεις
import time # εργαλεία ρολογιού
time.sleep(0.5) # περίμενε μισό δευτερόλεπτο
import random # εργαλεία για ζάρια και τύχη
print(random.randint(1, 6)) # τυχαίος ακέραιος από 1 έως 6
print(random.choice(["rock", "paper", "scissors"])) # διάλεξε από μια λίστα
from adafruit_clue import clue # δανειζόμαστε ΟΛΕΣ τις δυνάμεις του CLUE
11. Συναρτήσεις: οι δικές σου εντολές
def cheer(name):
print("Πάμε", name, "πάμε!")
cheer("Robo") # Πάμε Robo πάμε!
def double(n):
return n * 2 # το return δίνει πίσω μια απάντηση
print(double(4)) # 8
def average(numbers): # συναρτήσεις + λίστες = δύναμη!
return sum(numbers) / len(numbers)
print(average([10, 20, 30])) # 20.0
Το print δείχνει κάτι· το return δίνει την απάντηση πίσω στον κώδικα που κάλεσε τη συνάρτηση.
12. f-strings: ανακάτεψε κείμενο και αριθμούς
temp = 21.5678
print(f"Θερμοκρασία: {temp:.1f} C") # Θερμοκρασία: 21.6 C (.1f = 1 δεκαδικό ψηφίο)
13. Μπόνους: λεξικά (dictionaries), λίστες με ταμπελάκια
Μια λίστα βρίσκει πράγματα με βάση τη θέση. Ένα λεξικό τα βρίσκει με βάση ένα όνομα (ένα «κλειδί»), με άγκιστρα { }.
colors = {"red": (255, 0, 0), "green": (0, 255, 0), "blue": (0, 0, 255)}
print(colors["green"]) # (0, 255, 0)
colors["pink"] = (255, 0, 128) # πρόσθεσε νέο κλειδί
for name in colors:
print(name, colors[name]) # προσοχή: στο CLUE η σειρά μπορεί να βγει ανακατεμένη!
Σε αντίθεση με τη λίστα, ένα λεξικό στο CLUE δεν υπόσχεται να κρατήσει τη σειρά. Όταν η σειρά μετράει, χρησιμοποίησε λίστα.
🔬 Μίνι project: μια λίστα με αληθινές μετρήσεις
Μόλις στήσεις το CLUE σου (στο επόμενο επίπεδο), δοκίμασε αυτό. Μαζεύει 10 μετρήσεις θερμοκρασίας σε μια λίστα και μετά κάνει μαθηματικά με αυτές.
import time
from adafruit_clue import clue
readings = []
for i in range(10):
readings.append(clue.temperature)
time.sleep(0.2)
print("όλες:", [round(t, 1) for t in readings])
print(f"χαμηλότερη {min(readings):.1f} υψηλότερη {max(readings):.1f}")
print(f"μέσος όρος {sum(readings) / len(readings):.2f}")
Η γραμμή με το [round(t, 1) for t in readings] είναι μια έξυπνη συντόμευση που φτιάχνει μια νέα λίστα με κάθε μέτρηση στρογγυλεμένη. Δεν χρειάζεται να γράφεις τέτοιες ακόμα!
Άλλαξέ το ώστε να μαζεύει μετρήσεις
clue.sound_level και να τυπώνει πόσες ήταν πάνω από 20 (βοήθεια: ένας μετρητής και ένα if μέσα σε έναν βρόχο for).Η Python είναι αυστηρή: τα κεφαλαία μετράνε (
True και όχι true), η άνω και κάτω τελεία (:) μπαίνει στο τέλος των γραμμών με if/for/while/def, και η εσοχή είναι 4 κενά.🛠️Εγκατάσταση: ζωντάνεψε το CLUE σου
Αυτό το κάνουμε μόνο μία φορά. Έχει 3 μέρη: (A) εγκατάσταση της CircuitPython, (B) προσθήκη των βιβλιοθηκών, (Γ) σύνδεση με τον editor κώδικα.
Μέρος A: Εγκατάσταση της CircuitPython
- Πήγαινε στο circuitpython.org/board/clue_nrf52840_express και κατέβασε το πιο πρόσφατο σταθερό αρχείο .UF2 (όχι κάποιο "Absolute Newest" ή beta).
- Σύνδεσε το CLUE στον υπολογιστή με το καλώδιο USB δεδομένων.
- Κάνε διπλό κλικ στο μικρό κουμπί Reset (γρήγορα: κλικ-κλικ!). Το NeoPixel γίνεται πράσινο και στον υπολογιστή σου εμφανίζεται ένας νέος δίσκος με όνομα CLUEBOOT (ο δίσκος «εκκίνησης» της πλακέτας).
- Σύρε το αρχείο .UF2 πάνω στο CLUEBOOT. Το φωτάκι αναβοσβήνει, το CLUEBOOT εξαφανίζεται και εμφανίζεται ένας νέος δίσκος με όνομα CIRCUITPY (εδώ θα ζει ο κώδικάς σου). 🎉
① Δοκίμασε άλλο καλώδιο USB, γιατί μάλλον έχεις καλώδιο μόνο για φόρτιση. ② Κάνε το διπλό κλικ πιο γρήγορα (ή πιο αργά!). ③ Δοκίμασε άλλη θύρα USB. Αν βλέπεις το CIRCUITPY αντί για αυτό, η CircuitPython είναι ήδη εγκατεστημένη, οπότε πήγαινε στο Μέρος B.
Κοίτα μέσα στο CIRCUITPY. Θα δεις το code.py (το πρόγραμμά σου), έναν φάκελο lib (για τις βιβλιοθήκες) και το boot_out.txt. Άνοιξε το boot_out.txt: η πρώτη γραμμή σου λέει την έκδοση της CircuitPython, για παράδειγμα Adafruit CircuitPython 10.0.0. Θυμήσου αυτόν τον πρώτο αριθμό!
Μέρος B: Πρόσθεσε τις βιβλιοθήκες
Μια βιβλιοθήκη (library) είναι κώδικας που έγραψε κάποιος άλλος και μπορείς να τον δανειστείς. Η βιβλιοθήκη adafruit_clue μάς δίνει εύκολες εντολές όπως το clue.temperature. Χρειάζεται όμως και μερικές βοηθητικές βιβλιοθήκες.
- Πήγαινε στο circuitpython.org/libraries και κατέβασε το Bundle με τον ίδιο πρώτο αριθμό. Για παράδειγμα, αν το
boot_out.txtγράφειCircuitPython 10.3.1, διάλεξε το bundle για 10.x. - Αποσυμπίεσέ το. Άνοιξε τον φάκελο
libμέσα στο bundle. Είναι τεράστιος, αλλά χρειαζόμαστε μόνο λίγα πράγματα. - Αντέγραψε αυτά στον φάκελο
libτου CIRCUITPY (κάποια είναι φάκελοι, κάποια είναι αρχεία που τελειώνουν σε.mpy):
| Αντέγραψε αυτό | Τι κάνει… |
|---|---|
adafruit_clue.mpy | Τις εύκολες εντολές του CLUE ⭐ |
adafruit_apds9960 📁 | Αισθητήρας εγγύτητας, χειρονομιών & χρώματος |
adafruit_bmp280.mpy | Ατμοσφαιρική πίεση & υψόμετρο |
adafruit_sht31d.mpy | Υγρασία (και θερμοκρασία) |
adafruit_lsm6ds 📁 | Επιταχυνσιόμετρο & γυροσκόπιο |
adafruit_lis3mdl.mpy | Μαγνητόμετρο |
adafruit_display_text 📁 | Λέξεις στην οθόνη |
neopixel.mpy | Το έγχρωμο LED |
adafruit_bus_device 📁 | Βοηθός που «μιλάει» με τους αισθητήρες |
adafruit_register 📁 | Άλλος ένας βοηθός για αισθητήρες |
ImportError: no module named '…';Αυτό σημαίνει ότι λείπει μια βιβλιοθήκη. Βρες το όνομα που γράφει μέσα στον φάκελο
lib του bundle και αντέγραψέ το κι αυτό.🧑🏫 Για εκπαιδευτικούς: ο πιο γρήγορος τρόπος με το circup
Αν ο υπολογιστής έχει Python 3, το circup εγκαθιστά μια βιβλιοθήκη μαζί με όλους τους βοηθούς της αυτόματα, στη σωστή έκδοση για την πλακέτα. Με το CLUE συνδεδεμένο:
pip install circup
circup install adafruit_clue
Πολύ βολικό όταν στήνεις πλακέτες για όλη την τάξη.
Μέρος Γ: Σύνδεση με τον editor κώδικα
- Άνοιξε το code.circuitpython.org σε Chrome ή Edge.
- Εμφανίζεται ένα κουτί που ρωτάει πώς θα συνδεθείς. Πάτα USB.
- Βήμα 1: πάτα Connect to Device (Σύνδεση με συσκευή). Ο Chrome δείχνει μια λίστα: διάλεξε CLUE nRF52840 Express - CircuitPython CDC control (COM…) και πάτα Connect.
- Βήμα 2: πάτα Select New Folder (Επιλογή φακέλου), διάλεξε τον δίσκο CIRCUITPY και πάτα Select Folder. Ο Chrome ρωτάει "Allow this site to edit files?" (Να επιτρέπεται η επεξεργασία αρχείων;): πάτα Allow και μετά OK.
- Ένα κουτί Device Info δείχνει την πλακέτα και την έκδοσή της. Αν γράφει "Update available … alpha", αγνόησέ το (alpha = δοκιμαστική, ημιτελής έκδοση) και πάτα Close.
- Ο editor ξεκινάει με ένα άδειο [New Document]. Πάτα Open (Άνοιγμα) και κάνε διπλό κλικ στο
code.py. Αυτό είναι το αρχείο που τρέχει αυτόματα το CLUE. - Πάτα Serial (κάτω αριστερά) για να ανοίξει η κονσόλα στα δεξιά. Εκεί εμφανίζονται τα μηνύματα του
print(). Έχει κουμπιά Halt (σταματάει το πρόγραμμα), Restart (επανεκκίνηση), Clear (καθάρισμα) και Plotter (ζωντανά γραφήματα!).
Άλλαξε το
code.py → πάτα Save + Run (Αποθήκευση + Εκτέλεση) → το CLUE κάνει επανεκκίνηση και τρέχει τον κώδικά σου αμέσως. Αυτό ήταν!Όταν ένα πρόγραμμα τελειώνει, η κονσόλα γράφει "Code done running." Αυτό είναι φυσιολογικό, όχι σφάλμα.
Το πρώτο σου πρόγραμμα
Σβήσε ό,τι υπάρχει στο code.py, γράψε αυτό και πάτα Save + Run:
from adafruit_clue import clue
print("Γεια από το CLUE μου!")
print("Εδώ μέσα έχει", round(clue.temperature, 1), "βαθμούς Κελσίου (λίγο παραπάνω, δες την Αποστολή 11)")
Κοίτα στην κονσόλα Serial. Τύπωσε τη θερμοκρασία; Μόλις διάβασες έναν αισθητήρα! 🎉
🐞 Επίλυση προβλημάτων & το REPL
- Κόκκινο κείμενο σφάλματος; Διάβασε την τελευταία γραμμή και κοίτα τον αριθμό γραμμής. Τα περισσότερα bugs είναι ορθογραφικά λάθη, μια άνω και κάτω τελεία
:που λείπει ή λάθος εσοχή. - Τα σφάλματα φαίνονται και στην οθόνη του CLUE, πολύ βολικό!
- REPL = μια ζωντανή «παιδική χαρά» της Python, όπου γράφεις εντολές και τις τρέχει αμέσως. Πάτα το κουμπί Halt (ή κάνε κλικ στην κονσόλα Serial και πάτα Ctrl + C), μετά οποιοδήποτε πλήκτρο. Θα δεις το σύμβολο
>>>. Γράψε2 + 2και πάτα Enter! Δοκίμασε εδώ τα μαθήματα Python από πάνω. Πάτα Ctrl + D για να ξανατρέξει τοcode.py. - Ο editor δεν βλέπει την πλακέτα; Αποσύνδεσέ την, ξανασύνδεσέ την, κάνε ανανέωση στη σελίδα και ξαναπάτα Connect.
- Ο editor υποστηρίζει και Bluetooth για το CLUE, αλλά το USB είναι ο πιο εύκολος τρόπος για να ξεκινήσεις.
📺Γεια σου, Οθόνη!
+100 XPΚάθε αποστολή ξεκλειδώνει μια νέα δύναμη του CLUE. Γράψε τον κώδικα (το να τον πληκτρολογείς μαθαίνεται καλύτερα από το copy-paste!), τρέξ' τον και μετά δοκίμασε την πρόκληση.
Ας βάλουμε λέξεις στην οθόνη. Το simple_text_display σού δίνει έναν τίτλο και γραμμές με αριθμούς 0, 1, 2…
from adafruit_clue import clue
screen = clue.simple_text_display(title="CLUE QUEST", text_scale=2,
colors=((255, 0, 255), (0, 255, 255), (255, 255, 0)))
screen[0].text = "Hello, world!"
screen[1].text = "My name is"
screen[2].text = "Sam"
screen.show() # δεν εμφανίζεται τίποτα μέχρι να καλέσεις το show()!
while True: # κράτα το πρόγραμμα να τρέχει για να μένει το κείμενο
pass # "pass" σημαίνει "μην κάνεις τίποτα"
Η ενσωματωμένη γραμματοσειρά του CLUE δεν έχει ελληνικά γράμματα, οπότε αν γράψεις «Γεια» θα δεις κουτάκια ή τίποτα. Για ό,τι εμφανίζεται στην οθόνη του CLUE χρησιμοποίησε λατινικούς χαρακτήρες: τα Greeklish είναι μια χαρά (π.χ.
"Geia sou!"). Στην κονσόλα Serial με το print() μπορείς να γράφεις κανονικά ελληνικά.Τα χρώματα γράφονται ως (κόκκινο, πράσινο, μπλε), το καθένα από 0 έως 255. (255, 0, 255) = όλο το κόκκινο + όλο το μπλε = ματζέντα. Ο τίτλος μένει πάντα λευκός, γιατί το colors= αλλάζει μόνο τις γραμμές. Για να τον αλλάξεις, βάλε title_color=(255, 255, 0).
while True;Όταν ένα πρόγραμμα τελειώνει, το CLUE γράφει "Code done running" και το κείμενό σου εξαφανίζεται. Ο ατελείωτος βρόχος το κρατάει στην οθόνη.
⭐ Μπόνους: ΤΕΡΑΣΤΙΟ κείμενο όπου θες στην οθόνη
Για πλήρη έλεγχο, χρησιμοποίησε το displayio (το σύστημα ζωγραφικής της οθόνης) και ένα Label:
import displayio
import terminalio
from adafruit_display_text import label
from adafruit_clue import clue
group = displayio.Group() # ένα "στρώμα" για να ζωγραφίσουμε
# φόντο: ένα bitmap 240x240 γεμάτο με ένα χρώμα
bg = displayio.Bitmap(240, 240, 1)
palette = displayio.Palette(1)
palette[0] = 0x220044 # σκούρο μωβ (χρώμα σε hex)
group.append(displayio.TileGrid(bg, pixel_shader=palette))
big = label.Label(terminalio.FONT, text="WOW", color=0x22D3EE, scale=6, x=65, y=120)
group.append(big)
clue.display.root_group = group # δείξε το στρώμα μας
while True:
pass
Τα x και y είναι θέσεις σε pixel: το (0, 0) είναι η πάνω αριστερή γωνία και το (239, 239) η κάτω δεξιά.
Φτιάξε ένα καρτελάκι-ταυτότητα με το όνομά σου, το αγαπημένο σου φαγητό και το αγαπημένο σου παιχνίδι, το καθένα σε διαφορετικό χρώμα (σε Greeklish!).
Το Εργαστήριο Οθόνης εξηγεί πώς δουλεύει στ' αλήθεια η οθόνη: pixel, σχήματα, κίνηση και χρώματα. Το Picture Maker μετατρέπει οποιαδήποτε φωτογραφία ή GIF σε κώδικα για το CLUE!
🌈Σόου με Φώτα
+100 XPΤο CLUE έχει τρία είδη φώτων: το NeoPixel (όποιο χρώμα θες), το κόκκινο LED (ανοιχτό/κλειστό) και δύο λευκά LED (ανοιχτά/κλειστά, πάρα πολύ φωτεινά).
import time
from adafruit_clue import clue
clue.pixel.brightness = 0.2 # 0.0 = σβηστό, 1.0 = ΤΥΦΛΩΝΕΙ
rainbow = [(255, 0, 0), (255, 128, 0), (255, 255, 0),
(0, 255, 0), (0, 0, 255), (128, 0, 255)]
while True:
for color in rainbow:
clue.pixel.fill(color) # βάλε χρώμα στο NeoPixel
clue.red_led = True # κόκκινο LED αναμμένο
time.sleep(0.3)
clue.red_led = False # κόκκινο LED σβηστό
time.sleep(0.1)
Και τα λευκά LED θέλουν μόνο μία γραμμή:
from adafruit_clue import clue
clue.white_leds = True # φακός ΑΝΑΜΜΕΝΟΣ (με False σβήνει)
while True:
pass
Μην κοιτάς κατευθείαν μέσα στα λευκά LED, είναι πολύ φωτεινά!
Φτιάξε σειρήνα περιπολικού: αναβόσβησε κόκκινο και μπλε στο NeoPixel, και άναβε τα λευκά LED κάθε φορά που γίνεται μπλε.
🅰️Πάτα τα Κουμπιά
+100 XPΤο clue.button_a είναι True όσο κρατάς πατημένο το A, αλλιώς είναι False. Το ίδιο και για το B.
from adafruit_clue import clue
while True:
if clue.button_a and clue.button_b:
clue.pixel.fill((0, 255, 0)) # και τα δύο = πράσινο
elif clue.button_a:
clue.pixel.fill((255, 0, 0)) # A = κόκκινο
elif clue.button_b:
clue.pixel.fill((0, 0, 255)) # B = μπλε
else:
clue.pixel.fill((0, 0, 0)) # τίποτα = σβηστό
Μετράμε πατήματα
Αν απλώς κάναμε count = count + 1 όσο είναι πατημένο το A, θα μετρούσε εκατοντάδες φορές σε κάθε πάτημα! Αντί γι' αυτό, θυμόμαστε αν το κουμπί ήταν ήδη πατημένο και μετράμε μόνο τη στιγμή που πατιέται.
from adafruit_clue import clue
screen = clue.simple_text_display(title="Clicker", text_scale=3)
count = 0
was_down = False
while True:
down = clue.button_a
if down and not was_down: # ΜΟΛΙΣ πατήθηκε
count = count + 1
was_down = down
if clue.button_b: # το B μηδενίζει
count = 0
screen[0].text = str(count) # το str() κάνει έναν αριθμό κείμενο
screen.show()
Κάνε το B να ανάβει και να σβήνει τον φακό με τα λευκά LED (βοήθεια: χρησιμοποίησε το ίδιο κόλπο «μόλις πατήθηκε» και το
clue.white_leds = not clue.white_leds).🎵Η Μπάντα Μπιπ Μπουπ
+100 XPΤο clue.play_tone(frequency, seconds) παίζει μια νότα (συχνότητα, δευτερόλεπτα). Μεγαλύτερη συχνότητα σημαίνει πιο ψιλή νότα. Το 262 είναι το μεσαίο Ντο.
import time
from adafruit_clue import clue
C, D, E, F, G, A = 262, 294, 330, 349, 392, 440 # Ντο, Ρε, Μι, Φα, Σολ, Λα
# Twinkle Twinkle Little Star: (νότα, διάρκεια)
song = [(C, 0.4), (C, 0.4), (G, 0.4), (G, 0.4), (A, 0.4), (A, 0.4), (G, 0.8),
(F, 0.4), (F, 0.4), (E, 0.4), (E, 0.4), (D, 0.4), (D, 0.4), (C, 0.8)]
for note, length in song: # ξεπακετάρουμε κάθε ζευγάρι (νότα, διάρκεια)
clue.play_tone(note, length)
time.sleep(0.05) # μικρό κενό ανάμεσα στις νότες
Υπάρχουν επίσης τα clue.start_tone(freq) και clue.stop_tone() για νότες που κρατάνε όσο θέλεις. Θα τα χρησιμοποιήσεις στην επόμενη αποστολή. Το play_tone περιμένει να τελειώσει η νότα πριν τρέξει η επόμενη γραμμή· το start_tone ξεκινάει τη νότα και προχωράει αμέσως.
Παίξε έναν χαρούμενο ήχο "level up" όταν πατιέται το A (νότες που ΑΝΕΒΑΙΝΟΥΝ) και έναν λυπημένο ήχο "game over" όταν πατιέται το B (νότες που ΚΑΤΕΒΑΙΝΟΥΝ).
🎹Πιάνο Αφής
+100 XPΤα χρυσά «πατάκια» με τα νούμερα 0, 1 και 2 στην κάτω άκρη είναι αισθητήρες αφής. Το σώμα σου έχει ένα μικροσκοπικό ηλεκτρικό φορτίο, και το CLUE μπορεί να το νιώσει!
from adafruit_clue import clue
clue.pixel.brightness = 0.2
while True:
if clue.touch_0:
clue.start_tone(262) # Ντο
clue.pixel.fill((255, 0, 0))
elif clue.touch_1:
clue.start_tone(330) # Μι
clue.pixel.fill((0, 255, 0))
elif clue.touch_2:
clue.start_tone(392) # Σολ
clue.pixel.fill((0, 0, 255))
else:
clue.stop_tone()
clue.pixel.fill((0, 0, 0))
Χέρια μακριά όσο ξεκινάει! Το CLUE μαθαίνει το «κανονικό» επίπεδο κάθε πατακιού όταν ξεκινάει το πρόγραμμα. Αν ένα πατάκι μοιάζει κολλημένο, ξανατρέξε το πρόγραμμα χωρίς να ακουμπάς τίποτα.
Σύνδεσε με ένα κροκοδειλάκι ένα πατάκι με μια μπανάνα, ένα μήλο ή αλουμινόχαρτο. Τώρα το φρούτο είναι πλήκτρο πιάνου! (Μόνο φρούτα και κροκοδειλάκια, τίποτα που να είναι στην πρίζα.)
Πρόσθεσε άλλες δύο νότες με τα κουμπιά A και B, για να έχεις πιάνο με 5 νότες.
🎱Κούνα & Γείρε
+150 XPΤο επιταχυνσιόμετρο μετράει σπρωξίματα και τραβήγματα, ακόμα και τη βαρύτητα! Το clue.acceleration δίνει 3 αριθμούς (x, y, z). Όταν η πλακέτα είναι ξαπλωμένη με την οθόνη προς τα πάνω, το z είναι περίπου -9,5 έως -9,8 (λίγο διαφορετικό σε κάθε πλακέτα): αυτή είναι η βαρύτητα που τραβάει προς τα κάτω. Γύρνα την ανάποδα και γίνεται +9,8!
import time
from adafruit_clue import clue
while True:
x, y, z = clue.acceleration
print(f"x={x:.1f} y={y:.1f} z={z:.1f}")
time.sleep(0.2)
Γείρε την πλακέτα και δες τους αριθμούς να αλλάζουν. Γείρε τη δεξιά-αριστερά: αυτό είναι το x. Γείρε τη μπρος-πίσω: αυτό είναι το y.
Αν τυπώσεις αριθμούς μέσα σε παρενθέσεις, όπως
print((x, y, z)), ο Plotter (σχεδιαστής γραφημάτων) του editor μπορεί να τους ζωγραφίσει σαν ζωντανές γραμμές.Μαγική Μπάλα 8
Το clue.shake() είναι True όταν κουνάς την πλακέτα. Η προεπιλογή για το shake_threshold είναι 30 (δυνατό κούνημα)· εμείς βάζουμε 20 για να πιάνει και ένα απαλό κούνημα. Μεγάλωσέ το αν ενεργοποιείται πολύ εύκολα, μίκρυνέ το αν πρέπει να την κουνάς πάρα πολύ δυνατά, αλλά όχι κάτω από 10.
import random
from adafruit_clue import clue
answers = ["Yes!", "No way", "Maybe...", "Ask again", "Definitely", "Nope"]
screen = clue.simple_text_display(title="Magic 8-Ball", text_scale=3)
screen[1].text = "Shake me!"
screen.show()
while True:
if clue.shake(shake_threshold=20):
screen[1].text = random.choice(answers)
screen.show()
clue.play_tone(880, 0.1)
Φτιάξε ένα «αλφάδι»: κάνε το NeoPixel πράσινο όταν η πλακέτα είναι επίπεδη (x και y και τα δύο κοντά στο 0). Πρώτα τύπωσε τα x και y με την πλακέτα σε επίπεδο τραπέζι: μπορεί να δείχνει 0,5 αντί για 0, οπότε διάλεξε όρια λίγο πιο φαρδιά, π.χ. -1,5 έως 1,5 και κόκκινο όταν γέρνει.
🌀Ανιχνευτής Σβούρας
+100 XPΤο γυροσκόπιο μετράει πόσο γρήγορα γυρίζει η πλακέτα, σε μοίρες ανά δευτερόλεπτο. Όταν είναι ακίνητη, δείχνει κοντά στο 0.
from adafruit_clue import clue
screen = clue.simple_text_display(title="Spin-o-meter", text_scale=2)
while True:
x, y, z = clue.gyro
screen[0].text = f"x: {x:6.0f}"
screen[1].text = f"y: {y:6.0f}"
screen[2].text = f"z: {z:6.0f}"
if abs(z) > 200: # το abs() αγνοεί το πρόσημο μείον
screen[4].text = "WHEEE!"
else:
screen[4].text = ""
screen.show()
Το :6.0f σημαίνει χωρίς δεκαδικά και πλάτος τουλάχιστον 6 χαρακτήρες, για να στοιχίζονται οι αριθμοί. Μπορείς να χρησιμοποιήσεις και τις γραμμές 3, 4, 5…: κάθε γραμμή είναι 13 × text_scale pixel πιο κάτω, οπότε με μεγάλα γράμματα η οθόνη τελειώνει πιο γρήγορα.
Ξάπλωσε το CLUE στο τραπέζι και γύρνα το σαν δίσκο βινυλίου. Αυτός είναι ο άξονας z!
Παίξε πιο ψιλή νότα όσο πιο γρήγορα γυρίζει (βοήθεια:
clue.start_tone(200 + int(abs(z)))).🧭Κυνηγός Μαγνητών & Πυξίδα
+150 XPΤο μαγνητόμετρο νιώθει μαγνητικά πεδία (σε μικροτέσλα). Η Γη είναι ένας γιγάντιος μαγνήτης, και ένα μαγνητάκι ψυγείου είναι ένας μικροσκοπικός.
import math
from adafruit_clue import clue
screen = clue.simple_text_display(title="Magnet Hunter", text_scale=2)
while True:
x, y, z = clue.magnetic
strength = math.sqrt(x*x + y*y + z*z) # συνολική δύναμη μαγνήτη
screen[0].text = f"Power: {strength:.0f}"
if strength > 150:
screen[2].text = "MAGNET NEARBY!"
clue.pixel.fill((255, 0, 0))
else:
screen[2].text = ""
clue.pixel.fill((0, 0, 0))
screen.show()
Φέρε κοντά έναν μαγνήτη και δες τη δύναμη να πετάγεται. Μόνο το πεδίο της Γης είναι συνήθως γύρω στο 25 έως 65.
Πρόχειρη πυξίδα
Με την πλακέτα ξαπλωμένη, το atan2(y, x) μετατρέπει τις τιμές x και y σε γωνία, και το % 360 την κρατάει από 0 έως 359.
import math
from adafruit_clue import clue
screen = clue.simple_text_display(title="Compass", text_scale=3)
while True:
x, y, z = clue.magnetic
heading = math.degrees(math.atan2(y, x)) % 360
screen[1].text = f"{heading:.0f} deg"
screen.show()
Η γωνία μετριέται από τον άξονα x της πλακέτας, όχι από την οθόνη. Γύρνα την πλακέτα μέχρι να δείξει περίπου 0: τώρα ο άξονας x δείχνει προς τον μαγνητικό βορρά. Δες προς τα πού ανεβαίνει ο αριθμός πριν εμπιστευτείς τα N/E/S/W.
Κάθε μαγνητόμετρο είναι λίγο «στραβό», και τα μέταλλα ή οι ηλεκτρονικές συσκευές κοντά του το μπερδεύουν. Αν η πυξίδα σου τρελαίνεται, είναι φυσιολογικό! Οι αληθινοί μηχανικοί κάνουν βαθμονόμηση (calibration): γυρνάνε αργά την πλακέτα έναν ολόκληρο κύκλο, σημειώνουν το μικρότερο και το μεγαλύτερο x και y, και μετά αφαιρούν τη μεσαία τιμή (
(min + max) / 2) από κάθε μέτρηση.Δείξε "N", "E", "S" ή "W" (Βορράς, Ανατολή, Νότος, Δύση) αντί για αριθμό.
✋Δυνάμεις Jedi στα Χέρια
+150 XPΟ μικρός μαύρος αισθητήρας στην κορυφή της πλακέτας ρίχνει αόρατο υπέρυθρο φως και βλέπει πώς αυτό αναπηδάει πίσω. Έτσι παίρνουμε εγγύτητα (0 = μακριά, 255 = το ακουμπάς) και χειρονομίες (κουνήματα του χεριού!).
Θερεμίν εγγύτητας
from adafruit_clue import clue
while True:
p = clue.proximity
if p > 10:
clue.start_tone(200 + p * 5) # χέρι πιο κοντά = πιο ψιλή νότα
else:
clue.stop_tone()
Ανιχνευτής κινήσεων
Το clue.gesture δίνει 0 = τίποτα, 1 = πάνω, 2 = κάτω, 3 = αριστερά, 4 = δεξιά. Κούνα το χέρι σου περίπου 5 με 10 εκατοστά πάνω από τον αισθητήρα.
from adafruit_clue import clue
names = ["", "UP", "DOWN", "LEFT", "RIGHT"]
screen = clue.simple_text_display(title="Swipe!", text_scale=4)
while True:
g = clue.gesture
if g != 0:
screen[1].text = names[g] # με τον αριθμό διαλέγουμε από τη λίστα
screen.show()
Κούνα το χέρι αριστερά/δεξιά για να αλλάζεις το χρώμα του NeoPixel από μια λίστα, σαν να γυρνάς σελίδες.
🎨Ο Αντιγραφέας Χρωμάτων
+150 XPΟ ίδιος αισθητήρας βλέπει και χρώματα! Το clue.color δίνει 4 αριθμούς: κόκκινο, πράσινο, μπλε, clear (clear = συνολική φωτεινότητα). Άναψε τα λευκά LED για να βλέπει καλύτερα.
import time
from adafruit_clue import clue
clue.white_leds = True
clue.pixel.brightness = 0.3
screen = clue.simple_text_display(title="Color Copycat", text_scale=2)
while True:
r, g, b, c = clue.color
screen[0].text = f"R {r}"
screen[1].text = f"G {g}"
screen[2].text = f"B {b}"
screen.show()
biggest = max(r, g, b, 1) # το 1 μας γλιτώνει από διαίρεση με το μηδέν
# κλιμάκωση ώστε το πιο δυνατό χρώμα να γίνει 255
clue.pixel.fill((r * 255 // biggest, g * 255 // biggest, b * 255 // biggest))
time.sleep(0.1)
Κράτα ένα πολύχρωμο τουβλάκι LEGO, ένα χαρτάκι post-it ή το καπάκι ενός μαρκαδόρου ακριβώς πάνω από τον αισθητήρα. Το NeoPixel το αντιγράφει!
Η πρώτη μέτρηση αφού ανάψουν τα λευκά LED είναι 0 (ο αισθητήρας θέλει περίπου μισό δευτερόλεπτο για την πρώτη του «φωτογραφία»· σε πρόγραμμα που διαβάζει μόνο μία φορά, διάβασε, κάνε time.sleep(0.5) και ξαναδιάβασε), και οι αριθμοί μπορεί να είναι εκατοντάδες ή χιλιάδες, όχι μόνο 0 έως 255. Δεν πειράζει: μετράει μόνο ποιος είναι ο μεγαλύτερος. (Το // κάνει διαίρεση και πετάει τα δεκαδικά.)
Φτιάξε έναν «διαλογέα φρούτων»: δείξε "RED!", "GREEN!" ή "BLUE!" στην οθόνη, ανάλογα με το ποιος αριθμός είναι ο μεγαλύτερος. Όταν και τα τρία είναι 0 (η πρώτη μέτρηση), δείξε
"?" αντί να μαντεύεις: πρόσθεσε ένα τελευταίο else.⛅Μετεωρολογικός Σταθμός
+150 XPΤέσσερις αισθητήρες αέρα σε ένα πρόγραμμα:
clue.temperature: βαθμοί Κελσίουclue.humidity: % νερού στον αέραclue.pressure: ατμοσφαιρική πίεση σε hPa (όταν η πίεση πέφτει, συχνά έρχεται βροχή!)clue.altitude: υψόμετρο σε μέτρα, υπολογισμένο από την πίεση
import time
from adafruit_clue import clue
# Βρες τη σημερινή πίεση στο επίπεδο της θάλασσας για την πόλη σου σε ένα site καιρού
# και βάλ' τη εδώ για να είναι πιο ακριβές το υψόμετρο.
clue.sea_level_pressure = 1013.25
TEMP_OFFSET = 5 # μέτρησε το δικό σου: ένδειξη CLUE μείον αληθινό θερμόμετρο
screen = clue.simple_text_display(title="Weather Station", text_scale=2,
colors=((255, 80, 80), (80, 180, 255), (255, 255, 0), (80, 255, 120)))
while True:
temp_c = clue.temperature - TEMP_OFFSET
temp_f = temp_c * 9 / 5 + 32
screen[0].text = f"{temp_c:.1f}C / {temp_f:.0f}F"
screen[1].text = f"Humid {clue.humidity:.0f}%"
screen[2].text = f"{clue.pressure:.0f} hPa"
screen[3].text = f"Alt {clue.altitude:.0f} m"
screen.show()
time.sleep(1)
Φύσα την ανάσα σου πάνω στην πλακέτα: η υγρασία εκτοξεύεται! Ανέβα τις σκάλες κρατώντας τη: το υψόμετρο θα ανέβει περίπου 3 μέτρα ανά όροφο. Κράτα τη στο χέρι σου: η θερμοκρασία ανεβαίνει.
Η πλακέτα ζεσταίνεται μόνη της, οπότε δείχνει αρκετούς βαθμούς παραπάνω (η δική μας δείχνει 30 C σε ένα δωμάτιο με ευχάριστη θερμοκρασία), και ακόμα περισσότερους αν ήταν αναμμένα τα LED. Βάλε ένα κανονικό θερμόμετρο δίπλα της, βρες τη διαφορά και γράψ' τη στο
TEMP_OFFSET: πάλι βαθμονόμηση!Κάνε το NeoPixel μπλε όταν κάνει κρύο, πράσινο όταν είναι ευχάριστα και κόκκινο όταν κάνει ζέστη. Χρησιμοποίησε το διορθωμένο
temp_c.👏Ανιχνευτής Παλαμάκιων
+150 XPΤο μικρόφωνο εδώ δεν μπορεί να ηχογραφήσει λέξεις, αλλά μετράει πόσο δυνατός είναι ο ήχος. Το clue.sound_level δίνει έναν αριθμό, και το clue.loud_sound() είναι True όταν ο ήχος είναι πιο δυνατός από ένα όριο.
Μετρητής θορύβου
import time
from adafruit_clue import clue
while True:
level = clue.sound_level
print((level,)) # το κόμμα το κάνει tuple, για να το ζωγραφίσει ο Plotter!
time.sleep(0.05)
Φως με παλαμάκι
import time
from adafruit_clue import clue
light_on = False
while True:
if clue.loud_sound(sound_threshold=500):
light_on = not light_on # αλλάζει True ↔ False
clue.white_leds = light_on
time.sleep(0.5) # αγνόησε την ηχώ από το ίδιο παλαμάκι
Πολύ ευαίσθητο; Μεγάλωσε το sound_threshold. Δεν σε ακούει; Μίκρυνέ το. Σε ήσυχο δωμάτιο ο αριθμός είναι συνήθως 5 έως 30. Όταν μιλάτε ανεβαίνει, και με ένα παλαμάκι ανεβαίνει πολύ περισσότερο. Τρέξε τον μετρητή θορύβου, χτύπα παλαμάκια και διάλεξε ένα όριο ανάμεσα στον πιο δυνατό κανονικό θόρυβο και στο παλαμάκι σου.
Φτιάξε έναν «φύλακα βιβλιοθήκης»: η οθόνη δείχνει ένα χαρούμενο μήνυμα (π.χ. "Nice and quiet", η γραμματοσειρά του CLUE δεν δείχνει emoji) όταν έχει ησυχία και "SHHH!" όταν ο θόρυβος γίνεται πολύς. Κάθε γράμμα έχει πλάτος 6 × text_scale pixel και η οθόνη έχει πλάτος 240, οπότε για το μεγάλο μήνυμα βάλε
text_scale=2.⚡Αγώνας Αντανακλαστικών
+300 XPΏρα να συνδυάσεις δυνάμεις: οθόνη + NeoPixel + κουμπιά + ηχείο + χρόνος + τύχη (random). Περίμενε το πράσινο και μετά πάτα το A όσο πιο γρήγορα μπορείς. Αν πατήσεις πολύ νωρίς, χάνεις!
import time
import random
from adafruit_clue import clue
clue.pixel.brightness = 0.3
screen = clue.simple_text_display(title="REACTION RACE", text_scale=2)
best = None # None = "δεν υπάρχει σκορ ακόμα"
def show(line0, line1="", line2=""):
screen[0].text = line0
screen[1].text = line1
screen[2].text = line2
screen.show()
while True:
best_text = "Best: --" if best is None else f"Best: {best} ms"
show("Press A", "to start", best_text)
while not clue.button_a: # περίμενε το A
pass
while clue.button_a: # περίμενε να αφήσεις το A
pass
show("Get ready...", "wait for GREEN")
clue.pixel.fill((255, 0, 0))
wait = random.uniform(1.5, 4.0)
start_wait = time.monotonic()
cheated = False
while time.monotonic() - start_wait < wait:
if clue.button_a: # πατήθηκε πολύ νωρίς!
cheated = True
break
if cheated:
clue.pixel.fill((255, 0, 255))
clue.play_tone(150, 0.6)
show("TOO EARLY!", "Try again")
time.sleep(2)
continue # πήδα πίσω στην αρχή του βρόχου
clue.pixel.fill((0, 255, 0))
clue.play_tone(1000, 0.05)
go = time.monotonic()
while not clue.button_a:
pass
ms = int((time.monotonic() - go) * 1000)
clue.pixel.fill((0, 0, 0))
if best is None or ms < best:
best = ms
clue.play_tone(523, 0.1)
clue.play_tone(784, 0.2)
show(f"{ms} ms", "NEW RECORD!")
else:
show(f"{ms} ms", "Nice try!")
time.sleep(2)
while clue.button_a:
pass
Καινούργια πράγματα εδώ: το time.monotonic() είναι ένα χρονόμετρο που μετράει δευτερόλεπτα από τη στιγμή που ξεκίνησε η πλακέτα, το break σε βγάζει έξω από έναν βρόχο, το continue πηδάει στον επόμενο γύρο, και το None σημαίνει «τίποτα ακόμα».
① Κάν' το για 2 παίκτες: A εναντίον B, και όποιος πατήσει πρώτος μετά το πράσινο κερδίζει.
② Χρησιμοποίησε το
clue.shake() αντί για κουμπί: «κούνα το όταν γίνει πράσινο!» Να ξέρεις: το clue.shake() θέλει περίπου μισό δευτερόλεπτο για να αποφασίσει, οπότε οι χρόνοι είναι λιγότερο ακριβείς απ' ό,τι με κουμπί.③ Εφεύρε το δικό σου παιχνίδι. Μερικές ιδέες: βηματόμετρο (κούνημα = βήμα), λαβύρινθος με κλίση στο NeoPixel, ένα κατοικίδιο που πεινάει και θέλει να του πατάς κουμπιά, ή ένας καταγραφέας που παρακολουθεί τη θερμοκρασία όλη μέρα.
CLUE MASTER!
Χρησιμοποίησες κάθε gadget του CLUE: οθόνη, NeoPixel, LED, κουμπιά, ηχείο, επιφάνειες αφής, επιταχυνσιόμετρο, γυροσκόπιο, μαγνητόμετρο, εγγύτητα, χειρονομίες, χρώμα, θερμοκρασία, υγρασία, πίεση, υψόμετρο και μικρόφωνο. Αυτό είναι αληθινός προγραμματισμός ενσωματωμένων συστημάτων. Τώρα πήγαινε να φτιάξεις κάτι φοβερό!
Όλες οι δυνάμεις του CLUE σε μία σελίδα
Ξεκίνα πάντα με from adafruit_clue import clue.
| Gadget | Κώδικας | Τι παίρνεις |
|---|---|---|
| Οθόνη (εύκολα) | s = clue.simple_text_display(title="Hi", text_scale=2)s[0].text = "..." s.show() | Γραμμές κειμένου |
| Οθόνη (πλήρης έλεγχος) | clue.display.root_group = group | Τη δική σου ζωγραφιά με displayio |
| NeoPixel | clue.pixel.fill((r, g, b))clue.pixel.brightness = 0.2 | Όποιο χρώμα θες, 0 έως 255 το καθένα |
| Κόκκινο LED | clue.red_led = True | Αναμμένο / σβηστό |
| Λευκά LED | clue.white_leds = True | Αναμμένα / σβηστά |
| Κουμπιά | clue.button_a, clue.button_b | True όσο είναι πατημένο |
| Επιφάνειες αφής | clue.touch_0, clue.touch_1, clue.touch_2 | True όσο το ακουμπάς |
| Ηχείο | clue.play_tone(440, 0.5)clue.start_tone(440) / clue.stop_tone() | Μπιπ και νότες |
| Μικρόφωνο | clue.sound_levelclue.loud_sound(sound_threshold=500) | Αριθμός έντασης / True αν είναι δυνατός |
| Επιταχυνσιόμετρο | x, y, z = clue.acceleration | m/s² (βαρύτητα ≈ 9,8) |
| Κούνημα | clue.shake(shake_threshold=20) | True αν κουνήθηκε (το 30 είναι η προεπιλογή) |
| Γυροσκόπιο | x, y, z = clue.gyro | Ταχύτητα περιστροφής, μοίρες/δευτερόλεπτο |
| Μαγνητόμετρο | x, y, z = clue.magnetic | Μικροτέσλα |
| Εγγύτητα | clue.proximity | 0 (μακριά) έως 255 (κοντά) |
| Χειρονομία | clue.gesture | 0 τίποτα, 1 πάνω, 2 κάτω, 3 αριστερά, 4 δεξιά |
| Χρώμα | r, g, b, c = clue.color | Κόκκινο, πράσινο, μπλε, clear (συνολικό φως) |
| Θερμοκρασία | clue.temperature | °C |
| Υγρασία | clue.humidity | % σχετική υγρασία |
| Πίεση | clue.pressure | hPa |
| Υψόμετρο | clue.sea_level_pressure = 1013.25clue.altitude | Μέτρα |
Κι άλλες περιπέτειες
- Εργαστήριο Οθόνης: πώς δουλεύει η οθόνη, σχήματα και κίνηση
- Picture Maker: φωτογραφίες και GIF στο CLUE σου
- Οδηγός Adafruit CLUE: το επίσημο εγχειρίδιο (στα αγγλικά)
- Τεκμηρίωση της βιβλιοθήκης adafruit_clue: κάθε εντολή εξηγημένη (στα αγγλικά)
- Projects με CLUE στο Adafruit Learn: ένα σωρό ιδέες για projects
- Η CircuitPython στο GitHub: ο πηγαίος κώδικας της ίδιας της CircuitPython