Script para lector de tension 14.5 V

Buenas...
Estaba probando a medir la tensión de un grupo de baterias de 14,5 V ion litio, para posteriormente programar una alarma sonora y visual en la que se solicite recargarlas por bajo nivel.
Dado que la tensión de referencia maxima es 3.5 Volt, para el puerto analogico, he empleado un divisor de tension que me permita en 14.5 V una tensión maxima de 3.5 V en el puerto analógico, esto seria el 100 % de la señal.
No se si he cometido alguna redundancia o existe un metodo mas sencillo y preciso, habia estimado una tensión de seguridad de la carga de la bateria en 6.5 V.
Os muestro el script realizado y agradeceria que me aconsejaseis al respecto para afinarlo.
Gracias de antemano.

int analogPin = A0;     // Declaro pin analogico A0
 
float val = 0;           // Valor de la lectura analogica en float

float tension=0; // Valor de la tension en float

void setup()
{
   Serial.begin(9600);           //  Inicialización del modulo Serial.
}

void loop()
{
   val = map(analogRead(0), 0, 1023, 0, 145); // Mapeo de la lectura analogica en un rango de 0 a 145
   tension= 14.5*(val/100); // Convierto la señal analogica en voltios
  if (tension<=6.5) digitalWrite(6, HIGH); // Condición If que si se cumple encienda Led 6
   Serial.print("La tension es:");
   Serial.print( tension);
   Serial.println(" Volt");
   delay(2000); // Retardo 2 segundos
}

Un saludo.

Iñigo

divisor.png

Porque afirmas esto

Dado que la tensión de referencia maxima es 3.5 Volt

La tensión de referencia es de 5.0 Voltios

Si cambias a referencia interna puedes usar una mas precisa de 1.1V

De ningún modo es 3.5V en un UNO la tensión de Referencia.

Ajusta todo a 5.0

Moderador:
Vivo reclamando que nadie lee las normas que cuando me encuentro con alguien que postea usando etiquetas de código y adjunta la imagen como corresponde no puedo mas que felicitarte por hacer lo que se espera de todos. Pero lamentablemente eres el 1% de los que llegan a este foro que cumple con lo que se pide
De todos modos FELICITACIONES por LEER las Normas del Foro!!

Saludos...
No lo dije por decir, precisamente no estoy programando un arduino...sino un teensy ++2.0, y la tension maxima en este hardware es de 3,5 v.
Si meto mas tensión me cargo al menos el puerto analogico.
Este hardware tiene dos opciones de programación...c y arduino.
Un saludo.
Iñigo

Y como quieres que adivinemos que estas usando? El 99% de las personas usan Arduinos o tipo compatible.
En las normas se te pide que digas que estas usando justamente para evitar estos malos entendidos.

En el grafico que has mostrado simplemente no logro divisar los elementos involucrados.
Si que hay un divisor y posiblemente otro.
Si veo que hay como indicadores de tensión y muestras tensiones de 14.5 y otra lectura de 2.5 que no se que tiene que ver.
No esta claro cual es tu GND común a todos las fuentes involucradas.

Tampoco se ve los valores de los resistores ni lo mencionas en tu comentario.
En la imagen no detecto los valores de las resistencias.

Aclaro que intento ayudarte y para ello tu debes ser lo mas claro posible y no que esto sea un trabajo de investigación.
Mira (para la próxima) como se dibuja un esquema con divisores de tensión.

muestra el divisor resistivo y el pin que vas a usar.

En esta página dice que la referencia interna es de 2.56V y no 3.5 como afirmas.

The internal reference allows you to measure specific voltages, since it will remain at (approximately) 2.56 volts, even when the power supply voltage changes. The ADC input range will be 0 to 2.56 volts.

https://www.pjrc.com/teensy/adc.html

Los resultados obtenidos con 3.5 volts te dan bien?

Buenas...ante todo disculpa por la parquedad de los datos mostrados y mi ignorancia, seguro que he metido patadas considerando cosas que no son ciertas!!!.
Si tienes razon os voy a mostrar el divisor correctamente.

Entendi en el foro teensy que podia meter 3,5 v, en la entrada analogica, error por no haberlo confirmado antes.

No lo he probado aun solamente he simulado en pc, para comprobar tensiones y si el codigo funcionaba.
Con esta premisa tengo que recalcular los divisores de tensión para el valor que comentaste en el ultimo post.
En principio con la idea de los 3,5 v, calcule un divisor de tension de R1 = 100 KOhm y R2= 31 kOhm,
Nuevamente gracias.
Iñigo

divisor.jpg

Bueno yo creo que lo máximo es 2.50 y entonces tu divisor debería ser

2.5 = R2/(R1+R2)*14.5 =>

SI R1 = 100k => R2 = 100k/4.8 = 20.83k

Un valor que puedes conseguir con un preset. Una R de 18k y un preset de 5k multivuelta.
O jugar con resistencias 20k es fácil y 830 ohms con una de 820 te acercas...

Con este divisor obtienes 2.500 cuando a la entrada del divisor tienes 14.5V.
El uso de un preset te permite ajustar debidamente todo porque no siempre los valores son tan finos.

Gracias ...seguro que tienes razon y he interpretado mal el mensaje del foro en ingles.

Bueno entonces habria que recalcularlo todo para los 2,5 V de entrada maxima en el puerto analogico.

Lo que si he observado es que al meter el divisor la tension maxima que recibe el puerto seria 2.5 para 1023, y al simular para el uno me salia como si fuera 5 para 1023...por ello me daba en el puerto serial una lectura proporcional pero erronea...

En el script se requiere un mapeado de la entrada analogica?

Gracias.
Iñigo

Si el divisor esta bien hecho, cosa que asi creo y estamos de acuerdo que la tensión máxima será de 2.5V y que eso corresponde a un AD de 10Bits entonces, no necesitas map que solo te da una respuesta entera cuando tu puedes resolver las cosas con float.

mi rutina sería asi en lugar de esto

val = map(analogRead(0), 0, 1023, 0, 145); // Mapeo de la lectura analogica en un rango de 0 a 145
   tension= 14.5*(val/100); // Convierto la señal analogica en voltios
  if (tension<=6.5) digitalWrite(6, HIGH); // Condición If que si se cumple encienda Led 6

usaría esto

 // tension debe ser una variable tipo float
tension = 14.5*analogRead(A0)/1023.0f; // Leo directo en 0-14.5V
  if (tension <= 6.5f) 
      digitalWrite(6, HIGH); // Condición If que si se cumple encienda Led 6