Skip to main content

4.1 Prikaz poruke na LCD-u

Svaki primjer do sada javljao se natrag preko konzole, što znači da pločica ima nešto reći samo dok je privezana na računalo. Ovaj to mijenja: 16x2 LCD iz kita daje pločici vlastiti ekran, a poruka ispisana tamo ostaje na njemu bez obzira gleda li računalo ili ne.

Spajanje je najlakše u cijelom kitu. LCD je Qwiic modul, pa jedan kabel obavlja sve.

U ovoj dokumentaciji naučit ćeš:

  • Kako spojiti 16x2 LCD jednim Qwiic kabelom.
  • Za što služi ljubičasti I2C LCD adapter na pozadini ekrana.
  • Kako inicijalizirati ekran i upaliti njegovo pozadinsko svjetlo, i zašto je redoslijed važan.
  • Kako staviti tekst gdje želiš pomoću setCursor(), i zašto je brojanje od nule važno.
  • Zašto u jedan red ulazi samo 16 znakova, i što se dogodi sa sedamnaestim.
  • Što učiniti kada ekran svijetli ali ostaje prazan, jedina greška koja uhvati svakoga.

Potreban hardver:

  • 1x Soldered NULA MINI pločica
  • 1x Breadboard
  • 1x 16x2 LCD ekran s I2C adapterom
  • 1x Qwiic kabel
  • 1x USB-C kabel
ℹ️
Nema otpornika ni jumper žica. Kao u primjeru 3.1, ovo je Qwiic modul, pa jedan kabel nosi napajanje i podatke zajedno i ulazi samo na jedan način. Breadboard je tu samo da drži pločicu stabilno.

Spajanje komponenti

1. Umetni NULA MINI pločicu na breadboard

Utisni pločicu u jedan kraj breadboarda tako da njezina dva reda pinova sjednu s obje strane središnjeg kanala, s čipom okrenutim prema dolje.

NULA MINI pločica postavljena na breadboard
Korak 1: pločica postavljena na breadboard

2. Utisni Qwiic kabel u pločicu

NULA MINI ima jedan Qwiic konektor, na rubu pločice između tipki USER i RST. To je bijeli konektor označen s qwiic na silkscreenu. Utisni kabel dok ne klikne.

Qwiic kabel utisnut u NULA MINI pločicu, s drugim krajem još slobodnim
Korak 2: kabel u Qwiic konektoru pločice, drugi kraj još slobodan
⚠️
Ne pomiješaj ga s manjim konektorom s dva kontakta na suprotnom rubu pločice, označenim s - i +. To je konektor za bateriju, i Qwiic kabel u njega ne ulazi.

Ako želiš vidjeti točno o kojem se konektoru radi na goloj pločici, ovdje je istaknut:

NULA MINI pločica s istaknutim Qwiic konektorom
Qwiic konektor na NULA MINI, istaknut plavim

3. Utisni drugi kraj u ekran

Okreni ekran i naći ćeš ljubičastu pločicu pričvršćenu na njegovu pozadinu, sa silkscreenom I2C LCD ADAPTER. Ona nosi dva Qwiic konektora, po jedan na svakom kraju. Utisni slobodni kraj kabela u bilo koji od njih. Spojeni su međusobno, a rezervni postoji da možeš dalje nalančati još jedan modul.

Ekran okrenut da se vidi njegova ljubičasta adapterska pločica, s Qwiic kabelom koji ide s nje na NULA MINI na breadboardu
Korak 3: ekran okrenut, kabel u jednom od dva Qwiic konektora adaptera
ℹ️
Duž ruba adaptera možeš vidjeti i rupice označene s SCL, SDA, 5V i GND. To je ista veza izvedena na pinove za lemljenje, za pločice koje nemaju Qwiic utičnicu. Ovdje ti ne treba. Kabel obavlja isti posao.

4. Utisni USB-C kabel

Spoji pločicu na računalo. Ljubičasto PWR svjetlo se upali i pozadinsko svjetlo ekrana zasvijetli plavo, ali sam ekran ostaje prazan, jer mu još ništa nije reklo što prikazati.

Gotov sklop sa spojenim USB-C: pozadinsko svjetlo ekrana svijetli plavo ali ekran ne prikazuje znakove
Korak 4: napojeno, prije pokretanja skripte. Pozadinsko svjetlo upaljeno, ekran još prazan
ℹ️
Ovo vrijedi dobro pogledati, jer točno tako izgleda i greška. Upaljeno pozadinsko svjetlo znači samo da ekran ima napajanje. Ne govori ništa o tome razgovara li pločica s njim. Trenutno je ekran prazan iz običnog razloga što nijedna skripta nije pokrenuta. Ako i dalje izgleda ovako nakon što pritisneš Run, vidi Ako je pozadinsko svjetlo upaljeno a ekran prazan ispod.

Za što služi adapterska pločica

Pogledaj pobliže zelenu pločicu ekrana i izbrojat ćeš 16 pinova duž njezinog gornjeg ruba, označenih s VSS, VDD, V0, RS, RW, E, D0 do D7, A i K. To je izvorno sučelje HD44780, kontrolerskog čipa koji pogoni ekrane poput ovog od 1980-ih. Spajanje direktno na njega znači četrnaest ili tako nešto spojeva, i cijeli bi ovaj primjer prošao u utiskivanju jumper žica u breadboard.

Ljubičasta adapterska pločica taj posao odrađuje za tebe. Ona trajno sjedi na tih 16 pinova i s tvojom pločicom razgovara preko samo dvije žice.

Ljubičasta I2C LCD adapterska pločica montirana na pozadini ekrana, s vidljivim silkscreen oznakama
I2C LCD adapter: 16 pinova ekrana s jedne strane, dva Qwiic konektora i I2C adresa s druge

Te dvije žice su I2C sabirnica, ista koju je ultrazvučni senzor koristio u primjeru 3.1: SDA nosi podatke a SCL daje takt koji drži oba kraja u koraku. Nekoliko modula može dijeliti jedan par žica, svaki odgovarajući na svoju adresu, i zato ova pločica ima ispisano I2C ADDR 0X20. 0x20 je broj na koji ovaj ekran odgovara.

Zato se ekran stvara iz istog i2c objekta koji već poznaješ, bez adrese i bez vlastitih brojeva pinova:

i2c = I2C(0, scl=Pin(7), sda=Pin(6))
lcd = LCD_I2C(i2c)
ℹ️
LCD_I2C već zna da je 0x20 mjesto gdje će naći ekran, i sam postavlja kontroler za ekran s dva reda, za razliku od Arduino biblioteke, koja se stvara kao LCD lcd(16, 2). Nema se što predati osim veze.
⚠️
Dio scl=Pin(7), sda=Pin(6) nije neobavezan, točno kao u 3.1. Zamijeni ta dva broja ili ih izostavi i ekran nikada ne odgovori, što izgleda kao mrtav ekran a pogrešno je upisan pin.

Možeš primijetiti i tri mala kontakta označena s A0, A1 i A2 blizu SOLDERED logotipa. Njihovo premoštavanje lemom mijenja adresu, do 0x27. To bi radio samo ako bi želio staviti dva takva ekrana na jedan kabel. Ostavi ih na miru.


Dobavljanje drivera na pločicu

Ovom primjeru treba LCD.py, koji živi u lib folderu repozitorija primjera. Kao i kod ultrazvučnog senzora, driver mora biti na samoj pločici, u njezinom /lib folderu, jer tamo MicroPython gleda kada vidi from LCD import LCD_I2C.

Ako si prošao Postavljanje MicroPythona, sva četiri drivera već su tamo. Ako nisu:

mpremote mip install github:SolderedElectronics/Soldered-NULA-Beginner-kit-MicroPython-project-examples/lib
⚠️
ImportError: no module named 'LCD' znači da driver nije na pločici, ili je sletio negdje drugdje osim u /lib. Spajanje i ekran nisu problem.

begin() prije backlight()

Ekran pokreću dva poziva, a njihov redoslijed nije zamjenjiv:

lcd.begin()
lcd.backlight()

begin() otvara razgovor i priprema ekran za upotrebu. Kao dio toga ekran i resetira, što gasi pozadinsko svjetlo. Zato backlight() mora doći drugi. Stavi ga prvog i svjetlo se trenutak kasnije ponovno ugasi, a tebi ostaje mračan ekran i nikakav očit razlog zašto.

ℹ️
clear() zatim briše sve što je ostalo od onoga što se izvršavalo prije. Bez njega možeš na kraju čitati mješavinu stare i nove poruke, jer ekran nastavlja prikazivati ono što mu je posljednje rečeno dok to nešto ne promijeni.

Redovi, stupci i brojanje od nule

Ekran je rešetka: 16 znakova u širinu, 2 reda u visinu. lcd.setCursor(column, row) odabire gdje će sljedeća stvar koju ispišeš sletjeti, a oba broja počinju od nule:

  • lcd.setCursor(0, 0) je prvi znak gornjeg reda.
  • lcd.setCursor(0, 1) je prvi znak donjeg reda.

Dakle, redovi su numerirani 0 i 1, a ne 1 i 2, a stupci idu od 0 do 15. Pogriješiti u tome ne diže grešku, a to je ono zbog čega ju je teško primijetiti: driver svaki red osim 0 tretira kao donji red, pa setCursor(0, 2) i čak setCursor(0, 5) svi tiho pišu u red 1. Ako linija teksta stalno sleti u pogrešan red, to je zato.

Ograničenje od 16 znakova vrijedi uzeti ozbiljno, jer ekran ne prelazi u sljedeći red. Ispiši string od devetnaest znakova i vidjet ćeš prvih šesnaest znakova i ništa više. Ipak, posljednja tri nisu izgubljena. Svaki red je u stvari buffer od 40 znakova unutar kontrolerskog čipa, a staklo je samo prozor od 16 znakova na njega, pa dodatni znakovi sjede tek izvan ruba ekrana. Primjer 4.2 to iskorištava pomicanjem tog prozora. Za sada je praktično pravilo jednostavno to da sve nakon šesnaestog znaka neće biti vidljivo. Obje poruke u ovom primjeru dugačke su dvanaest znakova, pa obje ugodno ulaze:

stupac: 0123456789012345
red 0: Hello, NULA!
red 1: Let's start!
ℹ️
Prebroji svoje poruke prije ispisa. Ako je string predugačak, obično rješenje je skratiti tekst, a ne razdvojiti ga na dva reda, jer drugi red normalno nosi nešto drugo.

Sve se događa jednom

Još jedna stvar koju treba primijetiti prije koda: ova skripta nema while True petlju uopće. Izvršava se od prve linije do posljednje i onda završi.

To je namjerno. LCD drži ono što mu je posljednje rečeno prikazati, a da ga se ne podsjeća, pa je ispis poruke jednom dovoljan. Ostaje na ekranu nakon što skripta završi, a nestaje samo kada prekineš napajanje ili pokreneš nešto drugo.

ℹ️
Arduino verzija ovog primjera sve stavlja u setup() i ostavlja loop() prazan iz istog razloga. MicroPythonu prazna petlja ne treba uopće. Skripta koja dođe do svoje posljednje linije jednostavno je završila.

Kod

# I2C je način da nekoliko uređaja razgovara s pločicom preko samo dvije žice, i to je ono što Qwiic konektor
# nosi. Treba nam ovdje jer je ekran Qwiic modul.
from machine import I2C, Pin

# Soldered driver za LCD ekran. Živi u lib folderu repozitorija primjera, pa kopiraj cijeli
# lib folder na svoju pločicu, inače ga MicroPython neće moći naći.
from LCD import LCD_I2C

# Ovdje postavljamo I2C vezu. Dva pina fiksirana su pločicom: na NULA MINI, I2C koristi IO6 za
# liniju podataka (SDA) i IO7 za liniju takta (SCL), a to su točno pinovi na koje je Qwiic konektor spojen.
i2c = I2C(0, scl=Pin(7), sda=Pin(6))

# Ovdje stvaramo naš objekt ekrana, koji smo nazvali "lcd", i predajemo mu I2C vezu.
# Ekran u ovom kitu širok je 16 znakova i visok 2 reda, a od toga dolazi ime 16x2.
lcd = LCD_I2C(i2c)

# begin() pokreće komunikaciju i priprema ekran za upotrebu. Mora doći prvi, prije svega drugoga što
# od ekrana zatražimo.
lcd.begin()

# backlight() pali svjetlo iza ekrana, bez kojeg je tekst vrlo teško čitati. Primijeti da ovo mora
# doći nakon begin(), jer begin() resetira ekran i svjetlo bi ponovno ugasio.
lcd.backlight()

# clear() briše sve što je ostalo na ekranu od prije, pa počinjemo s čistim ekranom.
lcd.clear()

# setCursor() odabire gdje će se sljedeći tekst pojaviti. Prvi broj je stupac a drugi je red, i
# oba počinju brojati od nule, pa je (0, 0) gornji lijevi kut.
# print() zatim ispisuje naš tekst počevši od te pozicije.
lcd.setCursor(0, 0)
lcd.print("Hello, NULA!")

# Prijeđi u drugu liniju i ispiši još jednu poruku. (0, 1) znači stupac nula reda jedan.
# Imaj na umu da u ovaj ekran ulazi točno 16 znakova po redu, pa se sve dulje odsijeca na rubu.
lcd.setCursor(0, 1)
lcd.print("Let's start!")

# I to je sve. Za razliku od ranijih primjera, ovdje nema while True petlje, jer se ništa ne mora događati
# iznova: poruka ostaje na ekranu dok se pločica ne resetira ili ne ugasi.

Što bi trebao vidjeti

Pritisni Run. U roku od sekunde pojavljuju se obje linije, isti sklop kao na fotografiji iznad, sada s nečim na ekranu:

Gotov sklop s 16x2 LCD-om koji prikazuje Hello, NULA! u gornjem redu i Let's start! u donjem redu
`Hello, NULA!` u redu 0 i `Let's start!` u redu 1, svaka počinje od stupca 0

Ovaj put se u Shell ne ispisuje ništa. Skripta nikada sama ne poziva print(), jer ekran je izlaz. Primijeti da su lcd.print() i ugrađeni print() dvije različite stvari: jedan piše na ekran, drugi u konzolu.

Ako je pozadinsko svjetlo upaljeno a ekran prazan

To je najčešći problem s ovim ekranima, i nije greška u tvom kodu.

Znakovi se ispravno šalju, ali je kontrast ekrana postavljen tako nisko da su nevidljivi na pozadinskom svjetlu. Rješenje je mali trimer potenciometar na adapterskoj pločici, označen s CONTRAST:

I2C LCD adapterska pločica s istaknutim CONTRAST trimer potenciometrom
CONTRAST trimer na adapterskoj pločici, istaknut plavim

Kada je pločica napojena i skripta pokrenuta, malim ravnim odvijačem polako okreni taj trimer kroz cijeli njegov opseg. Na jednom kraju dobiješ prazan plavi ekran; na drugom, red punih tamnih blokova. Tvoj tekst je negdje između. Zastani gdje znakovi izgledaju oštro. To moraš napraviti samo jednom.

ℹ️
Ništa u driveru ne dira kontrast. Postavlja ga isključivo taj trimer, i zato nikakva količina mijenjanja koda neće vratiti tekst. Ako ti je ekran prazan, posegni za odvijačem, a ne za tipkovnicom.
⚠️
Ako trimer ne radi ništa kroz cijeli svoj opseg, problem je u komunikaciji a ne u kontrastu. Provjeri scl=Pin(7), sda=Pin(6) u liniji I2C(), pa ponovno utisni oba kraja Qwiic kabela dok svaki ne klikne. Skripta koja se zaustavi s OSError: [Errno 19] ENODEV nikada nije ni došla do ekrana.

Probaj sam: promijeni jednu od poruka u nešto dulje od šesnaest znakova i pokreni ponovno. Vidjet ćeš je odsječenu točno na šesnaestom znaku, a to je brži način da se nauči ograničenje nego brojanje.


Cijeli primjer

Pogledaj cijeli kod primjera na linku ispod:

4.1_Print_Message.py

Primjer koji inicijalizira Qwiic 16x2 LCD i ispisuje statičnu poruku u dva reda pomoću Soldered LCD drivera.