Erkennung S0-Schnittstellen-Impuls

mayrst:
Zum Thema wie schließe ich das ganze an:

S0+ auf Arduino 5V
S0- über 4,7 kOhm auf Pin D3

Hört sich schon mal falsch an.

Richtig beschrieben wäre die korrekte Schaltung wohl eher so:

  • S0+ auf Arduino 5V
  • S0- auf Pin D3
  • Zusätzlich Pin D3 über Widerstand 4.7K an GND

Hallo,
der Sketch von mit läuft auf einem Mega 2560 fehlerfrei (daher Pin 30)
Er gibt über Serial die ms zwischen 2 Impulsen raus.
Rechnet hier (PWh=(3600000/ZeitWatt)*0.5;) P/Wh raus- für einen Zähler, der
2000Imp/kWh macht.

Du kannst lesen was Du willst, verdrahte so, wie jurs es beschrieben hat.
Gruß und Spaß
Andreas

OK Sry wegen Fischertechnik, aber für manche ist einfach e alles klar andere müssen sich halt erst einarbeiten.

jetzt klappt mein Skript, hab komplett gewechselt.

//Anzahl der Pulse für die Leistungsmessung
long pulseCount = 0;

//Werte für gemessene Leistung
unsigned long pulseTime,lastTime;

//Leistung und Energie
double power, kWh;

//Anzahl der Pulse pro Wh (auf Stromzähler)
int w_per_pulse = 1; //1000 pulses/kwh = 1 pulse per wh

void setup()
{
Serial.begin(9600);

// bestimmt Digital Pin3 als Messeingang
attachInterrupt(1, onPulse, RISING);
}

void loop()
{

}

void onPulse()
{

//Zeit zwischen den Pulsen
lastTime = pulseTime;
pulseTime = micros();

//pulseCounter
pulseCount++;

//Ermittlung der Leitstung
power = (3600000000.0 / (pulseTime - lastTime))*w_per_pulse;

//Ermittlung der kWh
kWh = (1.0pulseCountw_per_pulse)/1000; //multiply by 1000 to pulses per wh to kwh convert wh to kwh

//Ausgabe
Serial.print("Power");
Serial.print(power);
Serial.print(" ");
Serial.print("kWh:");
Serial.println(kWh);
}

Dürfte ich nochmal um eine Idee fragen!

Wenn ich nun meine Last ein- und ausstecke werden 3 undefinierte Werte gemessen, kann man dies verhindern?

Idee: beim messen vom ersten Puls 20 Sekunden sleep

was meint ihr? Habt ihr n besseren Vorschlag? :confused:

mayrst:
was meint ihr? Habt ihr n besseren Vorschlag? :confused:

Also ich habe zwei Vorschläge:

  1. Vorschlag
    Wenn Du von Interruptprogrammierung sowas von "keine Ahnung" hast, wie Du es hier mit dem geposteten Code zeigst, dann programmiere das Auslesen der Impulse OHNE INTERRUPTS ZU VERWENDEN! Das ist sowohl einfacher als auch zuverlässiger. Insbesondere für Anfänger ohne Ahnung von Interruptprogrammierung. Laut Wikipedia-Eintrag zur S0 Schnittstelle dauert ein S0-Impuls 30 Millisekunden, und um so langsame Impulse zu erkennen (30ms = 30000µs), braucht es keine Interrupts. Jedenfalls nicht, wenn Du ein Programm auf die Reihe bekommst, das Dein Programm nicht mit "delay()" absichtlich für längere Zeit blockiert.

  2. Vorschlag
    Wenn es denn unbedingt ein Programm mit Verwendung von Interrupts sein muss, dann informiere Dich wenigstens über ein paar Grundlagen der Programmierung mit Interrupts, z.B. wie RAM-Speicher und Variablen konsistent gehalten werden, wenn zwei Threads gemeinsam auf dieselben RAM-Bereiche zugreifen ("Shared Memory" zwischen normalem Code und Interrupt-Code)! Profi-Programmiertechniken sind eher für Programmierer geeignet, die wenigstens ein paar grundlegende Anfänger-Grundlagen bereits beherrschen.

mayrst:
Idee: beim messen vom ersten Puls 20 Sekunden sleep

Ein Programm, das auch nur ein einziges mal "delay(irgendwas)" verwendet, hat bereits mit diesem einen Funktionsaufruf als Mikrocontroller-Programm total verkackt, und Du kannst Dir stattdessen ein neues Programmkonzept überlegen, das kein "delay()" verwendet. Und wenn "delay()", dann sollte die Zeit deutlich kürzer sein als die kürzeste Zeit, mit der Dein Programm umgehen muss. Diese kürzeste Zeit scheint in Deinem Programm die Impulsdauer eines S0-Impulses zu sein, ca. 30 ms. Also sollte Dein Programm pro einmaligem Durchlauf durch die loop() Funktion aufsummiert auf keinen Fall mehr als delay(15) verwenden, um die Impulse mit Sicherheit zu erkennen, ohne dafür Interrupts zu benötigen.

Hallo,
"Wenn ich nun meine Last ein- und ausstecke werden 3 undefinierte Werte gemessen, kann man dies verhindern?"

Das kann man (auch Frau)…
Erst einmal in der BDA des WSZ lesen, was der überhaupt kann und von welcher
(zweifelhaften) Qualität der denn ist.
Dann das ganze Zeug´s richtig und sicher verdrahten.
Wichtig wäre auch einen Sketch zu verwenden, den der geübte Laie auch versteht.

Du kannst ja mal etwas probieren.
Mit dem S0 ist es ja möglich, den tatsächlichen Verbrauch zu messen, so wie
auch die momentare Wirkleistung.
Du nimmst zwei Glühbirnen, eine 100W und eine 60W. Die 100W läßt Du 5Min
leuchten, dann umschalten auf die 60W.
Die gemessene Wirkleistung wird Dir ja sofort angezeigt, den genauen Verbrauch
kannst Du Dir errechnen und mit dem Arduino vergleichen.
Auch ein Wasserkocher mit >=2Kw oder ein Fön mit 1,8Kw können sehr hilfreich
sein.

Dann würde ich einmal über mehrere Tage messen, um zu schauen wie "genau" das
ganze denn so sein könnte.
Bei mir habe ich z.B. einen Unterschied von 6W in drei Tagen. das sind 60W im
Monat oder 720W im Jahr. Das ist fast ne´ kWh.

Du bemerkst also, das man so eine Geschichteziemlich sicher und "genau"
aufbauen kann.
Zu Störungen bei plötzlichen Lastwechseln, gleich welcher Art, darf es auf
keinen Fall kommen. Egal was Du im laufendem Betrieb an Deinem WSZ anschließt-
oder abstöpsels, weder der Arduino- noch der WSZ dürfen dabei einen Muks von
sich geben.

"Idee: beim messen vom ersten Puls 20 Sekunden sleep"
"sleep" hört sich für mich wie delay() an, geht überhaupt nicht.
Warum nimmst Du nicht die Zeit mit dem zweiten Impuls?
Beim ersten Impuls "StopUhr" an, beim zweiten "aus".
Gruß und Spaß
Andreas
P.S. passe auf, das Du keine gewischt kriegst- geht ganz schnell bei
KamikazeVerdrahtungen