Bluetooth Low Energy (BLE) ist eine leistungsstarke Möglichkeit zur drahtlosen Kommunikation zwischen Ihrer CodeCell und anderen Geräten wie Smartphones, Tablets und sogar anderen Mikrocontrollern. In dieser Anleitung richten wir BLE auf CodeCell ein, ermöglichen den Empfang von Befehlen von einem BLE-Client und steuern die RGB-LED basierend auf den empfangenen Daten.
BLE ist eine energieeffiziente Version von Bluetooth, die es Geräten ermöglicht, kleine Datenmengen bei geringem Stromverbrauch auszutauschen. Hier sind die wichtigsten Konzepte:
Bevor wir mit dem Testen beginnen, müssen Sie eine App herunterladen, um BLE-Daten auf Ihr Smartphone zu senden. Beginnen Sie mit dem Herunterladen eine BLE-Scanner-App:
Damit CodeCell sich selbst als BLE-Gerät ankündigt , müssen wir BLE initialisieren, einen Dienst und eine Eigenschaft erstellen und mit der Werbung beginnen .
Dieser Code erstellt einen BLE-Server , kündigt einen Dienst an und richtet eine Eigenschaft ein , die von einem angeschlossenen Gerät gelesen und geschrieben werden kann. Die CodeCell empfängt die Tasteneigenschaft und steuert ihre integrierte RGB-LED:
#include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> #include <BLE2902.h> #include <CodeCell.h> CodeCell myCodeCell; BLECharacteristic *pButtonCharacteristic = NULL; #define BUTTON_UUID "abcd1234-abcd-1234-abcd-123456789012" class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer *pServer) override { Serial.println("BLE Connected"); delay(1000); } void onDisconnect(BLEServer *pServer) override { Serial.println("BLE Disconnected"); delay(500); BLEDevice::startAdvertising(); // Restart advertising } }; // Callback class for handling button writes class ButtonCallback : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) override { String value = pCharacteristic->getValue(); if (value.length() > 0) { int buttonState = value[0]; Serial.print("Button State: ");
Serial.println(buttonState); wenn (ButtonState == 1) { myCodeCell.LED(255, 0, 0); // Rote LED, wenn die Taste 1 ist } anders { myCodeCell.LED(0, 255, 0); // Grüne LED, wenn die Schaltfläche nicht 1 ist } } } }; void setup() { Serial.begin(115200); myCodeCell.Init(LIGHT); // Initialisiert den Lichtsensor BLEDevice::init("CodeCell_BLE"); // BLE-Gerätenamen festlegen BLEServer *bleServer = BLEDevice::createServer(); bleServer->setCallbacks(neu MyServerCallbacks()); BLEService *bleService = bleServer->createService(BLEUUID("12345678-1234-5678-1234-56789abcdef0")); // BLE-Merkmal für den Schaltflächenzustand erstellen pButtonCharacteristic = bleService->createCharacteristic( BUTTON_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE ); pButtonCharacteristic->addDescriptor(neues BLE2902()); pButtonCharacteristic->setCallbacks(neuer ButtonCallback()); bleService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID("12345678-1234-5678-1234-56789abcdef0"); BLEDevice::startAdvertising(); } void-Schleife() { // Keine ständige Überprüfung erforderlich, LED-Updates nur beim BLE-Schreiben }
"CodeCell_BLE"
."CodeCell_BLE"
her.
BUTTON_UUID
) und senden Sie den Wert:
1
→ LED leuchtet rot 🔴0
→ LED leuchtet grün 🟢Als Nächstes definieren wir eine neue BLE-Eigenschaft , die es CodeCell ermöglicht, Sensorwerte an ein verbundenes Gerät zu senden .
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLE2902.h>
#include <CodeCell.h>
CodeCell myCodeCell;
BLECharacteristic *pSensorCharacteristic = NULL;
#define SENSOR_UUID "abcd5678-abcd-5678-abcd-56789abcdef0"
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer *pServer) override {
Serial.println("BLE Connected");
delay(1000);
}
void onDisconnect(BLEServer *pServer) override {
Serial.println("BLE getrennt");
Verzögerung (500);
BLEDevice::startAdvertising(); // Werbung neu starten
}
};
void setup() {
Serial.begin(115200);
myCodeCell.Init(LIGHT); // Licht- und Näherungssensor initialisieren
BLEDevice::init("CodeCell_BLE"); // Benennen Sie das BLE-Gerät
BLEServer *bleServer = BLEDevice::createServer();
bleServer->setCallbacks(neu MyServerCallbacks());
BLEService *bleService = bleServer->createService(BLEUUID("12345678-1234-5678-1234-56789abcdef0"));
// BLE-Kennlinie für Sensordaten erstellen
pSensorCharacteristic = bleService->createCharacteristic(
SENSOR_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
pSensorCharacteristic->addDescriptor(neues BLE2902());
bleService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID("12345678-1234-5678-1234-56789abcdef0");
BLEDevice::startAdvertising();
}
void-Schleife() {
if (myCodeCell.Run(10)) { // Alle 100 ms (10 Hz) lesen
uint16_t Nähe = myCodeCell.Light_ProximityRead();
Serial.print("Nähe: ");
Serial.println(Nähe);
// Näherungswert in Zeichenfolge umwandeln und über BLE senden
String proximityStr = String(Nähe);
pSensorCharacteristic->setValue(proximityStr.c_str());
pSensorCharacteristic->notify(); // Verbundenes Gerät benachrichtigen
}
}
SENSOR_UUID
) ein , die Clients lesen und von der sie Echtzeit-Updates erhalten können:
Wir konvertieren die Zahl in eine Zeichenfolge und senden sie an den BLE-Client.
Da CodeCell jetzt Näherungssensordaten über BLE sendet , können Sie diese auf einem Telefon anzeigen .
"CodeCell_BLE"
suchen und verbindenSENSOR_UUID
)
Bewegen Sie ein Objekt in die Nähe des Sensors und sehen Sie, wie sich die Werte ändern!
Nachdem Sie CodeCell nun über BLE steuern können, versuchen Sie:
Erfahren Sie als Erster von neuen Projekten und sichern Sie sich spannende Angebote!
© 2025 Microbots.