Cetax:
Wo wird was eingesetzt ?? Kann jemand helfen ??
vom Prinzip her ist Dein Stromzähler-Sketch nichts anderes als ein Fahrradtacho-Sketch.
Beim Fahrradtacho gibt ein Reed-Kontakt immer einen Impuls pro Radumdrehung, aus den Radumdrehungen pro Zeit kann man die Geschwindigkeit ermitteln.
Auch bei Dir kommen Impulse pro irgendwas, und aus den Impulsen pro Zeit kann man die Leistung in Watt berechnen.
Hier mal mein abgestrippter Fahrradtacho-Sketch mit einigen umbenannten Variablen und Funktionen:
Wegen der Berechnungsformel müßtest Du mal mit ein paar technischen Daten rüberkommen, die ist vermutlich falsch. Benötigt wird die Zahl "Impulse pro Kilowattstunde" Deines Stromzählers.
#define S0PIN 2
#define S0INTERRUPT 0
void setup(){
Serial.begin(9600);
pinMode(S0PIN, INPUT_PULLUP);
attachInterrupt(S0INTERRUPT, S0ISR, FALLING);
}
volatile unsigned int impulseCountSum;
volatile long impulseMillisSum;
unsigned long lastImpulseMillis;
void S0ISR()
{
if (millis()-lastImpulseMillis>=25) // 25ms Entprellzeit
{
impulseCountSum++; // einen Impuls zählen
impulseMillisSum+=millis()-lastImpulseMillis; // Zeit addieren
lastImpulseMillis=millis(); // Zeit merken
}
}
void wattAnzeige()
{
unsigned int impulse;
unsigned long zeit;
float watt;
noInterrupts(); // Interrupts sperren
impulse=impulseCountSum; // Zählvariable umkopieren
impulseCountSum=0; // Zählvariable auf 0 zurücksetzen
zeit=impulseMillisSum; // Zeitzähler umkopieren
impulseMillisSum=0; // Zeitzähler auf 0 zurücksetzen
interrupts(); // Interrupts wieder zulassen
if (impulse>0)
watt = 3600000.0 / zeit * impulse;
else
watt=0.0;
Serial.println(watt);
}
unsigned long letztesIntervall=0;
void loop()
{
#define ANZEIGEINTERVALL 5000
unsigned long diesesIntervall=millis()/ANZEIGEINTERVALL;
// Tachoanzeige wird genau einmal pro Sekunde aktualisiert
if (letztesIntervall != diesesIntervall)
{
wattAnzeige();
letztesIntervall=diesesIntervall;
}
}
Und das kannst Du dann als Basis nehmen.
Was ich aus Deinem Sketch als Timings entnommen habe, eine Bouncetime von 100 und eine Aktualisierungsdauer von 1000 ms, erscheint mir ziemlich unsinnig zu sein. Eine Bouncetime von 100 ms würde ja bedeuten, dass höchstens 10 Impulse pro Sekunde gezählt werden können und eine Zähldauer von 1000 ms würde bedeuten, dass wenn nicht mindestens 1 Impuls in 1 Sekunde gezählt wird, die Wattanzeige 0 Watt anzeigt. D.h. der Anzeigebereich des Zählers wäre überhaupt nur von 1 Impuls/s bis 10 Impulse/s.
Mein Sketch ist so gemacht, dass Du die Zähldauer = Anzeigedauer getrennt einstellen kannst, über
#define ANZEIGEINTERVALL 5000
Ich habe im Sketch mal 5 Sekunden gesetzt, die immer gezählt wird, bis zur nächsten Aktualisierung,
Und die Entprellzeit, die mindestens zwischen zwei gezählten Impulsen vergehen muss, habe ich auf 25ms gesetzt. Wie sinnvoll das ist, na ja, fehlende technische Daten zu Deiner Zähleinrichtung...