Inicio > TECHNICAL FAQS > ¿Cómo leer un sensor de corriente con Arduino?

¿Cómo leer un sensor de corriente con Arduino?

¿Cómo leer un sensor de corriente con Arduino?
Sep30, 2024

Tome el modelo HSTS016L como ejemplo: es capaz de medir valores de corriente de 10 A a 200 A. Al usar un sensor de corriente de núcleo partido, podemos abrir y cerrar el CT sin modificar el sistema existente, y simplemente usar una pinza para colocar el cable de medición dentro del CT. El voltaje de salida de este sensor es de 2.5 V +/- 0.625 V, lo que ofrece una buena precisión. Aunque el rango de salida de voltaje de este sensor está entre 1.875 V y 3.125 V, también es adecuado para sensores analógicos de 3.3 V, especialmente microcontroladores Arduino Nano y NodeMCU.

El sensor tiene 4 pines de salida: RED (entrada de 5 V), BLACK (0 V Gnd), YELLOW (salida analógica) y WHITE (analógico para calibración). A veces, el voltaje de alimentación puede no ser exactamente de 5 V, por lo que necesitaremos un pin analógico adicional para medir el punto medio exacto desde el pin blanco. En Arduino UNO, hay 6 pines de entrada analógica (A0-A5), donde podemos usar uno de los pines para medir corriente CA y 1 más para fines de calibración. Los pines de entrada analógica asignarán voltajes de entrada entre 0 y 5 V a valores enteros entre 0 y 1023, con una resolución de 4.9 mV por unidad (5.00 V / 1023 unidades).

Conectamos RED a la entrada de 5 V, BLACK a tierra, YELLOW al pin analógico A1 y WHITE al pin analógico A2. Se recomienda encarecidamente usar un adaptador de corriente de 12 V para alimentar el Arduino Uno y el sensor. Usar una fuente de alimentación de 5 V por USB tendrá un valor de desplazamiento inicial; es posible que deba agregar manualmente el valor de desplazamiento al cargar el código.


// Qué pin mide el valor de corriente (A0 está reservado para la función de botón del LCD Display Shield)
int currentAnalogInputPin = A1;  
// Qué pin calibra el valor medio de desplazamiento
int calibrationPin = A2; 
// Introduzca el valor para desplazar manualmente el valor inicial
float manualOffset = 0.00;
// Si usa un transformador de corriente de “efecto Hall”, introduzca el valor con esta fórmula: mVperAmp = rango máximo de voltaje (en milivoltios) / corriente nominal del CT
float mVperAmpValue = 12.5;        
// Voltaje máximo de alimentación del pin de entrada analógica; Arduino Uno o Mega es 5000 mV, mientras que Arduino Nano o Node MCU es 3300 mV
float supplyVoltage = 5000;
/* para leer el valor de una muestra con fines de desplazamiento más adelante */
float offsetSampleRead = 0;        
 /* para leer el valor de una muestra, incluido el valor currentOffset1*/
float currentSampleRead  = 0;     
  /* para contar el tiempo de cada muestra. Técnicamente, se toma 1 muestra cada 1 milisegundo */
float currentLastSample  = 0;     
  /* acumulación de lecturas de muestras */
float currentSampleSum   = 0;     
  /* para contar el número de muestras. */
float currentSampleCount = 0;     
    /* para calcular el valor promedio de todas las muestras, en valores analógicos*/
float currentMean ;            
  /* raíz cuadrada de currentMean, en valores analógicos */
float RMSCurrentMean ;             
   /* la lectura final de corriente RMS*/
float FinalRMSCurrent ;           
void setup()                                 /*códigos que se ejecutan una vez */
{
        Serial.begin(9600);                 /* para mostrar lecturas en el monitor serie a 9600 baudios */
}
void loop()
{
        /* 1- Medición de corriente CA y CC */
        if(micros() >= currentLastSample + 200)                     /* cada 0.2 milisegundos se toma 1 lectura */
          {
           /* leer el valor de la muestra, incluido el valor de desplazamiento*/
           currentSampleRead = analogRead(currentAnalogInputPin)-analogRead(calibrationPin); 
          /* acumular los valores analógicos totales para cada lectura de muestra*/
           currentSampleSum = currentSampleSum + sq(currentSampleRead) ;
           /* para contar y pasar al siguiente conteo */
           currentSampleCount = currentSampleCount + 1; 
           /* para restablecer el tiempo de nuevo y que el siguiente ciclo pueda comenzar otra vez*/
           currentLastSample = micros(); 
          }
        /* después de 4000 conteos u 800 milisegundos (0.8 segundos), ejecute los siguientes códigos*/
        if(currentSampleCount == 4000) 
          {
            /* promediar los valores analógicos acumulados*/
            currentMean = currentSampleSum/currentSampleCount;
             /* raíz cuadrada del valor promedio*/
            RMSCurrentMean = sqrt(currentMean);
             /* calcular la corriente RMS final*/
            FinalRMSCurrent = (((RMSCurrentMean /1023) *supplyVoltage) /mVperAmpValue)- manualOffset;
              /* si la corriente detectada es menor o igual al 1%, establezca el valor de corriente en 0 A*/
            if(FinalRMSCurrent <= (625/mVperAmpValue/100))
            { FinalRMSCurrent =0; }
            Serial.print(” El valor RMS de corriente es: “);
            Serial.print(FinalRMSCurrent,decimalPrecision);
            Serial.println(” A “);
            currentSampleSum =0;                                 /* para restablecer los valores de muestra acumulados para el siguiente ciclo */
            currentSampleCount=0;                                 /* para restablecer el número de muestras para el siguiente ciclo */
          }
}

Inquiry Form