Hallöchen ,
Kämpfe gerade mit einem Problem, sitze an einem etwas kleineren Projekt und zwar würde ich gerne mit dem Pi eine Stromzähler über S0 auslesen, anschluss ist bereits geschehen und der Pi empfängt auch die Impulse. Nun habe ich zum einen das Problem, dass ich einen recht Energiesparsamen Verbraucher meinen Laptop zum Test rangehängt habe (etwa 20 W) das bedeutet dass bei 100 Impulsen/KWh die Impulse doch recht rar kommen.
Ich habe mir auch schon ein kleines Progrämmchen in C geschrieben
/*
* Grundprogramm: Zähler der auf ein Interrupt wartet und dann um eins hoch zählt
*/
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <sys/time.h>
#include <time.h>
// Impulsausgang des Stromzählers auf GPIO 3
// Bei WiringPi GPIO 3 = PIN 9
// Benutztung des GPIO, da kein zusätzlicher Pullup Widerstand notwendig ist, schon integriert
#define BUTTON_PIN 9
// globale Varibale "interruptzaehler" zählt die interrupts
static volatile int interruptzaehler = 0 ;
/*
* Interruptfunktion
*/
void Interrupt (void)
{
++interruptzaehler ;
}
/*
*********************************************************************************
* main
*********************************************************************************
*/
int main (void)
{
int Counter = 0 ;
double stop = 0.0;
double start = 0.0;
int i = 0;
double dt;
struct timeval tim;
if (wiringPiSetup () < 0)
{
fprintf (stderr, "Verbindung zu wiringPi fehlgeschlagen: %s\n", strerror (errno)) ;
return 1 ;
}
if (wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, &Interrupt) < 0)
{
fprintf (stderr, "Es liegt ein Fehler in der Verdrahtung vor: %s\n", strerror (errno)) ;
return 1 ;
}
for (;;)
{
printf ("Warte auf Impuls ... ") ; fflush (stdout) ;
while (Counter == interruptzaehler)
delay (1) ;
printf (" OK. Zählerstand: %5d\n", interruptzaehler) ;
i++;
if (i==1)
{
gettimeofday(&tim, NULL);
start=tim.tv_sec+(tim.tv_usec/1000000.0);
Counter = interruptzaehler;
}
if (i==2)
{
gettimeofday(&tim, NULL);
stop=tim.tv_sec+(tim.tv_usec/1000000.0);
dt = stop - start;
printf ("Zeit: %f\n", dt);
Counter = interruptzaehler;
start = 0.0;
stop = 0.0;
i = 0;
}
}
return 0 ;
}
Alles anzeigen
Habe den Test nun schon unzählige male getestet, zu Anfangs habe ich ewig gewartet bis ein Interrupt erfasst wurde bzw. zwei, da ich gerne die Zeit zwischen den Interrupts messen wollte. Dann habe ich einfach mal mehrere Verbraucher angeschlossen, anscheinend von der Leistung immer noch nicht ausreichend, als ich dabei am Kabel zum Stromzähler hin gewackelt habe, hat das Programm gleich mehrere (viele) Interrupts gleichzeitig gezählt so dass er mit der Ausgabe gar nicht hinterher kam. Woran kann das liegen? Dachte schon es lag daran dass ich die Kabel umgesteckt habe (Spannungspitzen!) aber dies scheint es nicht zu sein, auch wenn ich am zähler selber wackel treten gleich mehrere Interrupts auf?
Und meine zweite Frage ist, könnt ihr euch den Code oben mal anschauen, hat jemand ne Idee das ganze effektiver zu gestalten? Ich bin irgendwie noch nicht ganz zu frieden? Die Zeitmessung ist irgendwie ungenau. Achja und mein genaues Ziel ist mir den momentanen Verbrauch zu berechnen, dafür wollte ich die zeit zwischen zwei Impulsen messen und dadurch diesen dann umrechnen.
Ein wenig Hilfe wäre echt spitze :s