11. diel - Bluetooth Low Energy na module ESP-32 - praktický príklad
V predchádzajúcej lekcii, Bluetooth Low Energy na module ESP-32 - Úvod , sme sa zoznámili s teoretickým základom služby Bluetooth Low Energy.
V tomto tutoriále Internetu vecí s ESP-32 zužitkujeme vedomosti o technológii Bluetooth Low Energy, skrátene BLE. Spoločne si ukážeme, ako pomocou tejto služby ovládať prvky pripojené k mikrokontroléru. Pripravíme si zapojenie, ktoré budeme ovládať mobilným telefónom.
Ovládanie LED diód pomocou BLE
Našou úlohou bude vytvoriť zapojenie, kedy na ESP-32 pripojíme dve diódy, červenú a zelenú. Program ESP-32 potom pomocou BLE nadviaže spojenie s aplikáciou v mobilnom telefóne. Posielaním príkazov z mobilu potom rozsvietime červenú alebo zelenú diódu.
Potrebné súčiastky a schéma zapojenia
Keďže budeme pomocou BLE ovládať LED diódy, poďme si zostaviť jednoduchý obvod. Budeme potrebovať:
- 2x LED dióda (červená, zelená),
- ESP-32,
- 2x rezistor 220Ω,
- nepájivé pole,
- prepojovacie vodiče.
Program pre ESP-32
Poďme si teraz postupne zostaviť a popísať jednotlivé časti programu. Začneme opäť hlavičkou.
Hlavička programu
Všetky použité knižnice sú obsiahnuté v základnej konfigurácii prostredia a nie je nutné ich preto inštalovať:
Kód si popíšeme. Knižnica
BLEDevice.h
nám poskytuje základné triedy a funkcie pre prácu s
BLE zariadením. Knižnica BLEUtils.h
potom obsahuje funkcie pre
prácu s dátami posielané cez BLE a knižnica BLEServer.h
nám
umožní vytvorenie BLE servera pre obsluhu pripojených zariadení. Konštanty
ledPin
a ledPin2
obsahujú číslo pinu, ku ktorým
máme pripojené LED diódy. Makrá SERVICE_UUID
a
CHARACTERISTIC_UUID
obsahujú jedinečné
identifikátory pre služby a charakteristiku čítania údajov z
klienta. Vytvorené premenné *pServer
a *pChar
budú
neskôr slúžiť na inicializáciu servera a charakteristiky. Taktiež
vytvoríme premennú pre informácie, či je nejaké zariadenie pripojené a
taktiež pre uchovanie informácie o poslednom pripojenom zariadení v prípade
zmeny zariadenia.
V tomto programe budeme vyžadovať aj základné znalosti OOP a to hlavne vytváranie tried a inštancií tried. Tejto problematike sa venuje lekcia OOP v C++, v tejto lekcii nebude o princípoch OOP reč.
Trieda MojeCallbacky
Poďme si teraz teda vytvoriť triedu, ktorá bude obsahovať callback funkcie. Tie budú overovať, či je akékoľvek zariadenie pripojené alebo odpojené:
Táto trieda vychádza z
triedy BLEServerCallbacks
obsiahnutej v knižnici
BLEServer.h
. V triede MojeCallbacky
vytvoríme metódy
pre zmenu booleovskej hodnoty v premennej zarizeniPripojeno
hneď
pri pripojení resp. odpojenie zariadenia. Tieto metódy bude volať ESP-32
automaticky práve pri pripojení alebo odpojení
zariadenia.
Funkcia setup()
Teraz poďme postupne vytvoriť telo funkcie setup()
:
Najprv nastavíme počet
baudov sériového monitora opäť na hodnotu 115200
. Tiež
nastavíme ako výstupné tie piny, na ktoré sme pripojili LED diódy.
Inštancia BLEDevice
bola vytvorená v knižnici
BLEDevice.h
, preto k nej môžeme pristupovať staticky cez
štvorbodku. Funkciou init()
nastavujeme názov servera, ku
ktorému sa budeme pripájať. Do premennej pServer
vložíme
inštanciu servera a funkciou setCallbacks()
vytvoríme serveru
callback funkcie. Ako parameter tejto funkcie bude novo vytvorený
objekt našej triedy MojeCallbacky
. Tým zaistíme, že
pri pripojení a odpojení zariadenia použije mikrokontrolér metódy v tele
tejto triedy. Ďalej vytvoríme potrebné vlastnosti BLE komunikácie a to je
BLE služba a BLE charakteristika:
Teraz použijeme skôr
vytvorenú premennú server
, ktorá (keďže je inštanciou triedy)
obsahuje okrem iného metódu createService()
. Do nej pošleme ako
parameter vygenerovaný SERVICE_UUID
. Do premennej
pChar
vytvoríme charakteristiku BLE služby pomocou metódy
createCharacteristic()
. Metóde poskytneme vygenerované
CHARACTERISTIC_UUID
a vlastnosti, ktoré chceme, aby služba
obsahovala. V našom prípade využijeme vlastností PROPERTY_READ
a PROPERTY_WRITE
. Po nastavení charakteristiky službu spustíme
pomocou funkcie start()
. Teraz už stačí iba nastaviť
viditeľnosť zariadenia pre ostatné zariadenia v dosahu. Do
premennej *pViditelnost
uložíme údaje potrebné na začatie
viditeľnosti servera pomocou metódy getAdvertising()
objektu
pServer
. Potom pomocou funkcie start()
zviditeľníme
server zariadením v okolí.
Funkcia loop()
V tejto chvíli sme dokončili nastavenie BLE servera a všetkých jeho
dôležitých súčastí. Vrhneme sa teda na vyhodnocovanie podnetov od klienta
vo funkcii loop()
. V tejto časti programu budeme na základe
obdržaných dát vyhodnocovať, ktorá LED dióda sa má rozsvietiť resp.
zhasnúť:
Najskôr vyhodnotíme, či je
vôbec nejaké zariadenie pripojené. Ak áno, uložíme prijaté údaje do
reťazca value
pomocou funkcie getValue()
. Ak
odošleme z telefónu správu cervena
, mikrokontrolér ju
vyhodnotí tak, že privedie signál na konkrétny pin, kde je pripojená
červená LED dióda, čím ju rozsvieti. Ak potom pošleme správu
zelena
, červená dióda zhasne a rozsvieti sa iba zelená
dióda.
Nakoniec ešte vyhodnotíme zmenu pripojeného zariadenia a vypíšeme túto zmenu do sériového monitora. Táto časť kódu je vhodným pomocníkom pri ladení kódu. Nie je síce nevyhnutná, ale je vhodné ju do programu zakomponovať:
Spustenie projektu
Tým sme úspešne dokončili celý program pre mikrokontrolér. Poďme si teraz ukázať, ako celý projekt funguje. Na pripojenie k BLE serveru využijeme mobilný telefón. Optimálna bude aplikácia nRF Connect, ktorá je dostupná ako na Google Play, tak aj na App Store.
Pre pripojenie k Bluetooth rozhraniu existuje mnoho podobných aplikácií, záleží čisto na našej preferencii.
Po spustení aplikácie začne telefón vyhľadávať zariadenie v okolí,
kliknutím na Connect
pri názve nášho BLE servera sa
pripojíme:
Po pripojení k serveru vyberieme možnosť Unknown Service a potom na ikonku so šípkou hore (upload):
Tým sa otvorí tabuľka pre odosielanie hodnôt na serveri, kde rozklikneme zoznam s možnými typmi odosielaných dát:
A vyberieme možnosť TEXT (UTF-8):
Teraz do textového poľa New value
napíšeme buď
cervena
alebo zelena
a kliknutím na tlačidlo
SEND v pravom dolnom rohu odošleme hodnotu na server:
Po odoslaní hodnoty sa rozsvieti príslušná LED dióda.
Zdrojový kód projektu je k dispozícii v archíve pod lekciou.
V budúcej lekcii, BLE na ESP-32 - komunikácia servera s klientom - Server , nakonfigurujeme BLE server pre vzájomnú komunikáciu medzi serverom a klientom, vďaka ktorej budeme ovládať LED diódu.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 13x (1.5 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++