IoT prakticky: Python na ESP32 V – ovládanie displejov LED, LCD a OLED

predchádzajúcej časti sme ukázali konfiguráciu knižnice Octopus, ktorá obsahuje triedy funkcií na ovládanie rôzneho hardvéru a komunikačných rozhraní. Ukázali sme aj motivačný príklad, ako pomocou dvoch riadkov kódu je možné zobraziť čísla, alebo text na displeji zloženom zo sedem segmentových číslic, pričom doska displeja využíva zbernicu I2C, takže na pripojenie k doske mikrokontroléra jej stačia štyri vodiče.

Pokračujeme predstavením možnosti displejov. Príklady sú vo videu:

Doplnenie displeja je pre väčšinu amatérskych konštrukcií veľkou pridanou hodnotou, nielen pri finálnej funkcii, ale aj počas ladenia. Je to oveľa praktickejšie, než výpisy cez konzolovú aplikáciu.

Upozorňujeme, že na príklady v tejto časti musíte mať nainštalovanú knižnicu Octopus. Podprobný postup je v predchádzajúcej časti seriálu. Pomocou príkazu octopus() knižnicu inicializujete.  Príkazom h() zobrazíte nápovedu. Vypíšeme len jej časť týkajúcu sa displejov:

>> displays ------------------|---------------------
   d7 = disp7_init()          > d7.show(123.567)
   d2 = lcd2_init()           > d2.putstr(text)
   d2.clear()                 |
   o = oled_init()            | o.fill(0/1)
   o.text(text, x, y)         > o.show()
   o.hline(*) |  d.vline(*)   | o.pixel(x, y, 1)

Príkazom ios nakonfigurujete zoznam používaného hardvéru. Proto je potrebné importovať funcie pre tento hardvér:

>>> from util.octopus import *
octopus() --> autoInit: Led | piezzo | ws | SPI | disp7 | disp8 | I2C | OLED | lcd

Sériové zbernice na komunikáciu s displejmi

Najskôr stručne predstavíme komunikačné zbernice, ktoré sa používajú na komunikáciu s displejmi.

Pomocou zbernice SPI (Serial Peripheral Interface) sa najčastejšie pripájajú displeje, externé pamäte, či  A/D prevodníky, prípadne sa toto rozhranie využíva pre vzájomnú komunikáciu medzi viacerými mikrokontrolérmi. V systéme využívajúcom rozhranie SPI môže byť zapojených dva alebo viac obvodov, pričom jeden z nich je označovaný ako Master, ktorý riadi komunikáciu a ostatné sú označované ako Slave. Komunikácia prebieha pomocou štyroch vodičov MOSI (Master Out, Slave In), MISO(Master In, Slave Out), hodinového signálu SCK, a SS (Slave Select).

I2C. je dvojvodičová obojsmerná sériová zbernica, určená napríklad na komunikáciu jednočipových procesorov s podriadenými obvodmi. Vodič SDA je určený na prenos sériových dát a vodič SLC na prenos taktovacieho signálu.

LED displeje

Ukážeme príklad pre obsluhu sedem segmentového displeja, pripojeného cez SPI. Displej má sériový driver MAX7219 a je zložený z dvoch modulov po 4 znaky, spolu je teda možné zobraziť 8 znakov.

Displej sa k mikrokontroléru pripája pomocou piatich vodičov a využíva rozhranie SPI

  • VCC      – Napájacie napätie 3,3 V
  • GND     – elektrická zem
  • DIN      – data input  – pripája sa na pin D23, ktorý má alternatívnu funkciu MOSI
  • CS        – chip select  – pripája sa na pin D5 s funkciou CS0
  • CLK      – clock,  taktovací signál pripája sa na pin D18 s alternatívnou funkciou SCLK

Môžete zreťaziť viac displejov, pričom výstup DOUT z jedného displeja pripojíte na DIN druhého displeja.

Pripojenie na piny 30 pinového modulu ESP 32

Modul 2x15 pins:                               [ROBOT Board]:
                          -----------     (GPIO)
                      EN -           - D23 (23)  MOSI       [SPI_MOSI_PIN] 
[PIN_ANALOG]    (36)  VP -           - D22 (22)  SCL(I2C)   [I2C_SCL_PIN]
[I39_PIN]       (39)  VN -           - TXD (1)   D2
[I34_PIN]            D34 -           - RXD (3)   D3
[I35_PIN]            D35 -           - D21 (21)  SDA(I2C)   [I2C_SDA_PIN]
[ONE_WIRE_PIN] DEV1  D32 -           - D19 (19)  MISO       [SPI_MISO_PIN]
               DEV2  D33 -  (ESP32)  - D18 (18)  SCLK       [SPI_CLK_PIN]
[MOTOR_12EN]         D25 -           - D5  (5)   CS0        [SPI_CS0_PIN]
[MOTOR_1A]           D26 -           - TX2 (17)             [PIN_PWM1] /Servo1
[MOTOR_4A]           D27 -           - RX2 (16)             [PIN_PWM2] /Servo2
[MOTOR_3A]           D14 -           - D4  (4)              [PIN_PWM3] /Servo3
[MOTOR_2A]           D12 -           - D2  (2)              [BUILT_IN_LED]
[MOTOR_34EN]         D13 -           - D15 (15)             [WS_LED_PIN] //v1(13)     
                     GND -           - GND
                     VIN -           - 3V3 +
                          -----------

Displej je potrebné inicializovať príkazom disp7_init().  Príkaz odovzdá inštanciu objektu d7.

d7 = disp7_init()       
Môžete zobraziť číslo.
d7.show(123.456)

Alebo aj textový reťazec, pretože na 7 segmentovom displeji sa dá zobraziť aj hodne písmen, avšak nie všetky.

d7.show("PCREVUE")

Jednotlivé segmenty sú adresované takto:.

------64-----

| 2            |32
-------1------
|4             | 16
-------8------

Bodka za číslom má kód 128. Môžete použiť aj binárnu kombináciu týchto konštánt a rozsvietiť viac segmentov súčasne.

Blikajúca pomlčka segmentu:

while True:
  d7.set_register(5,1)
  sleep(1)
  d7.set_register(5,0) 
  sleep(1)

Blikajúca bodka:

while True:
  d7.set_register(5,128)
  sleep(1)
  d7.set_register(5,0)
  sleep(1)

Knižnica Octopus podporuje aj zobrazovanie na maticovom LED displej 8×8 s obvodom MAX7219.

Tento displej sa pripája rovnako ako sedem segmentový v predchádzajúcej časti, čiže pomocou signálov VCC, GND, DIN, CS a CLK. Aj tieto displeje môžete zoradiť do kaskády s cieľom zobraziť viac znakov.

Trieda pre obsluhu displeja sa inicializuje:

d8 = disp8_init()

Schéma pripojenie maticového displeja k mikrokontroléru

LCD displeje

Rozdeľujú sa na grafické a znakové. Grafický displej umožňuje na kontinuálnej matici bodov zobraziť grafické obrazce a samozrejme aj text rôznym fontom. Znakové displeje sú v podstate tiež maticové, akurát matice pre každý znak sú oddelené. Znakové displeje umožňujú zobraziť rôzne dlhý text v jednom, alebo viacerých riadkoch.  Displeje sú k dispozícii v konfigurácii 8 × 1, čiže 8 znakov v jednom riadku až po 40 × 4, čiže 4 riadky, pričom každý z nich môže mať 40 znakov. Programové ovládanie týchto displejov je pomerne jednoduché. Nastavíte kurzor na miesto kde chcete mať znak, alebo začiatok textu a pošlete znak, alebo text.

Alfanumerické displeje využívajú ako radič obvod Hitachi HD44780. Radič má riadiaci a dátový register. V pamäti ROM má napevno uložené definície 208 znakov v matici 5 × 8 bodov a 32 znakov v matici 5 × 10 bodov. Zlou správou pre našinca je, že tam nie sú znaky so slovenskou diakritikou. Tie môžete v matici 5 × 8 bodov definovať do pamäte typu CGRAM. Obrazová pamäť RAM obsahuje aktuálne zobrazený text. Displej tohoto typu môžete pripojiť aj cez sériovú zbernicu I2C pomocou dvoch dátových pinov (SDA a SCL) + dvoch pinov na napájanie. Dá sa kúpiť displej už s takýmto rozhraním, alebo dosku, ktorá sa nasadí na 16 pinový konektor displeja a pripojí cez I2C.

Displej sa k mikrokontroléru pripája pomocou štyroch vodičov a využíva rozhranie I2C. Displej vyžaduje napájacie napätie 5V

  • SCL      – pripája sa na pin D22, ktorý má alternatívnu funkciu I2C_SCL
  • SDA      – pripája sa na pin D21, ktorý má alternatívnu funkciu I2C_SDA
  • GND     – elektrická zem
  • VCC      – Napájacie napätie 5 V

Pripojenie na piny 30 pinového modulu ESP 32:

Modul 2x15 pins:                               [ROBOT Board]:
                          -----------     (GPIO)
                      EN -           - D23 (23)  MOSI       [SPI_MOSI_PIN]
[PIN_ANALOG]    (36)  VP -           - D22 (22)  SCL(I2C)   [I2C_SCL_PIN]
[I39_PIN]       (39)  VN -           - TXD (1)   D2
[I34_PIN]            D34 -           - RXD (3)   D3
[I35_PIN]            D35 -           - D21 (21)  SDA(I2C)   [I2C_SDA_PIN]
[ONE_WIRE_PIN] DEV1  D32 -           - D19 (19)  MISO       [SPI_MISO_PIN]
               DEV2  D33 -  (ESP32)  - D18 (18)  SCLK       [SPI_CLK_PIN]
[MOTOR_12EN]         D25 -           - D5  (5)   CS0        [SPI_CS0_PIN]
[MOTOR_1A]           D26 -           - TX2 (17)             [PIN_PWM1] /Servo1
[MOTOR_4A]           D27 -           - RX2 (16)             [PIN_PWM2] /Servo2
[MOTOR_3A]           D14 -           - D4  (4)              [PIN_PWM3] /Servo3
[MOTOR_2A]           D12 -           - D2  (2)              [BUILT_IN_LED]
[MOTOR_34EN]         D13 -           - D15 (15)             [WS_LED_PIN] //v1(13)     
                     GND -           - GND
                     VIN -           - 3V3 +
                          -----------

Displej sa inicializuje príkazom:

d2 = lcd2_init()

Príkazom d2.TAB (kláves tabulátor) môžete vypísať metódy triedy.

>>> d2.
__class__       __init__        __module__      __qualname__
clear           __dict__        i2c             custom_char
putstr          move_to         hal_write_init_nibble
hal_backlight_on                hal_backlight_off
hal_write_command               hal_write_data  i2c_addr
LCD_FUNCTION_RESET              LCD_FUNCTION
LCD_FUNCTION_2LINES             num_lines       num_columns
backlight       LCD_CLR         LCD_HOME        LCD_ENTRY_MODE
LCD_ENTRY_INC   LCD_ENTRY_SHIFT                 LCD_ON_CTRL
LCD_ON_DISPLAY  LCD_ON_CURSOR   LCD_ON_BLINK    LCD_MOVE
LCD_MOVE_DISP   LCD_MOVE_RIGHT  LCD_FUNCTION_8BIT
LCD_FUNCTION_10DOTS             LCD_CGRAM       LCD_DDRAM
LCD_RS_CMD      LCD_RS_DATA     LCD_RW_WRITE    LCD_RW_READ
show_cursor     hide_cursor     blink_cursor_on
blink_cursor_off                display_on      display_off
backlight_on    backlight_off   putchar         cursor_x
cursor_y

Na výpis textu použijete napríklad príkaz:

d2.putstr("PCREVUE – serial IoT prakticky")

Pomocou I2C rozhrania sa pripájajú aj maticové OLED displeje. Najpraktickejšie sú displeje s rozlíšením 128 × 64. Pripájajú sa rovnako ako viacriadkové LCD displeje.

  • SCL      – pripája sa na pin D22, ktorý má alternatívnu funkciu I2C_SCL
  • SDA      – pripája sa na pin D21, ktorý má alternatívnu funkciu I2C_SDA
  • GND     – elektrická zem
  • VCC      – Napájacie napätie 5 V

Displej sa inicializuje príkazom:

o = oled_init()

Zoznam metód objektu:

>>> o.
__class__       __init__        __module__      __qualname__
clear           __dict__        addr            blit
buffer          fill            fill_rect       hline
invert          line            pixel           rect
scroll          text            vline           width
i2c             test            temp            show
ox              oy              draw_icon       draw_image
oledSegment     init_display    poweroff        poweron
contrast        height          external_vcc    pages
write_cmd       write_data      write_list

Text vypíšete príkazmi:

o.fill(0)
o.text("PC REVUE", 0, 0) 
o.text("IoT serial", 0, 20)
o.show()

V budúcom pokračovaní sa budeme venovať obsluhe LED diód, farebných RGB LED diód a farebných diód Neopixel.