Hallo,
vor einiger Zeit dachte ich das es mir gelungen sei mit dem ACS 712 Wechselstrom ziemlich genau zu messen.
http://forum.arduino.cc/index.php?topic=143265.0
Da habe ich es den sketch mit einem 1kW Wasserkocher ausprobiert und es funktionierte ziemlich präzise
Nun habe ich das ganze an einer 3kW Heizung ausprobiert und nichts ist wie es war. =(
Hier mal der sketch:
#include <Bounce.h>
#include <LiquidCrystal.h>
#define MEDIAN 512
#define MEAS_INT 20
#define ACS_ADC A0
#define K_ACS 0.1028 //für 20A version
uint8_t RelaisKnopf2 = 24;
uint8_t buttonState_k2 = 0;
Bounce bouncer_k2 = Bounce( RelaisKnopf2, 5 );
uint8_t k[] = {A15, A14, A13, A12};
int backLight = 53;
LiquidCrystal lcd(39, 41, 43, 45, 47, 49, 51);
int ledPin = 12;// LED connected to digital pin 12
int fade;
int poti = A7;
void setup() {
pinMode(backLight, OUTPUT);
digitalWrite(backLight, HIGH);
lcd.begin(20, 4);
uint8_t i;
for (i = 0; i < 4; i++) {
pinMode(k[i], OUTPUT);
digitalWrite(k[i], LOW);
}
analogReference(DEFAULT);
analogRead(ACS_ADC);
Serial.begin(9600);
int myEraser = 7; // this is 111 in binary and is used as an eraser
TCCR1B &= ~myEraser; // this operation (AND plus NOT), set the three bits in TCCR2B to 0
int myPrescaler = 2; // this could be a number in [1 , 6]. In this case, 3 corresponds in binary to 011.
TCCR1B |= myPrescaler; //this operation (OR), replaces the last three bits in TCCR2B with our new value 011
}
void loop() {
if ( bouncer_k2.update() ) { //Relais2
if ( bouncer_k2.read() == HIGH) {
if ( buttonState_k2 == LOW ) {
digitalWrite(k[1], HIGH);
buttonState_k2 = HIGH;
} else {
digitalWrite(k[1], LOW);
buttonState_k2 = LOW;
}
}
}
fade = analogRead (poti);
fade = map(fade, 0 , 1023, 0, 255);
analogWrite(ledPin, fade);
fade = map (fade,0,255,100,0);
messwertAnzeigen(0,0,fade,3);
lcd.setCursor(0, 1);
lcd.print("I=");
uint32_t sum2=0;
uint16_t n=0;
uint32_t StartTime, StopTime;
int16_t adc;
uint32_t avrg=0;
float I;
StartTime=millis()+1;
StopTime=StartTime+MEAS_INT;
while(StartTime>millis());
while(StopTime>millis())
{
adc=(MEDIAN-analogRead(ACS_ADC));
sum2+=(uint32_t)adc*adc;
n++;
}
if (n>0)
{
avrg=sqrt(sum2/n);
}
I=(float)avrg*5/(K_ACS*1024);
lcd.setCursor(2, 1);
lcd.print(I);
lcd.print("A ");
int W;
W= (I*I) * 16;
lcd.setCursor(0, 2);
lcd.print(W);
lcd.print("W ");
}
void messwertAnzeigen(int spalte, int zeile, int wert, int stellen)
{
char buf[7];
lcd.setCursor(spalte,zeile);
itoa (wert,buf,10);
lcd.print(wert);
for (int i=0;i<stellen-strlen(buf);i++)
lcd.print(" ");
}
Der Wert springt nun wild rum in einem bestimmten bereich um den eigentlichen wert.
Das war vorher nicht so, da wurde der wert minimal jede 2 sec geändert oder garnicht.
Außerdem sind die werte die rauskommen vollkommen falsch.
ich habe z.B mal notiert:
A = 8,07 und Leistung somit 1041W (die formel wie ich es in Watt umrechne (R=16Ohm) (I*I)*R=P)
Gemessen habe ich aber 113V Wass ja denn ca. 800W wären. Es war zwar kein RMS-Messgerät, aber ein normales Messgerät kann doch nicht so falsch liegen.
Bitte helft mir diese beiden probleme zu lösen.
Was ist auch einmal falsch.
Gruß
strohhirn