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: 12335

Responder esta

Respostas a este tópico

O codigo é meio longo, fica dificil entender.

Sugestões:

- Fazer um simples que só le a porta e escreve na serial para ver se o problema é a entrada de dados;

- Colocar um potenciometro com as extremidades ligadas em 0 e +5V ligado ao pino para simular.

Fora isso é preciso ver por ex se Pow retorna float caso haja uma entrada int. Pode ser que vc precise colocar um typecast antes, algo como:

pow((float)sensorValue_aux);

Olá, não tenho potenciometro, mas a ideia do typecast foi bem vinda, obrigada.

Outra sugestão seria vc incluir linhas para debug enviando valores intermediarios para a serial. Assim vc consegue entender até onde seu valor existe e onde é zerado (ou entra zerado).

A dica do Debug é uma ótima dica. Coloco vários Serial.println  em um instante eu acho o erro

Olá,

Pesquise aqui no fórum do LDG http://labdegaragem.com/forum/topics/medidor-de-consumo-de-energia-1 , existe um tópico creio que resolvido a respeito, na época fiz dois vídeos para meu canal no YT, simulando no Proteus um circuito, e como não tinha o sensor usei um Trafo e dois divisores para a simulação.

https://www.youtube.com/watch?v=aS5GyNodlGc

https://www.youtube.com/watch?v=2e4hF6uT5Po

Lembrete, quando postar código, trate de publicar no www.pastebin.com e inclui o link aqui, se não a formatação se perde, trate também de comentar as linhas, e de identar.

Abs.

Sugiro que leia esse tópico para entender a leitura de corrente AC :

http://labdegaragem.com/forum/topics/sensor-de-corrente-acs712-com-...

Primeiro erro que eu vi , não analisei o código.

O valor da sensibildade esta errado !

Como eu já postei em outro tópico, a sensibilidade do sensor ACS712-30A é de 66mV/A e não 185mV/A. 

currentValue = (sensorValue/185)*1000 ; // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

currentValue = (sensorValue/66)*1000; // calcula a corrente considerando a sensibilidade do sernsor (66 mV por amper)

http://labdegaragem.com/forum/topics/sensor-de-corrente-acs712-com-...

Gustavo,

Já tinha visto sua postagem hoje cedo no tópico similar onde opinamos ambos e onde você postou um excelente trabalho, documentando seus testes, parabéns!

Fiz um vídeo a proposito do seu comentário:

https://www.youtube.com/watch?v=sbURLO1tNk8&feature=youtu.be

Observe que no vídeo anterior acima  na simulação a fundo de escala não passava de 12A, e usando o fator 66mv passava em 8 amperes, tal como seu comentário de ontem, fiz um teste até acertar o fator exato (Pelo menos na simulação) veja o resultado no vídeo.

Grande abraço!

Carlos Kwiek,

Carlos obrigado pelo elogio. 

Visualizando essa tabela podemos concluir, que as correntes minima e máxima são respectivamente - 30A e + 30 A. 

O ponto de offset é de 2,5 V . 

Abraços.

 I Min = -2,0 V / 0,066 = - 30,3 A

 I Max =+2,0 V / 0,066 = 30,3 A

Olá,

Simulei um teste no Proteus usando um potenciômetro como sugerido pelo Eduardo.

Link do vídeo no meu canal.

https://www.youtube.com/watch?v=3Olm6x72pNk&feature=youtu.be

Abs.

Olá,

Segue minha contribuição com o código.

http://pastebin.com/eisq8RW9

Por favor, me avise se der algum erro.

Coloquei uns Serial.print() adicionais para tentar entender onde está o problema.

Poderia postar aqui ou no pastebin.com o resultado?

Boa sorte,

  'Eiju

Caro Celso, 

Como eu já postei em outro tópico, a sensibilidade do sensor ACS712-30A é de 66mV/A e não 185mV/A. 

Olá José,

Muito obrigado!

Pastebin.com está corrigido.

  'Eiju

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço