Home > Perguntas frequentes técnicas > Como ler um sensor de corrente com Arduino?

Como ler um sensor de corrente com Arduino?

Como ler um sensor de corrente com Arduino?
Sep30, 2024

Tomemos o modelo HSTS016L como exemplo: consegue medir correntes entre 10 A e 200 A. Por ser um sensor de corrente de núcleo bipartido, podemos abrir e fechar o núcleo sem alterar o sistema existente e encaixá-lo à volta do cabo de medição. A tensão de saída deste sensor é de 2,5 V ± 0,625 V, com boa precisão. Embora a gama de tensão de saída deste sensor esteja entre 1,875 V e 3,125 V, também é adequada para entradas analógicas de 3,3 V, especialmente nos microcontroladores Arduino Nano e NodeMCU.

 

O sensor tem quatro pinos: VERMELHO (entrada de 5 V), PRETO (terra de 0 V), AMARELO (saída analógica) e BRANCO (sinal analógico para calibração). Por vezes, a tensão de alimentação pode não ser exatamente 5 V; por isso, precisamos de um pino analógico adicional para medir o ponto médio exato através do pino branco. O Arduino UNO tem seis pinos de entrada analógica (A0-A5): podemos usar um para medir a corrente CA e outro para a calibração. Os pinos de entrada analógica convertem tensões entre 0 e 5 V em valores inteiros entre 0 e 1023, com uma resolução de 4,9 mV por unidade (5,00 V / 1023 unidades).

 

Ligamos o VERMELHO à entrada de 5 V, o PRETO à terra, o AMARELO ao pino analógico A1 e o BRANCO ao pino analógico A2. Recomenda-se vivamente utilizar um adaptador de alimentação de 12 V para alimentar o Arduino Uno e o sensor. A alimentação de 5 V por USB pode produzir um desvio inicial; nesse caso, poderá ser necessário acrescentar manualmente o valor do desvio ao carregar o código.

 


// Pino usado para medir a corrente (A0 está reservado para os botões do LCD Display Shield)
int currentAnalogInputPin = A1;  
// Pino usado para calibrar o valor do ponto médio
int calibrationPin = A2; 
// Introduza o valor para corrigir manualmente o desvio inicial
float manualOffset = 0.00;
// Se utilizar um transformador de corrente de efeito Hall, introduza o valor calculado pela fórmula: mVperAmp = amplitude máxima da tensão (em milivolts) / corrente nominal do transformador de corrente
float mVperAmpValue = 12.5;        
// Tensão máxima da entrada analógica: 5000 mV no Arduino Uno ou Mega e 3300 mV no Arduino Nano ou NodeMCU
float supplyVoltage = 5000;
/* ler o valor de uma amostra para posterior correção do desvio */
float offsetSampleRead = 0;        
 /* ler o valor de uma amostra, incluindo o valor currentOffset1 */
float currentSampleRead  = 0;     
  /* contar o tempo entre amostras; teoricamente, é recolhida uma amostra por milissegundo */
float currentLastSample  = 0;     
  /* acumulação dos valores das amostras */
float currentSampleSum   = 0;     
  /* contar o número de amostras. */
float currentSampleCount = 0;     
    /* calcular a média de todas as amostras, em valores analógicos */
float currentMean ;            
  /* raiz quadrada de currentMean, em valores analógicos */
float RMSCurrentMean ;             
   /* leitura final da corrente eficaz */
float FinalRMSCurrent ;           
void setup()                                 /* código executado uma única vez */
{
        Serial.begin(9600);                 /* apresentar as leituras no Monitor Série a 9600 baud */
}
void loop()
{
        /* 1- Medição de corrente CA e CC */
        if(micros() >= currentLastSample + 200)                     /* uma leitura a cada 0,2 milissegundos */
          {
           /* ler o valor da amostra, incluindo o desvio */
           currentSampleRead = analogRead(currentAnalogInputPin)-analogRead(calibrationPin); 
          /* acumular os valores analógicos de todas as amostras */
           currentSampleSum = currentSampleSum + sq(currentSampleRead) ;
           /* incrementar a contagem de amostras */
           currentSampleCount = currentSampleCount + 1; 
           /* atualizar o tempo para iniciar o ciclo seguinte */
           currentLastSample = micros(); 
          }
        /* após 4000 amostras ou 800 milissegundos (0,8 segundos), executar o código seguinte */
        if(currentSampleCount == 4000) 
          {
            /* calcular a média dos valores analógicos acumulados */
            currentMean = currentSampleSum/currentSampleCount;
             /* calcular a raiz quadrada da média */
            RMSCurrentMean = sqrt(currentMean);
             /* calcular a corrente eficaz final */
            FinalRMSCurrent = (((RMSCurrentMean /1023) *supplyVoltage) /mVperAmpValue)- manualOffset;
              /* se a corrente detetada for igual ou inferior a 1%, definir o valor como 0 A */
            if(FinalRMSCurrent <= (625/mVperAmpValue/100))
            { FinalRMSCurrent =0; }
            Serial.print(” O valor eficaz da corrente é: “);
            Serial.print(FinalRMSCurrent,decimalPrecision);
            Serial.println(” A “);
            currentSampleSum =0;                                 /* repor a soma das amostras para o ciclo seguinte */
            currentSampleCount=0;                                 /* repor o número de amostras para o ciclo seguinte */
          }
}

Inquiry Form