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);
}
Tags:
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);
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 !
Os meus cálculos foram feitos todos em milhares de milivolts.
Percebeu o erro no seu programa?
Consegui corrigir o seu programa ?
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por