ESP32 Spannung messen

Eigentlich ein so einfaches Projekt, trotzdem bin ich gerade sprachlos und fast im Begriff die Nobelpreisakademie anzurufen, ich habe ein neues Naturgesetz entdeckt. Aber wahrscheinlich bin ich einfach nur zu müde.

Ich will mit einem ESP32 die Spannung einer 9V-Blockbatterie messen, um den Akkustand meiner Batterie zu erfahren und zu wissen, wann diese leer ist. Dazu habe ich GPIO Nummer 2 genutzt und einen Spannungsteiler vorgeschaltet.
R1 = 100kOhm; R2 = 5kOhm; andere Widerstände habe ich gerade nicht da.
Außerdem habe ich diesen Sketch benutzt:

#define PIN_TEST 2

#define REF_VOLTAGE 3.3
#define PIN_STEPS 4069

const float R1 = 10000.0;          
const float R2 =  5000.0;

float vout = 0.0, vin = 0.0;
int rawValue = 0;

void setup()
{
    Serial.begin(9600);
    pinMode(PIN_TEST, INPUT);
}

void loop()
{
    rawValue = analogRead(PIN_TEST);
    Serial.println(String(rawValue));
    vout = (rawValue * REF_VOLTAGE) / PIN_STEPS;
    vin = vout / (R2 / (R1 + R2));

    if (vin < 0.09) {
        vin = 0.0;
    }

    Serial.println("U = " + String(vin) + " V");
    delay(1000);
}

Jetzt das Merkwürdige: Ist die Schaltung aufgebaut und Pin 2 ist verbunden, messe ich 0V und als rawValue ebenfalls 0. Wenn Pin 2 nicht verbunden ist, messe ich plötzlich Spannung. Irgendwas um die 1,5V. Wie kann das sein?

Ich bin jetzt schon dankbar über eure Hilfe.

#define PIN_STEPS 4069

Beim 12-Bit Wandler würde ich 4096 Steps erwarten.

const float R1 = 10000.0;

Das sind nur 10kOhm.

Wenn ich richtig überschlagen habe, lässt Du mit Deinem Spannungsteiler von den 9V nur 5% an den A/D-Wandler durch. Das sind 0.45V - knapp 14% des möglichen Meßbereichs (560/4096). Scheint mir suboptimal dimensioniert zu sein.

Serial.println(String(rawValue));

Das geht auch ohne String; println hat eine passende Methode:

Serial.println(rawValue);

Wie sehen denn die Raw-Werte aus?

Edit: Ach so, die Frage.

Der offene Pin wirkt als Antenne - da kannst Du alles messen.

BTW: Sind Minus der Batterie und GND vom ESP verbunden?

Ihr Code zeigt R1 als 10k und nicht als 100k an.

Wow, erstmal danke für das ganze Feedback. Ich habe noch nicht viel Erfahrung mit Spannungsteilern, ich bringe mir die ganze Materie selber bei.

BTW: Sind Minus der Batterie und GND vom ESP verbunden?

Ah, Problem gelöst. Ich habe diesen Link zum Nachbauen verwendet: T1-Electric measurement: Messung an einer 9 V Batterie
Bei Abbildung 1 sieht man, dass + und - der Batterie vertauscht sind. Und das bei einer Berufsbildenden Schule. Das habe ich gerade erst endeckt, als ich meine Vermutung mal ausprobiert habe. Jetzt werden 6,6 V gemessen. Die Batterie hat aber eigentlich eine (mit dem Multimeter) gemessene Spannung von 9,15 V. Die Differenz ist ja nicht ganz unerheblich. @wno158 Kommt das von den 5% die beim Spannungsteiler nur durchgelassen werden?

Nee, glaube ich nicht.

Rechnen wir mal nach (hoffe dass das richtig ist):
9.15V -> Spannungsteiler 100k:5k -> (9.15 / 105) * 5 = 0.436V am ADC.
Das ist zwar jetzt nicht viel Spannung, sollte aber reichen.

Nach meiner Rechnung sollte der Raw-Wert dann 541 sein (ungefähr).
Kannst Du das bestätigen?

Hallo,
sorry wnn ich mich da reinhänge.
ich vermute das die 100K zu hochohmig sind und das C im AD Wandler nicht richtig geladen wird. Hast Du nicht noch eine zweiten 100K um die mal parallel zu schalten.

ich wurde da ehr einen Teiler nehmen 10K und 4,7K oder 22K und 10K. Zudem sind die Analogeingänge des ESP32 nicht besonders linear.
Heinz

Kein sorry nötig. Bin heilfroh wenn jemand mit soliderem Wissen als meinem helfen kann.
Also: Danke!

Nach meiner Rechnung sollte der Raw-Wert dann 541 sein (ungefähr).
Kannst Du das bestätigen?

Müsste ich morgen Mal nachschauen.
Ich weiß, dass die Analogeingänge nicht so linear sind, aber eine Differenz von 3 V lässt sich damit nicht erklären. Ein Teiler, wie du ihn vorgeschlagen hast, würde sicher mehr bringen, ich hatte jedoch gerade keine anderen Widerstände da. Ich werde morgen Mal einen zweiten 100kOhm parallel schalten. Du meinst sicher parallel zu R1 und nicht parallel zur gesamten Schaltung, oder?

Ja, das ist wirklich war. Die AD Wandler Eingänge vom ESP32 kann man in der Pfeife Rauchen. Die würde ich nur verwenden, wenn die Feststellung reicht, Spannung vorhanden? Ja / nein

Mal ne Zwischenfrage, Auf dem ESP sind doch 3,3V auf dem Pin => 4096...

Spannungsteiler berechnen geht auch mit ner Kalkulationstabelle.

Und was der ESP analog kann, steht in der Doku Ich find das schon interessant zu lesen, das der 2ADC hat bei denen bei mutmasslich gleichen Bedingungen unterschiedliche Werte rauskommen.

Vielleicht interpretiere ich das auch nur falsch...

Unglückliche Wahl, weil ADC2 bei Wifi, solltest Du das mal verwenden wollen, nicht funktioniert. Nimm besser die reinen Eingänge GPIO34, GPIO35, GPIO39 und GPIO39.

Hallo,
ja sicher, damit hast Du dann einen Teiler R1=50K R2= 5K gibt (R1+R2)/R2= 55/5=11

den kannst Du ja erst mal mit den 3,3V testen , dann solltest Du eine Spannung von 3,3/11=0,3V und einen Rohwert von 4096/11=372 bekommen. Ob das dann reicht musst Du mal sehen,es sollte jedenfalls besser werden.
Noch eine Anmerkung dazu, Widerstände haben eine Toleranzangabe. Das können im schlimmsten Fall auch 10% sein.(Farbcode) Wenn Du jetzt einen Widerstand im plus hast und den anderen im Minus kann sich schon ein ziemlicher Fehler ergeben. Du solltest also Deine Widerstände tatsächlich mal messen und die gemessenen Werte im Sketch eintragen. Eine andere Variante ist halt einen Faktor, zu verwenden der sich mittels einer Referenzmessung ergibt. Wenn man zudem einen Offset verwendet hat man gleich eine lineare Regression, und kann damit Unlinearitäten ganz gut kompensieren. An Faktor und Offset kommt man recht einfach mit Excel.
Heinz

Habe die Schaltung jetzt so aufgebaut, wie du sie empfohlen hast und folgende Werte: R1 = 49,998K und R2 = 5,04K. Jetzt weden immer um die 7,4 V gemessen. Ich habe ADC1 verwendet, da mein Projekt später auch mit Bluetooth arbeiten soll, und ADC 2 dann wohl nicht funktioniert.
Ich habe mal überprüft: Bei der 9V Batterie ist eine Differenz von 1,7V zu messen. Bei einer 5V Spannungsquelle habe ich ca. 1,5V Differenz. Man könnte somit einfach 1,5-1,7V auf die errechneten Werte drauf rechnen, aber das ist ja nun auch nicht Sinn der Sache...
Für meinen Verwendungszweck würde es aber wohl reichen, da ich ja nur prüfen will, ob die Spannung der Batterie unter 7,2 V (leer) sinkt. Aber ich denke, ich werde es wohl nicht verbauen, zu viele Unsicherheiten und der Sinn des Projekts ist ja ein anderer. Folglich gilt wohl bald die Schlussfolgerung: Gerät funktioniert nicht mehr → Gehäuse aufschrauben und Batterie prüfen :wink:

Trotzdem Danke für euer Aller Hilfe, und falls euch doch noch was einfällt, gerne melden!

ESP32: A function that improves the default ADC reading accuracy to within 1%

Du könntest auch einen besseren/genaueren ADC verwenden. Evtl. den ADS1115, der wird per I2C an den Controller angebunden.

@my_xy_projekt Bringt leider nichts.

Du könntest auch einen besseren/genaueren ADC verwenden. Evtl. den ADS1115, der wird per I2C an den Controller angebunden.

Klar, das ist möglich und würde sicherlich bessere Ergebnisse liefern, aber das würde jetzt doch den Rahmen meines Projekts sprengen. Die Spannungsmessung wäre ein schönes "Add-On" mit Bordmitteln gewesen, aber es ist nicht essentiell für das Projekt.
Aber für alle anderen, die vor dem gleichen Problem stehen und für die Spannungsmessung essentiell ist, ist das die beste Lösung!

Naja...der Aufwand ist ja nun nicht so groß, aber deine Entscheidung.

Warum?

Naja...der Aufwand ist ja nun nicht so groß, aber deine Entscheidung.

Nein, der Aufwand nicht. Aber der Platz im Gehäuse ist sehr begrenzt. Es soll alles auf kleinstem Raum stattfinden (zum in die Gitarrentasche stecken quasi). Und dann sage ich mir einfach: Anstatt dass ich ein größeres Gehäuse kaufe, um den externen ADC auch noch unterzubringen, schmeiße ich diese Funktion lieber raus und habe dann ales auf kleinstem Raum.

Warum?

Gute Frage. Der Sketch an sich funktioniert. Ich habe mit dem neuen errechneten Wert weitergerechnet und versucht in meinen obigen Sketch einzubauen, jedoch funktioniert die Umrechnung für den Spannungsteiler nicht mehr. Ganz kann ich mir das auch nicht erklären.

Ok, dann interpretiere ich dein "bringt leider nichts" etwas anders.