sensor para medir voltagem de baterias em serie

Boas;

Queria fazer um pequeno projecto para medir a voltagem de baterias de litium 18650 e serie e necessitava que fizesse uma leitura rigorosa a decima pois a mesma irá trabalhar entre os 3v a 4,2V. Ate ao momento não encontrei nada que ofereça rigor na leitura à decima.

Será que alguem me possa ajudar?

Cumprimentos

Viva.

"Voltage divider", tens por aqui muito exemplos no forum, duas resistências e pouco mais, um condensador tambem ajuda em conjunto com as ressitencias.

Esta precisão chega para o que pretendes ? :

voltage

O Arduino vai estar alimentado com que tensão?
Se for com 5V, o máximo e precisão que podes atingir é 5/1023.

Se precisares de mais, aconselho baixares a tensão de alimentação do conversor AD e utilizares um amplificador operacional para converter a tensão de 3 a 4.2V para algo entre 0 e 3V. Assim conseguirás bastante mais precisão, mas talvez seja mais do que precisas.

arssant:
Viva.

"Voltage divider", tens por aqui muito exemplos no forum, duas resistências e pouco mais, um condensador tambem ajuda em conjunto com as ressitencias.

Esta precisão chega para o que pretendes ? :

voltage

Eu adquiri uma pequena board http://www.ebay.com/itm/191736125167?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT que penso ser o que referes mas não deu a precisao que pretendia, porque os valores de coparação sao entre os 3,00V a 4,20V entre celulas depois pretendo as balancear mas sem conseguir uma leitura correcto de cada não consigo avançar para o proximo passo

bubulindo:
O Arduino vai estar alimentado com que tensão?
Se for com 5V, o máximo e precisão que podes atingir é 5/1023.

Se precisares de mais, aconselho baixares a tensão de alimentação do conversor AD e utilizares um amplificador operacional para converter a tensão de 3 a 4.2V para algo entre 0 e 3V. Assim conseguirás bastante mais precisão, mas talvez seja mais do que precisas.

Bubulino,

Penso que necessito de maior precisao como referes as minhas bases é que sao fracas para avançar por ai… dai pedir o vosso apoio e ajuda…

tecnisol:
Eu adquiri uma pequena board http://www.ebay.com/itm/191736125167?_trksid=p2060353.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT que penso ser o que referes mas não deu a precisao que pretendia, porque os valores de coparação sao entre os 3,00V a 4,20V entre celulas depois pretendo as balancear mas sem conseguir uma leitura correcto de cada não consigo avançar para o proximo passo

Viva.

Se os valores que consegui ler nas resistência do link estao correcta, 30k e 7.5k, tenta este meu codigo, uma funcao que tenho:

alteras

R1 para 30000
R2 para 7500

e vref, medes a voltagem que tens no pino saida dos 5vts do arduino.

const byte vinInput = 3;
float vout = 0.0;
float vin = 0.0;
const float R1 = 10000000.0; // resistance of R1 (10M)
const float R2 = 1000000.0; // resistance of R2 (1M)

const float vref = 4.95;

vin = volts();


float volts()
{
  
  for (int i = 0; i < 50; i++) {
    vout = (analogRead(vinInput) * vref) / 1023; 
    delay (10);
    vin += vout / (R2 / (R1 + R2));
  }
  vin = vin / 50;
  if (vin < 0.09) {
    vin = 0.0;
  }
  return vin;
}

5/1023 = 0.05 o que é o dobro do que pediste...

arssant:
Viva.

Se os valores que consegui ler nas resistência do link estao correcta, 30k e 7.5k, tenta este meu codigo, uma funcao que tenho:

alteras

R1 para 30000
R2 para 7500

e vref, medes a voltagem que tens no pino saida dos 5vts do arduino.

const byte vinInput = 3;

float vout = 0.0;
float vin = 0.0;
const float R1 = 10000000.0; // resistance of R1 (10M)
const float R2 = 1000000.0; // resistance of R2 (1M)

const float vref = 4.95;

vin = volts();

float volts()
{
 
  for (int i = 0; i < 50; i++) {
    vout = (analogRead(vinInput) * vref) / 1023;
    delay (10);
    vin += vout / (R2 / (R1 + R2));
  }
  vin = vin / 50;
  if (vin < 0.09) {
    vin = 0.0;
  }
  return vin;
}

O codigo da-me erro

bubulindo:
5/1023 = 0.05 o que é o dobro do que pediste…

Não entendi…

tecnisol:
O codigo da-me erro

Viva.

`e provável. So aqui postei a função, as definicoes das varavies e a chamada da funcao.
So postei a parte de codigo do meu monitor de AP´s, sao mas de 600 linhas.
Pega no exemplo do IDE AnalogInput/analogRead e alteras o com a minha funcao, mas fácil nao ha.

tecnisol:
e necessitava que fizesse uma leitura rigorosa a decima pois a mesma irá trabalhar entre os 3v a 4,2V.

5/1023 = 0.00488758553

Precisas de medir com precisão até uma décima de volt. Com 5V, consegues medir até meia décima de volt… logo é o dobro da precisão, ou não?

graças a vossa ajuda em especial ao codigo do arssant consegui este codigo e esta a dar valores muito aceitaveis… obrigado assim ja posso avançar um pouco mais no projecto.

const byte vinInput = 3; // pino do arduino onde ligas o out do sensor (S)
float vout = 0.0;
float vin = 0.0;
const float R1 = 30000.0; // resistance of R1 (30M)
const float R2 = 7500.0; // resistance of R2 (7,5M)

const float vref = 3.26;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
vin = volts();
Serial.println(vin);
delay (20);
}

float volts()
{

for (int i = 0; i < 50; i++) {
vout = (analogRead(vinInput) * vref) / 1023;
delay (10);
vin += vout / (R2 / (R1 + R2));
}
vin = vin / 50;
if (vin < 0.09) {
vin = 0.0;
}
return vin;
}

Estive a tentar colocar a ler a 2 celula que esta ligada em paralelo mas não me esta a dar correctamente, este é o codigo que estou a usar:

const byte vinInput1 = 0; // pino do arduino onde ligas o out do sensor (S)
const byte vinInput2 = 1;

float vout1 = 0.0;
float vout2 = 0.0;

float vin1 = 0.0;
float vin2 = 0.0;

const float R1 = 30000.0; // resistance of R1 (30M)
const float R2 = 7500.0; // resistance of R2 (7,5M)

const float vref = 3.26;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
vin1 = volts1();
vin2 = volts2();
Serial.print("Pin 0 - ");
Serial.println(vin1);
Serial.print("Pin 1 - ");
Serial.println(vin2);
delay (20);
}

float volts1()
{

for (int i = 0; i < 50; i++) {
vout1 = (analogRead(vinInput1) * vref) / 1023;
delay (10);
vin1 += vout1 / (R2 / (R1 + R2));
}
vin1 = vin1 / 50;
if (vin1 < 0.09) {
vin1 = 0.0;
}
return vin1;
}
float volts2()
{

for (int i = 0; i < 50; i++) {
vout2 = (analogRead(vinInput2) * vref) / 1023;
delay (10);
vin2 += vout2 / (R2 / (R1 + R2));
}
vin2 = vin2 / 50;
if (vin2 < 0.09) {
vin2 = 0.0;
}
return vin2;
}

Se a célula está ligada em paralelo não vais medir a mesma tensão em ambas as baterias??

Viva.

const float vref = 3.26

Mediste a voltagem no pino dos 5 vts do arduino ?
OS valores variam muito pouco entre os 5.1 e 4.8 vts.

Acho que acertas-te com o pino dos 3.3vts

bubulindo:
Se a célula está ligada em paralelo não vais medir a mesma tensão em ambas as baterias??

Estou a medir em serie inclusive os fios ligados ao arduino na 2 celula começam a aquecer imenso

arssant:
Viva.

const float vref = 3.26

Mediste a voltagem no pino dos 5 vts do arduino ?
OS valores variam muito pouco entre os 5.1 e 4.8 vts.

Acho que acertas-te com o pino dos 3.3vts

Boas usei com 5v mas depois coloquei a placa a trabalhar assim com 3,3v estão os valores muito mais correctos comparando com um multimetro deram-me sempre os mesmos com os 5v dava-me como anteriormente +/-

O meu problema é que não tou a conseguir ler a segunda celula deu tipo 14 e os fios aqueciam imenso

"Aquecer muito" !!! ca pra mim tens qq coisa em curto circuito.

Faz um desenho simples das ligações que fizeste, mesmo a lápis e coloca o aqui no forum.

junto segue o esquema

tecnisol:
junto segue o esquema

Viva.

Até aposto que sao os fios do sensor da direita que estao a aquecer, certo ?

Se me recordo das aulas de "electricidade" na faculdade, nao sera a forma indicada para ter isso assim ligado.

Tenta assim: medes a bateria do lado esquerdo da maneira que se encontra, mas a do lado direito; ligas o VCC do do sensor a bateria do lado direito (+) e o GND desse mesmo sensor ao (-) da bateria da esquerda.
No calculo final, fazes vindadireira = vinddasduas - vindaesquerda
basicamente medes a da esquerda, o total das duas, e no final subtrais ao total o valor da esquerda para saber o valor da direita.
TEsta assim, deveras ter algum resultado satisfatório.