Hello all,
I'm trying to make an energy monitor similar to the stuff on openenergymonitor.org (How to build an arduino energy monitor | Archived Forum). It's not working (I get wrong values). I have traced the problem to the following:
One of the things that happens is that the arduino uses one of its analog pins to read in the mains voltage. It does so by transforming the 230 VAC mains to 9 VAC with a standard AC wall wart. It actually outputs about 10.4V unloaded, according to my multimeter.
I then resistively divide this 10.4V AC to 175 mV AC. I then add a 420 mV bias voltage, so that the negative part of the AC period can also be read with the arduino's analog in. (Because of the range of my current sensors, I am using the arduinos internal 1.1V reference as the analog reference). I am actually only using about half the resolution of the AD converter, I may tune this in the future, but it is ok for now.
The problem I am having: When the only input on the arduino is this AC voltage, and I continuously read the pin, and store the value in a histogram, I get something I do not understand. Naïvely, I would expect a centre-weighted distribution of the readings. (Every period, there are twice as many zero crossings as there are positive peaks, for instance. You know what I mean, I hope.)
But what I get is what you see in the attached picture. A more or less flat distribution of the voltage readings in the middle, with large peaks at the sides, supposedly indicating that there are more peaks than zero crossings...?
Below is the code I used to gather this data, and I plotted it with Excel.
Does anyone understand this?
/*
Make a histogram with 512 bins, from analog read data
*/
int teller=0;
int values[512]; //Arduino crashes on 1024 bins, so 512 is the next best thing
void setup() {
Serial.begin(9600);
analogReference(INTERNAL); // for 1.1V measurements
}
void loop() {
int sensorValue = floor((analogRead(A4)+1)/2); //divide by two to fit 512 bins
values[sensorValue]+=1; //increase the bin
teller=teller+1;
if (teller>5000) { //once in a while...
for(int n=0; n<512;n++) {
Serial.print(values[n], DEC); //...output all the bins over the serial port
Serial.print(" ");
}
Serial.println("");
teller=0;
}
}