4.2 Automatsko pomicanje teksta
U primjeru 4.1 obje poruke bile su odabrane tako da ulaze: po dvanaest znakova, ugodno unutar šesnaest koliko ekran može prikazati. Ovaj primjer to pravilo namjerno lomi. Poruka je dugačka dvadeset i tri znaka, što je sedam više nego što ima mjesta, i umjesto da je skratimo, pomicat ćemo je po jedan znak, iznova i iznova, tako da cijela rečenica prođe pred čitateljem kao na ploči s odlascima.
Sklop se u odnosu na 4.1 ne mijenja uopće. Mijenja se to što ekran radi s porukom koja je za njega predugačka.
U ovoj dokumentaciji naučit ćeš:
- Zašto poruka dulja od 16 znakova nije izgubljena, iako je ne možeš svu vidjeti.
- Da je svaki red ekrana u stvari buffer od 40 znakova s malim prozorom na njega.
- Kako
scrollDisplayLeft()pomiče taj prozor umjesto da pomiče tekst. - Kako postaviti brzinu pomicanja i zašto cijela petlja traje oko 12 sekundi.
- Zašto ekran svaki krug nakratko ostane prazan, i zašto to nije greška.
- Zašto poruci koja se pomiče treba
while Truepetlja, kada 4.1 nije trebala nijednu.
Potreban hardver:
- 1x Soldered NULA MINI pločica
- 1x Breadboard
- 1x 16x2 LCD ekran s I2C adapterom
- 1x Qwiic kabel
- 1x USB-C kabel
Spajanje komponenti
Ako ti je pločica još spojena od primjera 4.1, već je ispravna, pa preskoči pravo na kod. Inače su četiri koraka ispod ista ona koja si tamo prošao.
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.

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.

- i +. To je konektor za bateriju, i Qwiic kabel u njega ne ulazi.3. Utisni drugi kraj u ekran
Okreni ekran i utisni slobodni kraj kabela u bilo koji od dva Qwiic konektora na ljubičastoj I2C LCD ADAPTER pločici. Spojeni su međusobno, pa nije važno koji koristiš.

4. Utisni USB-C kabel
Spoji pločicu na računalo. Ljubičasto PWR svjetlo se upali i pozadinsko svjetlo ekrana zasvijetli plavo, a na ekranu još nema ništa.

Dobavljanje drivera na pločicu
Ovaj primjer koristi isti LCD.py driver kao 4.1, pa ako je taj primjer radio, već je na pločici. Ako nije, instaliraj cijeli lib folder kako je opisano na stranici Postavljanje MicroPythona:
mpremote mip install github:SolderedElectronics/Soldered-NULA-Beginner-kit-MicroPython-project-examples/lib
Gdje živi ostatak poruke
Primjer 4.1 rekao je da se poruka dulja od šesnaest znakova odsijeca na rubu ekrana. Tako to izgleda, ali nije baš to ono što se događa, a ta razlika je cijela svrha ovog primjera.
Za svakim redom ekrana u pozadini stoji buffer od 40 znakova unutar kontrolerskog čipa ekrana. Ispis piše u taj buffer. Staklo prikazuje prozor od 16 znakova na njega, a sve izvan prozora je i dalje tamo: spremljeno, zapamćeno, samo nije prikazano.
Naša poruka dugačka je dvadeset i tri znaka, pa u buffer ulazi s mjestom naviše:
pozicija: 0123456789012345678901234567890123456789
buffer: Hello from NULA MINI!
prikazano:^^^^^^^^^^^^^^^^
Šesnaest oznaka ^ je prozor. Kada skripta ispiše poruku, pozicije 0 do 15 su ono što vidiš, Hello from NULA, a MINI! sjedi na pozicijama 16 do 21, ispisan i na čekanju.
scrollDisplayLeft() ne pomiče tekst. Pomiče taj prozor jednu poziciju duž buffera, zbog čega se čini da tekst klizi u drugu stranu. Pozivaj ga ponovljeno i prozor prošeta dužinom buffera, dovodeći skrivene znakove u vidno polje stupac po stupac.
Budući da je buffer dugačak 40 pozicija, prozoru treba 40 pomaka da se vrati odakle je počeo, a nakon svakog pomaka slijedi pauza od SCROLL_DELAY_MS. To postavlja dužinu jednog kruga:
40 pomaka x 300 ms = 12000 ms = 12 sekundi po krugu
Promijeni SCROLL_DELAY_MS i računanje slijedi: na 100 krug traje oko četiri sekunde i tekst se kreće žustro, na 600 traje dvadeset i četiri i čita se ugodnije.
scrollDisplayLeft() traje 0.84 ms, pa stvarni krug izađe na 12034 ms prema 12000 ms koliko računanje predviđa. Razlika od 34 ms je tih četrdeset naredbi pomaka.scroll_display_right(), u snake caseu, a ne scrollDisplayRight(). Driver je u tome nedosljedan, pa ako pokušaš obrnuti smjer i dobiješ AttributeError: 'LCD_I2C' object has no attribute 'scrollDisplayRight', to je zato.Poruka ima razmak na svakom kraju
Pogledaj pobliže poruku u kodu i vidjet ćeš da počinje i završava razmakom:
message = " Hello from NULA MINI! "
Nijedan nije tipfeler. Prozor na kraju obiđe s kraja buffera od 40 znakova natrag na početak, pa se kraj poruke sretne s vlastitim početkom. Bez tih dvaju razmaka dobio bi MINI!Hello stisnuto zajedno na jedan krug u svakoj rotaciji.
Jednom po krugu ekran ostane prazan
Postoji još jedna posljedica tih brojeva, i vrijedi je znati prije nego pokreneš skriptu. Poruka zauzima 23 od 40 pozicija buffera, ali prva i posljednja od njih su ona dva razmaka, pa ispisana slova idu samo od pozicije 1 do pozicije 21. Zato je odsječak u kojem nema ničega vidljivog dugačak 19 pozicija, a ne 17, a prozor od 16 znakova ulazi u prazninu od 19 pozicija na četiri različita mjesta. Četiri koraka svakog kruga, nešto više od sekunde, prozor gleda u ništa i ekran je stvarno, ispravno prazan.
CONTRAST trimer. Vidi Ako je pozadinsko svjetlo upaljeno a ekran prazan u prethodnom primjeru.Ovaj put se sve ponavlja
U 4.1 skripta se izvršila od vrha do dna i završila, jer ekran svoju posljednju poruku drži sam i nije se imalo što ponavljati.
Ovdje se to prevrće. Poruka se i dalje ispisuje jednom, prije petlje, jer se ponovljenim ispisom ne bi postiglo ništa. Ali kretanje se mora pobuđivati, pa while True petlja unedogled radi dvije stvari: pomakne prozor jednu poziciju, pa čeka. To sparivanje radnje i pauze je ono što statičan ekran pretvara u animiran.
clear(), i ne treba: begin() već briše ekran i vraća kursor na početak kao dio svojeg postavljanja. Zato se i print() može pozvati bez prethodnog setCursor(): kursor je već na poziciji 0.Kod
# I2C je ono što Qwiic konektor nosi, a ekran je Qwiic modul.
from machine import I2C, Pin
# Soldered driver za LCD ekran, koji se nalazi u lib folderu repozitorija primjera.
from LCD import LCD_I2C
import time
# Ovdje postavljamo I2C vezu. Na NULA MINI, I2C koristi IO6 za liniju podataka (SDA) i IO7 za liniju
# takta (SCL), a to su 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 je širok 16 znakova i visok 2 reda.
lcd = LCD_I2C(i2c)
# Stvori poruku koja će se pomicati preko ekrana. Razmaci na početku i na kraju ostavljaju malu prazninu,
# pa tekst ne naleti pravo na sebe dok putuje.
message = " Hello from NULA MINI! "
# Brzina pomicanja u milisekundama. Veći broj = sporije pomicanje.
# Slobodno eksperimentiraj s ovom vrijednošću.
SCROLL_DELAY_MS = 300
# begin() pokreće komunikaciju i priprema ekran. Mora doći prije svega drugoga.
lcd.begin()
# backlight() pali svjetlo iza ekrana. Dolazi nakon begin(), koji bi ga inače ponovno ugasio.
lcd.backlight()
# Ispiši poruku jednom. Isprva će se prikazati samo vidljivi dio.
lcd.print(message)
while True:
# scrollDisplayLeft() pomiče sve što je već na ekranu jednu poziciju lijevo. Poruku nikada ne
# ispisujemo ponovno, samo je nastavljamo pomicati, a to iznova i iznova stvara učinak kretanja.
lcd.scrollDisplayLeft()
# time.sleep_ms() pauzira program za zadani broj milisekundi. To je ono što upravlja brzinom
# pomicanja: dulje čekanje između pomaka znači sporije pomicanje.
time.sleep_ms(SCROLL_DELAY_MS)
Što bi trebao vidjeti
Pritisni Run. Poruka se pojavi i odmah počne kliziti preko gornjeg reda, po jedan znak svakih 300 milisekundi, i nikada ne prestaje:
print(), pa konzola nema što prikazati. Ekran je jedini izlaz koji ima. Prazan Shell ovdje znači da skripta normalno radi, a ne da je nešto pošlo po zlu.Cijeli primjer
Pogledaj cijeli kod primjera na linku ispod:
4.2_Auto_Scroll_Text.py
Primjer koji poruku dulju od ekrana pomiče preko Qwiic 16x2 LCD-a pomoću scrollDisplayLeft().