Jak jste si mohli přečíst v našem návodu k vývojové desce ESP32, tento nový čip oproti starší verzi ESP8266 obsahuje více možností bezdrátového spojení. Vedle WiFi můžete s ESP32 využít nově i Bluetooth ve verzi 4 BLE (Bluetooth Low Energy). A právě na tuto funkci je zaměřen tento návod, kde si ukážeme, jak s pomocí chytrého telefonu nejen číst informace, ale i zapisovat.
Pro programování ESP32 v Arduino IDE je nutné doinstalovat podpůrný balíček, na který už byl zaměřen minulý návod. Pokud ale budete chtít používat BLE, je nutné ho stáhnout v nejnovější verzi. A vedle samotné podpory ESP32 je nutné doinstalovat ještě knihovnu ESP32_BLE_Arduino. Ta se instaluje běžným způsobem, návod, jak na to, najdete zde. Uvedená knihovna obsahuje spoustu příkladů na různé funkcionality Bluetooth, přičemž já jsem pro tento návodu upravil jeden z nich.
Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven a nastavení propojovacích pinů. Poté provedeme inicializaci modulu z knihovny a vytvoříme proměnnou, v které budeme ukládat informaci o existenci připojeného zařízení. V dalším kroku si vytvoříme proměnnou pro ukládání přijaté zprávy a také si vypíšeme definice unikátních ID pro různé služby. V komentáři je uveden odkaz na jednoduchý generátor těchto UUID, ale můžete si všimnout, že v tomto příkladu se UUID liší pouze v jednom čísle prvního bloku.
Oproti běžným Arduino kódům tento program obsahuje využití tříd (class), avšak nemusíte se jich bát, protože jsou velmi jednoduché. První třída slouží pro kontrolu připojení, kde jsou uvedeny metody, které se aktivují při spojení nebo odpojení zařízení. V obou případech je vždy adekvátně nastavena proměnná ‚zarizeniPripojeno‘.
Druhá třída pak slouží pro příjem zprávy. V této třídě si při načtení zprávy uložíme data do proměnné a zkontrolujeme, jestli zpráva není prázdná podle její délky. Pokud obsahuje jeden znak či více, provedeme poté její vytištění po znacích po sériové lince a následně budeme dekódovat znaky pro ovládání LED diody. Pokud je tedy v přijaté zprávě znak ‚A‘, zapneme LED diodu, zatímco při přijetí znaku ‚B‘ ji vypneme.
Podprogram setup obsahuje na začátku zahájení komunikace po sériové lince a nastavení LED diody jako výstupní. V dalším kroku provedeme inicializaci BLE s nastavením jména, pod kterým budeme hledat náš ESP32 modul. V dalších krocích postupně vytvoříme BLE server, BLE služby a komunikační kanály pro odesílání (TX) a příjem dat (RX). Následně ještě zahájíme BLE službu a zapneme viditelnost našeho zařízení pro okolí společně se zprávou po sériové lince.
V nekonečné smyčce loop začneme vždy podmínkou, která kontroluje, jestli je připojeno nějaké zařízení k ESP32 skrze BLE. Pokud ano, načteme data z analogového pinu do proměnné a následně vytvoříme zprávu, v které je pro ukázku uveden text a naměřená data. Tuto zprávu poté převedeme na znaky, které nastavíme skrze BLE službu, příkazem notify() ji odešleme na připojené zařízení a vytiskneme po sériové lince. Na konci smyčky se už nachází jen pauza po dobu jedné sekundy.
// Arduino ESP32 a Bluetooth Low Energy // připojení potřebných knihoven #include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #include <BLE2902.h> // definice propojovacích pinů // pro analogový vstup a LED diodu #define readPin 32 #define LED 2 // inicializace modulu z knihovny BLECharacteristic *pCharacteristic; // proměnná pro kontrolu připojených zařízení bool zarizeniPripojeno = false; // proměnná pro ukládání přijaté zprávy std::string prijataZprava; // definice unikátních ID pro různé služby, // pro vlastní UUID využijte generátor // https://www.uuidgenerator.net/ #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" // třída pro kontrolu připojení class MyServerCallbacks: public BLEServerCallbacks { // při spojení zařízení nastav proměnnou na log1 void onConnect(BLEServer* pServer) { zarizeniPripojeno = true; }; // při odpojení zařízení nastav proměnnou na log0 void onDisconnect(BLEServer* pServer) { zarizeniPripojeno = false; } }; // třída pro příjem zprávy class MyCallbacks: public BLECharacteristicCallbacks { // při příjmu zprávy proveď následující void onWrite(BLECharacteristic *pCharacteristic) { // načti přijatou zprávu do proměnné prijataZprava = pCharacteristic->getValue(); // pokud není zpráva prázdná, vypiš její obsah // po znacích po sériové lince if (prijataZprava.length() > 0) { Serial.print("Prijata zprava: "); for (int i = 0; i < prijataZprava.length(); i++) { Serial.print(prijataZprava[i]); } Serial.println(); // kontrola přijaté zprávy // pokud obsahuje znak A, rozsviť LED diodu if (prijataZprava.find("A") != -1) { Serial.println("Zapnutí LED!"); digitalWrite(LED, HIGH); } // pokud obsahuje znak B, zhasni LED diodu else if (prijataZprava.find("B") != -1) { Serial.println("Vypnutí LED!"); digitalWrite(LED, LOW); } } } }; void setup() { // zahájení komunikace po sériové lince // rychlostí 115200 baud Serial.begin(115200); // nastavení LED diody jako výstup pinMode(LED, OUTPUT); // inicializace Bluetooth s nastavením jména zařízení BLEDevice::init("ESP32 BLE"); // vytvoření BLE serveru BLEServer *pServer = BLEDevice::createServer(); pServer->setCallbacks(new MyServerCallbacks()); // vytvoření BLE služby BLEService *pService = pServer->createService(SERVICE_UUID); // vytvoření BLE komunikačního kanálu pro odesílání (TX) pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY ); pCharacteristic->addDescriptor(new BLE2902()); // vytvoření BLE komunikačního kanálu pro příjem (RX) BLECharacteristic *pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE ); pCharacteristic->setCallbacks(new MyCallbacks()); // zahájení BLE služby pService->start(); // zapnutí viditelnosti BLE pServer->getAdvertising()->start(); Serial.println("BLE nastaveno, ceka na pripojeni.."); } void loop() { // pokud je zařízení připojeno k ESP32 // začneme s odesíláním dat if (zarizeniPripojeno == true) { // načtení dat z analogového pinu s dělením pro // vytvoření čísla s desetinnou hodnotou float data = analogRead(readPin) / 3.456; // vytvoření zprávy z textu a naměřených dat // znak \n slouží k odřádkování String zprava = "Analog: "; zprava += data; zprava += "\n"; // vytvoření dočasné proměnné, do které // je převedna zpráva na znaky char zpravaChar[zprava.length() + 1]; zprava.toCharArray(zpravaChar, zprava.length() + 1); // přepsání zprávy do BLE služby pCharacteristic->setValue(zpravaChar); // odeslání zprávy skrze BLE do připojeného zařízení pCharacteristic->notify(); // vytištění odeslané zprávy po sériové lince Serial.print("*** Odeslana zprava: "); Serial.print(zprava); } // pauza před novým během smyčky delay(1000); }
Ukázka z výpisu dat na sériovou linku:
BLE nastaveno, ceka na pripojeni.. *** Odeslana zprava: Analog: 187.50 *** Odeslana zprava: Analog: 143.52 Prijata zprava: A Zapnutí LED! *** Odeslana zprava: Analog: 144.68 Prijata zprava: B Vypnutí LED! *** Odeslana zprava: Analog: 157.41
Po úspěšném nahrání programu do ESP32 si můžeme vyzkoušet funkčnost vícero způsoby. Na jednoduchou ukázku si můžete pro Android zařízení stáhnout program „Serial Bluetooth Terminal“ (více informací o aplikaci v tomto návodu). Pokud se v něm připojíte na naše vytvořené zařízení, uvidíte každou sekundu novou zprávu a při odeslání znaku A nebo B můžete ovládat LED diodu na ESP desce.
Pokud byste si ale chtěli prohlížet data ve vlastní aplikaci a ovládat LED diodu pomocí stisku tlačítka, můžete pro tvorbu této aplikace využít webovou stránku Thunkable.com (vychází z populárního MIT App Inventor). Uvedu zde zjednodušený postup, přičemž na detailnější popis se můžete podívat zde.
Po registraci na webu Thunkable si můžete importovat šablonu, která obsahuje aplikaci tak, jak ji vidíte níže na obrázku. Případně si můžete zde se šablonou stáhnout také hotový APK, který stačí nainstalovat ve Vašem Android zařízení. Pokud si ale budete chtít aplikaci nějak upravit, pro nahrání je nutné do Vašeho telefonu dohrát Thunkable aplikaci, na webu zvolit Export aplikace s QR kódem a tento kód následně načíst skrze telefonní aplikaci.
Po zapnutí aplikace „ESP32 BLE Demo“ stisknete tlačítko Připojit a v zobrazeném seznamu najdete své zařízení se jménem „ESP32 BLE“. Po připojení se Vám začne aktualizovat hodnota uprostřed obrazovky aplikace a můžete také zkusit ovládání LED diody pomocí tlačítka LED. Pro odpojení zařízení opět stačí stisknout stejnojmenné tlačítko, přičemž v ESP zůstane poslední stav LED uložen do dalšího spojení.
ESP32 Bluetooth Low Energy funkce je poměrně jednoduše použitelná možnost komunikace s dalšími zařízeními. V tomto návodu je uvedena ukázka komunikace s chytrými zařízení typu Android, ale BLE je možné využít i se zařízeními Apple. Pro test na těchto zařízeních si můžete stáhnout například aplikaci „nRF Connect“. Využití je pak velmi široké, ať už pro příjem či odesílání nejrůznějších dat, vytvoření ovladačů a jiné. V čase vydání tohoto návodu je nutné pro Bluetooth funkcionalitu využít přídavné knihovny, ale je velmi pravděpodobné, že bude vše v brzké době integrováno přímo do balíčku podpory ESP32 pro Arduino.
Seznam použitých komponent:
https://dratek.cz/arduino/1581-esp-32s-esp32-development-board-2-4ghz-dual-mode-wifi-bluetooth-antenna-module-1493028819.html
https://dratek.cz/arduino/1681-vyvojova-deska-s-dvojitym-rezimem-wemos-d1-esp8266-wifi-bluetooth-2-4ghz-1501223637.html