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.

ESP32 a Bluetooth Low Energy (BLE)

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.

První ukázka ESP32 a Bluetooth Low Energy (BLE)

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í.

Druhá ukázka ESP32 a Bluetooth Low Energy (BLE)

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

FB tw

Další podobné články