---
title: "ESP32-Sensoren per BLE synchronisieren ohne GPS (SoftPLL) — PToB Blog"
description: "Synchronisiere ESP32-S3-Sensoren per Bluetooth Low Energy ohne GPS oder UTC. Sieh, wie ein SoftPLL den Uhrendrift korrigiert, und starte das Beispiel am Computer."
url: "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/"
language: "de"
robots: "index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
representations: {"application/json":"https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/?format=json","text/markdown":"https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/?format=markdown"}
format_description: "https://ptob.dev/agent-formats.json"
---

# ESP32-Sensoren ohne GPS über BLE synchronisieren

Ein ESP32-S3 gibt den Takt vor. Mit einem Phasenregelkreis in Software können Sensormodule in der Nähe ihre Messwerte ohne UTC-Referenz auf dieselbe Zeitachse beziehen.

[Jonathan Yantis](https://github.com/yantisj2/PToB/blob/main/CREDITS.md) 8. November 2026  5 Min. Lesezeit

![Ein ESP32-S3 sendet Zeitinformationen per Bluetooth an zwei Sensormodule. Beide beziehen ihre Messwerte auf dieselbe Zeitachse.](https://ptob.dev/blog/esp32-wireless-softpll-v1.svg)

In diesem Beispiel liefert ein frei laufender ESP32-S3 per Bluetooth Low Energy eine gemeinsame Zeitbasis für Sensormodule in der Nähe.

In diesem Beitrag

Befestige zwei Beschleunigungssensoren an den gegenüberliegenden Enden einer Werkbank und klopfe darauf. Wenn ein Sensor die Erschütterung früher aufzeichnet, ist sie dort wirklich früher angekommen? Oder gehen die Uhren der beiden Boards unterschiedlich?

Für den Vergleich brauchen beide Boards dieselbe Zeitachse. Ein ESP32-S3 kann als Referenz dienen und die verstrichene Zeit ab einem beliebigen Startpunkt vorgeben. Sein Oszillator läuft frei. So funktioniert der Aufbau auch in Innenräumen ohne GPS oder Zeitserver im Netz. Die Gruppe folgt dem Takt dieses Oszillators, auch wenn er gegenüber der Weltzeit UTC abdriftet. Diesen Aufbau verwendet [Beispiel 01: Drahtloser SoftPLL über BLE](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-example).

## Zwei Zeitstempel für dasselbe Funkereignis

Das Referenzboard sendet 16-mal pro Sekunde ein Zeitpaket über Bluetooth Low Energy (BLE). Beide Empfänger hören dieselben Aussendungen. Beim Empfang eines Originalpakets speichert jeder einen lokalen Zeitstempel aus dem Controller. Ein späteres Paket enthält die geschätzte Sendezeit des Originals auf der Referenzuhr. Der Empfänger ordnet die beiden Angaben anhand der Paketnummer, des Funkereigniszählers und des Kanals innerhalb derselben Quellsitzung einander zu. So erhält er zwei Zeitwerte für das frühere Ereignis.

Beim Originalpaket hält der Empfänger den lokalen Zählerstand fest. Das Folgepaket liefert die dazugehörige geschätzte Referenzzeit.

Entscheidend ist der Zeitpunkt des Funkereignisses. Wenn die Anwendung ihren Callback ausführt, ist das Paket bereits angekommen. Andere Aufgaben können den Aufruf zusätzlich verzögern. Das Beispiel liest den Empfangszeitstempel des Controllers in Schritten von 500 ns. Für das Senden schätzt es den Zeitpunkt anhand des Sendeplans im Controller. Verzögerungen im Funkpfad können das Wertepaar systematisch verschieben, selbst wenn die Zeitstempel wenig streuen. Der Zeitstempeladapter ist auf den ESP32-S3 und die im Repository festgelegte ESP-IDF-Version zugeschnitten. [Zeitstempeladapter für den ESP32-S3](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-adapter) · [Ereigniszuordnung und Sitzungsregeln](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-protocol)

## Den Gang bestimmen und die Zeitabweichung ausgleichen

Stell dir vor, die beiden Empfängeruhren zeigen am Anfang dieselbe Zeit an. Geht eine um 20 ppm vor und die andere um 15 ppm nach, liegen ihre unkorrigierten Anzeigen nach zehn Sekunden 350 Mikrosekunden auseinander. Je länger die Zeitspanne, desto stärker wirkt sich dieser Gangunterschied aus.

Ein **Phasenregelkreis in Software**, kurz **SoftPLL**, schätzt anhand der jeweils jüngsten Zeitstempelpaare, wie viel Zeit einem lokalen Zähltakt entspricht. Wächst der Vorsprung stetig, läuft die Uhr zu schnell. Die Differenz zwischen der aktuellen Anzeige und der geschätzten Referenzzeit ist der **Phasenfehler**, den der Regelkreis ausgleichen soll.

Beispielhafte Zeitstempelpaare. Die Steigung zeigt, wie schnell die Abweichung wächst. Der Abstand zur Nulllinie zeigt, wie weit die Uhr zu diesem Zeitpunkt vorgeht.

Aus den Zeitstempelpaaren schätzt der Regelkreis den Gang der Uhr. Dann aktualisiert er die Softwareuhr und gleicht die verbleibende Zeitabweichung aus, indem er die Anzeige kurzzeitig schneller oder langsamer laufen lässt. Das ist dieselbe *gleitende Korrektur* wie in Teil 1, diesmal anhand von Beobachtungen. Die Uhr läuft weiter, und der Quarz schwingt in seinem eigenen Takt. [Eine einfache Uhr auf dem ESP32 bauen](https://ptob.dev/de/blog/esp32-uhren-grundlagen/) · [SoftPLL-Implementierung](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-loop)

## Messwerte auf eine gemeinsame Zeitachse bringen

Wenn ein Sensor ein Ereignis aufzeichnet, erfasse den lokalen Zählerstand so nah am Abtastzeitpunkt, wie es die Hardware erlaubt. Rechne den Zählerstand mit der gerade gültigen Softwareuhr in die gemeinsame Zeit um und speichere sie beim Messwert. Jedes Board verwendet seine eigene Umrechnung. Jetzt kannst du beide Schwingungsverläufe auf derselben Zeitachse vergleichen, selbst wenn die Daten in umgekehrter Reihenfolge am Laptop eintreffen.

Beispielwerte auf einem vergrößerten Ausschnitt der Zeitachse. Nach der Umrechnung liegen die erfassten Ereignisse 300 µs auseinander.

Der Vergleich hängt weiterhin davon ab, wann die Sensoren tatsächlich abtasten und wie genau du diesen Zeitpunkt erfasst. Beide Sensoren gleichzeitig abtasten zu lassen, ist eine eigene Aufgabe. Um die Gleichzeitigkeit zu prüfen, miss die Flanken der Abtastsignale mit einem gemeinsamen Messgerät. Die Uhren werden dabei weiterhin über BLE geregelt.

## Wann die Uhr bereit ist

Bevor der Empfänger ein Folgepaket zur Korrektur nutzt, vergleicht er dessen Referenzzeit mit der Vorhersage, die er beim ursprünglichen Ereignis gespeichert hat. Für die Anzeige **LOOP LOCK** braucht der Regelkreis genügend Vorhersagen mit kleinen Abweichungen, eine belastbare Schätzung des Uhrengangs und einen kleinen verbleibenden Phasenfehler. Die Anzeige beschreibt, wie eng die Softwareuhr ihren BLE-Beobachtungen folgt. Eine feste Verzögerung in diesen Beobachtungen kann die Uhrzeit weiterhin verschieben.

Bleiben brauchbare Paare aus, liefert die Uhr ab 500 ms nach dem Empfang des letzten verwendbaren Originalpakets keine gültige Zeit mehr. Bei einer neuen Quellsitzung muss der Regelkreis den Gang erneut bestimmen. Speichere den rohen Zählerstand und die Quellsitzung zusammen mit deinen Daten. So erkennst du beim späteren Vergleich der Kurven auch Lücken und Neustarts. [Lock-Prüfung und Ablauf im Code](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-loop)

## Ohne angeschlossene Boards ausprobieren

Starte die Übung am Computer. Sie nutzt denselben Regelkreis wie die Firmware, mit einer simulierten Referenz und zwei Empfängern, die um +20 beziehungsweise −15 ppm abweichen. Überlege zuerst, welches Vorzeichen die beiden Gangkorrekturen haben sollten, und prüfe dann die Ausgabe. Lass anschließend einen Empfänger mehr Pakete verpassen und beobachte, wie viele Ereignisse du noch vergleichen kannst. Die Ausgabe zählt fehlende Gelegenheiten zum Vergleich und zeigt die zeitliche Streuung. [Beispiel 01 starten](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-example) · [Simulation ändern](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#source-simulation)

Jeder Zeitstempel braucht eine Referenz.
**Welches Ereignis wurde erfasst?**

## Die Einzelheiten erkunden

[Eine einfache Uhr auf dem ESP32 bauen Teil 1 zeigt, wie Software aus Zähltakten die Zeit berechnet und eine Uhr ohne Zeitsprung korrigiert.](https://ptob.dev/de/blog/esp32-uhren-grundlagen/)[Wie passive BLE-Zeitübertragung auf dem ESP32 funktioniert Verfolge ein Funkereignis bis zur Zeitschätzung im Empfänger.](https://ptob.dev/de/blog/passives-ble-esp32/)

## Quellen und weitere Lektüre

Primärquellen zu den besprochenen Geräten und Methoden.

1. [PToB · ESP32-REF 01 — Software-PLL über BLE](https://github.com/yantisj2/PToB/tree/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/01_wireless_softpll)

   Starte die Übung am Computer oder sieh dir den Aufbau mit Referenz und Empfängern auf ESP32-S3-Boards an.
2. [PToB · Funkprotokoll und Sitzungsregeln](https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/docs/wireless-protocol.md)

   So ordnet der Empfänger Funkereignisse zu, prüft die Quellsitzung und verwirft abgelaufene Zeitwerte.
3. [PToB · Zeitstempeladapter für den ESP32-S3](https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/docs/esp32s3-port.md)

   Der Empfangszeitstempel, die Schätzung der Sendezeit und ihre Abhängigkeit von der festgelegten ESP-IDF-Controller-Version.
4. [PToB · SoftPLL-Implementierung](https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/components/ref_softpll/ref_softpll.c)

   Gangschätzung, Phasenkorrektur, Auswertung der Vorhersagen und Lock-Prüfung im Quellcode.
5. [PToB · Simulation mit zwei Empfängern](https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/01_wireless_softpll/simulation.c)

   Ändere den Gang der simulierten Oszillatoren oder die Paketverluste und beobachte, wie sich die Zeitschätzungen ändern.

## Diesen Beitrag zitieren

Jonathan Yantis. ESP32-Sensoren ohne GPS über BLE synchronisieren PToB Blog. Veröffentlicht am 8. November 2026.

Permalink zum Beitrag: [https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/](https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/)

[Zurück zum Blog](https://ptob.dev/de/blog/)[Messnachweise des Projekts ansehen](https://github.com/yantisj2/PToB/blob/main/evidence/README.md)

## Structured data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "WebSite",
      "@id": "https://ptob.dev/#website",
      "url": "https://ptob.dev/",
      "name": "PToB",
      "alternateName": [
        "Precision Time over BLE",
        "Precision Time over Bluetooth"
      ],
      "description": "Bluetooth and USB software clocks: W12 60.3 ns relative-PPS RMS over 522/600 observations, separate 64 s sampled holdover, and CoreSE diagnostics.",
      "inLanguage": [
        "en",
        "de"
      ],
      "publisher": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      }
    },
    {
      "@type": "Person",
      "@id": "https://ptob.dev/#jonathan-yantis",
      "name": "Jonathan Yantis",
      "url": "https://github.com/yantisj2/PToB/blob/main/CREDITS.md"
    },
    {
      "@type": "Project",
      "@id": "https://ptob.dev/#project",
      "name": "PToB",
      "alternateName": "Precision Time over BLE",
      "url": "https://ptob.dev/",
      "description": "An independent protocol project researching precision time transfer across Bluetooth-enabled microcontrollers and USB clients.",
      "sameAs": "https://github.com/yantisj2/PToB",
      "member": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      },
      "knowsAbout": {
        "@id": "https://ptob.dev/#protocol"
      }
    },
    {
      "@type": "Thing",
      "@id": "https://ptob.dev/#protocol",
      "name": "Precision Time over BLE",
      "alternateName": "PToB",
      "description": "An experimental PTP-inspired protocol proposal for wireless clock synchronization over Bluetooth Low Energy."
    },
    {
      "@type": "WebPage",
      "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#webpage",
      "url": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/",
      "name": "ESP32-Sensoren per BLE synchronisieren ohne GPS (SoftPLL) — PToB Blog",
      "description": "Synchronisiere ESP32-S3-Sensoren per Bluetooth Low Energy ohne GPS oder UTC. Sieh, wie ein SoftPLL den Uhrendrift korrigiert, und starte das Beispiel am Computer.",
      "inLanguage": "de",
      "keywords": [
        "ESP32-S3",
        "Drahtlose Sensorsynchronisierung",
        "Bluetooth Low Energy",
        "SoftPLL"
      ],
      "isPartOf": {
        "@id": "https://ptob.dev/#website"
      },
      "author": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      },
      "about": {
        "@id": "https://ptob.dev/#protocol"
      },
      "dateModified": "2026-11-08T00:00:00.000Z",
      "image": "https://ptob.dev/blog/esp32-wireless-softpll-v1.jpg",
      "breadcrumb": {
        "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#breadcrumbs"
      },
      "mainEntity": {
        "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#article"
      },
      "translationOfWork": {
        "@id": "https://ptob.dev/blog/esp32-wireless-softpll/#webpage"
      }
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#breadcrumbs",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "PToB",
          "item": "https://ptob.dev/de/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Blog",
          "item": "https://ptob.dev/de/blog/"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "ESP32-Sensoren ohne GPS über BLE synchronisieren",
          "item": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/"
        }
      ]
    },
    {
      "@type": "Blog",
      "@id": "https://ptob.dev/de/blog/#blog",
      "url": "https://ptob.dev/de/blog/",
      "name": "PToB-Blog",
      "description": "Entwicklungsnotizen über gemeinsame Zeit, preiswerte Hardware und die Experimente hinter PToB.",
      "inLanguage": "de",
      "publisher": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      },
      "isPartOf": {
        "@id": "https://ptob.dev/#website"
      },
      "blogPost": [
        {
          "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/esp32-uhren-grundlagen/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/zuverlaessige-firmware-zeitmesh/#article"
        },
        {
          "@id": "https://ptob.dev/blog/lab-sensor-timing-economics/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/starlink-lokaler-stratum-1-zeitserver/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/raspberry-pi-ptp-ntp-ble/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/gnss-resilientes-zeitmesh/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/passives-lora-kanalwechsel/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/esp32-holdover-unter-einer-mikrosekunde/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/lokale-zeit-utc-netz/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/grandmaster-ausfall-und-uhrenensemble/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/ble-uhren-innenraumnavigation/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/passives-ble-esp32/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/warum-utc/#article"
        },
        {
          "@id": "https://ptob.dev/de/blog/warum-ptob/#article"
        }
      ]
    },
    {
      "@type": "BlogPosting",
      "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#article",
      "url": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/",
      "headline": "ESP32-Sensoren ohne GPS über BLE synchronisieren",
      "description": "Synchronisiere ESP32-S3-Sensoren per Bluetooth Low Energy ohne GPS oder UTC. Sieh, wie ein SoftPLL den Uhrendrift korrigiert, und starte das Beispiel am Computer.",
      "mainEntityOfPage": {
        "@id": "https://ptob.dev/de/blog/esp32-sensoren-ble-synchronisieren/#webpage"
      },
      "isPartOf": {
        "@id": "https://ptob.dev/de/blog/#blog"
      },
      "author": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      },
      "publisher": {
        "@id": "https://ptob.dev/#jonathan-yantis"
      },
      "inLanguage": "de",
      "dateCreated": "2026-11-08T00:00:00.000Z",
      "dateModified": "2026-11-08T00:00:00.000Z",
      "datePublished": "2026-11-08T00:00:00.000Z",
      "image": "https://ptob.dev/blog/esp32-wireless-softpll-v1.jpg",
      "articleSection": "ESP32-Firmwarebeispiele · Teil 2",
      "keywords": [
        "ESP32-S3",
        "Drahtlose Sensorsynchronisierung",
        "Bluetooth Low Energy",
        "SoftPLL"
      ],
      "wordCount": 1293,
      "citation": [
        {
          "@type": "CreativeWork",
          "name": "PToB · ESP32-REF 01 — Software-PLL über BLE",
          "url": "https://github.com/yantisj2/PToB/tree/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/01_wireless_softpll"
        },
        {
          "@type": "CreativeWork",
          "name": "PToB · Funkprotokoll und Sitzungsregeln",
          "url": "https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/docs/wireless-protocol.md"
        },
        {
          "@type": "CreativeWork",
          "name": "PToB · Zeitstempeladapter für den ESP32-S3",
          "url": "https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/docs/esp32s3-port.md"
        },
        {
          "@type": "CreativeWork",
          "name": "PToB · SoftPLL-Implementierung",
          "url": "https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/components/ref_softpll/ref_softpll.c"
        },
        {
          "@type": "CreativeWork",
          "name": "PToB · Simulation mit zwei Empfängern",
          "url": "https://github.com/yantisj2/PToB/blob/c8686bb38de0802f21e9b93b803c538dc7b2306f/firmware/examples/esp32-ref/01_wireless_softpll/simulation.c"
        }
      ],
      "about": {
        "@id": "https://ptob.dev/#protocol"
      }
    }
  ]
}
```
