An einem ESP8266 einen ACS712 30A betreiben....

Zur Info:

Der ACS712 ist ein AC Strommesser, der seine Daten Analog ausgibt.

Problem:

Ich versuche die Werte vom ACS712 mit einem ESP8266 einzulesen, aber die Analogwerte, die ich über A0 einlese springen ohne Last schon sehr stark…

Hat einer eine Idee wie das in den Griff bekomme ?

Servus

es gibt da eine recht praktische Running Average library:
Arduino Playground - RunningAverage

Damit läßt sich der Noise des ACS gut bändigen.
Die Versorgung muß natürlich trotzdem absolut sauber uns stabil sein, denn die Ausgangsspannung hängt ja von der Vdd ab. Idealerweise ist die identisch mit der Referenzspannung des ADC, denn der ACS hat j einen ratiometrischen Ausgang.

Hab einige ACS an Arduinos hängen, klappt ganz gut. Averagen muß man aber fest, sonst misst nur Mist.

gruß
bb

Danke, aber leider verstehe ich noch nicht wie ich diese Library benutzen soll ?

Die Versorgung muß natürlich trotzdem absolut sauber uns stabil sein !

Was meinst du mit Sauber ?

Stabil, ja wie definiert man das ? Ich habe alles mögliche versucht, Den ESP und den Strommesser an einem Netzteil, an USB usw. keine Besserung. Dann habe ich beide mit getrennten Netzteilen versorgt und nur GND der Netzteile verbunden, auch keine Besserung…, auch mit einem Akku als Stromquelle kein Erfolg…

Dann habe ich mal einen I2C 4 Channel Modul an den ESP gehängt, sogar da Springen die Werte :banghead:

Es muss aber am ESP liegen, weil wenn ich mir Videos anschaue, die benutzen einen Arduino X und da springt kein Wert :eek:

was meinst du mit : Averagen muß man aber fest… ???

Vielen Dank für deine Hilfe…

Habe das gefunden:

Genaue Strommessung mit dem Arduino und dem ACS712 Hall-Sensor mittels Oversampling - Bastel & Reparatur Blog

Aber ich kann es nicht mit dem ESP benutzen, weil :

ADCSRA, ADMUX, ADCH kennt der ESP nicht :frowning:

Servus

Saubere Spannungsversorgung meine ich das alles getan ist um sie

  1. so langzeitstabstabil als möglich zu haben
  2. möglichst keine Spikes/Noise/Rauschen drauf ist.

Beim ACS ist es nämlich so, das die Ausgangsspannung auch direkt von der Betriebsspannung abhängt. d.h. jeder Noise an der Vdd ist auch am Ausgang sichtbar. -> dies wäre zb mit einem Tiefpass (RC-Glied) wegfilterbar.
Weiters gibt es die Schwierigkeit das wenn die VDD driftet (zb. durch Temperaturschwankungen) auch der Ausgang in gleichem Maße wegdriftet.
Darum sollte die VDD des ACS wenn möglich an die ADC Referenz gelegt werden damit hebt sich ein Drift wieder auf.

Wenn der ESP keinen ADC Referenzspannungs Pin hat, dann mußt du deine Messwerte immer kritisch hinterfragen oder dir eine regelmäßige Kalibrierung überlegen. Kommt halt auf die Genauigkeit an die du erwartest.

Mit einem 20A ACS komme ich bei meiner Photovoltaikanlage auf etwa 30mA Noise:

Wegen dem Averagen hier mein Code.
Averagen heist das du den Mittelwert aus vielen Einzelsamples nimmst.
In meinem Fall der Mittelwert aus den letzten 5000 Samples.
Stör dich nicht am 1Wire und Dallas Krams, das sind nur Reste von einem Versuch. Hab jetzt nicht extra aufgeräumt.


#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Ethernet.h>
#include <RunningAverage.h>

//#include "DHT.h" 
//#define DHTPIN 2     // benutzter ARDUINO-Pin
//#define DHTTYPE DHT11   // unser Sensor: DHT11 
//DHT dht(DHTPIN, DHTTYPE);

// Pin für LED
int LED=13;


//Pin für One-Wire-Bus festelgen. Standart = 2
#define ONE_WIRE_BUS 1
OneWire oneWire(ONE_WIRE_BUS);
// One-Wire-Bus mit dem Temperatursensor verbinden
DallasTemperature sensors(&oneWire);
EthernetClient client;

int samples =0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0XEF, 0XFE, 0xEC};
byte ip[] = {10,0,0,50}; //eigene IP
byte subnet[] = {255,255,255,0};
byte server[] = { 10, 0, 0, 101 }; //zweite IPSServer Adresse, weil Router sendt nicht an 10.0.0.1

RunningAverage myA0(10);
RunningAverage myA1(10);
RunningAverage myA2(10);
RunningAverage myA3(10);


void setup() {
pinMode(LED, OUTPUT);  


Ethernet.begin(mac,ip,subnet);
Serial.begin(9600);
Serial.println("Start Ethernet");

delay(5000);

if (client.connect(server, 1101)) {
    Serial.println("connected");
  } else {
    Serial.println("connection failed");
 }


//dht.begin(); //DHT11 starten

myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();

//Temperaturabfrage initalisieren
 sensors.begin();
 delay(1000);

}

void loop() {

String TxtToSend; 
  
  //float h = dht.readHumidity();
//float t = dht.readTemperature();  


myA0.addValue(analogRead(A0));
myA1.addValue(analogRead(A1));
myA2.addValue(analogRead(A2));
myA3.addValue(analogRead(A3));
samples++;
digitalWrite(LED, LOW);
if (samples == 5000)
  {
digitalWrite(LED, HIGH);
delay(1000);
TxtToSend = "B"+String(myA0.getAverage()) + "," + String(myA1.getAverage()) + "," + String(myA2.getAverage())+ "," + String(myA3.getAverage()) + "E";
Serial.println(TxtToSend);
client.println(TxtToSend);

    
samples = 0;
myA0.clear();
myA1.clear();
myA2.clear();
myA3.clear();

if (!client.connected()) {
    client.stop();
    delay (1000);
    if (client.connect(server, 1101)) {
      Serial.println("connected");
    } else {
       Serial.println("connection failed");
  }
}



  
//if (isnan(t) || isnan(h)) {
//    Serial.println("Fehler beim Lesen vom DHT-Sensor");
//  } else {
//    //t = t - 1.00; //Diese Korrektur war bei mir noetig
//    Serial.print("Feuchtigkeit: "); 
//    Serial.print(h);
//    Serial.print(" %	   ");
//    Serial.print("Temperatur: "); 
//    Serial.print(t);
//    Serial.println(" Grad Celsius");
//    Mb.R[4]=(h)*1000;
//    Mb.R[5]=(t)*1000;
// 
//  }
//  
  }
  
  
}

Hi vielen Dank, damit bin ich schon mal einen kleinen Schritt weiter:

Aufbau: ESP und Strommessmodul hängen an einer USB Powerbank !

Ohne Last:

Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 780
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 782
Val: 782
Millivolt: 2.73
Amper: 0.04
Watt: 10.31
Raw: 780
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00

Aber mit Last (60W Glühbirne) springt er wieder hin und her… :

Raw: 787
Val: 787
Millivolt: 16.41
Amper: 0.27
Watt: 61.86
Raw: 782
Val: 782
Millivolt: 2.73
Amper: 0.04
Watt: 10.31
Raw: 777
Raw: 774
Raw: 776
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 786
Val: 786
Millivolt: 13.67
Raw: 781
Val: 781
Millivolt: 0.00
Amper: 0.00
Watt: 0.00
Raw: 776
Raw: 774
Raw: 777
Raw: 785
Val: 785
Millivolt: 10.94
Amper: 0.18
Watt: 41.24
Raw: 788
Val: 788
Millivolt: 19.14
Amper: 0.31
Watt: 72.17
Raw: 786
Val: 786
Millivolt: 13.67
Amper: 0.22
Watt: 51.55
Raw: 779
Raw: 776
Raw: 774
Raw: 778
Raw: 783
Val: 783
Millivolt: 5.47
Amper: 0.09
Watt: 20.62

Ich weis nicht mehr weiter :confused:

Hier mein Sketch :


#include <RunningAverage.h> 

int calVal = 781;
int mVpA = 61;

int samples =0; 


RunningAverage myA0(10); 
RunningAverage myA1(10); 


void setup() { 
 


Serial.begin(115200); 




myA0.clear(); 




} 

void loop() { 

String TxtToSend;  
   


myA0.addValue(analogRead(A0)); 

samples++; 

if (samples == 5000) 
  { 


delay(1000);

 int wert=myA0.getAverage();

 Serial.print("Raw: ");
  Serial.println(wert);


if (wert >=calVal)
{
int val = wert;
  int valAdj = val - calVal;
  float milliVolts = ((valAdj * 2.8) / 1024) * 1000;
  float Amps = milliVolts / mVpA;
  float watt = 230 * Amps;
  Serial.print("Val: ");
  Serial.println(val);
  Serial.print("Millivolt: ");
  Serial.println(milliVolts);
  Serial.print("Amper: ");
  Serial.println(Amps);
  Serial.print("Watt: ");
  Serial.println(watt);

}
     
samples = 0; 
myA0.clear(); 
} 
}  

blöde Frage:

Zitat: … 60Watt Glühbirne…" und " float watt = 230 * Amps; "

Sieht so aus als ob du direkt Wechselstrom messen möchtest. :eek:
Du hast da doch wohl hoffentlich einen Messgleichrichter drin, oder ?

bb

Sieht so aus als ob du direkt Wechselstrom messen möchtest.

Ja was soll ich den sonst mit einem Strommesser messen wollten :confused:

Du hast da doch wohl hoffentlich einen Messgleichrichter drin, oder ?

Nein, was meinst du damit ?

Aber das ist ja eigentlich erstmal egal, weil wenn die Messungen (val) immer so springen, braucht man auch nichts messen, weil die Werte zu extrem schwanken…

Schau mal hier
Ist ein einfacher Gleichrichter, aber auch hier muß die Versorgungsspannung sehr stabil sein.
Gruß Helmut

Wenn deine Antwort wirklich ernst gemeint war, dann kann ich dir jetzt nicht mehr weiterhelfen. Arbeite mal das durch:
Wechselstrom – Wikipedia
Nimms mir jetzt nicht krum, aber ein paar Basics sollten schon vorhanden sein wenn man mit Strom rumbastelt. Insbesondere der Unterschied zw. Wechselstrom und Gleichstrom.

gruß
bb

Hi ich glaube du hast mich falsch verstanden :eek: Ich bin dir sehr dankbar für deine Hilfe und Tips :smiley:

Aber mich nervt es einfach (nicht Ihr aus dem Forum !) , das 100 Videos und Artikel, die über diesen Strommesser berichten und bei allen schwanken die Werte nicht. Der einzige Unterschied zwischen dem was ich die anderen mache, ist, das ich einen einen ESP statt einem Arduino benutze…

Und alles was ich im Bezug auf dem ESP lese, trifft genau mein Problem: ADC am ESP ist viel zu ungenau und schwankt zu stark…

Ich werde mal mir die Bauteile für den Messgleichrichter bestellen und dann nochmal von vorne anfangen… wird aber 1-3 Monate dauern…

Schon OK.
In dem Fall ist aber nicht der ESP schuld sondern dein Ansatz.
Du hast ja Wechselstrom, also MÜSSEN sich die Ergebnisse permanent ändern.

Probiere doch mal Gleichstrom zu messen. Die Ergebnisse werden dann so um wenige 100mA schwanken. Diese Schwankungen kriegst dann mit den vorher beschriebenen Methoden weg.

Aber mal ehrlich, wenn dir die elektrotechnischen Grundlagen fehlen dann ist besser du kaufst dir was fertiges.
Zur korrekten Leistungsmessung im Wechselstromkreis gehört noch einiges mehr dazu als nur ein guter Messgleichrichter. Du mußt ja auch den cosPhi und die Spannung wissen um ein korrektes Ergebnis zu bekommen.
Berücksichtigst du dies nicht, so hast gleich mal 20-30% Fehler.
Irgendwelche Unzulänglichkeiten des ESP sind da noch das kleinste Problem.

Wenns dir aber nur darum geht zu sehen ob ein Gerät eingeschaltet ist gibt es einfachere Methoden ohne Strommesser und ADC Gedöns.

gruß
bb

Evtl benötigst du einen Levelshifter oder du betreibst den ACS mit zu wenig VCC.

Was ist ein Levelshifter ?

Ich habe den ACS auch meiner eigenen Stromversorgung ( 5V USB 2A Netzteil ) getestet ! Keine Besserung…

Damit kannst du Signale von 3,3v auf 5v oder umgekehrt konvertieren. Aber evtl ist das ja gar nicht das Problem… welchen ESP verwendest du,haben ja alle unterschiedlich viele Pinouts. Ich nutze zur Einfachheit halber NodeMCUs.
Wobei meine ESP-01 dasselbe Werk verrichten.

Ich musste meinem Nodemcu z.b. einen Levelshifter verpassen um einen WS2812 Strip ansteuern zu können (Datensignal 5v)

Aber ist nur eine Mutmaßung gar so viel Ahnung habe ich von den Projekten noch nicht (lerne auch von Tag zu Tag dazu)

Wichtig ist auch immer die Grounds zu verbinden. Solltest du einer der Sensoren mit einer externen Stromversorgung betreiben solltest du du diesen immer mit dem GND des Arduino/ESP verbinden. Ich weiß das sind alles grundlegende Dinge jedoch vergisst man sie manchmal.

Aber wie die anderen Member schon schreiben weißt du evtl gar nicht was du Messen willst (Wechsel oder Gleichspannung) und was dein Sensor überhaupt messen kann. Ich weiß ehrlichgesagt auch nicht genau was du messen möchtest. Mach doch mal ein Fritzing von deinem Projekt.

Klar habe dann auch Ground verbunden :slight_smile:

Ich weis genau was ich messen will, steht alles oben ! AC 230V !!! Ampere !!! Was anderes würde auch bei dem Sensor keinen Sinn machen :banghead:

Ich benutze den ModeMCU V0.9 und den Wemos D1 mini…

Alles was ich im Netz finde, zeigt, das der ESP selber das Problem ist ! Mit einem Arduino klappt es in allen Howtos perfekt ohne zu tun !

Wenn du eine kleine stabile Gleichspannung am Eingang des ESP anschließt anstellen des ACS, springen denn da die Messwerte auch so stark oder kommt das durch den Ripple des ACS?

Doc

Hi habe mal folgendes getestet:

Am ESP A0 an :

  • ground = schwankt zwischen 4 und 5 hin und her

  • An 3,3V vom ESP = 987 bis 988

  • an eine 3V Knopfzelle (ground wurde mit dem Ground vom ESP verbunden !) 922 -924

Das ist ja nicht viel Bewegung …

Wie hast du den ACS denn mit dem ESP verbunden?
Direkt auf einem Board zusammen oder hast du evtl. noch mehr Kabel dazwischen.

Ich frage nur deshalb, weil ich so ein Verhalten von ähnlichen Sensoren kenne, wenn die mit „normalem“ Kabel über 1-2m verbunden sind.
Verwendet man z.B. verdrillte Leitungen, sind die Eingänge deutlich ruhiger, evtl. auch mit einer kleinen Kapazität?

Grüße,
Doc

Ich habe es direkt auf dem B Board gesteckt, so das der A0 vom ESP mit Out vom ACS über das B Board verbunden ist, nur die Stromversorgung habe ich per 10cm Kabel verbunden…

Aber auch wenn der ACS per 10cm Kabel Verbunden ist, sind die Sprünge gleich…