Οθόνες OLED SSD1306 – Raspberry Pi Pico

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

Η MicroPython διαθέτει μια (μη τυπική) βιβλιοθήκη για μονόχρωμες οθόνες OLED με ελεγκτή SSD1306 και δίαυλο επικοινωνίας I2C ή SPI.

Δεδομένου ότι ο πιο συνηθισμένος τύπος αυτού του μοντέλου οθονών που μπορούμε να βρούμε στην αγορά είναι αυτές με ανάλυση 128×64 pixel – 0,96″ (25×14 mm) και δίαυλο επικοινωνίας I2C, η χρήση του θα αναπτυχθεί ώστε να είναι σε θέση να γνωρίζει τις επιλογές κειμένου και γραφικών (σημεία, γραμμές, ορθογώνια και εικόνες) που είναι διαθέσιμες στη βιβλιοθήκη.

Βιβλιοθήκη SSD1306

Η (μη τυπική) βιβλιοθήκη για μονόχρωμες οθόνες OLED με τα προγράμματα οδήγησης SSD1306 και δίαυλο επικοινωνίας I2C ή SPI για MicroPython μπορεί να βρεθεί στο GitHub:

https://github.com/micropython/micropython-lib/tree/68e3e07bc7ab63931cead3854b2a114e9a084248/micropython/drivers/display

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

Το Πρόγραμμα

Η βιβλιοθήκη ssd1306.py χρησιμοποιεί τη βιβλιοθήκη FrameBuff της MicroPython , καθώς σας επιτρέπει να δημιουργήσετε αποτελεσματικά buffer μνήμης για να εργαστείτε με απλές γραφικές προβολές, επομένως είναι απαραίτητο να αναπτύξετε τη λειτουργία της.

Η FrameBuff έχει τις μεθόδους για να σχεδιάσει σημεία, γραμμές, ορθογώνια, εικόνες ή να γράψει κείμενο, καθώς και να μετακινήσει εικόνες γύρω από την οθόνη.

Ένα framebuffer (τμήμα της μνήμης – buffer – δεσμευμένο για την προσωρινή διατήρηση μιας εικόνας – πλαίσιο-.

Πριν ξεκινήσουμε…

  • Το σύστημα συντεταγμένων που χρησιμοποιείται από τη βιβλιοθήκη για τον εντοπισμό αναπαραστάσεων είναι το καρτεσιανό σύστημα (μονάδες σε pixels, εικονοστοιχεία). Ο οριζόντιος άξονας του είναι και ο κάθετος άξονας είναι Y.
    • Η αρχή (0,0) βρίσκεται στην επάνω αριστερή γωνία.
    • Η αντίθετη κορυφή σε μια οθόνη 128×64 pixel θα βρίσκεται στη συντεταγμένη (127×63).
  • Οι οθόνες OLED είναι μονόχρωμες και το χρώμα καθορίζεται είτε ως “0” (ανενεργό – χρώμα της πρόσφατα αρχικοποιημένης οθόνης) ή «1» (ενεργό – φωτισμένο).

Πρέπει να χρησιμοποιήσετε το . show() για να εμφανίσετε τι έχει σχεδιαστεί στην οθόνη. Μέχρι να γίνει, δεν θα εμφανίζει αλλαγές.

Φόρτωση βιβλιοθηκών και δημιουργία του αντικειμένου oled

from machine import Pin, I2C 
import ssd1306 
from time import sleep
i2c = I2C(-1, scl=Pin(22), sda=Pin(21)) 
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

Βασικές οδηγίες:

oled.fill(1) # Γεμίστε την οθόνη (φωτίστε την εντελώς) 
oled.fill(0) # Γεμίστε την οθόνη (απενεργοποιήστε την εντελώς) 
oled.show() # Εμφανίζει το αποτέλεσμα 
oled.contrast(50) # Ρυθμίστε την αντίθεση σε ένταση 50% 
oled.inver(1) # Αντιστρέψτε αυτό που πρόκειται να εμφανιστεί 
.poweron() # Μπορείτε  να την ενεργοποιήσετε 
.poweroff() # Μπορείτε να την απενεργοποιήσετε 

Αντικείμενα που μπορούν να σχεδιαστούν στην οθόνη:

.pixel(x0, y0 [, color])

oled.pixel(11,5,1) # Σχεδιάστε ένα φωτιζόμενο pixel στο (5,10)
.line(x0, y0, x1, y1, color) 

oled.line(4,5,18,9,1) 
# Σχεδιάστε μια φωτισμένη γραμμή. Με αρχή (4,5) και τέλος (18, 9))
.hline(x0, y0, πλάτος, χρώμα) 

oled.hline(5, 4, 16, 1) 
# Σχεδιάστε μια φωτισμένη οριζόντια γραμμή. Με αρχή (5, 4) και πλάτος 16 pixels

.vline(x0, y0, ύψος, χρώμα)

oled.vline(11, 5, 10, 1)  
# Σχεδιάστε μια φωτιζόμενη κάθετη γραμμή. Με αρχή (11,5) και ύψος 10 pixel
.rect(x0, y0, πλάτος, ύψος, χρώμα) 

oled.rect(5, 3, 14, 12, 1) 
# Σχεδιάστε ένα φωτιζόμενο ορθογώνιο. Με αρχή (5,3) και πλάτος y  και ύψος x 14x12
.fill_rect(x0, y0, πλάτος, ύψος, χρώμα) 

oled.fill_rect(5, 3, 14, 12, 1) 
# Σχεδιάστε ένα γεμάτο ορθογώνιο φωτισμένο. 
# Με αρχή (5,3) πλάτος y και ύψος x 14x12 pixel
.text(κείμενο, x0, y0 [, χρώμα])

oled.text("w"; 6, 1, 1) # Πληκτρολογήστε "w" φωτισμένο. Με αρχή (6,1).
oled.text("Hello world!", 16, 28, 0) # Πληκτρολογήστε "Hello world!" σκοτεινό.
# Με αρχή (16,28).
.scroll(x0, y0) 

oled.scroll(20,10)

1. Σχεδίαση Κειμένου OLED

Σκοπός

Ας δοκιμάσουμε τη λειτουργία της συσκευής OLED 1306

Λειτουργικότητα

Στην εφαρμογή, θα χρησιμοποιήσουμε τη βιβλιοθήκη “ssd1306” που ενσωματώνει τις απαραίτητες λειτουργίες για να μπορέσουμε να διαχειριστούμε αυτήν τη συσκευή. Η επικοινωνία με το OLED γίνεται μέσω της θύρας I2C του Raspberry Pi Pico. Αυτό που θα στείλουμε στην οθόνη για να εμφανιστεί θα είναι:

  • Το γράμμα “w” για 2 δευτερόλεπτα. Στη θέση (6,1) και λευκό χρώμα
  • Η φράση “Hello world” σε αντίστροφο βίντεο για 2 δευτερόλεπτα.
  • Το γράμμα “w” με κύλιση πέντε φορές στην οθόνη

Πρόγραμμα

Το πρόγραμμα θα πραγματοποιηθεί στα ακόλουθα βήματα.

Φόρτωση των βιβλιοθηκών

from machine import Pin, I2C 
from ssd1306 import SSD1306_I2C 
import framebuf 
import utime

Ορίζουμε το πλάτος και το ύψος σε εικονοστοιχεία της οθόνης και επίσης το I2C

WIDTH = 128 # Ορισμός πλάτους μεγέθους οθόνης 
HEIGHT = 64

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000) 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)

Δείχνουμε “w” στην οθόνη, θέση (6,1) για χρόνο 2 δευτερόλεπτα.

oled.text("w", 6, 1, 1) # πληκτρολογήστε "w" φωτισμένο. Με αρχή (6,1).
oled.show() # Εμφανίζει το αποτέλεσμα 
utime.sleep(2) # Περιμένει 2 δευτερόλεπτα

Ρυθμίζουμε την οθόνη να αντιστρέφει το βίντεο (λευκό) και να γράφει “hello world” στη θέση (16, 28) με μαύρο χρώμα. Περιμένει για 2 δευτερόλεπτα.

oled.fill(1) # Γεμίζει την οθόνη (φωτίζει ολόκληρη την οθόνη)
oled.text("hello world!", 16, 28, 0) 
# Πληκτρολογήστε "Hello world!" μακριά. Προέλευση (16, 28).
oled.show() # Εμφανίζει το αποτέλεσμα
utime.sleep(2)

Εμφάνιση “w” και κύλιση του γράμματος στην οθόνη

oled.text("W", 2, 2, 1) # ΓΡάφει ένα "w" φωτισμένο. Με αρχή (2,2). 
oled.show() #  # Εμφανίζει το αποτέλεσμα για x εντός εύρους (0,5)
for x in range (0, 5): # Μετατοπίζει την εικόνα σε (20,10) 5 φορές. 
  oled.scroll(20,10) 
  utime.sleep(0.5) 
  oled.show() # Εμφανίζει το αποτέλεσμα

Συνολικά ο κώδικας:

# Οδήγηση της συσκευής OLED 1306
from machine import Pin, I2C 
from ssd1306 import SSD1306_I2C 
import framebuf 
import utime

WIDTH = 128 # Ορισμός πλάτους μεγέθους οθόνης 
HEIGHT = 64

i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000) 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
# Σχεδίαση Κειμένου
oled.text("w", 6, 1, 1) # πληκτρολογήστε "w" φωτισμένο. Με αρχή (6,1).
oled.show() # Εμφανίζει το αποτέλεσμα 
utime.sleep(2) # Περιμένει 2 δευτερόλεπτα
oled.fill(1) # Γεμίζει την οθόνη (φωτίζει ολόκληρη την οθόνη)
oled.text("hello world!", 16, 28, 0) 
# Πληκτρολογήστε "Hello world!" μακριά. Προέλευση (16, 28).
oled.show() # Εμφανίζει το αποτέλεσμα
utime.sleep(2)
# κύλιση
oled.text("W", 2, 2, 1) # ΓΡάφει ένα "w" φωτισμένο. Με αρχή (2,2). 
oled.show() #  # Εμφανίζει το αποτέλεσμα για x εντός εύρους (0,5)
for x in range (0, 5): # Μετατοπίζει την εικόνα σε (20,10) 5 φορές. 
  oled.scroll(20,10) 
  utime.sleep(0.5) 
  oled.show() # Εμφανίζει το αποτέλεσμα

Ρύθμιση στην πράξη

Ανάλυση και πρόταση δραστηριοτήτων

Αυτή θα πρέπει να είναι η εμφάνιση της οθόνης OLED κατά την εκτέλεση της εφαρμογής

2. Αναλογικό σήμα OLED

Σκοπός

Θέλουμε να καταγράψουμε στην οθόνη OLED την αναλογική τιμή που διαβάζεται από ένα κανάλι

Λειτουργικότητα

Θα ορίσουμε μια αναλογική ράβδο στον ακροδέκτη GP27 και θα πάρουμε την τιμή ανάγνωσης και θα την τοποθετήσουμε στην οθόνη OLED η οποία, όπως και στην προηγούμενη περίπτωση, συνδέεται με I2C

Πρόγραμμα

Το πρόγραμμα θα πραγματοποιηθεί στα ακόλουθα βήματα.

Φόρτωση των βιβλιοθηκών

from machine import Pin, I2C, ADC 
from ssd1306 import SSD1306_I2C 
import framebuf 
import utime

Ορίζουμε την ακίδα εισόδου του αναλογικού σήματος GP27, το πλάτος και το ύψος σε εικονοστοιχεία της οθόνης και επίσης το I2C

analog1=ADC(27)
WIDTH = 128 # εικονοστοιχεία βάσης
HEIGHT = 64 # εικονοστοιχεία ύψους
# Ξεκινήστε μία κλάση I2C χρησιμοποιώντας GP4 και GP5 (I2C0)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000) 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Εγκαινίαση OLED

Στο τμήμα while του προγράμματος, θα γράψουμε στην οθόνη την τιμή του αναλογικού σήματος που διαβάζεται στον ακροδέκτη GP27

while True: 
  oled.fill(0) # Καθαρίστε την οθόνη OLED. 
  adcValue = analog1.read_u16() # Προσθήκη κειμένου 
  oled.text("Value="+ str(adcValue),0,10) # Συντεταγμένες x=0, y=10
  oled.show() # Κατεβάστε το κείμενο στην οθόνη και εμφανίστε το

Συνολικά ο κώδικας:

# Εμφανίζει την τιμή του αναλογικού καναλιού GP27 με
# OLED συνδεδεμένο στο δίαυλο I2C με τη βιβλιοθήκη ssd1306
from machine import Pin, I2C, ADC 
from ssd1306 import SSD1306_I2C 
import framebuf 
import utime

analog1=ADC(27)
WIDTH = 128 # εικονοστοιχεία βάσης
HEIGHT = 64 # εικονοστοιχεία ύψους
# Ξεκινήστε μία κλάση I2C χρησιμοποιώντας GP4 και GP5 (I2C0)
i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=200000) 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c) # Εγκαινίαση OLED

while True: 
  oled.fill(0) # Καθαρίστε την οθόνη OLED. 
  adcValue = analog1.read_u16() # Προσθήκη κειμένου 
  oled.text("Value="+ str(adcValue),0,10) # Συντεταγμένες x=0, y=10
  oled.show() # Κατεβάστε το κείμενο στην οθόνη και εμφανίστε το

Ρύθμιση στην πράξη

Ανάλυση και πρόταση δραστηριοτήτων

Αυτή θα πρέπει να είναι η εμφάνιση της οθόνης OLED κατά την εκτέλεση της εφαρμογής.