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

1x NRF52840 USB-C Mikrocontroller – Zum Produkt
1x AM2302 (DHT22) Temperatur- und Feuchtigkeitssensor – Zum Produkt
1x Solderless Breadboard 400 Kontakte – Zum Produkt
3mm LED Sortiment (Statusanzeige) – Zum Produkt
600x Widerstände-Sortiment (Vorwiderstand LED) – Zum Produkt

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.

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.

Zurück zum Blog