Bluetooth-Seriell
Was dieses Beispiel zeigt
Tauschen Sie Text zwischen einem Smartphone und dem Inkplate 7SPECTRA über Bluetooth LE aus. Was das Smartphone sendet, erscheint im Serial Monitor; was Sie im Serial Monitor eingeben, wird an das Smartphone gesendet. Sobald Bluetooth gestartet ist, zeigt der Bildschirm eine kurze Meldung an.
Koppeln Sie das Inkplate in den Bluetooth-Einstellungen des Smartphones mit Ihrem Smartphone, öffnen Sie dann eine Bluetooth-Serial-Terminal-App (die Kommentare im Sketch nennen Serial Bluetooth Terminal; eine ähnliche App funktioniert ebenfalls) und wählen Sie das Inkplate in der Geräteliste aus.
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-Paket installiert.
Beispielcode
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include "Inkplate.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
Inkplate inkplate; // Create an object on Inkplate library and also set library into 1-bit mode (BW)
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
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)
{
Serial.print("Received Value: ");
for (int i = 0; i < rxValue.length(); i++)
{
Serial.print(rxValue[i]);
}
Serial.println();
}
}
};
void setup()
{
inkplate.begin(); // Init Inkplate library (you should call this function ONLY ONCE)
inkplate.clearDisplay(); // Clear frame buffer of display
inkplate.setTextSize(3); // Scale text to be 3 times bigger then original (5x7 px)
inkplate.setTextColor(INKPLATE_BLACK);
inkplate.println("Bluetooth Serial");
inkplate.println("Example");
inkplate.println();
inkplate.setTextSize(2);
Serial.begin(115200);
BLEDevice::init("Inkplate 7SPECTRA");
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");
inkplate.println("BLE FAILED");
}
else
{
inkplate.println("The device started, now you can ");
inkplate.println("pair it with Bluetooth and send");
inkplate.println("messages.");
inkplate.println();
inkplate.println("Open Serial Monitor at 115200");
inkplate.println("baud!");
}
inkplate.display();
}
void loop()
{
if (deviceConnected)
{
if (Serial.available())
{
String s = Serial.readStringUntil('\n') + "\n"; // Load the message from serial
Serial.printf("Sent value: %s\n", s.c_str());
pTxCharacteristic->setValue((uint8_t *)s.c_str(), strlen(s.c_str())); // Convert the message into bytes
pTxCharacteristic->notify(); // Transmit the message
}
}
if (!deviceConnected && oldDeviceConnected)
{
delay(500); // Allow bluetooth stack some time
pServer->startAdvertising(); // Restart advertising
oldDeviceConnected = false; // Update state
}
if (deviceConnected && !oldDeviceConnected)
{
oldDeviceConnected = true; // Update the old state
}
}
Der Kommentar neben Inkplate inkplate; erwähnt einen 1-Bit-Modus; das Inkplate 7SPECTRA hat nur seinen Sechs-Farben-Modus, und der Konstruktor nimmt keinen Modus entgegen.
Verwendete Funktionen
Inkplate()returns NoneErstellt das Inkplate-Objekt. Das Inkplate 7SPECTRA hat einen einzigen Sechs-Farben-Modus, daher nimmt der Konstruktor kein Modus-Argument entgegen.
ReturnsKonstruktor; kein Rückgabewert.
inkplate.begin()returns voidInitialisiert die Bibliothek, die Peripherie und den Framebuffer. Rufen Sie sie einmal in setup() auf.
ReturnsNichts.
inkplate.clearDisplay()returns voidFüllt den Framebuffer mit Weiß. Das Panel wird dadurch nicht verändert.
ReturnsNichts.
inkplate.setTextSize(uint8_t s)returns voidLegt die Textvergrößerung fest: 3 für den Titel, 2 für die folgenden Zeilen.
ReturnsNichts.
inkplate.setTextColor(uint16_t c)returns voidLegt die Textfarbe fest, hier INKPLATE_BLACK.
ReturnsNichts.
inkplate.println(text)returns size_tGibt Text in den Framebuffer aus und springt in die nächste Zeile, wie Serial.println().
ReturnsAnzahl der ausgegebenen Bytes.
inkplate.display(bool _leaveOn = 0)returns voidSendet den gesamten Framebuffer an das Panel und aktualisiert es.
ReturnsNichts.
Serial.begin(115200)returns voidFunktion des Arduino-Cores: startet die serielle Schnittstelle mit 115200 Baud.
ReturnsNichts.
BLEDevice::init(name)returns voidBluetooth-LE-Bibliothek des ESP32-Board-Pakets: startet Bluetooth LE mit dem Gerätenamen, den das Smartphone sieht, hier Inkplate 7SPECTRA.
ReturnsNichts.
BLEDevice::createServer()returns BLEServer *Bluetooth-LE-Bibliothek: erstellt den Bluetooth-LE-Server.
ReturnsDer Server.
pServer->setCallbacks(callbacks)returns voidBluetooth-LE-Bibliothek: registriert das Objekt, dessen Funktionen onConnect und onDisconnect ausgeführt werden, wenn sich ein Smartphone verbindet oder trennt.
ReturnsNichts.
pServer->createService(SERVICE_UUID)returns BLEService *Bluetooth-LE-Bibliothek: erstellt den Service mit der UART-Service-UUID, die am Anfang des Sketches definiert ist.
ReturnsDer Service.
pService->createCharacteristic(uuid, properties)returns BLECharacteristic *Bluetooth-LE-Bibliothek: erstellt eine Characteristic. Der Sketch erstellt eine Sende-Characteristic mit PROPERTY_NOTIFY (Daten, die vom Inkplate ausgehen) und eine Empfangs-Characteristic mit PROPERTY_WRITE (eingehende Daten).
ReturnsDie Characteristic.
pTxCharacteristic->addDescriptor(new BLE2902())returns voidBluetooth-LE-Bibliothek: ermöglicht es dem Smartphone, Benachrichtigungen für die Sende-Characteristic ein- und auszuschalten.
ReturnsNichts.
pRxCharacteristic->setCallbacks(new MyCallbacks())returns voidBluetooth-LE-Bibliothek: registriert das Objekt, dessen Funktion onWrite ausgeführt wird, wenn das Smartphone in die Empfangs-Characteristic schreibt.
ReturnsNichts.
pCharacteristic->getValue()returns StringBluetooth-LE-Bibliothek: gibt den Text zurück, den das Smartphone geschrieben hat. Der Sketch gibt ihn Zeichen für Zeichen im Serial Monitor aus.
ReturnsDer empfangene Text.
pService->start()returns voidBluetooth-LE-Bibliothek: startet den Service.
ReturnsNichts.
pServer->getAdvertising()->start()returns voidBluetooth-LE-Bibliothek: startet das Advertising, damit das Smartphone das Inkplate finden kann.
ReturnsNichts.
pServer->startAdvertising()returns voidBluetooth-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_tFunktion des ESP32-Board-Pakets: 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.
pTxCharacteristic->setValue(uint8_t *data, size_t length)returns voidBluetooth-LE-Bibliothek: legt die Bytes fest, die an das Smartphone gesendet werden; der Sketch übergibt die im Serial Monitor gelesene Zeile.
ReturnsNichts.
pTxCharacteristic->notify()returns voidBluetooth-LE-Bibliothek: sendet den Wert an das verbundene Smartphone.
ReturnsNichts.
Serial.available()returns intFunktion des Arduino-Cores: gibt zurück, wie viele Bytes im seriellen Empfangspuffer warten.
ReturnsAnzahl der verfügbaren Bytes.
Serial.readStringUntil(char terminator)returns StringFunktion des Arduino-Cores: liest Zeichen von der seriellen Schnittstelle bis zum Endzeichen, hier ein Zeilenumbruch.
ReturnsDer gelesene Text.
Serial.print(value)returns size_tFunktion des Arduino-Cores: gibt Text ohne Zeilenumbruch im Serial Monitor aus.
ReturnsAnzahl der ausgegebenen Bytes.
Serial.println(text)returns size_tFunktion des Arduino-Cores: gibt eine Zeile im Serial Monitor aus.
ReturnsAnzahl der ausgegebenen Bytes.
Serial.printf(format, ...)returns size_tFunktion des Arduino-Cores auf dem ESP32: gibt formatierten Text im Serial Monitor aus.
ReturnsAnzahl der ausgegebenen Bytes.
delay(ms)returns voidFunktion des Arduino-Cores: wartet die angegebene Anzahl von Millisekunden.
ReturnsNichts.
Was Sie erwarten können
Der Bildschirm zeigt Bluetooth Serial Example, gefolgt von der Meldung The device started, now you can pair it with Bluetooth and send messages. und einem Hinweis, den Serial Monitor mit 115200 Baud zu öffnen. Wenn Bluetooth nicht startet, erscheint stattdessen BLE FAILED.
Wenn sich ein Smartphone verbindet und Text sendet, zeigt der Serial Monitor mit 115200 Baud ihn an, zum Beispiel nachdem das Smartphone hello gesendet hat:
Device connected
Received Value: hello
Geben Sie im Serial Monitor eine Zeile ein, während das Smartphone verbunden ist, dann gibt der Sketch Sent value: gefolgt von Ihrem Text aus und sendet ihn an das Smartphone. Der Sketch gibt Device disconnected aus, wenn das Smartphone die Verbindung trennt.
🔗Vollständiges Beispiel öffnen
examples/Inkplate7SPECTRA/Advanced/Communications/Inkplate7SPECTRA_Bluetooth_Serial