CT sensor, wrong values when used on three-feed phases

Hey guys.

I’m developing something around my Wemos D1 Mini Pro, a TT-100-SD, blynk, and the Emonlib library.

I reached a point where my arduino could mesure out of one phase (2 phases, one ground, 230v) continously and transmit thoses datas to blynk and make some charts… That was for debugging, getting used to code etc…

When I clamped my CT sensor to the machine I’d like to monitor (3 feed phases, 400v). All my values are really off, so I changed the calibration but even tho I get the nice value while working (it’s stable but not showing the reals values, ie : when the machine is punching metal I should get a peak of 80 Amps, but it stays really still around 36 amps), when my machine is off and supposed to show 0 amps, I’ve only lost 2-3 amps on my mesures so it gives me something around 33 amps.

I’ve tried many formula, getting the apparent power, multiplying with Square(3)*Voltage * 3 phases … But nothing seems to work.

I did read it was possible on three phases assuming they are correctly balanced (they are) to mesure only one phases with a Amps meter (non-intrusive) and make mesurements.

If anyone knows what my problem is, that would be awesome !

Best regards,

// Premiere partie du code qui définie la base du code. Permet d'inclure les librairies, définir les noms etc..)

#define BLYNK_PRINT Serial // Permet d'écrire ce qu'il se passe sur le monitor
#define BLYNK_DEBUG_ALL Serial

#include "EmonLib.h" // Librairie de mesure de courant
EnergyMonitor emon1; // Creation 'une instance

#include <ESP8266WiFi.h> // Lib Wifi
char ssid[] = "BLINK";
char pass[] = "12345678";               

#include <BlynkSimpleEsp8266.h> // Lib Blynk
char auth[] = "xxxxxxxx";//yourauthtoken
BlynkTimer timer; // Fait appel a la librairie Blynk pour lui faire comprendre qu'un timer sera ajouté dans le code

#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

//Début de la fonction sendSensor

void sendSensor()
  double Irms = emon1.calcIrms(1480); 
Blynk.virtualWrite(V0, ((Irms*400)/(1.732*400)*3)); // Lib Blynk, écrit sur le pin virtuel V0 la valeur emon1.calcIrms(1480)
if (emon1.calcIrms(1480) > 1) {
  Blynk.virtualWrite(V2, 255);
  Blynk.virtualWrite(V1, 0);
else if (emon1.calcIrms(1480) < 1) {
  Blynk.virtualWrite(V1, 255);
  Blynk.virtualWrite(V2, 0);

// Début de la fonction Setup, qui ne se réalise qu'une seule fois (sauf si appel...)

void setup()
  Serial.begin(9600); // Ecris sur le monitor en baud 9600
  Blynk.begin(auth, ssid, pass, "", 8080); // Lib blynk, connexion Token,wifi,mdp, ip serveur blynk, port 8080 ou 81 à modifier
  emon1.current(0, 11.755);             // Courant : Pin input a savoir Analogique0 = 0, calibration (à taton, nécessaire de lire la librairie pour comprendre si calcul possible).
  timer.setInterval(1000L, sendSensor); // timer lancant en boucle tout les "xL" en ms, la fonction sendSensor
   ArduinoOTA.setPassword((const char *)"123");
    ArduinoOTA.onStart([]() {
  ArduinoOTA.onEnd([]() {
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  Serial.print("IP address: ");

// Début de la fonction loop, qui tourne en boucle
// Il est nécessaire d'avoir une fonction loop la plus épuré possible sous peine de latence, déconnexion, bug .......

void loop()
  Blynk.run(); // fait appel a tout les arguments blynk
  timer.run(); // enclenche le timer.setInterval, qui tout les "xL" active la fonction sendSensor

FYI : If I change Blynk.virtualWrite(V0, ((Irms400)/(1.732400)*3)); // for (V0, IRMS) my mesurements on 230v are perfect and perfectly responding to any amps changes

What are you using to measure the real current for comparison with your controller readings?

Can you post a diagram of how you have the current pickups configured in the 3phase of your project?

Thanks.. Tom... :slight_smile:

Hi TomGeorge,

For real current, I use a Hand clamp, or a fluke logger, both are pretty precise, the fluke is clearly the most usefull as I took some date over hours.

Here's a quick view of the real logs, don't mind the date axe ^^

To measure with the arduino I use :

A TT100SD, that has an arrow to know how to plug it (in the flow of the current)

and here's my arduino diagram, the TT100SD is wired to the 2 screw port J2.

and that's basically how I mesure. You can remplace the TT100SD by the fluke for real measurement .. !

here's the actual arduino monitoring

The values are off, it's not important, what's important is that there is no spike on the mesurements, nor a lower current while the machine is off.

To be more precise, when I calibrate to have 40A for 40A, when I should get 80A spike I only get 40.6 ~ 41A and when I should get 0 ~ 5 A max I get 39.x A.. It doesn't seem to fluctuate !

Best regards,

How brief are the "spikes", the ADC in the controller is not instantaneous.

I'm not sure but the WeMos probably only has ONE ADC and multiplexes the inputs, reading each one separately and one after the other.
Each conversion takes time and I don't know much about Blynk but any comms with it probably consumes logging time.

If you remove Blynk and just use the serial monitor at 115200 what happens?
Have you used the serial graph plotter?

Tom.... :slight_smile:

The real values, shown on the graph are from the fluke. It mesures values each second for a second. So 13:20:21-13:20:22 + 13:20:22 - 13:20:23 etc ...

The spikes are mostly when the hammer hit the metal sheet and when the hydraulic pump start to build up pressure.

I'll try with a new sketch, with serial plotter !

Should I read RAW input from A0 or keep the emonlib library doing the conversion to amps ?


How did you arrive at the 53R value for the ct shunt..??
Normally those ct's are fairly high resistance.
Shunt isn't bogging down the ct by any chance..??

There is a forum on the openEnergyMon. Site

One thing i would verify is that the CT does not have an internal shunt resistor

Here's the documentation for the TT100SD HERE

For the burden :

Let VP-P = 5V

Irms = 0.033 A (33mA) (@100A)

VPeak = VP-P /2

= 2.5V Peak

Vrms = VPeak /1.41421 (SQRT(2))

= 2.5V/1.41421

= 1.7677 Vrms

RBurden = Vrms/Irms

= 1.7677/0.033A

= 53.5 Ohms

RBurden = 51 Ohms (Nearest Standard Value)

from A old post I made

Do you have a burden resistor connected across the output of the current transformer?

A current transformer needs a 'burden resistor' to convert the current in the secondary into a measurable voltage.

A current transformer without a burden resistor is dangerous because the output voltage will be extremely high as it tries to pass a current through an open circuit.

However your current transformers have clamping diodes to protect against this danger, according to the datasheet.

My guess is that it is the clamping diodes that are preventing the output from changing significantly, and that they are only conducting because you haven't got a correctly calculated burden resistor in circuit.

Yes it’s the 53 ohms burden resistor R3

Here is something to keep in mind when measuring three phase current going to existing equipment.

I had a wave solder machine that ran on three phase power and discovered the previous owner had kept the machine going when one contactor out of three had burned, by wiring one of the remaining contactors to power two of the heating elements. Then one of those elements had opened up, so there were only 2 resistive loads heating the solder pot.

You should interview the person doing the maintenance on the equipment you are measuring, to ensure there are not repairs or needed repairs to the motors, etc. And have them shut down the machine in question and test all the power circuits to look for shorting or open connections.

Just because your reading don't make logical sense doesn't mean they are wrong!


Hey ! I did and there's nothing wrong on the machine. isn't something off in my code ? Like why would it show 30 amps when I should actually get 2 amps like the fluke can show me ?

A WeMos is a 3.3volt-logic board.
You can't (shouldn't) bias the CT with, and connect the cap to the 5volt supply.
The built-in 100k:220k voltage divider of the WeMos on the A0 pin will screw up things more.
I think you should add an external A/D (or two), like the ADS1115.

Let VP-P = 5V

OK, so now let's say 3.3 volts.....
The bias needs to be at mid point of the ADC value.

The question is what is the analog value at 0 amps.
What are the peaks at your running load.

If your code is good and 511 is the zero crossing point for the AC value, of 0-1023 of the ADC
and you bias with 5v to get 2.5 volts.

Where does 2.5 volts input plot out ?

Change your circuit to this configuration;

Tom... :slight_smile: