Ένα ιστολόγιο για όσους αγαπούν τις ηλεκτρονικές κατασκευές...

Κυριακή 14 Απριλίου 2019

Πως να συνδέσετε LCD οθόνη χαρακτήρων στο Arduino σας


Είναι πολύ συνηθισμένο όταν κάνουμε μια εφαρμογή με το arduino να πρέπει να εμφανίσουμε κάποια αποτελέσματα ή μηνύματα σε οθόνη. Η πιο συνήθης είναι η απεικόνιση χαρακτήρων σε οθόνη LCD με πιο διαδεδομένη αυτή των 16 Χ 2 δηλαδή 16 χαρακτήρων 2 γραμμών.
Για παράδειγμα μπορούμε να εμφανίζουμε τα αποτελέσματα από κάποιες μετρήσεις . Αυτό φυσικά μπορεί να γίνει και με led display 7 τμημάτων, όμως οι οθόνες λόγω του πλήθους των χαρακτήρων μας δίνει πολύ περισσότερες δυνατότητες αφού μπορούν να απεικονίσουν και χαρακτήρες και έτσι για παράδειγμα μπορούμε να εμφανίσουμε την θερμοκρασία σαν: TEMP = 22.4oC. Ακόμη μπορούμε να έχουμε ένα μενού όπου ρυθμίζουμε πολλές μεταβλητές και ανά πάσα στιγμή βλέπουμε στην οθόνη το όνομα ποιας μεταβλητής ρυθμίζουμε κάτι που είναι πολύ δύσκολο σε ένα display αριθμών.
Μπορούμε να κάνουμε ακόμη περισσότερα πράγματα όπως custom χαρακτήρες ή να χρησιμοποιήσουμε κάποια από τις γραμμές (ή περισσότερες) σαν μπάρες ένδειξης ρυθμίσεων.


Η σύνδεση της οθόνης είναι πολύ εύκολη και οι έτοιμες βιβλιοθήκες που υπάρχουν κάνουν την χρήση της παιχνιδάκι. Υπάρχουν όμως μερικά μικρά μυστικά για αυτούς που ξεκινάνε τώρα με το arduino και αυτός είναι ο σκοπός του άρθρου. Παρακάτω λοιπόν εξηγώ πως θα συνδέσετε μια οθόνη LCD στο arduino σας (με δύο τρόπους) και πως μπορείτε να την χρησιμοποιήσετε.


Στην εικόνα αριστερά φαίνονται οι συνδέσεις που πρέπει να γίνουν σε μια οθόνη LCD.
Στην ακίδα 1 (από αριστερά) συνδέουμε το πλην της τροφοδοσίας και στο 2 το θετικό της τροφοδοσίας(5V). Στο τρίτο ποδαράκι συνδέουμε την μεσαία λήψη από ένα ποτενσιόμετρο (10Κ) που τα άκρα του συνδέονται στο + και - της τροφοδοσίας. Αυτό δίνει στο τρίτο ποδαράκι μια τάση από 0 έως 5V ρυθμιζόμενη η οποία ρυθμίζει το contrast της οθόνης. Προσοχή, μόλις τελειώσετε με την σύνδεση της οθόνης ρυθμίστε από το ποτενσιόμετρο  το contrast. Αν το contrast είναι πολύ χαμηλό στην οθόνη δεν θα εμφανίζεται τίποτε ακόμη και αν έχει συνδεθεί σωστά. Έτσι μπορεί να νομίζεται ότι κάνατε λάθος στην σύνδεση ενώ στην πραγματικότητα η οθόνη δείχνει αυτά που πρέπει αλλά δεν φαίνονται.
Οι επόμενες ακίδες χρειάζονται για τον χειρισμό της οθόνης και τα δεδομένα που στέλνουμε για εμφάνιση ενώ τα δύο τελευταία είναι το backlight της LCD οθόνης. Το LED το τροφοδοτούμε μέσω  αντίστασης όπως ένα απλό LED. 

Στο παρακάτω σχήμα μπορείτε να δείτε τις συνδέσεις που πρέπει να γίνουν στην οθόνη. 


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

Περάστε το παρακάτω πρόγραμμα και δείτε την χρήση των εντολών.

#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 Tutorial"); 
 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.clear(); κάνει το πρόγραμμα αργό και είναι καλό να την αποφεύγετε. Μπορείτε να τυπώνετε νέα δεδομένα πάνω στα παλιά με προσοχή όμως γιατί σε κάποιες περιπτώσεις όπου τα παλιά δεδομένα έχουν περισσότερους χαρακτήρες αφήνουν κατάλοιπα στην οθόνη και βγαίνει λανθασμένη ένδειξη.

Δεύτερος τρόπος μέσω I2C.

Ουσιαστικά η παραπάνω σύνδεση δεσμεύει 6 εξόδους και αν θέλουμε να χειριστούμε το backlight από το arduino, δηλαδή να το ενεργοποιούμε και να το απενεργοποιούμε κατά βούληση, τότε χρειαζόμαστε 7 εξόδους του arduino. Αυτό σε περίπτωση που δεν χρησιμοποιούμε πολλά Ι/Ο ποδαράκια του arduino για άλλα πράγματα όπως αισθητήρια ρελέ κλπ. δεν αποτελεί πρόβλημα.
Αν όμως θέλουμε κάποια Ι/Ο για πλήκτρα χειρισμού, άλλα για αισθητήρια και  άλλα για εξόδους ρελέ ή άλλα περιφερειακά διαπιστώνουμε τελικά ότι τα Ι/Ο ποδαράκια του arduino τελειώνουν γρήγορα και θα θέλαμε να ήταν αρκετά περισσότερα. 


Σε αυτή την περίπτωση μπορούμε να εξοικονομήσουμε Ι/Ο ποδαράκια με ένα διαφορετικό τρόπο σύνδεσης της οθόνης μέσω I2C πρωτοκόλλου. Για αυτή την σύνδεση χρειαζόμαστε ένα μικρό module σαν αυτό στην εικόνα που συνδέεται στην οθόνη και την μετατρέπει σε I2C. Αυτό προσθέτει λίγο κόστος (περίπου 0,5~1 ευρώ) αλλά ελευθερώνει αρκετά Ι/Ο πιν και επιπλέον κάνει πιο εύκολη την σύνδεση αφού θέλει μόνο 4 καλώδια για σύνδεση και περιλαμβάνει το ποτενσιόμετρο για το contrast καθώς και ένα jumper για επιλογή ΟΝ/ΟFF του backlight.


 Η σύνδεση της οθόνης μέσω I2C γίνεται με 4 καλώδια. Τα 2 είναι για την τροφοδοσία +5V και GND. Tα άλλα 2 για clock  και data

arduino uno
SDA pin of I2C module -> SDA pin A4
SCL pin of I2C module -> SCL pin A5
arduino Nano
SDA pin of I2C module -> SDA pin A4
SCL pin of I2C module -> SCL pin A5
arduino Mega2560
SDA pin of I2C module -> SDA pin D20
SCL pin of I2C module -> SCL pin D21
ESP32
SDA pin of I2C module -> SDA pin D21
SCL pin of I2C module -> SCL pin D22 


Κατεβάστε την βιβλιοθήκη από εδώ https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library


Παράλληλα με την οθόνη σε σύνδεση I2C μπορούν να συνδεθούν και άλλες συσκευές I2C. Για να μπορεί ο ελεγκτής να χειριστεί τις συσκευές χωρίς να μπερδεύεται για κάθε συσκευή χρησιμοποιείται μια διεύθυνση. Επάνω στο module υπάρχουν 3 θέσεις για βραχυκύκλωση που έχουν θέση διακόπτη και ορίζουν την διεύθυνση που έχει το module. Από το εργοστάσιο έχουν την 0x27 αλλά αυτό ποικίλει από module σε module.
Αν δεν λειτουργήσει με αυτή την διεύθυνση τρέξτε τον παρακάτω κώδικα στο arduino που είναι συνδεδεμένη η οθόνη Ι2C και στην παρακολούθηση της σειριακής θύρας θα σας δείξει την διεύθυνση της οθόνης.
#include <Wire.h>

void setup() {
Serial.begin (9600);
Serial.println ("Scanning I2C device...

Wire.begin();
for (byte i = 0; i <50; i++)
{
Wire.beginTransmission (i);
if (Wire.endTransmission () == 0)
{
Serial.print ("Address found->");
Serial.print (" (0x");
Serial.print (i, HEX);
Serial.println (")");
Count++;
}
Serial.print ("Found ");
Serial.print (count, DEC);
Serial.println (" device");
} 

void loop() {}

Αν έχετε και άλλες συσκευές I2C και θέλετε να αλλάξετε την διεύθυνση ακολουθήστε τον παρακάτω πίνακα:

A0 A1 A2 HEX Address
1 1 1 0x27
0 1 1 0x26
1 0 1 0x25
0 0 1 0x24
1 1 0 0x23
0 1 0 0x22
1 0 0 0x21
0 0 0 0x20

Υπόψη ότι 1 = Not Connected και  0 = Connected (για 0 βραχυκυκλώστε)

Δοκιμαστικό πρόγραμμα, ανοίξτε την παρακολούθηση της σειριακής και στείλτε χαρακτήρες οι οποίοι θα τυπωθούν στην οθόνη.


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16,2);  // (διεύθυνση I2C, χαρακτήρες, γραμμές)
void setup()   
{
Serial.begin(9600);  

lcd.init();  // αρχικοποίηση
lcd.backlight(); // ενεργοποιεί το backlight

lcd.setCursor(0,0); // τοποθετεί τον κέρσορα στον πρώτο χαρακτήρα της πρώτης γραμμής
lcd.print("Hello, world!"); εκτυπώνει το Hello, world!
delay(1000);
lcd.setCursor(0,1); τοποθετεί τον κέρσορα στον πρώτο χαρακτήρα της δεύτερης γραμμής
lcd.print("LCD tutorial");
delay(3000);  

lcd.clear();
lcd.setCursor(0,0); 
lcd.print("Use Ser. Monitor"); 
lcd.setCursor(0,1);
lcd.print("Type to display");  

}

void loop()   
{
{

if (Serial.available()) {
delay(100);

lcd.clear();

while (Serial.available() > 0) {
lcd.write(Serial.read();
}
}
}
}
Αν ακόμη έχετε απορίες με την σύνδεση της οθόνης σας στο arduino μη διστάσετε να ρωτήσετε.
Καλή επιτυχία.



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

Count down timer - χρονικό αντίστροφης μέτρησης

Μια απλή κατασκευή χρονομέτρου με αντίστροφη μέτρηση. Μπορεί να μετρήσει μέχρι 100 λεπτά με βήμα του ενός δευτερολέπτου. Είναι ιδανικό για ...