Zum Hauptinhalt springen

Bluetooth-Peripheral-Modus

Was dieses Beispiel zeigt​

Verwenden Sie Inkplate 7SPECTRA als Display, das Sie per Bluetooth LE vom Smartphone aus steuern. Der Sketch startet einen Bluetooth-LE-Dienst mit einer Empfangs- und einer Sende-Characteristic im Stil einer seriellen Schnittstelle. Text, den das Smartphone schreibt, wird an die Funktion run() in der Datei Peripheral.h des Beispiels übergeben, die auf dem Display zeichnet.

Koppeln Sie das Inkplate in den Bluetooth-Einstellungen Ihres Smartphones, öffnen Sie dann eine Bluetooth-Serial-Terminal-App (in den Kommentaren des Sketches ist Serial Bluetooth Terminal genannt; eine ähnliche App funktioniert ebenfalls) und wählen Sie das Inkplate in der Geräteliste aus. Ein Befehl beginnt mit # und endet mit *. Senden Sie nach den Zeichenbefehlen #L(1)*, um das Ergebnis auf dem Bildschirm anzuzeigen; laut den Kommentaren des Sketches entspricht das display->display().

Dieses Beispiel verwendet außerdem die Bluetooth-LE-Bibliothek (BLEDevice, BLEServer, BLEUtils, BLE2902) aus arduino-esp32. Sie gehört nicht zur Inkplate-Bibliothek und wird mit dem ESP32-Board-Package geliefert.

Beispielcode​

Das Listing ist die Sketch-Datei. Die Funktion run() und der Befehlsparser befinden sich in Peripheral.h im selben Beispielordner; öffnen Sie das vollständige Beispiel unten, um sie zu lesen.

Select Board
Inkplate7SPECTRA_Bluetooth_Peripheral_Mode.ino
#include "Inkplate.h"
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

#include "Peripheral.h"

#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" // For data coming IN to Inkplate
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" // For data coming OUT from Inkplate

BLEServer *pServer = NULL; // Pointer to BLEServer
BLECharacteristic *pTxCharacteristic; // Pointer to TX characteristic
bool deviceConnected = false; // Is client currently connected
bool oldDeviceConnected = false; // Store the previous connection

Inkplate inkplate;

#define BUFFER_SIZE 1000

char commandBuffer[BUFFER_SIZE + 1];

class MyServerCallbacks : public BLEServerCallbacks
{
void onConnect(BLEServer *pServer) {
deviceConnected = true;
Serial.println("Device connected");
};

void onDisconnect(BLEServer *pServer) {
deviceConnected = false;
Serial.println("Device disconnected");
}
};

class MyCallbacks : public BLECharacteristicCallbacks
{
void onWrite(BLECharacteristic *pCharacteristic) {
String rxValue = pCharacteristic->getValue();

if (rxValue.length() > 0)
{
size_t len = rxValue.length();
if (len > BUFFER_SIZE)
{
len = BUFFER_SIZE;
}
memcpy(commandBuffer, rxValue.c_str(), len);
commandBuffer[len] = 0;

run(commandBuffer, len, &inkplate, pTxCharacteristic);
}
}
};

void setup() // Initialize everything
{
Serial.begin(115200);

inkplate.begin();

BLEDevice::init("Inkplate 7 SPECTRA");

pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());

BLEService *pService = pServer->createService(SERVICE_UUID);

pTxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);

pTxCharacteristic->addDescriptor(new BLE2902());

BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE);

pRxCharacteristic->setCallbacks(new MyCallbacks());

pService->start();

pServer->getAdvertising()->start();

if (esp_bt_controller_get_status() != ESP_BT_CONTROLLER_STATUS_ENABLED)
{
Serial.println("BLE controller failed to start.");
}
else
{
Serial.println("The device started, now you can pair it with Bluetooth and send commands.");
}
}

void loop()
{
if (!deviceConnected && oldDeviceConnected)
{
delay(500); // Allow bluetooth stack some time
pServer->startAdvertising(); // Restart advertising
oldDeviceConnected = false;
}

if (deviceConnected && !oldDeviceConnected)
{
oldDeviceConnected = true;
}
}

Verwendete Funktionen​

Inkplate()returns None

Erstellt das Inkplate-Objekt. Inkplate 7SPECTRA hat nur einen einzigen Sechs-Farben-Modus, daher erhält der Konstruktor kein Modus-Argument.

ReturnsKonstruktor; kein Rückgabewert.

inkplate.begin()returns void

Initialisiert die Bibliothek, die Peripherie und den Framebuffer. Rufen Sie sie einmal in setup() auf.

ReturnsNichts.

run(char commandBuffer[], size_t n, Inkplate *display, BLECharacteristic *pTxCharacteristic)returns void

Definiert in der Datei Peripheral.h des Beispiels. Sucht im empfangenen Text nach einem Befehl zwischen # und *, führt die passende Zeichenfunktion für das Inkplate-Objekt aus und antwortet über die Sende-Characteristic, wenn ein Befehl dies verlangt (der Befehl `#?` antwortet mit OK).

ReturnsNichts.

Serial.begin(115200)returns void

Arduino-Core-Funktion: startet die serielle Schnittstelle mit 115200 Baud.

ReturnsNichts.

BLEDevice::init(name)returns void

Bluetooth-LE-Bibliothek des ESP32-Board-Packages: startet Bluetooth LE mit dem Gerätenamen, den das Smartphone sieht, hier Inkplate 7 SPECTRA.

ReturnsNichts.

BLEDevice::createServer()returns BLEServer *

Bluetooth-LE-Bibliothek: erstellt den Bluetooth-LE-Server.

ReturnsDer Server.

pServer->setCallbacks(callbacks)returns void

Bluetooth-LE-Bibliothek: registriert das Objekt, dessen Funktionen onConnect und onDisconnect ausgeführt werden, wenn sich ein Smartphone verbindet oder trennt. Der Sketch gibt Device connected oder Device disconnected aus.

ReturnsNichts.

pServer->createService(SERVICE_UUID)returns BLEService *

Bluetooth-LE-Bibliothek: erstellt den Dienst mit der UART-Service-UUID, die am Anfang des Sketches definiert ist.

ReturnsDer Dienst.

pService->createCharacteristic(uuid, properties)returns BLECharacteristic *

Bluetooth-LE-Bibliothek: erstellt eine Characteristic. Der Sketch legt eine Sende-Characteristic mit PROPERTY_NOTIFY (Daten, die vom Inkplate ausgehen) und eine Empfangs-Characteristic mit PROPERTY_WRITE (eingehende Daten) an.

ReturnsDie Characteristic.

pTxCharacteristic->addDescriptor(new BLE2902())returns void

Bluetooth-LE-Bibliothek: erlaubt es dem Smartphone, Benachrichtigungen für die Sende-Characteristic ein- und auszuschalten.

ReturnsNichts.

pRxCharacteristic->setCallbacks(new MyCallbacks())returns void

Bluetooth-LE-Bibliothek: registriert das Objekt, dessen Funktion onWrite ausgeführt wird, wenn das Smartphone in die Empfangs-Characteristic schreibt.

ReturnsNichts.

pCharacteristic->getValue()returns String

Bluetooth-LE-Bibliothek: gibt den Text zurück, den das Smartphone geschrieben hat. Der Sketch kopiert davon höchstens 1000 Zeichen in einen Puffer und übergibt den Puffer an run().

ReturnsDer empfangene Text.

pTxCharacteristic->setValue(value)returns void

Bluetooth-LE-Bibliothek, aufgerufen innerhalb von run(): legt den Wert fest, der an das Smartphone zurückgesendet wird.

ReturnsNichts.

pTxCharacteristic->notify()returns void

Bluetooth-LE-Bibliothek, aufgerufen innerhalb von run(): sendet den Wert an das verbundene Smartphone.

ReturnsNichts.

pService->start()returns void

Bluetooth-LE-Bibliothek: startet den Dienst.

ReturnsNichts.

pServer->getAdvertising()->start()returns void

Bluetooth-LE-Bibliothek: startet das Advertising, damit das Smartphone das Inkplate finden kann.

ReturnsNichts.

pServer->startAdvertising()returns void

Bluetooth-LE-Bibliothek: startet das Advertising neu. Der Sketch ruft sie in loop() eine halbe Sekunde nach dem Trennen eines Smartphones auf, damit sich ein neues verbinden kann.

ReturnsNichts.

esp_bt_controller_get_status()returns esp_bt_controller_status_t

Funktion des ESP32-Board-Packages: gibt den Zustand des Bluetooth-Controllers zurück. Der Sketch vergleicht ihn mit ESP_BT_CONTROLLER_STATUS_ENABLED, um zu melden, ob Bluetooth gestartet ist.

ReturnsDer Zustand des Controllers.

Serial.println(text)returns size_t

Arduino-Core-Funktion: gibt eine Zeile im Serial Monitor aus.

ReturnsAnzahl der ausgegebenen Bytes.

delay(ms)returns void

Arduino-Core-Funktion: wartet die angegebene Anzahl von Millisekunden.

ReturnsNichts.

Was Sie erwarten können​

Bei einem Serial Monitor mit 115200 Baud gibt der Sketch Folgendes aus, sobald Bluetooth gestartet ist:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
The device started, now you can pair it with Bluetooth and send commands.

Er gibt Device connected aus, wenn sich ein Smartphone verbindet, und Device disconnected, wenn es die Verbindung trennt; startet Bluetooth nicht, gibt er stattdessen BLE controller failed to start. aus. Der Bildschirm zeigt nichts an, bis das Smartphone Zeichenbefehle gefolgt von #L(1)* sendet.

🔗Vollständiges Beispiel öffnen

examples/Inkplate7SPECTRA/Advanced/Communications/Inkplate7SPECTRA_Bluetooth_Peripheral_Mode

→