Spannung messen mit dem ESP32

OK, dann hÀnge ich morgen einen Uno oder Mega parallel dazu. Auch mit dem selben einfachen Programm. 3,3 Volt Controller habe ich leider nur diese ESP32. Bis vor ein paar Wochen gabs bei mir nur 5 Volt Technik. :roll_eyes:

Moin. Ich erinner mich gerade an den ESP8266 wo der ADC nicht so toll ist.
Zitat:

Der ADC Eingang taugt nur als grobes SchÀtzeisen, weil er nicht linear arbeitet und sich vom RF Interface stören lÀsst. Laut einer sehr gut versteckten Info im Datenblatt sind bis zu 20 % Abweichung möglich!

ESP8266 und ESP8285 Module Anleitung

Weiterhin wird empfohlen das WLAN bei der Messung abzuschalten, da dieses die Messung signifikant beeintrÀchtigt.

Ich bilde mir ein das auch mal zu ESP32 gelesen zu haben.

Ich habe das WLAN nicht eingeschalten, aber ich weiß nicht ob es an ist. Das ist im Moment noch nicht relevant bei mir. Aber ich schaue mal, ob ich was finde, wie man das WLAN ein/aus schaltet. Ich glaube sogar, dass mir Agmue schon ein Programm reingesetzt, wo WLAN benutzt wird. Aber jetzt bin ich erst mal unterwegs. Danke euch einstweilen. Heute Nachmittag geht®s bei mir weiter.

Franz

Nach meinem VerstÀndnis ist WLAN und dergleichen nur an, wenn man es per Programm mit sowas wie WiFi.softAP(ssid, password) einschaltet.

Ein Blick sollte auf jeden Fall Richtung Espressif gehen, denn die sollten ja wissen, was sie gebaut haben. Analog to Digital Converter (ADC) beschreibt in " ADC Limitations" schonmal wichtige Fakten, so daß die Wahl vorzugsweise auf Pins von ADC1 fĂ€llt.

Die Beispiele sind nicht fĂŒr die Arduino-IDE gedacht, schĂ€rfen aber das VerstĂ€ndnis und sind durchaus fĂŒr die IDE adaptierbar. Unter Nutzung der Kompilermeldungen habe ich sowas schon mal gemacht.

Allerdings ist fraglich, ob sich der Aufwand lohnt, wenn ich lese: "Just do yourself a favor and get a 1.5$ uC from Microchip or STM that has a “well-documented ADC” + DMA + SPI. This would be the best combination for a Wi-Fi/BLE-enabled application." In ESP32 ADC Tutorial – Read Analog Voltage in Arduino ist der Weg zu dieser Zusammenfassung gut beschrieben.

Nach meinen allerdings nur flĂŒchtigen EindrĂŒcken bin ich derzeit auch bei "SchĂ€tzeisen".

Beim ESP8266 musste man noch das WLAN explizit ausschalten.

Ohne WLAN nimmt der Chip 10-15 mA Strom auf. Der analoge Eingang funktioniert in diesem Zustand viel besser. Um die WLAN Schnittstelle vorĂŒbergehend aus zu schalten, muss man den Wakeup-Timer einbeziehen:

  ESP.deepSleep(1, WAKE_RF_DISABLED); 
  delay(100);

Der Mikrocontroller legt sich sehr kurz schlafen und startet mit deaktiviertem WLAN neu durch.
So reaktiviert man die Schnittstelle wieder:

  ESP.deepSleep(1, WAKE_RFCAL); 
  delay(100);

Beim ESP32 funktioniert das bestimmt Àhnlich, habe mich damit aber noch nicht beschÀftigt.

So OK. Ich hatte jetzt einen Mega und einen ESP32 an Labornetzteil und 3,00 Volt beide an der USB Schnittstelle. Beide das selbe minnimale Programm, der Mega hatte A6 als ADC Schnittstelle, der ESP32 die 34. Der Mega hatte 610 - 615 angezeigt, der ESP32 die ĂŒbliche weite Spanne. Ich hatte beide gleichzeitig in Betrieb und beide an der selben Spannung 3V vom Labornetzteil. Ich habe nur am PC umgestellt auf Wahlweise ESP32, oder Mega. Dann bekam ich jeweils die entsprechenden Daten am PC, am Serialen Bildschirm. Bleibt also dabei. Der ESP32 schlechtes SchĂ€tzeisen, der Mega ziehmlich stabile Werte. Da kommt man auch auf 3 Volt beim ausrechnen.

Hier gibt es Infos dazu: ESP32: Tips to increase battery life

Hallo,

https://docs.espressif.com/projects/arduino-esp32/en/latest/api/wifi.html?highlight=wifi%20off#disconnect

Das mit dem WiFi abstellen hat keine Änderung gebracht. Aber ich habe jetzt mal das delay() nach der Messung rausgeschmissen und durch Millis ersetzt.

#include <ArduinoOTA.h>
unsigned long AktuelleMillizeit = 0;
const int delayTimeM1 = 1000;     // Pausezeit 1 Sekunde
unsigned long VorherMillesM1 = 0; // Millis beim Start der Pause
int analogwert; // Vollgas ist 4096
const byte Spannungspin = 34;
void setup()
{
  Serial.begin(115200); //starten des seriellen Monitors
  pinMode(Spannungspin, INPUT);
  WiFi.mode(WIFI_STA);
}
void loop()
{
  AktuelleMillizeit =  millis();
  if (millis() - VorherMillesM1 >= delayTimeM1) // Jede Sekunde eine Messung
  {
    VorherMillesM1 = AktuelleMillizeit; // Die Sekunde neu Starten
    
    analogwert = analogRead(Spannungspin); // Auslesen Pin. 34
    Serial.println(analogwert);  // Ausgabe des analogen Werts
  }
}

Da habe ich als weitester Ausreisser von 3010 bis 3041 bei anliegenden 2,5 Volt. Die Messung liegt trotzdem ziemlich daneben, denn wenn ich mit den Werten rechne, habe ich 2,42 bis 2,45 Volt bei 3,3 Volt Betriebsspannung. Das Ergebnis kann man also immer noch in der Pfeife rauchen, aber ist wenigstens nicht mehr so weit gestreut. Warum das delay() stört, ist mir nicht wirklich klar, weil es ja erst nach der Messung gestoppt hat. Aber gut, jetzt ist es raus und der Wert ist besser, warum auch immer. Zufall?

Gerade aufgefunden:
https://www.mikrocontroller.net/topic/476050#6239382

Vielleicht hilft es dir ja......

Ich habe heute die ADS1115 Sesnsoren bekommen. Und die Spannungsmessung ist damit etwa gleich gut, als mit einem MessgerÀt. Und er hat ja vier Mess-KanÀle Der Sensor kostet allerdings mit 9,- Euro fast so viel wie mein teuerster ESP32. Aber ok, ich finde die Messung mit dem ESP32 ADC ist keine Alternative. Ausser es reicht zu wissen, Spannung da ja/nein. Da spielt es keine Rolle ob das 3,3 oder 3 Volt sind.
Hier im Bild ist der Untere Wert am OLED Display der vom ADS1115, der obere der ADC vom ESP32.

Hier noch der aktuelle Code zum Bild.

/* Abfrage von analogen Werten am ESP32
   - per GPIO-Pin
   - am ADS1115 mit Weitergabe per I2C
  2021-05-28 Heiko (unsinnsbasis.de)
*/

#include <Adafruit_ADS1X15.h> // bindet Wire.h fĂŒr I2C mit ein
Adafruit_ADS1115 ads;
#define ADS_I2C_ADDR 0x48

// OLED Display einrichten
#include <U8g2lib.h>  // als U8g2 im Bibliotheksverwalter zu finden
U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);

const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. VerstÀrkung
#define A_PIN 4  // GPIO-Pin fĂŒr analoge Eingabe
int A_Value;         // Messwert per GPIO
int adc0;            // Messwert an Kanal 0 des ADS1115
float A_mv, ads_mv;  // Messwert in Millivolt umgerechnet
// ----------------------------------------------------SETUP------------------------------------
void setup() {
  Serial.begin(115200);
  delay(500);
  Serial.println("Analog-Test ESP32");

  ads.begin(ADS_I2C_ADDR, &Wire);
  // Werte 1-fach verstÀrken (ESP32 liefert  max. 3,3V)
  ads.setGain(GAIN_ONE);

  oled.begin();
  oled.clearBuffer();              // Textspeicher löschen
  oled.setFont(u8g2_font_6x12_tr); // choose a suitable font 6x12
  //oled.setFont(u8g2_font_9x15_mf);
  oled.setCursor(12, (1 * 10));
  oled.print(F("Analog-Test ESP32"));
  oled.setCursor(28, (2 * 10));
  oled.print(F("Mit ADS1115"));
  oled.sendBuffer();
}
// ----------------------------------------------------LOOP--------------------------------------
void loop() {
  A_Value = analogRead(A_PIN);  // 0...4095
  //Serial.printf("Rohwert: %d", A_Value);

  // Wert in Volt umrechnen fĂŒr ADC - ESP32
  A_mv = (A_Value * 3300.0 / 4095.0) / 1000UL;
  //Serial.printf("; %4.2f V", A_mv);
  // Messung per ADS1115
  // - Kanal 0 messen (single-ended)
  adc0 = ads.readADC_SingleEnded(0);
  ads_mv = ads.computeVolts(adc0);
  // oder
  // - differenzielle Messung an Kanal 0/1
  //adc0 = ads.readADC_Differential_0_1();
  //ads_mv = (adc0 * multiplier);
  //Serial.printf("; I2C: %4.2f mV\n", ads_mv);

  // Messung ausgeben
  oled.setFont(u8g2_font_10x20_mf);
  oled.setCursor(20, (2 * 20));
  oled.print(A_mv);
  oled.print(F(" Volt"));
  oled.setCursor(20, (3 * 20));
  oled.print(ads_mv);
  oled.print(F(" Volt"));
  oled.sendBuffer();
  delay(1000);
}

Das ist der große Vorteil der Digitaltechnik.

:smiley:

Ob das der einzige Grund ist, dass ein ESP32 so lÀcherlich billig sein kann, ist allerdings eine schwierigere Frage.

Ja, die Preisentwiklung ist schon seltsam. 6-10 Euro fĂŒr so einen ESP32, der ja wirklich eine sagenhaft tolle CPU ist. Es wĂ€re mir lieber, wenn die von mir aus den doppelten Preis aufrufen, dafĂŒr aber dann auch fĂŒr jeden passenden Zubehör wie z.B. die passenden Shielder zusĂ€tzlich zum Kauf anbieten. Ich habe Dreimal einen Satz ESP32 von verschiedenen Anbietern gekauft, bis ich das passende Board zu den Shieldern hatte, die ich mir auch gekauft habe. So habe ich jetzt 9 statt 3 ESP32, wo ich ja nur 3 wollte.

Hallo,
oft reicht es ja auch wenn eine Messung reproduzierbar ist. Wenn man dann zusĂ€tzlich noch eine 2Punkt Kalibrierung verwendet, die auf den ĂŒblichen Messbereich abgestimmt ist ist das Ergebnis oft ja ausreichen.
Z.B Überwaschung einer Akuspannung (18650) da ist eine Spannung von 2,5-4,5 interessant.
Heinz

Da hÀttest Du mir welche abgeben können, denn ich nutze die Variante "Scholle" :joy:

grafik

Ganz schön platt diese Scholle :smiley:

Naja, da bin ich schon wieder etwas pingelig. Da möchte ich dann ja doch den genauen Stand der Ladespannung wissen. Und wenn die unterste Entladegrenze erreicht ist. DafĂŒr reicht der ADC Eingang schon wieder nicht mehr. Ich wĂŒrde schon die Grenze so setzen, wenn es um Spannung messen geht, dann der ADS1115 und wenn es um prĂŒfen ob Spannung in ungefĂ€hrer GrĂ¶ĂŸenordung "vorhanden" geht, dann der ADC.