Εργαστηριακή Άσκηση 10: Βιβλιοθήκες – Οθόνες LCD
Εγκατάσταση και χρήση Βιβλιοθηκών στο Arduino IDE
Το περιβάλλον του Arduino μπορεί να επεκταθεί μέσω της χρήσης βιβλιοθηκών, όπως και οι περισσότερες πλατφόρμες προγραμματισμού. Οι βιβλιοθήκες παρέχουν επιπλέον λειτουργικότητα για χρήση σε προγράμματα, π.χ. σε αισθητήρες και περιφερειακές συσκευές ή στο χειρισμό δεδομένων. Ορισμένες βιβλιοθήκες είναι προεγκατεστημένες με το arduino IDE, αλλά μπορείτε επίσης να κάνετε λήψη βιβλιοθήκες που δεν υπάρχουν εγκατεστημένες (ή να δημιουργήσετε και δικές σας). Οι περισσότεροι αισθητήρες και περιφερειακές συσκευές που μπορούμε να χρησιμοποιήσουμε με την πλακέτα Arduino, υποστηρίζονται από βιβλιοθήκες οι οποίες αναλαμβάνουν να διαχειριστούν τη λειτουργία τους ή/και τα δεδομένα τους προκειμένου να γίνει πιο εύκολος ο προγραμματισμός από την πλευρά του χρήστη. Η διαχείριση των βιβλιοθηκών γίνεται από το μενού Sketch> Include Library> Manage Libraries… (Σχέδιο>Συμπερίληψη βιβλιοθήκης>Διαχείριση βιβλιοθηκών) ή από το αντίστοιχο εικονίδιο που υπάρχει στη αριστερή μπάρα λειτουργιών.

Η περιοχή διαχείρισης βιβλιοθηκών εμφανίζεται στην αριστερή περιοχή του παραθύρου. Εκεί μπορούμε να δούμε όλες τις βιβλιοθήκες που είναι εγκατεστημένες ή έτοιμες για εγκατάσταση. Για να εγκαταστήσουμε μια βιβλιοθήκη μπορούμε να κάνουμε αναζήτηση ή να περιηγηθούμε στη λίστα για να βρούμε την βιβλιοθήκη που ψάχνουμε. Στη συνέχεια επιλέγουμε την έκδοση της βιβλιοθήκης που θέλουμε να εγκαταστήσουμε και πατάμε το κουμπί εγκατάσταση. Αφού εγκατασταθεί η βιβλιοθήκη κλείνουμε τη διαχείριση βιβλιοθηκών ξαναπατώντας στο εικονίδιο και μπορούμε να βρούμε τη βιβλιοθήκη στη λίστα εγκατεστημένων βιβλιοθηκών από το μενού Sketch>Include Library> (Σχέδιο>Συμπερίληψη βιβλιοθήκης>).

Για να εισάγουμε μια βιβλιοθήκη σε ένα πρόγραμμα, ακολουθούμε τα βήματα της εικόνας Sketch > Include Library > όνομα βιβλιοθήκης (Σχέδιο > Συμπερίληψη βιβλιοθήκης > όνομα βιβλιοθήκης)
Όταν εισάγουμε μια βιβλιοθήκη στο πρόγραμμά μας, εμφανίζεται στην κορυφή του προγράμματος μια γραμμή κώδικα που δηλώνει την συμπερίληψη της βιβλιοθήκης. Π.χ #include <LiquidCrystal_I2C.h>

Για να αφαιρέσουμε μια βιβλιοθήκη από το πρόγραμμά μας αρκεί να διαγράψουμε την γραμμή:
#include <LiquidCrystal_I2C.h>
Οθόνη LCD σε παράλληλη σύνδεση
Θεωρία:
Η πλακέτα του Arduino μπορεί να συνδεθεί με διάφορους τύπους οθονών για την απεικόνιση πληροφοριών προς τον χρήστη. Ένας πολύ διαδεδομένος τύπος οθόνης, είναι η οθόνη υγρών κρυστάλλων (LCD – Liquid Crystal Display). Ειδικά οι LCD οθόνες που είναι συμβατές με τoν controller της Hitachi HD44780 είναι πολύ διαδεδομένες και με πληθώρα εφαρμογών στο διαδίκτυο. Στο εμπόριο υπάρχουν πολλές οθόνες lcd σε διάφορα μεγέθη τις οποίες μπορούμε εύκολα να διακρίνουμε από τους 16 ακροδέκτες που διαθέτουν για την σύνδεση με κάποιον μικροελεγκτή.
Στην άσκηση αυτή θα μάθουμε να χρησιμοποιούμε μια οθόνη LCD 16×2 (δηλαδή 16 χαρακτήρων 2 γραμμών) ή 20×2 με το Arduino uno. Επίσης, θα μάθουμε για την βιβλιοθήκη “LiquidCrystal’ και για τις συναρτήσεις lcd.begin(), lcd.print() και lcd.setCursor(). Υπάρχουν δύο τρόποι σύνδεσης της οθόνης με το Arduino, παράλληλη και σειριακή με το πρωτόκολλο I2C(IIC). Σε αυτή την άσκηση θα χρησιμοποιήσουμε την παράλληλη συνδεσμολογία.
Στην παρακάτω εικόνα φαίνεται μια οθόνη lcd με τους ακροδέκτες σύνδεσης.
Παρακάτω αναφέρονται οι συνδέσεις που πρέπει να γίνουν σε μια οθόνη LCD.
1: VSS ή GND συνδέεται στον αρνητικό πόλο της τροφοδοσίας (-)
2: VDD ή Vcc συνδέεται στον θετικό πόλο της τροφοδοσίας (+5V)
3: Vo ή VE(contrastvoltage) συνδέεται η μεσαία λήψη ενός ποτενσιομέτρου (10Κ) που τα άκρα του συνδέονται στο + και – της τροφοδοσίας. Έτσι εφαρμόζεται μια τάση από 0 έως 5V η οποία ρυθμίζει το contrast της οθόνης. Προσοχή, μόλις τελειώσετε με την σύνδεση της οθόνης ρυθμίστε από το ποτενσιόμετρο το contrast. Αν το contrast είναι πολύ χαμηλό στην οθόνη δεν θα εμφανίζεται τίποτε ακόμη και αν έχει συνδεθεί σωστά. Έτσι μπορεί να νομίζεται ότι κάνατε λάθος στην σύνδεση ενώ στην πραγματικότητα είναι σωστή.
Οι επόμενες ακίδες χρειάζονται για τον χειρισμό της οθόνης και τα δεδομένα που στέλνουμε για εμφάνιση ενώ τα δύο τελευταία για τον οπίσθιο φωτισμό της οθόνης.
4: RS(register select) συνδέεται σε κάποιο ακροδέκτη εξόδου του Arduino (π.χ pin12)και ελέγχεται από την βιβλιοθήκη τουArduino για να καθορίσει εάν στέλνουμε εντολές ή δεδομένα στην οθόνη LCD. Για παράδειγμα, εάν η ακίδα RS έχει ρυθμιστεί σε χαμηλή κατάσταση ή 0 volt, τότε στέλνουμε εντολές στην οθόνη LCD όπως: τοποθέτηση κέρσορα σε μια συγκεκριμένη θέση, καθαρισμός οθόνης, απενεργοποίηση οθόνης κ.τ.λ. Ενώ όταν η ακίδα RS έχει ρυθμιστεί σε υψηλή κατάσταση ή 5 volt, στέλνουμε δεδομένα ή χαρακτήρες στην οθόνη LCD.
5: RD/RW(Read/Write) καθορίζει αν θα γίνει Ανάγνωση ή Εγγραφή δεδομένων στην οθόνη. Για την εγγραφή δεδομένων συνδέεται στη γείωση (η πιο συνηθισμένη διαδικασία).
6: EN(EnableRegisters) συνδέεται σε κάποιο ακροδέκτη εξόδου του Arduino (π.χ pin 11) και ελέγχεται από την βιβλιοθήκη του Arduino για να ενεργοποιήσει του καταχωρητές που αποθηκευτούν τα δεδομένα.
7 – 14: D0 – D7 Οι οθόνες που είναι συμβατές με τον Hitachi controller μπορούν να οδηγηθούν με δυο λειτουργίες, 4-bit και 8-bit. Η συνδεσμολογία με 4-bit χρησιμοποιεί τα pins D4 – D7 ενώ η συνδεσμολογία με τα 8 bit τα pins D0 – D7 για την μεταφορά δεδομένων από το μικροελεγκτή (π.χ pin 5,4,3,2) στην οθόνη. Για να την εκτύπωση μηνύματος στην οθόνη, χρειαζόμαστε απλά την λειτουργία με τα 4-bit, έτσι σε αυτή την άσκηση θα χρησιμοποιήσουμε τη σύνδεση 4-bit.
15: A (Anode) είναι η άνοδος του LED οπίσθιου φωτισμού της οθόνης και συνδέεται μέσω μιας αντίστασης 220 Ωμ στο θετικό της τροφοδοσίας (όπως και τα led) ή σε κάποιο ακροδέκτη εξόδου του Arduino προκειμένου να μπορούμε να ανάβουμε και να σβήνουμε τον οπίσθιο φωτισμό κατά βούληση.
16: K (Cathode) είναι η κάθοδος του LED οπίσθιου φωτισμού της οθόνης και συνδέεται στην γείωση.
Το κύκλωμα σύνδεσης της οθόνης με το Arduino:

Αφού τελειώσουμε με τη συνδεσμολογία του κυκλώματος μπορούμε να δοκιμάσουμε την λειτουργία της οθόνης με ένα έτοιμο παράδειγμα εφαρμογής από το Arduino IDE. Ανοίξτε το παράδειγμα Hello World όπως φαίνεται στην παρακάτω εικόνα και φορτώστε το στην πλακέτα Arduino. Παρακολουθείστε τι εμφανίζεται στην οθόνη και μελετήστε τις εντολές που εκτελούνται. Μπορείτε να ανοίξετε και να φορτώσετε και άλλα παραδείγματα προκειμένου να κατανοήσετε καλύτερα τη λειτουργία της οθόνης.
Βασικές Εντολές της οθόνης:
Η εντολή lcd.begin(16, 2); αρχικοποιεί την βιβλιοθήκη με τους χαρακτήρες και τις γραμμές της οθόνης που έχουμε. Για παράδειγμα, αν είχαμε μια οθόνη με 20 χαρακτήρες και 4 γραμμές (20×4) θα έπρεπε να αλλάξουμε την εντολή σε lcd.begin(20, 4);.
Η εντολή lcd.print (“hello, world!”); εκτυπώνει ένα μήνυμα στην πρώτη γραμμή ξεκινώντας από τον πρώτο χαρακτήρα της οθόνης. Το κείμενο θα πρέπει να είναι με λατινικούς χαρακτήρες (δεν επιτρέπεται χρήση Ελληνικών) και να έχει μέγιστο μήκος όσο και το μέγεθος της οθόνης σε χαρακτήρες. Για παράδειγμα μια οθόνη με 16 χαρακτήρες μπορεί να εμφανίσει στην πρώτη γραμμή μήνυμα με μέγιστο μήκος 16 χαρακτήρες (μαζί με τα κενά), ενώ μια οθόνη με 20 χαρακτήρες μπορεί να εμφανίσει μήνυμα με μέγιστο μήκος 20 χαρακτήρες.
Η εντολή lcd.setCursor(0,1); μετακινεί τον κέρσορα στην πρώτη στήλη και δεύτερη γραμμή της οθόνης. Αν είχαμε μια οθόνη 20×4 και θέλαμε να ξεκινήσουμε το μήνυμα μας στον 5ο χαρακτήρα της 3ης γραμμής θα αλλάζαμε την εντολή σε lcd.setCursor(4,2);.
* Η αρίθμηση των χαρακτήρων και των γραμμών ξεκινάει από το 0.
** Για την εισαγωγή της βιβλιοθήκης διαχείρισης της lcd ακολουθούμε την παρακάτω διαδικασία.

Εφαρμογή:
Δημιουργήστε ένα δικό σας πρόγραμμα με όνομα “LCD_Message” και γράψτε τον παρακάτω κώδικα.
Παρακολουθήστε την εκτέλεση του προγράμματος και παρατηρήστε τη λειτουργία των εντολών lcd.blink(); , lcd.noBlink(); , lcd.cursor(); , lcd.noCursor();
#include <LiquidCrystal.h> // συμπερίληψη της βιβλιοθήκης LiquidCrystal
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Αρχικοποίηση. παράμετροι: (rs, enable, d4, d5, d6, d7)
void setup()
{
lcd.begin(16,2); // ξεκίνημα και ορισμός του μεγέθους της οθόνης, (16 χαρακτήρες - 2 γραμμές.
}
void loop()
{
lcd.print("Arduino"); // τυπώνει στην οθόνη "Arduino"
delay(3000); // καθυστέρηση 3 seconds
lcd.setCursor(2,1); // Ορίζει την θέση στην οποία θα τυπώσει τους επόμενους χαρακτήρες
lcd.print("LCD Display");
delay(3000);
lcd.clear(); // Καθαρίζει την οθόνη
lcd.blink(); // Εμφανίζει την θέση του κέρσορα (αναβοσβήνει)
delay(4000);
lcd.setCursor(7,1);
delay(3000);
lcd.noBlink(); // Σταματάει την εμφάνιση του κέρσορα
lcd.cursor(); // Εμφανίζει μια κάτω παύλα στη θέση όπου θα τυπώσει τον επόμενο χαρακτήρα
delay(4000);
lcd.noCursor(); // κρύβει τον κέρσορα
lcd.clear(); // Καθαρίζει την οθόνη
}
Οθόνη LCD με σειριακή επικοινωνία I2C
Θεωρία
Όπως είδαμε στην άσκηση 10A η σύνδεση μιας LCD οθόνης με το Arduino απαιτεί τη χρήση τουλάχιστον 7 ψηφιακών pin του Arduino. Δηλαδή τα μισά από αυτά που διαθέτει συνολικά. Η λύση σε αυτό το πρόβλημα είναι να χρησιμοποιήσουμε μια οθόνη LCD που χρησιμοποιεί το πρωτόκολλο σειριακής επικοινωνίας I2C. Χρησιμοποιεί μόνο δύο ακίδες I/O, τις αναλογικές εισόδους Α4 και Α5, οι οποίες δεν είναι ψηφιακές I/O και μπορούν να μοιραστούν και με άλλες συσκευές I2C.
Η κατασκευή της οθόνης και η απεικόνιση των χαρακτήρων είναι ακριβώς ίδια με αυτή που περιγράψαμε στην άσκηση 10A. Διαφορά υπάρχει μόνο στον τρόπο διασύνδεσης και μεταφοράς των δεδομένων προς απεικόνιση στην οθόνη. Αυτό επιτυγχάνεται με την χρήση ενός ειδικού προσαρμογέα που συνδέεται στην πλακέτα της οθόνης.
Προσαρμογέας LCD I2C
Στην καρδιά του προσαρμογέα βρίσκεται ένα τσιπ επέκτασης I/O 8-bit – PCF8574. Αυτό το τσιπ μετατρέπει τα δεδομένα του πρωτοκόλλου I2C του Arduino στα παράλληλα δεδομένα που απαιτούνται για την λειτουργία της οθόνης LCD.

Ο προσαρμογέας έχει ενσωματωμένο ένα τρίμερ με το οποίο ρυθμίζουμε το κοντράστ της οθόνης και ένα jumper που τροφοδοτεί με ρεύμα τον οπίσθιο φωτισμό. Για να ελέγξουμε την ένταση του οπίσθιου φωτισμού, μπορούμε να αφαιρέσουμε το βραχυκυκλωτήρα και να εφαρμόσουμε εξωτερική τάση στις ακίδες με την ένδειξη «LED».
Το πρωτόκολλο επικοινωνίας I2C
Ο δίαυλος επικοινωνίας I2C είναι πολύ δημοφιλής και χρησιμοποιείται ευρέως από πολλές ηλεκτρονικές συσκευές, επειδή μπορεί εύκολα να εφαρμοστεί σε πολλά ηλεκτρονικά σχέδια που απαιτούν επικοινωνία μεταξύ ενός master και πολλαπλών slave συσκευών ή ακόμη και μεταξύ πολλών master συσκευών. Οι ευκολία χρήσης του, έγκειται στο γεγονός ότι απαιτούνται μόνο δύο καλώδια για επικοινωνία μεταξύ σχεδόν 128 (στην ουσία 112) συσκευών όταν χρησιμοποιείται διευθυνσιοδότηση 7 bit και έως σχεδόν 1024 (στην ουσία 1008) συσκευές όταν χρησιμοποιείται διευθυνσιοδότηση 10 bit.
Η επίτευξη αυτής της επικοινωνίας στηρίζεται στο γεγονός ότι, κάθε συσκευή έχει ένα προκαθορισμένο αναγνωριστικό ή μια μοναδική διεύθυνση συσκευής, ώστε η master συσκευή να μπορεί να επιλέξει με ποια συσκευή θα επικοινωνεί κάθε φορά.
Τα δύο καλώδια ή γραμμές, ονομάζονται Serial Clock (ή SCL) και Serial Data (ή SDA). Η γραμμή SCL είναι το σήμα ρολογιού που συγχρονίζει τη μεταφορά δεδομένων μεταξύ των συσκευών στο δίαυλο I2C και παράγεται από την κύρια συσκευή (master). Η άλλη γραμμή είναι η γραμμή SDA που μεταφέρει τα δεδομένα (data).
I2C Διεύθυνση LCD
Εάν χρησιμοποιείτε πολλές συσκευές στον ίδιο δίαυλο I2C, ίσως χρειαστεί να ορίσετε διαφορετική διεύθυνση I2C για τον προσαρμογέα LCD, ώστε να μην έρχεται σε διένεξη με άλλη συσκευή I2C.
Για να γίνει αυτό, ο προσαρμογέας διαθέτει τρία ζεύγη επαφών που μπορούν να βραχυκυκλωθούν (A0, A1 και A2) όπως φαίνεται στην εικόνα.

Καθένα από αυτά χρησιμοποιείται για την κωδικοποίηση της διεύθυνσης. Η διεύθυνση της συσκευής καθορίζεται από τα ζεύγη επαφών που είναι βραχυκυκλωμένα.
Ένα σημαντικό σημείο εδώ είναι ότι αρκετές εταιρείες κατασκευάζουν το ίδιο τσιπ PCF8574, όπως η Texas Instruments και η NXP Semiconductors. Η διεύθυνση I2C της LCD οθόνης εξαρτάται από τον κατασκευαστή του chip. Εάν η οθόνη LCD διαθέτει τσιπ PCF8574 της Texas Instruments:
Σύμφωνα με το φύλλο δεδομένων της Texas Instruments, τα τρία bit επιλογής διευθύνσεων (A0, A1 και A2) τοποθετούνται στο τέλος του καταχωρητή διευθύνσεων I2C 7-bit όπως φαίνεται παρακάτω.

Επομένως οι διευθύνσεις για αυτές τις οθόνες μπορούν να πάρουν τιμές από 0x20 – 0x27.
Εάν η οθόνη LCD διαθέτει το τσιπ PCF8574 της NXP ο καταχωρητής διευθύνσεων είναι όπως φαίνεται στην παρακάτω εικόνα επομένως οι διευθύνσεις που μπορούμε να δώσουμε είναι 0x38 – 0x3F ανάλογα με τις συνδέσεις στα ζεύγη επαφών Α0,Α1 και Α2.


Επομένως, η οθόνη LCD έχει μια προεπιλεγμένη διεύθυνση I2C 0x27 Hex ή 0x3F Hex. Ανάλογα με την εταιρεία κατασκευής του τσιπ. Για να μάθουμε την πραγματική διεύθυνση I2C της οθόνης LCD πριν τη χρησιμοποιήσουμε μπορούμε να τρέξουμε ένα πρόγραμμα address scanner. Υπάρχουν πολλά διαθέσιμα στο διαδίκτυο.

Ακροδέκτες Σύνδεσης
GND: Συνδέεται με τη γείωση του Arduino.
Vcc: Συνδέεται με την τροφοδοσία του Arduino.
SDA: Ακροδέκτης I2C. Συνδέεται με το SDA (A4) του Arduino.
SCL: Ακροδέκτης I2C. Συνδέεται με το SCL (A5) του Arduino.
Εγκατάσταση βιβλιοθήκης Για να οδηγήσετε μια οθόνη LCD I2C, πρέπει πρώτα να εγκαταστήσετε μια βιβλιοθήκη που ονομάζεται LiquidCrystal_I2C. Αυτή η βιβλιοθήκη είναι μια βελτιωμένη έκδοση της βιβλιοθήκης LiquidCrystal που συνοδεύεται από το Arduino IDE. Για να εγκαταστήσετε τη βιβλιοθήκη, μεταβείτε στην επιλογή Sketch > Include Library > Manage Libraries…(Σχέδιο > Συμπερίληψη βιβλιοθήκης > Διαχείριση βιβλιοθηκών…). Στο μενού που ανοίγει πληκτρολογείτε στο πεδίο αναζήτησης τις λέξεις κλειδιά π.χ liquidcrystal i2c και από τα αποτελέσματα αναζήτησης επιλέγετε την βιβλιοθήκη που θέλετε να εγκαταστήσετε όπως φαίνεται στις εικόνες.


Εφαρμογή:
Συνδεσμολογήστε το κύκλωμα του σχήματος. Δημιουργήστε ένα δικό σας πρόγραμμα με όνομα “LCD_I2C_Message” και γράψτε τον παρακάτω κώδικα. Παρακολουθήστε την εκτέλεση του προγράμματος και παρατηρήστε τη λειτουργία των εντολών lcd.blink(); , lcd.noBlink(); , lcd.cursor(); , lcd.noCursor();


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // Αρχικοποίηση της οθόνης
lcd.backlight();
}
void loop()
{
lcd.setCursor(3,0);
lcd.print("Arduino"); // τυπώνει στην οθόνη "Arduino"
delay(3000); // καθυστέρηση 3 seconds
lcd.setCursor(2,1); // Ορίζει την θέση στην οποία θα τυπώσει τους επόμενους χαρακτήρες
lcd.print("LCD Display");
delay(3000);
lcd.clear(); // Καθαρίζει την οθόνη
lcd.blink(); // Εμφανίζει την θέση του κέρσορα (αναβοσβήνει)
delay(4000);
lcd.setCursor(7,1);
delay(3000);
lcd.noBlink(); // Σταματάει την εμφάνιση της θέσης του κέρσορα
lcd.cursor(); // Εμφανίζει τον κέρσορα στη θέση όπου θα τυπώσει τον επόμενο χαρακτήρα
delay(4000);
lcd.noCursor(); // κρύβει τον κέρσορα
lcd.clear(); // Καθαρίζει την οθόνη
}
Προσομοίωση της λειτουργίας στο Tinkercad
- Πατήστε το κουμπί Start Simulation για να δείτε την λειτουργία του κυκλώματος.
- Πατήστε το κουμπί Code για να δείτε τον κώδικα.
