Ajuda - Capturar Valor - Sensor de Corrente ACS712 30a

Bom dia Pessoal,

Estou com uma grande dificuldade em conseguir capturar o valor do sensor.

Já tentei inúmeros algoritmos disponibilizados, porém o valor aparece sempre "fixo", ou seja, com algum aparelho ligado ou não, o valor permanece o mesmo.

Alguém sabe como pegar esse valor mais próximo do real possível??

Algoritmos testados que não deram certos:

int sensorPin =A0;

int sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.004887586;// 5%1023

void setup() {
Serial.begin(9600);
pinMode(sensorPin, INPUT);
}

void loop() {

for(int i=100; i>0; i--){
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é (1023)vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // somam os quadrados das leituras.
}

sensorValue = (sqrt(sensorValue/ 100)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/0.185); // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

// mostra o resultado no terminal
Serial.print(currentValue,3);
Serial.print(" A \n" );

sensorValue =0;

delay(100);

}
###########################################################################################################3

void setup() {
// inicializa a comunicação seral a 9600 bits por segundo:
Serial.begin(9600);
}

void loop() {
// leitura input no analog pin 0:

//aqui a leitura é mostrada entre 0 e 1023
int sensorValue = analogRead(A0);

//podemos fazer transformações para mostrar em Amperes

//O código a seguir diz para o Arduino que o valor lido pelo sensor deve ser transformado de 0 a 1023 para -30 a +30.

int outputValue = map(sensorValue, 0, 1023, -30, 30);
// mostrar valor lido pelo sensor:

Serial.print("Sensor: ");

Serial.print(sensorValue);

//mostrar valor transformado em amperes:

Serial.print(" - mA: ");

Serial.println(outputValue);

delay(3000); // Tempo entre leituras
}

#########################################################

#define Rele1 7 // Define pino de saida para rele 1
#define Rele2 8 // Define pino de saida para rele 2
const int sensorPin = A0;
float sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.0048828125;

int st_rl = 0;
String st_lamp = 0;

void setup(){
pinMode(Rele1,OUTPUT);
pinMode(Rele2,OUTPUT);
Serial.begin(9600);
}

void loop(){
char c = Serial.read();

for(int i=500; i>0; i--)
{
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // soam os quadardos das leituras no laco
}

sensorValue = (sqrt(sensorValue/ 500)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/66)*1000; // calcula a corrente considerando a sensibilidade do sernsor (66 mV por amper)


if (currentValue < 0.10){
st_lamp = "Lampada apagada";
}
else{
st_lamp = "Lampada ligada";
}

if (c == 's'){
Serial.print ("Valor do st: ");
Serial.print (st_rl);
Serial.print (" Corrente: ");
Serial.print (currentValue);
Serial.print (" Status da lampada: ");
Serial.println (st_lamp);
}
if (c == 'a'){
if (st_rl == 0){
digitalWrite(Rele1, HIGH);
Serial.print ("Valor anterior do st: ");
Serial.print (st_rl);
Serial.print (" Status anterior da lampada: ");
Serial.print (st_lamp);
st_rl = 1;
Serial.print (" Valor do st mudado para: ");
Serial.print (st_rl);
Serial.print (" Status atual da lampada: ");
Serial.println (st_lamp);
}
else{
digitalWrite(Rele1, LOW);
Serial.print ("Valor do st: ");
Serial.print (st_rl);
st_rl = 0;
Serial.print (" Valor do st mudado para: ");
Serial.print (st_rl);
Serial.print (" Status da Lampada: ");
}
}


delay(5000);

}

#############################################

int VQ; //2.5 volts na saída quando corrente for 0A
int ACSPin = A2;
void setup() {
Serial.begin(9600);
VQ = determineVQ(ACSPin);
delay(1000);
}
void loop() {
Serial.print("ACS712@A2:");Serial.print(readCurrent(ACSPin),3);Serial.println(" mA");
delay(150);
}
int determineVQ(int PIN) {
Serial.print("estimating avg. quiscent voltage:");
long VQ = 0;
//read 5000 samples to stabilise value
for (int i=0; i<10000; i++)
{
VQ += abs(analogRead(PIN));
delay(1);
}

VQ /= 10000;
Serial.print(map(VQ, 0, 1023, 0, 5000));Serial.println(" mV");
return int(VQ);
}
float readCurrent(int PIN) {
int current = 0;
int sensitivity = 66;//sensibilidade para o sensor de 30 A
for (int i=0; i<50; i++)
{
current += abs(analogRead(PIN)) - VQ;
delay(1);
}
current = map(current/50, 0, 1023, 0, 5000);
return float(current)/sensitivity;
}

############################################################

const int sensorPin = A4;
float sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.0048828125;


void setup() {

Serial.begin(9600);
}


void loop() {


for(int i=500; i>0; i--)
{
sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é vcc/2 para corrente =0
sensorValue += pow(sensorValue_aux,2); // soam os quadardos das leituras no laco
}

sensorValue = (sqrt(sensorValue/ 500)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
currentValue = (sensorValue/185)*1000 ; // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

// mostra o resultado no terminal
Serial.print(currentValue);
Serial.print("\n" );

sensorValue =0;
delay(1000);
}

Exibições: 12341

Responder esta

Respostas a este tópico

Bom Noite a todos.

Alimentação do Arduino através de uma fonte externa de 5V.

Medição do Vcc do Arduino:

No meu Arduino:

Inicialmente, coloquei a escala que você falou 1126400.

Os resultados foram estes Primeiro readVcc = 5028 mV  e medido com multímetro = 5,04 V

Logo após fiz o cálculo para a correção da escala e a minha escala foi 1129062.

E os resultados após a calibração foram estes => medido = 5,04 V e readVcc = 5,040 V (no meu Arduino).

Teste da Vout (Tensão de Saída) do sensor ACS712-30A

As minhas medições forneceram os seguintes resultados não foram tão estáveis quanto as suas, mas apresentaram um pequeníssimo erro de alguns milivolts (já esperado) como você mesmo comentou. A flutuação dos valores ficam presos nesses valores (2522,2532 e 2527mV).

Vcc = 5040 mV

Vout = 2522 mV

 

Vcc = 5040 mV

Vout = 2522 mV

 

Vcc = 5040 mV

Vout = 2532 mV

 

Vcc = 5040 mV

Vout = 2522 mV

 

Vcc = 5040 mV

Vout = 2527 mV

Fiz medições no próprio sensor e os resultados foram:

Vcc = 5,024V (Alimentação do sensor).

Vout = 2,512V (Tensão de saída do sensor).

Obs.: Todas as medições apresentadas foram sem CARGA no sensor.

  

Medições sem Carga no ACS712-30A

 

MedicMedicao Maxima = 513

Tensao de Pico = 2.525 mV

Vmax ACS712 = 0.005 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.000 A

 

Medicao Maxima = 513

Tensao de Pico = 2.525 mV

Vmax ACS712 = 0.005 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.000 A

 

Medicao Maxima = 513

Tensao de Pico = 2.525 mV

Vmax ACS712 = 0.005 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.000 A

 

Medições com Carga (Descrição da Carga – SECADOR DE CABELO – FABRICANTE: ARNO – POTÊNCIA 915-1090W – TENSÃO 210-240V

 

TENSÃO MEDIDA COM O MULTIMETRO NA REDE ELÉTRICA = 217V

CORRENTE MEDIDA COM MULTIMETRO = 3,61A

 

E os resultados no Monitor Serial do Arduino foram esses:

 

Medicao Maxima = 579

Tensao de Pico = 2.850 mV

Vmax ACS712 = 0.330 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.004 A

 

Medicao Maxima = 578

Tensao de Pico = 2.845 mV

Vmax ACS712 = 0.325 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.003 A

 

Medicao Maxima = 579

Tensao de Pico = 2.850 mV

Vmax ACS712 = 0.330 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.004 A

 

Medicao Maxima = 578

Tensao de Pico = 2.845 mV

Vmax ACS712 = 0.325 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.003 A

 

Medicao Maxima = 579

Tensao de Pico = 2.850 mV

Vmax ACS712 = 0.330 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.004 A

 

Medicao Maxima = 578

Tensao de Pico = 2.845 mV

Vmax ACS712 = 0.325 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.003 A

 

Medicao Maxima = 578

Tensao de Pico = 2.845 mV

Vmax ACS712 = 0.325 mV

V RMS ACS712 = 0 mV

I RMS ACS712 = 0.003 A

 

Não podia deixar de agradecer pela partilha deste pedaço de código MILAGROSO e que eu já procurava há uns dias!

Bem haja pela !!!

Vitor como eu já disse no forum, o ACS712-30A com Arduino não permite medições precisas, quando a corrente é baixa. 

No seu caso onde a tensão é de 220V, a corrente ai é a aproximadamente a metade da minha. 

Isto é , ainda pior para medir. 

As medições sem carga estão boas, dentro da tolerância. 

Qual capacitor colocou no pino AREF do Arduino?

Nas medições com carga, você mudou algo errado no programa. 

No meu programa, não tem ponto ! Essa medição é em mV .

Veja a Tensao de Pico = 2.845 mV

E ai todos os calculos estarão errados...

José estou utilizando um capacitor de 100pF no AREF do arduino. Como você falou isso melhora a estabilidade das medições do ATmega328.

Mudei o programa para aparecer 3 casas decimais (Serial.print(V_MAX,3);  exatamente nessa linha eu faço isso. Por isso, está aparecendo esse ponto. Não é um erro !

Agora o que é acho muito estranho. É por que existe a modificação da Medição Máxima (que no caso é a tensão_ max), que essa tensão_max entra no seguinte cálculo: Vmax_ACS712 = (float)(tensao_max - 512 ) * 5.040/1024;  mas como você dá para perceber na minha postagem anterior, esse Vmax_ACS712 se modificar muito pouco. E consequentemente os valores de V_RMS e I_RMS sofrem alterações pequenas. 

Vitor, como eu disse, seu programa esta errado :

Use a escala somente em milivolts. Não use PONTO, para números fracionários. 

Todos os meus calculos foram feitos em milivolts. 

Você esta misturando escalas de mV com Volts. 

No código que você tinha enviado : 

Mude isso >

 V_MAX = (float)(tensao_max ) * 4733/1024; 

Vmax_ACS712 = (float)(tensao_max - 512 ) * 4733/1024;

Aqui esta certo :

  I_RMS = (V_RMS/65.8); 

Eu já mudei a tensão de referência. Include os valores que enviei para você ver. Já está com a tensão de 5040.

Verifique o seu programa novamente. 

Envie o programa que esta usando. 

Se a tensão de pico sem carga  é de 2525 mV, e se com carga a tensão de pico é 2850 mV, 

 diferença é de 325 mV. 

325 mV  x 0,707 = 229,77 mV 

229,77 mV / 66 mV = 3,48 A ( Que beleza ! ) 

Você mediu 3,61 A  (agora é só aferir o coeficiente de sensibilidade) 

Você alterou o seu programa incorretamente. 

Colega, o ponto na notação inglesa significa virgula na nossa notação ! 

5040 mV foi a tensão de referência que obtive com uma fonte de alimentação externa do arduino. Utilizei um fonte de 5 V
Ok. Vou tirá esse ponto.
José não entendi o seu comentário sobre a notação ponto e notação vírgula. Eu sei muito bem o que você falou que o ponto na notação inglesa é vírgula na nossa.
Sei que na programação deve ser usado ponto invés de vírgula.

Os meus cálculos foram feitos todos em milhares de milivolts.

Percebeu o erro no seu programa?

Consegui corrigir o seu programa ?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço