Το Arduino πηγαίνει στην αρχή του προγράμματος κατά συνθήκη. Βρόχοι Arduino. Κατάσταση και διακλάδωση στο κείμενο του προγράμματος

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

Επικεφαλίδα βρόχου Γιααποτελείται από τρία μέρη:

Για (αρχικοποίηση ; κατάσταση ; αύξηση) (τελεστές που εκτελούνται σε βρόχο)

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

Παράδειγμα

// Μείωση της φωτεινότητας του LED με χρήση PWM pin int PWMpin = 10; // LED σε σειρά με αντίσταση 470 ohm για 10 ακίδες void setup() ( // δεν απαιτείται ρύθμιση) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

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

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

Για(int x = 2; x< 100; x = x * 1.5){ println(x); }

Δημιουργήθηκε: 2,3,4,6,9,13,19,28,42,63,94

Ένα άλλο παράδειγμα, ομαλή μείωση ή αύξηση της στάθμης σήματος σε LED χρησιμοποιώντας έναν κύκλο Για:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x) ( analogWrite (PWMpin, i); εάν (i == 255) x = -1; / / Έλεγχος μεταγωγής στη μέγιστη καθυστέρηση (10); ) )

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

Επικεφαλίδα βρόχου Γιααποτελείται από τρία μέρη:

Για (αρχικοποίηση ; κατάσταση ; αύξηση) (τελεστές που εκτελούνται σε βρόχο)

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

Παράδειγμα
// Μείωση της φωτεινότητας του LED με χρήση PWM pin int PWMpin = 10; // LED σε σειρά με αντίσταση 470 ohm για 10 ακίδες void setup() ( // δεν απαιτείται ρύθμιση) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

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

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

Για(int x = 2; x< 100; x = x * 1.5){ println(x); }

Δημιουργήθηκε: 2,3,4,6,9,13,19,28,42,63,94

Ένα άλλο παράδειγμα, ομαλή μείωση ή αύξηση της στάθμης σήματος σε LED χρησιμοποιώντας έναν κύκλο Για:

Void loop() ( int x = 1; for (int i = 0; i > -1; i = i + x) ( analogWrite (PWMpin, i); εάν (i == 255) x = -1; // έλεγχος μεταγωγής στη μέγιστη καθυστέρηση (10); ) )

", μάθαμε πώς να χρησιμοποιούμε έναν βρόχο "για" για να οργανώσουμε τη λειτουργία του ελεγκτή. Αυτός ο τύπος βρόχου χρησιμοποιείται παντού και περισσότερο από ό, τι καλύπτει την «ανάγκη για λειτουργίες βρόχου». Ωστόσο, υπάρχει ένας άλλος τύπος βρόχου - "ενώ". Δεν είναι καλύτερο από έναν βρόχο for, απλώς χρησιμοποιεί διαφορετικές αρχές.

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

Ας συνεχίσουμε να δουλεύουμε με το κύκλωμα, που αποτελείται από 2 LED.

Επιπλέον, θα συνεχίσουμε να εργαζόμαστε με τον κώδικα που οριστικοποιήσαμε στο μάθημα 14.

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

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

Ας καταλάβουμε πώς λειτουργεί:

ενθ z= 1 ; // δηλώνει μια μεταβλητή και της εκχωρεί την τιμή 1

ενώ (z<=10) { //запускаем цикл ενώ

Κατα συρροη. println(z) //Έξοδος της τρέχουσας τιμής της μεταβλητήςz μέσω σειριακής θύρας

z= z+1 // αύξηση της τιμής της μεταβλητήςzκατά 1

) // τερματίστε τον βρόχο

Ο βρόχος while θα συνεχίσει να εκτελεί εντολές όσο ισχύει η «συνθήκη» που περιγράφεται στις παρενθέσεις. Στο παραπάνω παράδειγμα, ο βρόχος θα συνεχίσει να εκτελεί εντολές όσο το z είναι μικρότερο ή ίσο με 10. Το σώμα του βρόχου εκτελεί 2 εντολές:

  • Έξοδος της τιμής μιας μεταβλητής μέσω μιας σειριακής θύρας.
  • Αύξηση της τιμής μιας μεταβλητής κατά 1 (επιστημονικά ονομάζεται incrementing).

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

Ο βρόχος ξεκινά τη δουλειά του ελέγχοντας την αλήθεια της συνθήκης. Εάν το z είναι μικρότερο ή ίσο με 10, τότε το πρόγραμμα εκτελεί τον βρόχο. Στη συνέχεια ελέγχεται ξανά η κατάσταση κ.λπ. Όταν η τιμή της μεταβλητής φτάσει z = 11, η συνθήκη δεν θα είναι πλέον αληθής. Το πρόγραμμα δεν θα εκτελέσει τον βρόχο και θα πάει στην επόμενη γραμμή αμέσως μετά το σγουρό στήριγμα βρόχου.

Φτάνει η θεωρία, ας περάσουμε στην πράξη. Ας αντικαταστήσουμε τους βρόχους for στον πηγαίο κώδικα με τους βρόχους while.

Flasher που εκτελείται από τον κύκλο FOR:

για (int i = 1; i<= blinkNumberGreen; i++) // εκτόξευση κύκλοςΓια

{

Κατα συρροη. Τυπώνω("Το πράσινο άναψε");

Serial.println(i);

digitalWrite(greenLed, HIGH); //ανάβω πράσινος Δίοδος εκπομπής φωτός

καθυστέρηση (timeOnGreenLed); //περιμένουμε

digitalWrite(greenLed, LOW); //σβήνω πράσινος Δίοδος εκπομπής φωτός

καθυστέρηση (timeOffGreenLed); //περιμένουμε

}

Flasher στον κύκλο WHILE:

ενθ Εγώ=1; //δηλώνει μια μεταβλητή και της εκχωρεί την τιμή 1

καθώς εγώ<= blinkNumberGreen)

{ // εκτόξευση κύκλοςενώ

Serial.print("Πράσινος αναβοσβήνει «);

Serial.println(i);

digitalWrite(greenLed,HIGH); //ανάβω πράσινος Δίοδος εκπομπής φωτός

καθυστέρηση (timeOnGreenLed); //περιμένουμε

digitalWrite(greenLed,LOW); //σβήνω πράσινος Δίοδος εκπομπής φωτός

καθυστέρηση (timeOffGreenLed); //περιμένουμε

Εγώ= Εγώ+1 //αύξηση της τιμής της μεταβλητής κατά 1

}

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

Βρόχοι χρησιμοποιώντας εντολές ΓιαΚαι ενώείναι μια από τις πιο σημαντικές κατασκευές της γλώσσας C++ που βασίζεται στο Arduino. Βρίσκονται σε απολύτως κάθε σκίτσο, ακόμα κι αν δεν το ξέρετε. Σε αυτό το άρθρο, θα ρίξουμε μια πιο προσεκτική ματιά στους βρόχους, θα μάθουμε ποια είναι η διαφορά μεταξύ για και ενώ, πώς μπορείτε να απλοποιήσετε τη σύνταξη ενός προγράμματος με τη βοήθειά τους και ποια λάθη πρέπει να αποφεύγονται.

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

Ο τελεστής WHILE χρησιμοποιείται σε C++ και Arduino για να επαναλάβει τις ίδιες εντολές αυθαίρετες φορές. Σε σύγκριση με τον βρόχο FOR, ο βρόχος WHILE φαίνεται απλούστερος· συνήθως χρησιμοποιείται όπου δεν χρειάζεται να μετρήσουμε τον αριθμό των επαναλήψεων σε μια μεταβλητή, αλλά απλά χρειάζεται να επαναλάβουμε τον κώδικα μέχρι να αλλάξει κάτι ή να συμβεί κάποιο συμβάν.

ΕΝΩ σύνταξη

ενώ(<условие или список условий>)
{
<программный блок, который будет повторяться>
}

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

// Ένας ατελείωτος βρόχος while(true)( Serial.println("Waiting..."); ) // Ένας βρόχος που εκτελείται μέχρι να αλλάξει η τιμή της συνάρτησης checkSignal() while(!checkSignal())( Serial.println ("Αναμονή..."); )

Σημειώστε ότι η εντολή while μπορεί να χρησιμοποιηθεί χωρίς αποκλεισμό του μπλοκ με σγουρά άγκιστρα, οπότε η πρώτη εντολή που εμφανίζεται μετά τον βρόχο θα επαναληφθεί. Δεν συνιστάται ιδιαίτερα η χρήση χωρίς σγουρά τιράντες, γιατί σε αυτή την περίπτωση είναι πολύ εύκολο να κάνεις λάθος. Παράδειγμα:

while(true) Serial.print("Waiting for interruption"); καθυστέρηση (1000);

Σε αυτήν την περίπτωση, η επιγραφή θα εμφανίζεται σε έναν ατελείωτο βρόχο χωρίς παύσεις, επειδή η εντολή delay(1000) δεν θα επαναληφθεί. Μπορείτε να αφιερώσετε πολύ χρόνο για να πιάσετε τέτοια σφάλματα - είναι πολύ πιο εύκολο να χρησιμοποιήσετε ένα σγουρό στήριγμα.

Παράδειγμα χρήσης ενώ βρόχος

Τις περισσότερες φορές, το while χρησιμοποιείται για την αναμονή κάποιου συμβάντος. Για παράδειγμα, η ετοιμότητα του σειριακού αντικειμένου για εργασία.

Serial.begin(9600); ενώ (!Serial) ( ; // Ορισμένες πλακέτες Arduino απαιτούν από εσάς να περιμένετε μέχρι να ελευθερωθεί η σειριακή θύρα)

Ένα παράδειγμα αναμονής για άφιξη ενός χαρακτήρα από εξωτερικές συσκευές μέσω UART:

while(Serial.available())( int byteInput = Seria.read(); // Μερικές άλλες ενέργειες)

Σε αυτήν την περίπτωση, θα διαβάσουμε τις τιμές ​​εφόσον το Serial.available() επιστρέφει μια μη μηδενική τιμή. Μόλις εξαντληθούν όλα τα δεδομένα στο buffer, ο βρόχος θα σταματήσει.

Βρόχος FOR στο Arduino

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

ΓΙΑ σύνταξη βρόχου

Εδώ ο σχεδιασμός θα είναι λίγο πιο περίπλοκος:
Για (<начальное значение счетчика>;<условие продолжения выполнения цикла>;<изменение значения счетчика на каждом шаге>){
<список_команд>
}

Το απλούστερο παράδειγμα:

Για(int i=5;i<10;i++){ // Конструкция «3 в одном» pinMode(i, OUTPUT); }

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

Το μεταβλητό βήμα μπορεί να είναι διαφορετικό. Ακολουθούν παραδείγματα:

  • for(int i=0; i<10; i=i+2) // Шаг 2
  • for(int i=0; i<10; i+=2) // Аналогичен предыдущему
  • for(int i=10; i>0; i–) // Επιστροφή – από το 10 στο 1

do while βρόχος

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

Do ( Serial.println("Working"); ) while (checkSomething());

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

Συνέχεια και διάλειμμα δηλώσεων

Υπάρχουν περιπτώσεις που χρειάζεται να διακόψετε επειγόντως την εκτέλεση ενός βρόχου μέσα σε ένα μπλοκ βρόχου, χωρίς να περιμένετε να προχωρήσετε στο μπλοκ ελέγχου συνθήκης. Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε τον χειριστή Διακοπή:

while (true) (if (checkSomething()) ( break; ) )

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

Ενώ (αληθές) (αν (checkSomething()) (συνέχεια; ) )

Οι εντολές συνέχειας και διακοπής μπορούν να χρησιμοποιηθούν με όλες τις παραλλαγές των βρόχων FOR και WHILE.

Ένθετοι βρόχοι στο Arduino

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

Int arr; void setup() ( for (int i = 0; i< 10; i++) { for (int j = 0; j < 3; j++) { arr[i][j] = i * j; Serial.println(arr[i][j]); } } }

Περισσότερα για τους κύκλους

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

Γιατί χρειαζόμαστε έναν βρόχο;

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

Ας δούμε το παρακάτω παράδειγμα. Πρέπει να τροφοδοτήσετε ταυτόχρονα 5 LED συνδεδεμένα στην πλακέτα Arduino από τις ακίδες 5 έως 9. Η πιο προφανής επιλογή για αυτό θα ήταν να τοποθετήσετε πέντε οδηγίες στη σειρά:

digitalWrite(5, HIGH);

digitalWrite(6, HIGH);

digitalWrite(7, HIGH);

digitalWrite(8, HIGH);

digitalWrite(9, HIGH);

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

  • Με οποιαδήποτε αλλαγή, θα πρέπει να κάνετε αλλαγές σε πολλές γραμμές ταυτόχρονα. Για παράδειγμα, εάν πρέπει να αλλάξουμε τα LED στις ακίδες 2 έως 6 ή να απενεργοποιήσουμε την τάση αντί να την ανάψουμε, θα πρέπει να κάνουμε 5 αλλαγές στον κωδικό. Τι γίνεται αν υπάρχουν περισσότερες οδηγίες και αλλαγές;
  • Ο μεγάλος κώδικας με μεγάλο αριθμό παρόμοιων οδηγιών είναι άβολος και δυσάρεστος στην ανάγνωση. Πέντε πανομοιότυπες γραμμές δεν είναι πολύ τρομακτικές. Αλλά η συνήθεια του βρώμικου κώδικα θα οδηγήσει τελικά σε δεκάδες και εκατοντάδες επιπλέον σελίδες στην καταχώριση, κάτι που θα κάνει τόσο εσάς όσο και τους συναδέλφους σας απελπισμένους.
  • Στη διαδικασία «αντιγραφής-επικόλλησης» σχεδόν πανομοιότυπων οδηγιών, μπορείτε εύκολα να κάνετε ένα λάθος, για παράδειγμα, να ξεχάσετε να αλλάξετε τον αριθμό pin: digitalWrite(5, HIGH); digitalWrite(5, HIGH);
  • Μπορείτε εύκολα να αποτύχετε μια συνέντευξη σε οποιαδήποτε κανονική εταιρεία λογισμικού δείχνοντας στον συνεντευκτή αυτόν τον κωδικό.

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

Και εδώ οι κύκλοι έρχονται σε βοήθεια.

Συντακτικοί κανόνες

Loop στο Arduinoείναι ένα ειδικό μπλοκ προγράμματος που θα καλείται ορισμένες φορές κατά την εκτέλεση του προγράμματος. Μέσα σε αυτό το μπλοκ, περιγράφουμε τις ίδιες τις εντολές που θα κληθούν και τους κανόνες με τους οποίους ο ελεγκτής θα καθορίσει πόσες φορές πρέπει να κληθούν.

Στο παραπάνω παράδειγμά μας, θα μπορούσαμε να πούμε στον ελεγκτή τα εξής:

Επαναλάβετε την εντολή ψηφιακόΓράψε 5 φορές

Σε έναν ιδανικό κόσμο με προγραμματιστές ρομπότ, αυτό θα ήταν πιθανότατα αρκετό, αλλά επειδή μιλάμε με τον υπολογιστή σε C++, πρέπει να μεταφράσουμε αυτή τη φράση σε αυτήν τη γλώσσα:

Επαναλάβετε την εντολή – πρέπει να χρησιμοποιήσετε ειδικές οδηγίες που λένε στον ελεγκτή ότι κάτι ενδιαφέρον πρόκειται να ξεκινήσει με βρόχους while ή for

digitalWrite – αφήστε το ως έχει, αλλά γράψτε το μια φορά και κλείστε το σε σγουρά τιράντες. Τι να κάνετε με τους αριθμούς pin - ακριβώς από κάτω.

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

Ας δούμε ένα παράδειγμα μιας τέτοιας "μεταφρασμένης" εντολής βρόχου με μια δήλωση while:

Μετρητής Int = 0; // Μια μεταβλητή που θα αποθηκεύει την τιμή του μετρητή // Ζητάμε από τον επεξεργαστή να επαναλάβει την κατασκευή στις σγουρές αγκύλες μέχρι η συνθήκη στις παρενθέσεις να επιστρέψει true. // Στην περίπτωσή μας, ο μετρητής είναι ο μετρητής μας, το 5 είναι η οριακή τιμή, η προϋπόθεση είναι ότι η τιμή του μετρητή είναι μικρότερη από 5. // Μπορούμε όμως να καθορίσουμε εντελώς διαφορετικούς λογικούς τελεστές ενώ (μετρητής< 5) { digitaWrite(5, HIGH); // Будем включать светодиод counter++; // Увеличиваем значение счетчика } // Дойдя до сюда, исполняющий процессор переместится в начало блока и опять займется проверкой условий. Если условия вернут истину, команды в блоке между { и } выполнятся еще раз. Если условие не выполнится - процессор переместится к концу блока и пойдет дальше. Этот цикл больше его не заинтересует.

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

Ενώ (μετρ< 5) { // Вот теперь мы будем включать разные светодиоды, с 5 (0+5) по 9 (4+5) digitalWrite(counter + 5, HIGH); counter++; }

Το ίδιο αποτέλεσμα μπορεί να επιτευχθεί χρησιμοποιώντας έναν βρόχο FOR:

For(int counter =0; counter<5; counter ++){ digitalWrite(counter+5, HIGH); }

Όπως μπορείτε να δείτε, σε αυτήν την περίπτωση τοποθετούμε αμέσως όλες τις απαραίτητες λειτουργίες με τον μετρητή σε μία εντολή FOR - αυτό είναι πολύ πιο βολικό εάν πρέπει να μετρήσετε το απαιτούμενο ποσό.

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

συμπέρασμα

Σε αυτό το άρθρο, εξετάσαμε πολύ σημαντικές δομές της γλώσσας Arduino: βρόχους FOR και WHILE. Μπορείτε να βρείτε αυτούς τους τελεστές σε σχεδόν οποιοδήποτε περισσότερο ή λιγότερο περίπλοκο σκίτσο, γιατί χωρίς βρόχους πολλές λειτουργίες σε δεδομένα θα ήταν αδύνατες. Δεν υπάρχει τίποτα περίπλοκο στη σύνταξη των βρόχων - μπορείτε εύκολα να τα συνηθίσετε και να τα χρησιμοποιήσετε ενεργά στα έργα σας.

/ /

Για χειριστή

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

Επικεφαλίδα βρόχου Γιααποτελείται από τρία μέρη:

Για (αρχικοποίηση; κατάσταση; αύξηση) (τελεστές που εκτελούνται σε βρόχο)

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

Παράδειγμα

// Μείωση της φωτεινότητας του LED με χρήση PWM pin int PWMpin = 10; // LED σε σειρά με αντίσταση 470 ohm για 10 ακίδες void setup() ( // δεν απαιτείται ρύθμιση) void loop() ( for (int i=0; i<= 255; i++){ analogWrite(PWMpin, i); delay(10); } }

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

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

Για(int x = 2; x< 100; x = x * 1.5){ println(x); }

Δημιουργήθηκε: 2,3,4,6,9,13,19,28,42,63,94

Ένα άλλο παράδειγμα, ομαλή μείωση ή αύξηση της στάθμης σήματος σε LED χρησιμοποιώντας έναν κύκλο Για:

Void loop())( int x = 1; for (int i = 0; i > -1; i = i + x) ( analogWrite (PWMpin, i); εάν (i == 255) x = -1; / / Έλεγχος μεταγωγής στη μέγιστη καθυστέρηση (10); ) )