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 */
}
}