ESP32 ADC richtig auslesen: Analogwerte kalibrieren, Nichtlinearität & Rauschen in den Griff bekommen

Du hängst ein Poti an den ESP32, drehst es ganz nach links und liest 142 statt 0. Ganz nach rechts: 4095, aber schon ab 3,1 V. Dazwischen zappelt der Wert um ±30 Digits, und sobald das WLAN startet, liefert der halbe Chip nur noch Nullen. Der ADC des ESP32 hat seinen schlechten Ruf verdient – aber er ist beherrschbar. Dieser Artikel erklärt, warum er sich so verhält und zeigt Schritt für Schritt, wie du aus dem verrauschten Rohwert eine belastbare Messung machst.

Die vier Eigenheiten, die alle Probleme verursachen

Bevor Code hilft, muss klar sein, womit du es zu tun hast. Der ESP32-ADC weicht in vier Punkten von dem ab, was man vom AVR-Chip eines UNO R3 gewohnt ist:

Eigenheit Was du beobachtest Ursache
Nichtlinearität Kennlinie ist keine Gerade, Fehler bis 6 % Aufbau des SAR-Wandlers, chipabhängig
Totzone unten bei 0 V kommt nicht 0, sondern 100–200 Offset der Eingangsstufe
Sättigung oben ab ca. 3,1 V immer 4095 Attenuator erreicht sein Limit
ADC2 blockiert bei aktivem WLAN nur noch Nullen WLAN-Treiber belegt ADC2 exklusiv

⚠️ Die wichtigste Regel überhaupt: Nutze nur ADC1. Das sind beim WROOM32 die Pins GPIO32 bis GPIO39. Alle anderen Analogpins (GPIO0, 2, 4, 12–15, 25–27) gehören zu ADC2 – und der ist gesperrt, sobald WiFi.begin() läuft. Der fiese Teil: Es gibt keine Fehlermeldung. analogRead() gibt einfach 0 zurück, und du suchst den Fehler stundenlang beim Sensor.

ℹ️ GPIO34 bis GPIO39 sind reine Eingänge. Sie haben keine internen Pullups und keine Ausgangstreiber. Für Analogmessungen ist das genau richtig – für einen Taster brauchst du dort aber einen externen Widerstand aus dem Widerstands-Sortiment.

Attenuation: der Vorteiler, den du kennen musst

Der eigentliche Wandler des ESP32 misst nur bis etwa 1,1 V. Damit du trotzdem 3,3 V messen kannst, sitzt davor ein umschaltbarer Abschwächer. Dessen Einstellung bestimmt Messbereich und Genauigkeit:

Attenuation Arduino-Konstante Empfohlener Bereich Typische Anwendung
0 dB ADC_0db 100–950 mV kleine Sensorsignale, beste Linearität
2,5 dB ADC_2_5db 100–1250 mV Mittelweg
6 dB ADC_6db 150–1750 mV Spannungsteiler-Ausgänge
11 / 12 dB ADC_11db 150–2450 mV (nutzbar bis ca. 3,1 V) Standard, größter Bereich

💡 Die Faustregel: Wähle die kleinste Attenuation, in die dein Signal noch hineinpasst. Ein ALS-PT19 Lichtsensor, der maximal 0,9 V liefert, wird mit ADC_0db spürbar genauer gemessen als mit der Standardeinstellung – weil er dann den vollen 12-Bit-Bereich ausnutzt statt nur ein Viertel davon.

Das brauchst du

ESP32 DEV KIT WROOM32 (USB-C) – acht ADC1-Kanäle auf GPIO32 bis GPIO39
600er Widerstands-Sortiment – für Spannungsteiler und RC-Tiefpass
Kapazitiver Bodenfeuchte-Sensor – der Klassiker, bei dem Kalibrierung alles entscheidet
ACS712 Stromsensor 5A – analoges Signal um 2,5 V herum, empfindlich gegen Offsetfehler
ALS-PT19 Lichtsensor – kleines Signal, ideal für niedrige Attenuation
0,96 Zoll OLED SSD1306 – Messwert und Rauschband auf einen Blick
TP4056 Lademodul – für den Batteriewächter am Ende des Artikels
LM2596S Step-Down-Wandler – eine saubere Versorgung ist die halbe Messgenauigkeit

Dazu ein Multimeter. Ohne eine zweite Messquelle kannst du nicht kalibrieren, sondern nur raten.

1Erst messen, was der Chip wirklich tut

Bevor du irgendetwas korrigierst, brauchst du eine Bestandsaufnahme. Dieser Sketch zeigt Rohwert, Streuung und die eingebaute Kalibrierung nebeneinander:

#define ADC_PIN 34        // ADC1 - funktioniert auch mit aktivem WLAN

void setup() {
  Serial.begin(115200);
  delay(300);

  analogReadResolution(12);          // 0..4095
  analogSetPinAttenuation(ADC_PIN, ADC_11db);

  Serial.println(F("roh_min roh_max spanne mittel mV_kalibriert"));
}

void loop() {
  const uint16_t N = 200;

  uint32_t summe = 0;
  uint16_t minWert = 4095;
  uint16_t maxWert = 0;

  for (uint16_t i = 0; i < N; i++) {
    uint16_t w = analogRead(ADC_PIN);
    summe += w;
    if (w < minWert) minWert = w;
    if (w > maxWert) maxWert = w;
    delayMicroseconds(200);
  }

  uint16_t mittel = summe / N;

  // analogReadMilliVolts nutzt die im Chip gespeicherte Werkskalibrierung
  uint32_t mv = analogReadMilliVolts(ADC_PIN);

  Serial.print(minWert);   Serial.print('\t');
  Serial.print(maxWert);   Serial.print('\t');
  Serial.print(maxWert - minWert); Serial.print('\t');
  Serial.print(mittel);    Serial.print('\t');
  Serial.println(mv);

  delay(500);
}

💡 analogReadMilliVolts() ist der wichtigste Befehl in diesem ganzen Artikel. Er nutzt die Kalibrierdaten, die ab Werk in die eFuses jedes einzelnen Chips gebrannt wurden, und rechnet den Rohwert in Millivolt um – inklusive Korrektur der Nichtlinearität. Für die meisten Projekte ist das die komplette Lösung. Wer stattdessen analogRead() * 3.3 / 4095 rechnet, verschenkt genau diese Korrektur und wundert sich über 5 % Abweichung.

ℹ️ Was du bei diesem Test sehen solltest: Bei einem offenen, unbeschalteten Pin springt der Wert wild – das ist normal, der Eingang ist hochohmig und fängt alles ein. Leg ihn testweise auf GND: Die Spanne zwischen Minimum und Maximum sollte auf unter 20 Digits fallen. Tut sie das nicht, hast du ein Masse- oder Versorgungsproblem, kein Softwareproblem.

2Rauschen bekämpfen: Oversampling und Median

Ein einzelner analogRead() ist beim ESP32 fast wertlos. Mit Mehrfachmessung und dem richtigen Filter wird daraus ein stabiler Wert:

// --- Median: killt einzelne Ausreisser komplett ---
uint16_t leseMedian(uint8_t pin, uint8_t n = 15) {
  uint16_t puffer[31];
  if (n > 31) n = 31;

  for (uint8_t i = 0; i < n; i++) {
    puffer[i] = analogRead(pin);
    delayMicroseconds(100);
  }

  // Einfaches Insertion-Sort - bei n < 32 voellig ausreichend
  for (uint8_t i = 1; i < n; i++) {
    uint16_t schluessel = puffer[i];
    int8_t j = i - 1;
    while (j >= 0 && puffer[j] > schluessel) {
      puffer[j + 1] = puffer[j];
      j--;
    }
    puffer[j + 1] = schluessel;
  }
  return puffer[n / 2];
}

// --- Getrimmter Mittelwert: robust und ohne Sortier-Overhead im Extremfall ---
uint32_t leseMillivoltStabil(uint8_t pin, uint8_t n = 32) {
  uint32_t summe = 0;
  uint32_t minW = 0xFFFFFFFF, maxW = 0;

  for (uint8_t i = 0; i < n; i++) {
    uint32_t w = analogReadMilliVolts(pin);
    summe += w;
    if (w < minW) minW = w;
    if (w > maxW) maxW = w;
    delayMicroseconds(150);
  }

  // Groessten und kleinsten Wert verwerfen
  summe -= (minW + maxW);
  return summe / (n - 2);
}

// --- EMA: glaettet langsame Signale ohne Puffer im RAM ---
float emaWert = NAN;

float leseGeglaettet(uint8_t pin, float alpha = 0.15) {
  float neu = (float) analogReadMilliVolts(pin);
  if (isnan(emaWert)) emaWert = neu;          // beim ersten Mal uebernehmen
  else emaWert = emaWert * (1.0 - alpha) + neu * alpha;
  return emaWert;
}
Filter Gut gegen Kostet Einsatz
Median einzelne Ausreißer, Störspitzen RAM für den Puffer Motoren, Relais in der Nähe
Getrimmter Mittelwert Grundrauschen etwas Zeit Standardfall
EMA Zittern der Anzeige fast nichts langsame Größen wie Temperatur
RC-Tiefpass hochfrequente Einstreuung zwei Bauteile immer sinnvoll bei langen Kabeln

ℹ️ Der beste Filter ist Hardware. Ein 10 kΩ Widerstand in Reihe zum Eingang plus 100 nF gegen Masse bildet einen Tiefpass mit rund 160 Hz Grenzfrequenz. Das dämpft alles, was oberhalb liegt, bevor der Wandler es überhaupt sieht – und kostet keinen einzigen Rechenzyklus. Mehr zu Filtern in Software steht im Artikel Sensorwerte glätten mit Arduino.

⚠️ Die Eingangsimpedanz ist nicht unendlich. Der ESP32-ADC will eine Quelle mit maximal etwa 10 kΩ Innenwiderstand. Hängst du einen Spannungsteiler aus zwei 1-MΩ-Widerständen dran, kann sich der Sample-Kondensator nicht schnell genug laden und du misst systematisch zu wenig. Bleib bei Teilern im Bereich 10 kΩ bis 100 kΩ – oder setze einen 100 nF Kondensator direkt an den Eingangspin.

3Zwei-Punkt-Kalibrierung mit dem Multimeter

Wenn dir die Werkskalibrierung nicht genau genug ist – etwa beim Batteriewächter, wo 0,1 V über "laden" oder "nicht laden" entscheiden – hilft eine eigene Kalibrierung. Du misst zwei bekannte Punkte und legst eine Gerade hindurch:

// Zwei Messpunkte, mit dem Multimeter am Pin ermittelt.
// Waehle sie moeglichst weit auseinander, aber im spaeteren Arbeitsbereich.
const float P1_IST_MV = 500.0;    // Multimeter zeigte 0,500 V
const float P1_ADC_MV = 478.0;    // ESP32 meldete 478 mV

const float P2_IST_MV = 2500.0;   // Multimeter zeigte 2,500 V
const float P2_ADC_MV = 2431.0;   // ESP32 meldete 2431 mV

// Geradengleichung: ist = steigung * gemessen + offset
const float STEIGUNG = (P2_IST_MV - P1_IST_MV) / (P2_ADC_MV - P1_ADC_MV);
const float OFFSET   = P1_IST_MV - STEIGUNG * P1_ADC_MV;

float leseKalibriertMv(uint8_t pin) {
  float roh = (float) leseMillivoltStabil(pin, 32);
  return STEIGUNG * roh + OFFSET;
}

void kalibrierungAusgeben() {
  Serial.print(F("Steigung: "));
  Serial.print(STEIGUNG, 5);
  Serial.print(F("   Offset: "));
  Serial.print(OFFSET, 2);
  Serial.println(F(" mV"));
}

// --- Anwendung: Batteriewaechter fuer eine 18650-Zelle ---
// Spannungsteiler 100k / 100k halbiert die Zellspannung
#define BATT_PIN     35
const float TEILER_FAKTOR = 2.0;   // real nachmessen, nicht annehmen!

float batterieSpannung() {
  return leseKalibriertMv(BATT_PIN) * TEILER_FAKTOR / 1000.0;
}

uint8_t ladezustandProzent(float u) {
  // Grobe Kennlinie einer Li-Ion-Zelle unter kleiner Last
  if (u >= 4.15) return 100;
  if (u <= 3.30) return 0;

  if (u > 3.85) return (uint8_t)(70 + (u - 3.85) * (30.0 / 0.30));
  if (u > 3.60) return (uint8_t)(20 + (u - 3.60) * (50.0 / 0.25));
  return (uint8_t)((u - 3.30) * (20.0 / 0.30));
}

⚠️ Den Teilerfaktor nachmessen, nicht ausrechnen. Zwei Widerstände mit 5 % Toleranz ergeben einen Teiler, der um bis zu 10 % danebenliegt. Miss die tatsächlichen Werte mit dem Multimeter und rechne TEILER_FAKTOR = (R1 + R2) / R2. Das ist der Unterschied zwischen einer Anzeige, die 3,7 V zeigt, und einer, die 3,7 V bedeutet.

⚠️ Kalibrierpunkte im echten Arbeitsbereich wählen. Wer bei 0,1 V und 3,3 V kalibriert, legt die Gerade genau durch die beiden Bereiche, in denen der ADC am ungenauesten ist. Für einen 18650-Wächter mit Halbierung liegen die interessanten Spannungen zwischen 1,65 V und 2,1 V – dort gehören auch die Kalibrierpunkte hin.

4Praxisfall: Bodenfeuchte und ACS712 sauber auswerten

Zwei Sensoren, zwei völlig verschiedene Kalibrierstrategien. Beim Feuchtesensor sind die Endpunkte willkürlich, beim Stromsensor zählt der Nullpunkt:

#define FEUCHTE_PIN  36     // ADC1
#define ACS_PIN      39     // ADC1

// --- Kapazitiver Bodenfeuchte-Sensor ---
// Beide Werte selbst ermitteln: einmal an der Luft, einmal im Wasserglas.
// Achtung: Der Sensor gibt bei TROCKEN den HOEHEREN Wert aus.
uint32_t TROCKEN_MV = 2650;
uint32_t NASS_MV    = 1180;

void feuchteKalibrieren() {
  Serial.println(F("Sensor an die Luft halten, dann Taste im Monitor..."));
  while (!Serial.available()) { delay(50); }
  while (Serial.available()) Serial.read();
  TROCKEN_MV = leseMillivoltStabil(FEUCHTE_PIN, 64);
  Serial.print(F("Trocken: ")); Serial.println(TROCKEN_MV);

  Serial.println(F("Sensor ins Wasser, dann Taste..."));
  while (!Serial.available()) { delay(50); }
  while (Serial.available()) Serial.read();
  NASS_MV = leseMillivoltStabil(FEUCHTE_PIN, 64);
  Serial.print(F("Nass: ")); Serial.println(NASS_MV);
}

int8_t feuchteProzent() {
  uint32_t mv = leseMillivoltStabil(FEUCHTE_PIN, 32);

  if (TROCKEN_MV <= NASS_MV) return -1;         // Kalibrierung fehlt

  long p = map((long)mv, (long)TROCKEN_MV, (long)NASS_MV, 0, 100);
  return (int8_t) constrain(p, 0, 100);
}

// --- ACS712 5A: Nullpunkt ist alles ---
float acsNullMv = 2500.0;                       // Sollwert, wird ueberschrieben
const float ACS_MV_PRO_A = 185.0;               // 5A-Variante: 185 mV/A

void acsNullpunktMessen() {
  // WICHTIG: dabei darf kein Strom fliessen
  Serial.println(F("Verbraucher abklemmen, dann Taste..."));
  while (!Serial.available()) { delay(50); }
  while (Serial.available()) Serial.read();

  uint32_t summe = 0;
  for (uint16_t i = 0; i < 200; i++) {
    summe += analogReadMilliVolts(ACS_PIN);
    delay(2);
  }
  acsNullMv = summe / 200.0;

  Serial.print(F("Nullpunkt: "));
  Serial.print(acsNullMv, 1);
  Serial.println(F(" mV"));
}

float stromAmpere() {
  float mv = (float) leseMillivoltStabil(ACS_PIN, 32);
  float a  = (mv - acsNullMv) / ACS_MV_PRO_A;

  // Totband: unter 40 mA ist die Messung ohnehin nur Rauschen
  if (fabs(a) < 0.04) a = 0.0;
  return a;
}

⚠️ Der ACS712 gibt bei 5 V Versorgung bis zu 5 V aus – das zerstört den ESP32-Eingang. Bei Nullstrom liegen schon 2,5 V an, das geht gerade noch. Aber bei negativem Strom oder Störspitzen schießt der Ausgang darüber hinaus. Setz einen Spannungsteiler 10 kΩ / 15 kΩ dazwischen und rechne den Faktor mit ein. Details zum Sensor stehen im Artikel ACS712 Stromsensor mit Arduino auslesen.

💡 Kalibrierwerte in den Flash schreiben, nicht in den Code. Ein Sensor, der nach jedem Neustart neu kalibriert werden muss, ist im Alltag unbrauchbar. Mit Preferences legst du Trocken- und Nasswert dauerhaft ab – wie das geht, zeigt Arduino EEPROM & ESP32 Preferences. Die Kalibrierroutine startest du dann nur noch per Tastendruck beim Einschalten.

5Anzeige mit Rauschband auf dem OLED

Eine reine Zahl verrät nicht, wie stabil sie ist. Diese Anzeige zeigt zusätzlich, wie weit die Einzelmessungen streuen – damit siehst du sofort, ob dein Filter reicht:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display(128, 64, &Wire, -1);

struct Messung {
  float    mittelMv;
  uint16_t spanne;
};

Messung messeMitStreuung(uint8_t pin, uint8_t n = 40) {
  uint32_t summe = 0;
  uint32_t minW = 0xFFFFFFFF, maxW = 0;

  for (uint8_t i = 0; i < n; i++) {
    uint32_t w = analogReadMilliVolts(pin);
    summe += w;
    if (w < minW) minW = w;
    if (w > maxW) maxW = w;
    delayMicroseconds(150);
  }

  Messung m;
  m.mittelMv = summe / (float) n;
  m.spanne   = (uint16_t)(maxW - minW);
  return m;
}

void zeigeMessung(const Messung& m, uint16_t maxMv) {
  display.clearDisplay();

  display.setTextSize(1);
  display.setCursor(0, 0);
  display.print(F("ADC1 / GPIO34"));

  // Grosser Wert in Volt
  display.setTextSize(3);
  display.setCursor(0, 12);
  display.print(m.mittelMv / 1000.0, 3);
  display.setTextSize(1);
  display.print(F(" V"));

  // Balken mit dem Rauschband als Rahmen darum
  uint8_t x = map((long) m.mittelMv, 0, maxMv, 0, 126);
  uint8_t b = map((long) m.spanne,   0, maxMv, 0, 126);
  if (b < 2) b = 2;

  display.drawRect(0, 40, 128, 8, SSD1306_WHITE);
  display.fillRect(1, 41, x, 6, SSD1306_WHITE);

  // Streubreite als Markierung unterhalb
  int16_t links = (int16_t) x - b / 2;
  if (links < 0) links = 0;
  display.drawFastHLine(links, 50, b, SSD1306_WHITE);

  display.setCursor(0, 56);
  display.print(F("Streuung: "));
  display.print(m.spanne);
  display.print(F(" mV"));

  display.display();
}

ℹ️ Ein guter Zielwert für die Streuung: Bei einer sauber verkabelten Messung mit RC-Tiefpass sollte die Spanne über 40 Einzelmessungen unter 15 mV liegen. Werte über 50 mV bedeuten fast immer ein Hardwareproblem – lange ungeschirmte Kabel, gemeinsame Masse mit einem Motor, oder ein Schaltnetzteil ohne Siebung. Kein Softwarefilter ersetzt eine saubere Verdrahtung.

Troubleshooting

⚠️ analogRead() liefert konstant 0, sobald WLAN läuft: Du bist auf ADC2. Wechsle auf GPIO32–39. Das ist mit Abstand der häufigste ESP32-ADC-Fehler und kostet Anfänger regelmäßig einen halben Abend.

⚠️ Der Wert bleibt bei 4095 kleben: Die Eingangsspannung übersteigt etwa 3,1 V. Selbst mit ADC_11db ist bei diesem Wert Schluss – die letzten 200 mV sind nicht auflösbar. Setz einen Spannungsteiler davor, damit dein Maximalsignal bei etwa 2,4 V landet.

⚠️ Bei 0 V zeigt der ADC 130 statt 0: Das ist der bauartbedingte Offset, kein Defekt. Entweder du nutzt analogReadMilliVolts(), das ihn herausrechnet, oder du ziehst ihn per Zwei-Punkt-Kalibrierung ab. Ein Vergleich if (wert == 0) wird auf dem ESP32 nie zutreffen.

⚠️ Die Messung driftet über den Tag: Der ADC hängt an der Versorgungsspannung. Wenn dein ESP32 über ein langes USB-Kabel oder ein schwaches Netzteil versorgt wird, bricht die Spannung bei jedem WLAN-Sendeimpuls ein. Ein LM2596S mit 470 µF am Ausgang stabilisiert das.

⚠️ Zwei ESP32 messen unterschiedlich: Völlig normal. Die Werkskalibrierung ist chipindividuell, und die Nichtlinearität variiert von Exemplar zu Exemplar. Wenn du mehrere Geräte baust, muss jedes einzeln kalibriert werden – oder du nutzt konsequent analogReadMilliVolts(), das genau diesen Unterschied ausgleicht.

⚠️ Werte springen, wenn ein Relais schaltet: Einstreuung über die Masse. Trenne Last- und Signalmasse, führe sie nur an einem Punkt zusammen, und leg das Sensorkabel nicht parallel zur Lastleitung. Ein Median-Filter kaschiert das Symptom, beseitigt aber nicht die Ursache.

⚠️ Nach Deep Sleep sind die ersten Werte falsch: Der ADC braucht nach dem Aufwachen einige Millisekunden, bis der Referenzkreis eingeschwungen ist. Verwirf einfach die ersten fünf Messungen, bevor du auswertest.

Praxistipps

  • Immer ADC1. GPIO32 bis GPIO39. Schreib es dir an den Monitor, wenn nötig – dieser eine Punkt spart mehr Zeit als alle Filter zusammen.
  • analogReadMilliVolts() statt eigener Umrechnung. Die Werkskalibrierung im Chip ist besser als jede Formel, die du dir ausdenkst.
  • Kleinste passende Attenuation wählen. Ein Signal, das nur bis 0,9 V geht, gehört auf ADC_0db – dort nutzt du den vollen Wandlerbereich.
  • Hardware vor Software. 10 kΩ in Reihe, 100 nF gegen Masse. Zwei Bauteile aus dem Widerstands-Sortiment, die mehr bringen als fünfzig Zeilen Filtercode.
  • Sensorleitungen kurz halten. Ab etwa 30 cm ungeschirmtem Kabel fängst du deutlich mehr Störungen ein. Bei längeren Strecken lieber direkt am Sensor digitalisieren und den Wert über I2C übertragen.
  • Kalibrierwerte protokollieren. Schreib dir zu jedem Gerät auf, welche Werte du gemessen hast. Nach dem dritten gebauten Sensor weißt du sonst nicht mehr, welcher Wert zu welchem Board gehört.
  • Beim Batteriebetrieb unter Last messen. Eine 18650-Zelle zeigt im Leerlauf 3,9 V und unter 500 mA Last 3,6 V. Miss dort, wo dein Gerät tatsächlich arbeitet – sonst schaltet der Unterspannungsschutz zu spät. Passend dazu: TP4056 & MT3608 für Akkuprojekte.
  • Wenn es wirklich genau sein muss: Ein externer ADC über I2C umgeht alle Eigenheiten des internen Wandlers. Für die meisten Maker-Projekte ist das aber Überengineering – kalibriert und gefiltert reicht der interne ADC auf etwa 1 % genau, und das ist mehr als die Sensoren selbst hergeben.

🚀 Bauteile für saubere Analogmessungen

Fazit

Der ESP32-ADC ist nicht schlecht – er ist nur anders, als die meisten erwarten. Wer die vier Eigenheiten kennt, kommt mit erstaunlich wenig Aufwand zu belastbaren Werten: nur ADC1 benutzen, analogReadMilliVolts() statt eigener Dreisatzrechnung, die kleinste passende Attenuation und mehrfach messen statt einmal raten.

Diese vier Punkte bringen dich auf etwa 1 % Genauigkeit – mehr, als die meisten analogen Sensoren selbst liefern. Alles darüber hinaus ist eine Frage der Hardware: kurze Leitungen, ein RC-Tiefpass, eine saubere Masseführung und ein Netzteil, das nicht bei jedem WLAN-Impuls einbricht. Und wenn du dann noch die Streubreite mit anzeigst, siehst du beim nächsten Projekt sofort, ob dein Aufbau taugt – statt es erst nach einer Woche seltsamer Messwerte zu merken.

Zurück zum Blog