Go Down

Topic: problem with translate the values of voltage sensor ZMPT101B (Read 13314 times) previous topic - next topic

VictorA


Regards,

I'm trying to use a voltage sensor  ZMPT101B (with an arduino uno) to obtain the voltage values of the network (220 VRMS), but i don't need the RMS values, i need peak to peak values, ergo -311 V to 311 V (the values between that range).

The sensor is the shown in the following image:


But, the problem is that the values given in the monitor serie of my arduino are very variable and because of that i can't make a formula to translate the values of sensor to voltage values.

the code that i'm using is the following:
Code: [Select]
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  int rele = 3; //relĂ© conectao al pin digital 3
int sensorvalue = 0; // variable to store the value read
int sensmax = 0;
int sensmin = 0;
int Rmsmax = 0;
int Rmsmin = 0;
void setup()
{
 
  pinMode(rele, OUTPUT); // inicializar entrada digital 3 como una salida (OUTPUT)
   
  Serial.begin(9600); // initialize serial communication at 9600 bits per second
}

// the loop function runs over and over again forever
void loop()
{
    int sensorvalue = analogRead(A0); // read the input on analog pin 0
    //Serial.println(sensorvalue); // print out the value you read
    digitalWrite(rele, HIGH);
    //int cont = 0; //Inicializa la varieble de contar en cero
    //Serial.println (cont);
    sensmax = max(sensorvalue,600) ;
    sensmin = max(sensorvalue,50);
    Rmsmax= sensmax*1.4142;
    Rmsmin= sensmin*1.4142;
   
    Serial.print(sensmax);
    Serial.print("");
    Serial.print(" SensorMax");
    Serial.print("\t");
    Serial.print(Rmsmax);
    Serial.print("");
    Serial.print(" SensorRMSmax");
    Serial.println("");
    Serial.print(sensmin);
    Serial.print("");
    Serial.print(" SensorMin");
    Serial.print("\t");
    Serial.print(Rmsmin);
    Serial.print("");
    Serial.print(" SensorRMSmin");
    Serial.println("");
    Serial.println("");
    delay (0.000001);
    }


An this are the values that monitori serie shown:



I hope ypu can help me with this problem.
Thanks.

pylon

Although you didn't exactly specify it I assume you try to measure AC voltage. AC by definition has a voltage level in the form of a sinus wave so depending on the time you take the measurement you'll get any value between -Vmax and +Vmax. If you want to find out that Vmax you have to measure for a while and use the maximal value you got. Correct me if my assumptions were wrong.

VictorA

Although you didn't exactly specify it I assume you try to measure AC voltage. AC by definition has a voltage level in the form of a sinus wave so depending on the time you take the measurement you'll get any value between -Vmax and +Vmax. If you want to find out that Vmax you have to measure for a while and use the maximal value you got. Correct me if my assumptions were wrong.
Yes, you're right, that's is what i'm trying to do but if i measure for a while this are the values shown:



And those values are very variable.

pylon

Quote
Yes, you're right, that's is what i'm trying to do but if i measure for a while this are the values shown:
No, you don't do that:

Code: [Select]
sensmax = max(sensorvalue,600) ;

That line returns in sensmax either sensorvalue or 600 depending on which of the two values is greater. I cannot see any code that gets the maximum value of several measurements. Also I assume that the output posted in your first post was not generated by the code in the same post. At least the number 600 in above line was probably set to 300 for that output.

Quote
And those values are very variable.
Yes, as you would expect for a sine wave.

TomGeorge

Hi,
If all you are concerned with is peak voltage.
I believe those units output an AC waveform, hence your varying values.
Quote
This module is ideally suited to measuring an AC voltage. When connected to the screw terminals the sensor will sample the input and output an analog voltage, in the region of 0 - 5V. This makes it easy to use in power monitoring applications and checking supplies.
If you store a running maximum and minimum values that the analog input reads, then that will represent Peak to Peak voltage.

The scaling is up to you because the transformer has adjustable output gain.

You can easily calibrate it by measuring the 220Vac input , which is RMS.
Vp-p = RMS * 1.424*2 Volts
The difference between your analog max an min will represent that value.

Tom... :)
Everything runs on smoke, let the smoke out, it stops running....

VictorA

pylon

No, you don't do that:

Code: [Select]
sensmax = max(sensorvalue,600) ;

That line returns in sensmax either sensorvalue or 600 depending on which of the two values is greater. I cannot see any code that gets the maximum value of several measurements. Also I assume that the output posted in your first post was not generated by the code in the same post. At least the number 600 in above line was probably set to 300 for that output.

Yes, as you would expect for a sine wave.
Sorry, in the second monitor scope i use other code:
Code: [Select]
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
int sensorvalue = 0; // variable to store the value read
int sensmax = 0;
int sensmin = 0;
int Rmsmax = 0;
int Rmsmin = 0;
void setup()
{
 
  pinMode(rele, OUTPUT); // inicializar entrada digital 3 como una salida (OUTPUT)
   
  Serial.begin(9600); // initialize serial communication at 9600 bits per second
}

// the loop function runs over and over again forever
void loop()
{
    int sensorvalue = analogRead(A0)-512; // read the input on analog pin 0
    Serial.println(sensorvalue); // print out the value you read
 delay (0.000001);
    }

pylon

Quote
Sorry, in the second monitor scope i use other code:
Yes, and that just puts out the measured voltage. Depending on where you hit the sine wave it may show any value. Did you really expect something else? You do know how AC works, do you?

VictorA

Yes, and that just puts out the measured voltage. Depending on where you hit the sine wave it may show any value. Did you really expect something else? You do know how AC works, do you?
Yes, i know, but i think you are not unerstandig what i'm trying to say, maybe i'm not expressing my ideas properly (sorry if my english is not ok).

I know that in the AC sine i have a lot of diferent values in the wave because the values are moving from peak to peak. The variability that i'm saiying, if you look closely in the values shown in the second monitor scope seems not to move like a sine wave, one not spect in sine wave that the values stay for a long in one value and then just jump to anoter higher value without passing by the intermediate values.

i have been clear?

pylon

Did you check with a scope that the input on the Arduino really gets a sine wave meaning that the "sensor" is delivering what you expect?
ZMPT101B seems to be a transformer only. I haven't found a schematic for the rest of the circuit that is on the picture you posted. Please post a schematic of that circuit and how you wired the board to the Arduino.

In the output you print to the serial interface you have no timing component so you don't know the time difference between two consecutive measurements. To analyze the output the timing information is needed. Using above code you get about 200 measurements per second at most and that timing is not very exact because it depends on the serial buffer to be cleared and refilled. So the more or less random numbers could be explained perfectly.

VictorA


Dear Pylon,

Thanks for all your replys.

I measured the output signal of the ZMPT101B with an osciloscope conected to the output and ground an this is shown:



i though i know that the output is between 0 to 5 V, and this output give me 33 mili V Peak to Peak, it seems to be very rare.

Also, i graphed in excel the monitor scope and this is the result:


And i tried with another input instead A0, i tried with A1, the code is as follow:

Code: [Select]
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
int sensorvalue = 0; // variable to store the value read
int sensmax = 0;
int sensmin = 0;
int Rmsmax = 0;
int Rmsmin = 0;
void setup()
{
 
  pinMode(rele, OUTPUT); // inicializar entrada digital 3 como una salida (OUTPUT)
   
  Serial.begin(9600); // initialize serial communication at 9600 bits per second
}

// the loop function runs over and over again forever
void loop()
{
    int sensorvalue = analogRead(A1)-512; // read the input on analog pin 0
    Serial.println(sensorvalue); // print out the value you read
     delay (0.000001);
    }


As you say, the delay is very tiny, and one spect that the values move growing and decresing in a wave form with a period of 20 mili second, but instead of that i have a values growing and decrecing in very tiny period mso much less than 20 ms, so i think maybe the Arduino receptors of analogue signal are defective.

what do you say about this?

hammy

Something is very wrong here - your scope is not seeing a true representation of the mains  voltage , it just looks like noise pickup .

Does that sensor output an AC voltage ?  ( it looks just like a transformer with a follower amp ) In which case you can't just connect it to
an  Arduino and expect to get a sensible result - it cannot measure the negative voltage .
That needs sorting .

Don't understand why you want peak voltage , when this is readily scaleable from the rms value - if it's not a sine wave then that sensor may not see harmonics .

Personally I'd look at either offsetting the AC so it's always positive and either make smooth DC from it or sample it and seek the peaks ( not easy as you will need to sample at a high rate).

It needs a precision rectifier circuit to make DC proportional to the rms AC , that's how I would do it

Some stuff here :https://electronics.stackexchange.com/questions/244667/how-to-measure-mains-ac-voltage-with-an-adc-from-a-microcontroller

VictorA


Sorry, i connected wrong the osciloscope, this is the real graph:


TomGeorge

Hi,
Put the oscilloscope in DC mode, ALL those readings are in AC mode, so not true voltage readings of what is at the analog input pins.

  • Then before making any measurements, connect the probe to gnd and make sure you have a solid trace across the center line of the scope.
  • Connect scope probe gnd to pcb gnd and probe to output of the pcb.
  • Then adjust the pot  on the PCB to see if you can get a trace that is more like pulsed DC or at about 4V peak to peak for your 220Vac or what ever it is at the moment at the pcb input.

  • Try adjustment  from minimum to maximum adjustment.


Tom... :) :)
Everything runs on smoke, let the smoke out, it stops running....

VictorA


There is something i did'nt unerstood... why i have to see the signal of the analog input in DC?... the input to the sensor is AC, and i understand that this sensor is just a transformer and a regulator, so in the analog outpur i will have an AC signal betwen 0 to 5 V. or i am wrong?

TomGeorge

Hi,
I am sorry for the resolution, but I believe this is the circuit of the unit.


With NO AC input, it outputs 2.5Vdc or half Vcc.
With AC connected, it outputs an AC waveform centered around 2.5Vdc.
The magnitude of the AC waveform is adjusted by the potentiometer.

You need to have the scope in DC because that is the only way you will see AC and the DC offset.
When you have the scope set to AC, any DC offset or component is removed from the displayed signal.

You should be seeing on the scope a sinewave that is ALL positive above gnd.

Tom.. :)
Everything runs on smoke, let the smoke out, it stops running....

Go Up