Εργαστηριακή Άσκηση 8: Σειριακή οθόνη Arduino – Ανιχνευτής σκότους με Φωτοαντίσταση

Εργαστηριακή Άσκηση 8: Σειριακή οθόνη Arduino – Ανιχνευτής σκότους με Φωτοαντίσταση

Θεωρία:  Σειριακή οθόνη (Serial Monitor) – Συναρτήσεις Επιλογής ifelse

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

  • η σύνδεση μέσω του καλωδίου USB (όταν πρόκειται για τον υπολογιστή) ή
  • τα pins Rx0 και Tx1 για την επικοινωνία με κάποια πιο εξειδικευμένη σύνδεση (π.χ. με κάποια άλλη συσκευή Arduino, Bluetooth module κ.α.).

Στις περισσότερες πλακέτες Arduino (π.χ. Uno, Nano, Mini, Mega), οι ακίδες 0 και 1 χρησιμοποιούνται από τη σειριακή θύρα. Αν συνδέσουμε κάποιο άλλο εξάρτημα σε αυτές τις ακίδες μπορεί να επηρεάσει αυτήν την επικοινωνία ή να προκαλέσει αποτυχία μεταφόρτωσης του προγράμματος στην πλακέτα.

Σειριακή Επικοινωνία

Για να ενεργοποιήσουμε τη σειριακή θύρα επικοινωνίας, μέσα στην υπορουτίνα setup(), δηλώνουμε την έναρξη της σειριακής επικοινωνίας με την εντολή Serial.begin(BaudRate), όπου το BaudRate εκφράζει το ρυθμό με τον οποίο θα μεταδίδονται τα bits (μια τιμή στα 9600 είναι συνήθως αρκετή).

Για παράδειγμα: Serial.begin(9600);

Τυπικές τιμές BaudRate είναι: 4800, 9600, 19200, 31250, 38400, 57600, 115200 κλπ.

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

Για παράδειγμα:

  • Serial.print(“Serial communication started”); /* Θα εμφανίσει το μήνυμα αυτό στην οθόνη χωρίς να αλλάξει γραμμή */
  • Serial.println(distance); // Θα εμφανίσει την τιμή της μεταβλητής distance σε μια γραμμή.

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

  • Η σειριακή επικοινωνία στις ακίδες TX/RX χρησιμοποιεί λογικά επίπεδα TTL (5V ή 3,3V ανάλογα με την πλακέτα).
  • Δεν μπορούμε να συνδέσουμε αυτές τις ακίδες απευθείας σε μια σειριακή θύρα RS232 γιατί λειτουργεί στα +/- 12V και μπορεί να προκαλέσει βλάβη στην πλακέτα Arduino.
  • Για τη σύνδεση με TTL συσκευές, θα πρέπει να συνδέσουμε τον ακροδέκτη TX του Arduino στον ακροδέκτη RX της άλλης συσκευής και το RX του Arduino στον ακροδέκτη TX της άλλης συσκευής.

Δομή Επιλογής if – else (Εργαστηριακή άσκηση 5)

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

if (<συνθήκη>)
{
  <εντολές 1>
}
else
{
   <εντολές 2>
}

όπου, στη <συνθήκη> έχουμε τον έλεγχο που θέλουμε να γίνει, χρησιμοποιώντας συνήθως τους τελεστές σύγκρισης (>, <, >=, <=), π.χ. potVal > 500. Η συνθήκη μπορεί να είναι και πιο σύνθετη, χρησιμοποιώντας τους λογικούς τελεστές ( || για το Η’, && για το ΚΑΙ), π.χ. (potVal > 500) && (timePass >= 1000) . Μέσα στα άγκιστρα { } βάζουμε τις εντολές που θέλουμε να εκτελεστούν σε κάθε περίπτωση. Αν ισχύει η <συνθήκη> θα εκτελεστούν οι <εντολές 1> ενώ αν δεν ισχύει θα εκτελεστούν οι <εντολές 2> . Το τμήμα της δομής επιλογής  else { } δεν είναι πάντα απαραίτητο να υπάρχει.


Εργαστηριακή Άσκηση

Σε αυτήν την δραστηριότητα θα κατασκευάσουμε έναν ανιχνευτή σκότους με φωτοαντίσταση LDR. Η διάταξη που θα δημιουργήσουμε θα αποτελείται από ένα LED και μια φωτοαντίσταση LDR. Η φωτοαντίσταση είναι μια μεταβλητή αντίσταση η τιμή της οποίας εξαρτάται από την ένταση του φωτός που προσπίπτει σε αυτή. Όσο αυξάνει η ένταση του προσπίπτοντος φωτός η τιμή της φωτοευαίσθητης αντίστασης μειώνεται. Στο κύκλωμά μας, το LED θα ανάβει όταν η τιμή της φωτοευαίσθητης αντίστασης πέσει κάτω από κάποια τιμή (κατώφλι) την οποία θα βρούμε κάνοντας αρχικά κάποιες δοκιμαστικές μετρήσεις και με τη βοήθεια του serial monitor.

Απαραίτητα υλικά:

  1. Ηλεκτρονικός Υπολογιστής με εγκατεστημένο το Arduino IDE
  2. Arduino Uno board και καλώδιο usb
  3. Breadboard
  4. dupont/jumper wires
  5. 1 LDR
  6. 2 led
  7. 2 αντιστάσεις 220Ω
  8. 2 αντιστάσεις 10 ΚΩ

Εφαρμογή 1

  • Κατασκευάστε το κύκλωμα του σχήματος (Φωτοαντίσταση LDR, Αντίσταση 10ΚΩ).
    • Πριν προχωρήσουμε με την ανάπτυξη του προγράμματος τρέχουμε το παρακάτω πρόγραμμα (LDR_Test.ino) το οποίο εμφανίζει στην σειριακή οθόνη (Serial Monitor) τις τιμές που επιστρέφει η φωτοευαίσθητη αντίσταση όταν είναι συνδεδεμένη στην αναλογική είσοδο του Arduino.
    • Για να δείτε τις τιμές αυτές επιλέξτε από το Μενού: Εργαλεία > Παρακολούθηση Σειριακής (Tools > Serial Monitor) ή πατήστε το αντίστοιχο εικονίδιο επάνω δεξιά.
    • Ανοίγουμε το παράθυρο σειριακής επικοινωνίας και πειραματιζόμαστε με τις τιμές της φωτοαντίστασης καλύπτοντας την επιφάνειά της.
    • Καταγράψτε την τιμή που δίνει η φωτοαντίσταση όταν ανιχνεύει σκοτάδι (π.χ. 700)
    • Χρησιμοποιήστε την παραπάνω τιμή για να ορίσετε στο πρόγραμμα πότε θα ανάβει το led και πότε θα σβήνει.
    • Τροποποιήστε το κύκλωμα όπως φαίνεται στο δεύτερο σχήμα. Προσθέστε ένα LED στην έξοδο 3 του Arduino, το οποίο θα ανάβει όταν η φωτοαντίσταση θα ανιχνεύει σκοτάδι.
    • Τροποποιήστε το αρχικό πρόγραμμα  με τα παρακάτω στοιχεία και αποθηκεύστε το με όνομα LDR.ino.
    • Ορίστε μια ακέραια μεταβλητή LDR1 με τιμή Α0 (στο Α0 θα συνδεθεί η φωτοαντίσταση).
    • Ορίστε μια ακέραια μεταβλητή ledpin με τιμή 3 (στην ψηφιακή έξοδο 3 θα συνδέσετε το LED).
    • Δηλώστε την έναρξη της σειριακής επικοινωνίας μέσα στην υπορουτίνα setup και δηλώστε baudrate.
    • Ορίστε την αναλογική είσοδο και την ψηφιακή έξοδο, μέσα στην υπορουτίνα setup.
    • Προσθέστε μέσα στην υπορουτίνα loop, δομή επιλογής if – else για να ορίσετε πότε θα ανάβει το led και πότε θα σβήνει ανάλογα με την τιμή της LDR.

    Προσομοίωση της λειτουργίας στο Tinkercad

    Πατήστε στο κουμπί start simulation και στη συνέχεια πατήστε πάνω στην φωτοαντίσταση. Μεταβάλλετε το φως που προσπίπτει πάνω στη φωτοαντίσταση από το συρόμενο ποτενσιόμετρο που θα εμφανιστεί. Παρατηρήστε τη συμπεριφορά του LED. Για να δείτε τη σειριακή οθόνη, πατήστε στο κουμπί code και στη συνέχεια κάτω από τον κώδικα του προγράμματος πατήστε στο κουμπί serial monitor.

    Εφαρμογή 2

    Τροποποιήστε το πρόγραμμα και το κύκλωμα (μπορεί να γίνει και στο Tinkercad) με δύο LDR και δύο LED τα οποία λειτουργούν ανεξάρτητα. Όταν ανιχνεύει σκοτάδι το LDR1 θα ανάβει το LED1 και όταν ανιχνεύει σκοτάδι το LDR2 θα ανάβει το LED2. Αποθηκεύστε το νέο πρόγραμμα με το όνομα 2LDR.ino