NRF52840 Mikrocontroller mit Bluetooth Low Energy: Eigene BLE-Projekte mit der Arduino IDE
WLAN ist nicht immer die richtige Wahl: Wearables, batteriebetriebene Sensoren oder Fernbedienungen brauchen einen Funkstandard, der Wochen statt Stunden mit einer Knopfzelle auskommt. Genau dafür ist Bluetooth Low Energy (BLE) gemacht – und der NRF52840-Mikrocontroller bringt einen waschechten BLE-Funkchip direkt mit auf die Platine. In diesem Tutorial baust du damit einen eigenen BLE-Sensor, den du direkt mit deinem Smartphone auslesen kannst.
Was den NRF52840 von ESP32 & Co. unterscheidet
Der NRF52840 von Nordic Semiconductor ist ein ARM-Cortex-M4-Mikrocontroller mit integriertem 2,4-GHz-Funkmodul, das speziell für energiesparende Funkstandards wie Bluetooth Low Energy, Zigbee und Thread entwickelt wurde. Während ein ESP32 in Sachen WiFi-Durchsatz klar vorne liegt, spielt der NRF52840 seine Stärken aus, sobald es um minimalen Stromverbrauch bei Dauerbetrieb mit Batterie geht – ein typisches BLE-Beacon läuft damit oft monatelang mit einer einzigen Knopfzelle.
Über die Arduino-IDE-Unterstützung (z. B. Adafruit nRF52 Board-Paket) stehen dir die vollständige ArduinoBLE- bzw. Bluefruit-Bibliothek zur Verfügung, mit der du sowohl als BLE-Peripheriegerät (z. B. dein Sensor) als auch als BLE-Zentrale auftreten kannst.
Was du brauchst
Zum Testen der BLE-Verbindung reicht auf dem Smartphone eine kostenlose Generic-BLE-Scanner-App wie "nRF Connect" von Nordic Semiconductor.
Einrichtung in der Arduino IDE
Füge über den Boardverwalter das passende nRF52840-Boardpaket hinzu (z. B. "Adafruit nRF52 Boards" oder das Paket deines konkreten Moduls) und wähle dein Board aus. Installiere zusätzlich die Bibliotheken ArduinoBLE sowie für den Sensor DHT sensor library von Adafruit inklusive Adafruit Unified Sensor.
| Bauteil-Pin | NRF52840-Pin | Funktion |
|---|---|---|
| DHT22 VCC | 3.3V | Spannungsversorgung |
| DHT22 GND | GND | Masse |
| DHT22 Data | Pin 2 (digital) | Ein-Draht-Datenleitung |
| Status-LED Anode | Pin 3 (über Vorwiderstand) | Verbindungsstatus anzeigen |
Code 1: BLE-Peripheriegerät mit Temperatur-Wert
#include <ArduinoBLE.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
BLEService umweltService("181A"); // Standard Environmental Sensing Service
BLEFloatCharacteristic temperaturChar("2A6E", BLERead | BLENotify);
void setup() {
Serial.begin(115200);
dht.begin();
if (!BLE.begin()) {
Serial.println("BLE Start fehlgeschlagen!");
while (1);
}
BLE.setLocalName("MAKEROO-Sensor");
BLE.setAdvertisedService(umweltService);
umweltService.addCharacteristic(temperaturChar);
BLE.addService(umweltService);
temperaturChar.writeValue(0.0);
BLE.advertise();
Serial.println("BLE-Sensor bereit, wird beworben...");
}
void loop() {
BLEDevice zentrale = BLE.central();
if (zentrale) {
Serial.print("Verbunden mit: ");
Serial.println(zentrale.address());
while (zentrale.connected()) {
float temperatur = dht.readTemperature();
if (!isnan(temperatur)) {
temperaturChar.writeValue(temperatur);
Serial.print("Gesendet: ");
Serial.print(temperatur);
Serial.println(" °C");
}
delay(2000);
}
Serial.println("Verbindung getrennt");
}
}
Code 2: Statusanzeige per LED (verbunden / werbend)
#include <ArduinoBLE.h>
#define STATUS_LED 3
void setup() {
pinMode(STATUS_LED, OUTPUT);
BLE.begin();
BLE.setLocalName("MAKEROO-Sensor");
BLE.advertise();
}
void loop() {
BLEDevice zentrale = BLE.central();
if (zentrale && zentrale.connected()) {
digitalWrite(STATUS_LED, HIGH); // Dauerleuchten = verbunden
} else {
// Langsames Blinken = wird beworben, noch nicht verbunden
digitalWrite(STATUS_LED, HIGH);
delay(100);
digitalWrite(STATUS_LED, LOW);
delay(900);
}
}
Code 3: BLE-Zentrale – NRF52840 liest einen anderen BLE-Sensor aus
Der NRF52840 kann nicht nur als Peripheriegerät, sondern auch als Zentrale auftreten und selbst nach anderen BLE-Geräten suchen – praktisch, um mehrere BLE-Sensorknoten an einem zentralen Board zu sammeln.
#include <ArduinoBLE.h>
void setup() {
Serial.begin(115200);
if (!BLE.begin()) {
Serial.println("BLE Start fehlgeschlagen!");
while (1);
}
BLE.scanForName("MAKEROO-Sensor");
Serial.println("Suche nach MAKEROO-Sensor...");
}
void loop() {
BLEDevice gefunden = BLE.available();
if (gefunden) {
Serial.print("Gefunden: ");
Serial.println(gefunden.address());
BLE.stopScan();
if (gefunden.connect()) {
Serial.println("Verbunden!");
if (gefunden.discoverAttributes()) {
BLECharacteristic temperaturChar = gefunden.characteristic("2A6E");
if (temperaturChar) {
float wert;
temperaturChar.readValue(wert);
Serial.print("Empfangene Temperatur: ");
Serial.println(wert);
}
}
gefunden.disconnect();
}
delay(5000);
BLE.scanForName("MAKEROO-Sensor");
}
}
Praxistipps
🔋 Stromverbrauch weiter senken: Zwischen zwei Messungen kannst du den NRF52840 in den Low-Power-Modus versetzen, statt nur delay() zu nutzen – das senkt den Verbrauch nochmal deutlich gegenüber reinem Warten.
📱 Erste Tests ganz ohne eigenen Code: Bevor du eine eigene App baust, kannst du deinen Sensor direkt mit der App "nRF Connect" verifizieren – sie zeigt alle Services und Characteristics eines BLE-Geräts an.
🏷️ Eindeutige Service-UUIDs nutzen: Für eigene, nicht standardisierte Werte (statt Temperatur) solltest du eigene 128-Bit-UUIDs generieren, um Kollisionen mit anderen BLE-Geräten in der Umgebung zu vermeiden.
Troubleshooting
⚠️ "BLE Start fehlgeschlagen": Prüfe, ob wirklich das passende Board (nicht versehentlich ein AVR- oder ESP32-Board) in der Arduino IDE ausgewählt ist – ArduinoBLE funktioniert nur auf Boards mit echtem BLE-Funkchip.
⚠️ Handy findet das Gerät nicht: Manche Smartphones cachen alte BLE-Scans. Bluetooth am Handy kurz aus- und wieder einschalten löst das meist zuverlässig.
ℹ️ Zigbee/Thread/Matter: Der gleiche Funkchip beherrscht neben BLE auch Zigbee und Thread. Für Matter-Projekte brauchst du allerdings einen entsprechenden SDK-Unterbau (z. B. nRF Connect SDK), der über die reine Arduino-IDE-Unterstützung hinausgeht.
⚡ Starte dein eigenes BLE-Projekt
Alle Bauteile für dieses Tutorial findest du bei MAKEROO.
- NRF52840 USB-C Mikrocontroller
- Sensoren & Module – DHT22 & mehr
Fazit
Der NRF52840 macht aus deinem nächsten Projekt einen waschechten BLE-Teilnehmer, der direkt mit jedem Smartphone kommuniziert – ganz ohne WLAN-Router oder Cloud-Anbindung. Für batteriebetriebene Sensoren, Wearables oder eigene Fernbedienungen ist das oft die deutlich energieeffizientere und direktere Lösung als eine WiFi-Verbindung über ESP32.