Error al leer temperatura, si también leo voltios... (SOLUCIONADO)

Buenas a todos, ...
haciendo unas pruebas me he encontrado con un problema, y es que estoy intentando leer temperatura y voltios de una pila al mismo tiempo...

si solo leo la temperatura, no hay problema.. pero si añado las lineas para leer los voltios de la pila la temperatura oscila mucho y no parece leer bien, cada lectura cambia mas de 1 grado respecto a la lectura anterior...
no se que puede ser... :frowning:

pongo el código , a ver si alguien se le ocurre que puede ser....
gracias de antemano

float tempC;
int tempPin = 0;
char msg[5];
int vpin = 3;
float Vout = 0.0;
float Vin = 0.0;
float R1 = 10000.0;
float R2 = 10000.0;
float valor=0;
void setup()
{
Serial.begin(9600);
pinMode(vpin, INPUT);
pinMode(tempPin, INPUT);
}

void loop()
{
// leer temperatura
tempC = analogRead(tempPin);
tempC = (5.0 * tempC * 100.0)/1024.0;
dtostrf(tempC,2,2,msg);
Serial.println(msg);

delay(250);

// leer voltios
valor = analogRead(vpin);
Vout = (valor * 5) / 1024.0;
Vin = Vout / (R2/ (R1+R2));
dtostrf(Vin,2,2,msg);
Serial.println(msg);

delay(250);
}

Hola Lisergio:

Lo único que me llama la atención, aunque no se si es eso, es la re utilización de msg[5] sin inicializar antes. No manejo dtostrf así que no se si lo necesita o no.
Por otro lado no necesitas dtostrf, Serial.print funciona con variables float.
Ah, analogRrad va de 0 a 1023. Se divide por 1023 para pasarlo decimal.

Saludos desde Buenos Aires

he probado a borrar la variable msg usando...
msg[5]='\0';

pero tampoco funciona...

la función dtostrf la uso, porque luego voy a transmitir ese dato junto mas texto usando un transmisor de 2,4ghz

Hola,

msg[5]='\0'; solo pone como 0 el ultimo char.

Para inicializar es:

for(int i = 0; i < 5; i++) msg = 0;
o, aunque no es lo mismo

  • strcpy( msg, " ");*
    Pero antes de eso, de todas manera agrega en el código del loop un
  • Serial.println(tempC);*
    que es lo mas sencillo para descartar un problema, aunque después no lo uses.

Acabo de probar con serial.print y el resultado es el mismo....
pongo una código y una captura....

float tempC;
int tempPin = 0;
char msg[5];
int vpin = 3;
float Vout = 0.0;
float Vin = 0.0;
float R1 = 10000.0;
float R2 = 10000.0;
float valor=0;
void setup()
{
Serial.begin(9600);
pinMode(vpin, INPUT);
pinMode(tempPin, INPUT);
}

void loop()
{
// leer temperatura
tempC = analogRead(tempPin);
tempC = (5.0 * tempC * 100.0)/1024.0;
dtostrf(tempC,2,2,msg);
Serial.print("Temperatura: ");
Serial.println(tempC);

delay(250);

// leer voltios
valor = analogRead(vpin);
Vout = (valor * 5) / 1024.0;
Vin = Vout / (R2/ (R1+R2));
dtostrf(Vin,2,2,msg);
Serial.print("Tension Bateria: ");
Serial.println(Vin);

delay(1000);
}

y si solo leo temperatura...

float tempC;
int tempPin = 0;
char msg[5];
int vpin = 3;
float Vout = 0.0;
float Vin = 0.0;
float R1 = 10000.0;
float R2 = 10000.0;
float valor=0;
void setup()
{
Serial.begin(9600);
pinMode(vpin, INPUT);
pinMode(tempPin, INPUT);
}

void loop()
{
// leer temperatura
tempC = analogRead(tempPin);
tempC = (5.0 * tempC * 100.0)/1024.0;
dtostrf(tempC,2,2,msg);
Serial.print("Temperatura: ");
Serial.println(tempC);

delay(250);
/*
// leer voltios
valor = analogRead(vpin);
Vout = (valor * 5) / 1024.0;
Vin = Vout / (R2/ (R1+R2));
dtostrf(Vin,2,2,msg);
Serial.print("Tension Bateria: ");
Serial.println(Vin);
*/
delay(1000);
}

No entiendo, en que puede afectar leer dos valores analógico para que falle.... :frowning:

Pues ya esta arreglado....
NO ES PROBLEMA DE CÓDIGO..
el problema esta en el divisor de tensión que he usado para leer la pila.... he usado un divisor al 50% con dos resistencias de 10k, pero habéis visto el resultado,,,
Lo he cambiado por un divisor 10 a 1... una resistencia de 100k y una de 10k, y ahora parece que va bien....

he cambiado el valor de R1 en el código por 100000.0