Arduino Logic 101: Μάθημα 4.1: Loops (For & While) — Η τέχνη της επανάληψης

 

Γεια σας, μελλοντικοί μηχανικοί της Unique Tech! 🚀

Φτάσαμε στην Ενότητα 4! Μέχρι τώρα μάθαμε πώς να αποθηκεύουμε πληροφορίες (μεταβλητές) και πώς να παίρνουμε αποφάσεις (if/else). Τώρα ήρθε η ώρα να ξεκλειδώσουμε μια από τις μεγαλύτερες υπερδυνάμεις των υπολογιστών: την ταχύτητα και την υπομονή στην επανάληψη.

Φανταστείτε ότι σας ζητούν να γράψετε έναν κώδικα που αναβοσβήνει ένα LED 10 φορές. Ο "χειροκίνητος" τρόπος θα ήταν να γράψετε αυτό:

digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
// ... και να το αντιγράψετε άλλες 9 φορές! 😫

Αν όμως σας ζητούσαν να το κάνετε 100 ή 1.000 φορές; Ο κώδικάς σας θα γινόταν τεράστιος, δυσανάγνωστος και αν κάνατε ένα μικρό λάθος, θα έπρεπε να το διορθώσετε σε 1.000 διαφορετικά σημεία.

Εδώ έρχονται οι Βρόχοι Επανάληψης (Loops). Οι loops λένε στο Arduino: "Κάνε αυτή την εργασία X φορές" ή "Κάνε αυτή την εργασία μέχρι να συμβεί κάτι συγκεκριμένο".

Ας δούμε τα δύο βασικά είδη loops που χρησιμοποιούμε: τη For και τη While.

1. Η επανάληψη For (The Counting Loop)

Χρησιμοποιούμε τη for όταν γνωρίζουμε εκ των προτέρων πόσες ακριβώς φορές θέλουμε να επαναλάβουμε μια ενέργεια (π.χ. 5 φορές, 100 φορές, N φορές).

Η ανατομία της for

Η συντακτική δομή της for μοιάζει με "συνταγή" 3 βημάτων:

for (αρχικοποίηση; συνθήκη; βήμα) {
    // Κώδικας που εκτελείται επαναληπτικά
}

Ας το δούμε με ένα πρακτικό παράδειγμα. Θέλουμε να αναβοσβήσουμε ένα LED ακριβώς 5 φορές:

for (int i = 0; i < 5; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(500);
    digitalWrite(LED_PIN, LOW);
    delay(500);
}

Πώς το μεταφράζει το Arduino:

  1. Αρχικοποίηση (int i = 0): Δημιουργούμε μια μεταβλητή-μετρητή (τον "counter"), συνήθως με το όνομα i (από τη λέξη index ή iterator), και της δίνουμε την αρχική τιμή 0.

  2. Συνθήκη (i < 5): Πριν από κάθε επανάληψη, το Arduino ρωτάει: "Είναι το i μικρότερο από 5;". Αν ναι, εκτελεί τον κώδικα μέσα στις αγκύλες { }. Αν όχι, σταματάει τη loop και συνεχίζει παρακάτω.

  3. Βήμα (i++): Μόλις τελειώσει ο κώδικας μέσα στις αγκύλες, το Arduino αυξάνει το κατά 1 (το i++ είναι συντομογραφία του i = i + 1).

Η ροή της μνήμης:

  • 1ος κύκλος: i = 0 (Το 0 < 5 ισχύει -> LED On/Off -> Το i γίνεται 1)

  • 2ος κύκλος: i = 1 (Το 1 < 5 ισχύει -> LED On/Off -> Το i γίνεται 2)

  • ...

  • 5ος κύκλος: i = 4 (Το 4 < 5 ισχύει -> LED On/Off -> Το i γίνεται 5)

  • 6ος κύκλος: i = 5 (Το 5 < 5 ΔΕΝ ισχύει -> Η loop τερματίζεται!)

2. Η επανάληψη While (The Condition Loop)

Χρησιμοποιούμε τη while όταν δεν ξέρουμε πόσες φορές θα χρειαστεί να γίνει η επανάληψη. Ξέρουμε μόνο ότι πρέπει να συνεχίσουμε να το κάνουμε όσο (while) ισχύει μια συγκεκριμένη συνθήκη.

Η ανατομία της while

while (συνθήκη) {
    // Κώδικας που εκτελείται όσο η συνθήκη είναι TRUE
}

Παράδειγμα από το Bio-Robotic Project μας 🌿

Στο βραβευμένο μας σύστημα ελέγχου αέρα, θέλουμε ο ανεμιστήρας μας (FAN_PIN) να λειτουργεί συνεχώς όσο τα επίπεδα CO_$ είναι πάνω από το ασφαλές όριο των 1000 ppm.

int co2_level = readCO2(); // Διάβασμα αισθητήρα

while (co2_level > 1000) {
    digitalWrite(FAN_PIN, HIGH); // Άνοιξε τον ανεμιστήρα
    delay(2000);                 // Περίμενε 2 δευτερόλεπτα
    co2_level = readCO2();       // Ξαναδιάβασε τον αισθητήρα!
}

digitalWrite(FAN_PIN, LOW);      // Κλείσε τον ανεμιστήρα όταν πέσει το CO2

⚠️ Προσοχή - Η παγίδα της While! Αν ξεχάσετε τη γραμμή co2_level = readCO2(); μέσα στη loop, η μεταβλητή co2_level δεν θα αλλάξει ποτέ τιμή. Αν ξεκινήσει πάνω από 1000, θα μείνει για πάντα εκεί, δημιουργώντας μια ατέρμονη λούπα (infinite loop). Το ρομπότ σας θα "κολλήσει" εκεί για πάντα!

For vs While: Πότε χρησιμοποιώ τι;

Χαρακτηριστικό

for loop

while loop

Πότε τη χρησιμοποιούμε;

Όταν ξέρουμε τον ακριβή αριθμό επαναλήψεων.

Όταν περιμένουμε ένα γεγονός ή μια αλλαγή σε αισθητήρα.

Παράδειγμα

"Αναβόσβησε το LED 10 φορές."

"Κράτα την ειδοποίηση ανοιχτή μέχρι ο χρήστης να πατήσει το κουμπί."

Κίνδυνος κολλήματος

Πολύ σπάνιος.

Συχνός (αν ξεχάσουμε να ενημερώσουμε τη συνθήκη μέσα στη loop).

🛠️ Η Σπαζοκεφαλιά του Μηχανικού (Challenge)

Για να σιγουρευτούμε ότι κατανοήσατε τη δύναμη των loops, σας έχουμε μια πρόκληση!

Το σενάριο: Θέλουμε να πάρουμε 10 συνεχόμενες μετρήσεις θερμοκρασίας από έναν αισθητήρα, να τις προσθέσουμε και να βρούμε τον μέσο όρο τους, ώστε να έχουμε μια πιο ακριβή μέτρηση (φιλτράρισμα θορύβου).

Γράψτε σε ένα χαρτί ή στο Arduino IDE τον αλγόριθμο χρησιμοποιώντας μια for loop.

Hint (Βοήθεια):

  1. Δημιουργήστε μια μεταβλητή total_temp = 0.0 έξω από τη loop.

  2. Χρησιμοποιήστε μια for που τρέχει 10 φορές.

  3. Σε κάθε επανάληψη, διαβάστε τη θερμοκρασία και προσθέστε τη στο total_temp.

  4. Στο τέλος (έξω από τη loop), διαιρέστε το total_temp με το 10.0 για να βρείτε τον μέσο όρο.

Μοιραστείτε τον κώδικά σας στα σχόλια από κάτω ή στείλτε τον μας στη σελίδα επικοινωνίας για να τον ελέγξουμε μαζί!

Τι έρχεται στη συνέχεια;

Στο επόμενο μάθημα (Μάθημα 4.2: Συναρτήσεις - Functions), θα δούμε πώς μπορούμε να πακετάρουμε όμορφους κώδικες όπως αυτόν της θερμοκρασίας ή του CO2 σε δικές μας "λέξεις-κλειδιά", κάνοντας τον κώδικά μας απίστευτα καθαρό και οργανωμένο!

Μέχρι τότε... Keep Coding & Keep Innovating! 🚀

#UniqueTech #ArduinoLogic101 #CodingLogic #STEMGreece #Loops #ForLoop #WhileLoop #FutureEngineers

Σχόλια

Δημοφιλείς αναρτήσεις από αυτό το ιστολόγιο

Πώς να "διαβάζεις" τον αέρα: Σύνδεση αισθητήρων μέσω I2C με Arduino

Γιατί νυστάζουμε στην τάξη; Η αλήθεια πίσω από το CO2 και η λύση της Unique Tech

Καλωσορίσατε στο Unique Tech Blog!