Tomemos el modelo HSTS016L como ejemplo, es capaz de medir valores de corriente de 10A a 200A. Utilizando el tipo de sensor de corriente de núcleo dividido, podemos encender y apagar el TC sin cambiar el sistema existente, y sólo tenemos que utilizar un clip para poner el cable de medición dentro del TC. La tensión de salida de este sensor es de 2,5V +/- 0,625V, lo que supone una buena precisión. Aunque el rango de tensión de salida de este sensor está entre 1,875V y 3,125V, también es adecuado para sensores analógicos de 3,3V, especialmente microcontroladores Arduino Nano y NodeMCU.
El sensor tiene 4 pines de salida: ROJO (entrada 5V), NEGRO (0V Gnd), AMARILLO (Salida Analógica), y BLANCO (Analógico para Calibración). A veces la tensión de alimentación puede no ser exacta 5V por lo que necesitaremos Pin Analógico adicional para medir el punto medio exacto desde el Pin Blanco. Para Arduino UNO, hay 6 pines de entrada analógica (A0-A5) donde podemos utilizar uno de los pines para medir la corriente alterna y 1 más para utilizarlo con fines de calibración. Los pines de entrada analógica mapearán los voltajes de entrada entre 0 y 5V en valores enteros entre 0 y 1023 con una resolución de 4.9mV por unidad (5.00V / 1023 unidades).
Conectamos el ROJO a la entrada de 5V, el NEGRO a masa, el AMARILLO al pin analógico A1 y el BLANCO al pin analógico A2. Es muy recomendable utilizar un adaptador de corriente de 12V para alimentar el Arduino Uno y el sensor. El uso de una fuente de alimentación de 5V a través de USB tendrá un valor de desplazamiento inicial, puede que tenga que añadir manualmente el valor de desplazamiento al cargar el código.
// Which pin to measure Current Value (A0 is reserved for LCD Display Shield Button function)
int clavijaAnalogInputPin actual = A1;
// Which pin to calibrate offset middle value
int calibraciónPin = A2;
// Key in value to manually offset the initial value
float manualOffset = 0.00;
// If using “Hall-Effect” Current Transformer, key in value using this formula: mVperAmp = maximum voltage range (in milli volt) / current rating of CT
float mVperAmpValue = 12,5;
// Analog input pin maximum supply voltage, Arduino Uno or Mega is 5000mV while Arduino Nano or Node MCU is 3300mV
float supplyVoltage = 5000;
/* para leer el valor de una muestra con fines de desplazamiento posterior */
float offsetMuestraLectura = 0;
/* leer el valor de una muestra incluyendo el valor de currentOffset1*/
float currentSampleRead = 0;
/* para contar el tiempo de cada muestra. Técnicamente se toma 1 milisegundo 1 muestra */
float currentLastSample = 0;
/* acumulación de lecturas de muestra */
float sumaMuestraactual = 0;
/* para contar el número de muestras. */
float currentSampleCount = 0;
/* calcular el valor medio de todas las muestras, en valores analógicos*/
float mediaactual ;
/* techo cuadrado de currentMean, en valores analógicos */
float RMSCurrentMean ;
/* la lectura final de la corriente RMS*/
float FinalRMSCurrent ;
void setup() /*códigos a ejecutar una vez */
{
Serial.begin(9600); /* para mostrar las lecturas en el Monitor Serial a 9600 baudios */
}
void bucle()
{
/* 1- Medición de corriente alterna y continua */
if(micros() >= currentLastSample + 200) /* cada 0,2 milisegundos toma 1 lectura */
{
/* leer el valor de la muestra incluyendo el valor offset*/
currentSampleRead = analogRead(currentAnalogInputPin)-analogRead(calibrationPin);
/* acumular valores analógicos totales para cada lectura de muestra*/
sumaMuestraactual = sumaMuestraactual + sq(lecturaMuestraactual) ;
/* para contar y pasar a la siguiente cuenta */
currentSampleCount = currentSampleCount + 1;
/* volver a poner a cero el tiempo para que el siguiente ciclo pueda empezar de nuevo*/
actualÚltimaMuestra = micros();
}
/* después de 4000 o 800 milisegundos (0.8 segundos), haga lo siguiente*/
if(currentSampleCount == 4000)
{
/* valores analógicos medios acumulados*/
currentMean = currentSampleSum/currentSampleCount;
/* raíz cuadrada del valor medio*/
RMSMediaactual = sqrt(mediaactual);
/* calcular la corriente RMS final*/
FinalRMSCurrent = (((RMSCurrentMean /1023) *supplyVoltage) /mVperAmpValue)- manualOffset;
/* si la corriente detectada es inferior o igual al 1%, ajuste el valor de la corriente a 0A*/
if(FinalRMSCurrent <= (625/mVperAmpValue/100))
{ FinalRMSCurrent =0; }
Serial.print(" El valor RMS actual es: ");
Serial.print(FinalRMSCurrent,decimalPrecisión);
Serial.println(" A ");
currentSampleSum =0; /* restablecer los valores de muestra acumulados para el siguiente ciclo */
currentSampleCount=0; /* restablecer el número de muestras para el siguiente ciclo */
}
}