A vueltas con las entradas analogicas... y presentacion.

Hola Foreros

Hace unos dias aterrice en el mundo de Arduino, y la verdad es que estoy encantado. Me he pillado una placa UNO y una mini protoboar tipo “shield” (se queda un poco estrecha cuando quieres pinchar un LCD… pero por ahora me apaño bien)

Mi primer proyecto, quizas algo ambicioso para alguien que hace muuuchos años que dejo de programar, es hacer un ordenador de abordo para una moto. Y aunque ahora mismo estoy solo jugueteando, tengo un problema:

Estoy usando 2 entradas analogicas, la nº 4 con un LM 35 y la 6 con un potenciometro para simular la entrada de las RPM’s. El caso es, que la temperatura la marca bien, hasta que aumento el valor del potenciometro R.P.M.'s. Cuando aumento a mas de un 20% el valor del pot, la temperatura se vuelve loca, empieza a marcar valores raros (pasa de 13 a 29, a 331, a 1…). La funcion que debe de realizar el pot es correcta.

He probado a cambiar las entradas, pero el problema persiste…

Sabe alguien a que se debe este problema??? Alimento la placa a trabes del puerto USB del ordenador, no se si sera alguna caida de tension, o algun problema con los registros de las entradas analogicas…

He utilizado, en otro proyecto, dos LM’s 35 y no me daba problemas, es solo con la utilizacion del
potenciometro

El Pot es de 10 KOhms conectado a: +5 ; Entrada analogica 3 ; masa

Este es el codigo…

/* PROYECTO AFRICA TWIN
Mostrar RPM’s y Temperatura
RPM`s Simuladas con un potenciometro de 10 KOhms Conectado entre
masa y positivo, con el pin central a la entrada analogica nº3

Temperatura: LM 35 conectado a la entrada analogica numero 4

The circuit:

  • LCD RS pin to digital pin 12
  • LCD Enable pin to digital pin 11
  • LCD D4 pin to digital pin 5
  • LCD D5 pin to digital pin 4
  • LCD D6 pin to digital pin 3
  • LCD D7 pin to digital pin 2
  • LCD R/W pin to ground
  • 10K resistor:
  • ends to +5V and ground
  • wiper to LCD VO pin (pin 3)

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int sensor = 0; //guarda la lectura de la entarda analogica 3 potenciometro
byte col = 0; // control de la columna barra de las RPM’s
int valoranterior = 0; // valor anterior del sensor
byte todolleno[8] = {0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111,0b11111};
int rpm = 0; // su nombre lo dice todo
int temp5 = 0; //almacenamos la lectura del LM35 y calculo de la temperatura
unsigned long tiempoAnt = 0; // para controlar el tiempo que ha pasado. comparado con la funcion millis()

void setup() {
// set up the LCD’s number of columns and rows:
lcd.begin(20, 4);
// Print a message to the LCD.
lcd.setCursor(6, 0); // situamos el cursos
lcd.print(“PROYECTO”);
lcd.setCursor(4, 1);
lcd.print(“AFRICA TWIN”);
delay(3500);// espera de 3,5 segundos
lcd.clear();
lcd.createChar(1, todolleno); //creamos el caracter para la barra de las RPM’s
}

void loop() {

lcd.setCursor(0, 3);
sensor = analogRead(3); //leemos el pot
rpm = sensor * 9.77; // calculamos las rpm’s de 0 a 10000
lcd.print(col); // muestro la columna para control
lcd.print(" “);
col = sensor / 51.0; // 1024 / 20 (nº de columnas LCD) = 51
if ( col > valoranterior ) //comprobamos si hay variacion
{
for (int i = col; i >= 0; i–) // bucle para rellenar desade la posicion 0 hasta la columna la barra de las rpm’s
{
if (i == 0)
{
lcd.setCursor(i, 0);
}
else
{
lcd.setCursor(i-1, 0);
}
lcd.write(1);
}
}
if (col < valoranterior) // si hay variacion a la baja
{
for (int i = col; i <= 19; i++) // bucle para limpiar desde col hasta 19 la barra de las RPMs
{
lcd.setCursor(i, 0);
lcd.print(” “);
}
}
valoranterior = col;
lcd.setCursor(10,1);// empezamos a mostrar las RPM’s
lcd.print(“RPMs:”);
if ( rpm < 1000 ) // comprobasmos si las rpm’s estan por debajo de 1000 para limpiar las ultimas cifras
{
lcd.setCursor(15,1);
lcd.print(” “); // limpiamos las RPMs
}
lcd.setCursor(15,1);
lcd.print((rpm/100)*100); //desprecioamos las decenas y unidades, multiplicamos para dejar miles y centenas
if (rpm > 8500) // imitamos la zona roja de tacometro
{
lcd.setCursor(2,2);
lcd.print(”!!!ZONA ROJA!!!");

}
else
{
lcd.setCursor(2,2);
lcd.print(" ");
}
if ((millis()- tiempoAnt) > 1000) // mostrmos la temperatura una vez por segundo
{
temp5 = (5.0 * analogRead(4) * 100.0)/1024.0; //calculo de la temperatura segun voltaje
lcd.setCursor(5, 3);
lcd.print(“Temp: “);
lcd.print(” “);
lcd.setCursor(10, 3);
lcd.print(temp5);
lcd.print(” C”);
tiempoAnt = millis(); // para controlar la proxima entrada en esta condicion
}
}

Gracias y saludos!!!

Hola, podrías dar más detalles: cómo conectas el potenciómetro, qué valor tiene...

También tendrías que ponernos el código.

Teneis tooooda la razon....

Actualizado....

Gracias!!!

No sé si hay algo más pero de momento he visto que rpm lo declaras como int y en el código lo calculas multiplicando por 9,77 con lo que rpm tendría que ser un float.

Cheyenne: No sé si hay algo más pero de momento he visto que rpm lo declaras como int y en el código lo calculas multiplicando por 9,77 con lo que rpm tendría que ser un float.

Correcto, paro no necesito los decimales, por lo que no me preocupa demasiado que se pierdan. El marcador de las RPM´s tiene que ir marcando de 100 en 100, por eso lo divido entre 100 y lo vuelvo a multiplicar por 100, eliminando asi las decenas y las unidades.... Probare a cambiarlo, pero no creo que sea eso....

Gracias!!!

¿imagino que has probado a usar el potenciometro por separado verdad? en principio no debería haber ese problema del que hablas.

Edito: Ahora que he leido por encima el código, me da la sensación de que puedes estar desbordando la variable temp5. Prueba a cambiar temp5 por long, alguna vez he tenido algún error tonto por desbordamiento por no pararme a calcular el valor máximo que almacenará.

En el supuesto de que sea eso, puedes usar int si primero haces la división de analogRead y luego las multiplicaciones.

Un saludo